'coder_drush_review', 'description' => dt('Run code reviews'), 'drupal dependencies' => array('coder'), 'examples' => array( 'drush coder active' => 'Review all active modules and themes.', 'drush coder contrib critical' => 'Review installed contrib modules and themes, but only return critical warnings found.', 'drush coder major cck' => 'Review cck module for major or higher level warnings.', 'drush coder style zen' => 'Review zen theme for coding style standards.', 'drush coder style sql zen' => 'Review zen theme for coding style and sql standards.', 'drush coder http://example.com/foo.patch' => 'Review a patch file.', 'drush coder /src/myfile.patch' => 'Review a local patch file.', ), 'options' => array( 'summary' => 'Display summary statistics instead of default detailed messages.', 'no-empty' => 'Only display files with warning or error messages.', 'xml' => 'output results as xml', 'active' => 'Review all active projects.', 'core' => 'Review all core modules and themes.', 'contrib' => 'Review all contributed projects.', 'all' => 'Review all projects, both in core and contrib.', 'default' => 'Review all projects configured in the default set via the UI.', 'critical' => 'Only return results with the critical severity.', 'major' => 'Return results with the major and critical severities.', 'minor' => 'Return results marked as minor severity.', 'upgrade47' => 'Converting 4.6.x modules to 4.7.x', 'upgrade50' => 'Converting 4.7.x modules to 5.x', 'upgrade6x' => 'Converting 5.x modules to 6.x', 'comment' => 'Drupal Commenting Standards', 'i18n' => 'Internationalization', 'security' => 'Drupal Security Checks', 'sql' => 'Drupal SQL Standards', 'style' => 'Drupal Coding Standards', ), ); return $items; } function _coder_set_form_modules(&$settings) { if (isset($settings['coder_modules'])) { foreach ($settings['coder_modules'] as $key => $value) { if ($value == 1) { $settings['coder_modules-'. $key] = 1; } } unset($settings['coder_modules']); } } function coder_drush_review() { _coder_drush_set_option('drush'); // process command line arguments $args = func_get_args(); $reviews = array(); $modules = array(); $output = array(); $settings = _coder_get_default_settings(); if (count($args)) { $avail_reviews = _coder_reviews(); foreach ($args as $arg) { switch ($arg) { case 'summary': case 'no-empty': case 'xml': _coder_drush_set_option($arg); break; case 'active': case 'core': case 'contrib': case 'all': case 'default': $settings = _coder_get_default_settings($arg); $settings['coder_includes'] = TRUE; break; case 'major': case 'minor': case 'critical': $severity_name = $arg; break; default: if (isset($avail_reviews[$arg])) { $reviews[$arg] = $arg; } elseif (drupal_substr($arg, 0, 3) == 'no-') { _coder_set_form_modules($settings); unset($settings['coder_modules-'. drupal_substr($arg, 3)]); } else { if (_coder_drush_is_patch_arg($arg)) { $settings['coder_patches'] = 1; $settings['coder_patch_link'] = $arg; } else { $settings['coder_modules-'. $arg] = 1; $settings['coder_includes'] = TRUE; } unset($settings['coder_active_modules']); unset($settings['coder_core']); unset($settings['coder_all']); unset($settings['coder_modules']); } break; } } if (_coder_drush_is_option('xml')) { _coder_drush_xml_output_header(); } if (isset($severity_name)) { if (_coder_drush_is_option('xml')) { _coder_drush_xml_output_severity($severity_name); } $output[] = dt('Severity @severity_name', array('@severity_name' => $severity_name)); $settings['coder_severity'] = _coder_severity($severity_name); } if (count($reviews)) { if (_coder_drush_is_option('xml')) { _coder_drush_xml_output_reviews($reviews, $avail_reviews); } else { foreach ($reviews as $review) { $output[] = $avail_reviews[$review]['#title']; } } $settings['coder_reviews'] = $reviews; } if (count($output) && !_coder_drush_is_option('summary') && !_coder_drush_is_option('xml')) { drush_print(implode(', ', $output) ."\n"); } } _coder_set_form_modules($settings); $settings['op'] = 'drush'; $form_state['storage'] = $settings; coder_page_form($form_state); if (_coder_drush_is_option('xml')) { _coder_drush_xml_output_footer(); } } function _coder_drush_is_patch_arg(&$arg) { if (drupal_substr($arg, 0, 7) == 'http://' || is_file(realpath($arg))) { return TRUE; } // @NOTE: relies on http://drupal.org/node/297611 if (isset($_SERVER['OLDPWD'])) { $path = $_SERVER['OLDPWD'] .'/'. $arg; if (is_file($path)) { $arg = $path; return TRUE; } } } function theme_drush_coder($name, $filename, $results) { if (!_coder_drush_is_option('summary') && !empty($results) && ((count($results) && !isset($results[0])) || !_coder_drush_is_option('no-empty'))) { if (_coder_drush_is_option('xml')) { _coder_drush_xml_output_results($filename, $results); } else { drush_print($filename . ":\n " . implode("\n ", $results) . "\n"); } } } function theme_drush_coder_warning($warning, $severity_name, $lineno = 0, $line = '') { if (_coder_drush_is_option('xml')) { $attr = array( 'line' => $lineno, 'severity' => $severity_name, 'message' => $warning, 'source' => $line, ); $output = ''; return $output; } else { $output = $lineno ? '+' . $lineno . ': ' : ''; $output .= '[' . $severity_name . '] '; $output .= is_array($warning) ? $warning['#warning'] : $warning; return _coder_drush_output($output); } } function coder_print_drush_messages() { foreach (drupal_get_messages() as $type => $messages) { $output = _coder_drush_output(implode("\n ", $messages)); if (_coder_drush_is_option('xml')) { drush_print('' . $output . ''); } else { drush_print(dt(drupal_ucfirst($type) . ' Messages') . ":\n " . $output . "\n"); } } } function _coder_drush_output($output) { return html_entity_decode(strip_tags($output)); } function _coder_drush_set_option($option) { global $_coder_drush_options; if (!isset($_coder_drush_options)) { $_coder_drush_options = array(); } $_coder_drush_options[$option] = TRUE; } function _coder_drush_is_option($option) { global $_coder_drush_options; return isset($_coder_drush_options[$option]); } /** * XML output functions. */ function _coder_drush_xml_output_header() { // Put in an extra concatenation so syntax highlighting in vim doesn't break. drush_print('' . ''); drush_print(''); } function _coder_drush_xml_output_footer() { drush_print(''); } function _coder_drush_xml_output_severity($severity_name) { drush_print('' . $severity_name . ''); } function _coder_drush_xml_output_reviews($reviews, $avail_reviews) { drush_print(''); foreach ($reviews as $review) { drush_print('' . $avail_reviews[$review]['#title'] . ''); } drush_print(''); } function _coder_drush_xml_output_results($filename, $results) { drush_print('' . "\n" . implode("\n ", $results) . "\n" . ''); }