'grep_invert', '#source' => 'comment', '#value' => '$Id', '#case-sensitive' => TRUE, '#warning_callback' => '_coder_review_comment_Id_warning', '#filename-not' => array('patch'), ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '^.*\$Id.*$', '#not' => '^\/\/\s+\$Id\$|^\/\/\s+\$Id' . ':[^\$]+\$', '#case-sensitive' => TRUE, '#warning_callback' => '_coder_review_comment_Id_warning', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '^\*', '#warning' => 'indent secondary line of comment one space ', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '^\s*\*.+|^\/\*.+', '#not' => '^\s*\*\s+|^\/\*\s+|^\/\*\*|^\s*\*\/', '#warning' => 'put a space between the asterisk and the comment text', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '.*\@see\s*', '#not' => '^(\s*\*|\/\/)\s*\@see.*$', '#warning' => '@see should always be at the beginning of a line, never inline in other comments.', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '\/\/\s*\@see\s*', '#warning_callback' => '_coder_review_comment_see_comment_style_warning', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '\@see\s*.*', '#not' => '^\@see\s+((\w+\(\)|[\w\.\-\?\/:\&=]+\.[\w\.\->\?\/:\&=]+)[,\s]+)*(\w+\(\)|[\w\.\->\?\/:\&=]+\.[\w\.\->\?\/:\&=]+)\W*$', '#warning' => '@see should always be followed by a filename, a url or a function name with ()', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '\@see\s*\w+.*$', '#not' => '^\@see\s+([\w\.\-\(\)\?\/:\&=]+,\s)*[\w\.\-\(\)\?\/:\&=]+?[\w\(\)\/]$', '#warning' => '@see references should be separated by "," followed by a single space and with no trailing punctuation', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '\@see\s.*$', '#not' => '^\@see [^\s]', '#warning' => '@see should be separated from the references by one space only', '#severity' => 'minor', ), array( '#type' => 'grep_invert', '#source' => 'comment', '#value' => '@' . 'file', '#warning_callback' => '_coder_review_comment_missing_file_block_warning', '#filename-not' => array('patch'), ), array( '#type' => 'callback', '#value' => '_coder_review_comment_install_file_block_callback', // @NOTE: This is not used. It only exists to catch potential errors in this code. '#warning_callback' => '_coder_review_comment_install_file_callback_warning', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => '@' . 'file\s+.+$', '#warning_callback' => '_coder_review_comment_invalid_file_block_warning', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => 'Implements*\s+hook_\w+\(\)\s*$', '#warning' => 'Missing period', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => 'Implements*\s+hook_\w+\s*\.*$', '#warning' => 'Missing parenthesis after function name', '#severity' => 'minor', ), // @TODO: fix? array( '#type' => 'regex', '#source' => 'comment', '#value' => '^\s*\*\s*[a-zA-Z\s]+\s+hook_\w+', '#not' => '^\s\*\sImplements*\s+hook_\w+', '#warning' => 'Format should be * Implements hook_foo().', '#severity' => 'minor', ), array( '#type' => 'regex', '#source' => 'comment', '#value' => 'implements\s+hook_\w+', '#warning' => '\'Implements\' should be at the start of the sentence and begin with a capitialized letter', '#severity' => 'minor', '#case-sensitive' => TRUE, ), ); $review = array( '#title' => t('Drupal Commenting Standards'), '#link' => 'http://drupal.org/node/318', '#rules' => $rules, '#description' => t('every developer should use'), ); return array('comment' => $review); } /** * Define the rule callbacks for comment install file block, see do_coder_review_callback(). */ function _coder_review_comment_install_file_block_callback(&$coder_args, $review, $rule, $lines, &$results) { // Only perform this check on install files. $filename = $coder_args['#filename']; if (drupal_substr($filename, -7) == '.install') { $file_found = 0; $invalid_file_message = 0; foreach ($lines as $lineno => $line) { if (preg_match('/^ * @file/', $line[0])) { $file_found = 1; } // Immediately reset $file_found on the next line, and check if the // comment matches the required format. elseif ($file_found == 1) { if (!preg_match('/^ * Install, update and uninstall functions for the \w+ module./', $line[0])) { $invalid_file_message = 1; } $file_found = 0; } } if ($invalid_file_message) { $severity_name = _coder_review_severity_name($coder_args, $review, $rule); $tmprule = $rule; $tmprule['#warning_callback'] = '_coder_review_comment_install_file_warning'; _coder_review_error($results, $tmprule, $severity_name, $theme_lineno, $theme_line); } } } function _coder_review_comment_install_file_warning() { return array( '#warning' => t('For .install files, the @file description should be of the format "Install, update and uninstall functions for the XXX module.".'), '#link' => 'http://drupal.org/coding-standards', ); } function _coder_review_comment_Id_warning() { return array( '#warning' => t('Include the CVS keyword $Id' . '$ in each file. This should be in the format // $Id' . '$ or // $Id' . '$'), '#link' => 'http://drupal.org/coding-standards', ); } function _coder_review_comment_missing_file_block_warning() { return array( '#warning' => t('@' . 'file block missing'), '#link' => 'http://drupal.org/node/1354#files', ); } function _coder_review_comment_invalid_file_block_warning() { return array( '#warning' => t('@' . 'file description should be on the following line'), '#link' => 'http://drupal.org/node/1354#files', ); } function _coder_review_comment_see_comment_style_warning() { return array( '#warning' => t('@' . 'see should always be in a comment block rather than as an inline comment.'), '#link' => 'http://drupal.org/node/1354', ); }