diff options
Diffstat (limited to 'rfc.sh')
-rwxr-xr-x | rfc.sh | 161 |
1 files changed, 88 insertions, 73 deletions
@@ -128,22 +128,44 @@ editor_mode() fi if [ $(basename "$1") = "COMMIT_EDITMSG" ]; then - if grep -qi '^BUG: ' $1; then + # see note above function warn_reference_missing for regex elaboration + # Lets first check for github issues + ref=$(git show --format='%b' | grep -ow -E "([fF][iI][xX][eE][sS]|[uU][pP][dD][aA][tT][eE][sS])(:)?[[:space:]]+(gluster\/glusterfs)?#[[:digit:]]+" | awk -F '#' '{print $2}'); + if [ "x${ref}" = "x" ]; then + # if not found, check for bugs + ref=$(git show --format='%b' | grep -ow -E "([fF][iI][xX][eE][sS]|[uU][pP][dD][aA][tT][eE][sS])(:)?[[:space:]]+bz#[[:digit:]]+" | awk -F '#' '{print $2}'); + fi + + if [ "x${ref}" != "x" ]; then return; fi + while true; do echo Commit: "\"$(head -n 1 $1)\"" - echo -n "Enter Bug ID: " + echo -n "Reference (Bugzilla ID or Github Issue ID): " read bug if [ -z "$bug" ]; then return; fi if ! is_num "$bug"; then - echo "Invalid Bug ID ($bug)!!!"; + echo "Invalid reference ID ($bug)!!!"; continue; fi - sed "/^Change-Id:/{p; s/^.*$/BUG: $bug/;}" $1 > $1.new && \ + bz_string="bz" + if [ $bug -lt 742000 ]; then + bz_string="" + fi + + echo "Select yes '(y)' if this patch fixes the bug/feature completely," + echo -n "or is the last of the patchset which brings feature (Y/n): " + read fixes + fixes_string="fixes" + if [ "${fixes}" = 'N' ] || [ "${fixes}" = 'n' ]; then + fixes_string="updates" + fi + + sed "/^Change-Id:/{p; s/^.*$/${fixes_string}: ${bz_string}#${bug}/;}" $1 > $1.new && \ mv $1.new $1; return; done @@ -201,78 +223,72 @@ check_patches_for_coding_style() fi } -github_issue_message() +# Regex elaborated: +# grep -w -> --word-regexp (from the man page) +# Select only those lines containing matches that form whole words. +# The test is that the matching substring must either be at the +# beginning of the line, or preceded by a non-word constituent +# character. Similarly, it must be either at the end of the line or +# followed by a non-word constituent character. Word-constituent +# characters are letters, digits, and the underscore. +# IOW, the above helps us find the pattern with leading or training spaces +# or non word consituents like , or ; +# +# [fF][iI][xX][eE][sS]|[uU][pP][dD][aA][tT][eE][sS]) +# Finds 'fixes' OR 'updates' in any case combination +# +# (:)? +# Followed by an optional : (colon) +# +# [[:space:]]+ +# followed by 1 or more spaces +# +# (gluster\/glusterfs)? +# Followed by 0 or more gluster/glusterfs +# +# # +# Followed by # +# +# [[:digit:]]+ +# Followed by 1 or more digits +warn_reference_missing() { echo "" - echo "=== Missing a github issue reference in a potential enhancement! ===" + echo "=== Missing a reference in commit! ===" + echo "" + echo "Gluster commits are made with a reference to a bug or a github issue" echo "" - echo "Gluster code submissions that are enhancements (IOW, not functional" + echo "Submissions that are enhancements (IOW, not functional" echo "bug fixes, but improvements of any nature to the code) are tracked" - echo "using github issues. A check on the commit message, reveals that" - echo "there is no bug associated with this change, hence it could be a" - echo "potential code improvement or feature enhancement" + echo "using github issues [1]." echo "" - echo "If this is an enhancement, request a github issue be filed at [1]" - echo "and referenced in the commit message as," - echo "\"Fixes gluster/glusterfs#n\" OR \"Updates gluster/glusterfs#n\"," - echo "where n is the issue number" + echo "Submissions that are bug fixes are tracked using Bugzilla [2]." echo "" - echo "You can reference multiple issues that this commit addresses as," - echo "\"fixes gluster/glusterfs#n, updates gluster/glusterfs#m\", and so on" + echo "A check on the commit message, reveals that there is no bug or" + echo "github issue referenced in the commit message" echo "" echo "[1] https://github.com/gluster/glusterfs/issues/new" + echo "[2] https://bugzilla.redhat.com/enter_bug.cgi?product=GlusterFS" + echo "" + echo "Please file an issue or a bug report and reference the same in the" + echo "commit message using the following tags:" + echo "GitHub Issues:" + echo "\"Fixes: gluster/glusterfs#n\" OR \"Updates: gluster/glusterfs#n\"," + echo "\"Fixes: #n\" OR \"Updates: #n\"," + echo "Bugzilla ID:" + echo "\"Fixes: bz#n\" OR \"Updates: bz#n\"," + echo "where n is the issue or bug number" echo "" echo "You may abort the submission choosing 'N' below and use" echo "'git commit --amend' to add the issue reference before posting" - echo "to gerrit. If this is a bug fix, choose 'Y' to continue." + echo "to gerrit." echo "" -} - -check_for_github_issue() -{ - # NOTE: Since we run '#!/bin/sh -e', the check is in an if, - # as grep count maybe 0 - # - # Regex elaborated: - # grep -w -> --word-regexp (from the man page) - # Select only those lines containing matches that form whole words. - # The test is that the matching substring must either be at the - # beginning of the line, or preceded by a non-word constituent - # character. Similarly, it must be either at the end of the line or - # followed by a non-word constituent character. Word-constituent - # characters are letters, digits, and the underscore. - # IOW, the above helps us find the pattern with leading or training spaces - # or non word consituents like , or ; - # - # grep -c -> gives us a count of matches, which is all we need here - # - # [fF][iI][xX][eE][sS]|[uU][pP][dD][aA][tT][eE][sS]) - # Finds 'fixes' OR 'updates' in any case combination - # - # (:)? - # Followed by an optional : (colon) - # - # [[:space:]]+ - # followed by 1 or more spaces - # - # (gluster\/glusterfs)? - # Followed by 0 or more gluster/glusterfs - # - # # - # Followed by # - # - # [[:digit:]]+ - # Followed by 1 or more digits - if [ 0 = "$(git log --format=%B -n 1 | grep -cow -E "([fF][iI][xX][eE][sS]|[uU][pP][dD][aA][tT][eE][sS])(:)?[[:space:]]+(gluster\/glusterfs)?#[[:digit:]]+")" ]; then - moveon='N' - github_issue_message; - echo -n "Missing github issue reference in a potential RFE. Continue (y/N): " - read moveon - if [ "${moveon}" = 'Y' ] || [ "${moveon}" = 'y' ]; then - return; - else - exit 1 - fi + echo -n "Missing reference to a bug or a github issue. Continue (y/N): " + read moveon + if [ "${moveon}" = 'Y' ] || [ "${moveon}" = 'y' ]; then + return; + else + exit 1 fi } @@ -295,26 +311,25 @@ main() assert_diverge; - bug=$(git show --format='%b' | grep -i '^BUG: ' | awk '{print $2}'); + # see note above function warn_reference_missing for regex elaboration + reference=$(git show --format='%b' | grep -ow -E "([fF][iI][xX][eE][sS]|[uU][pP][dD][aA][tT][eE][sS])(:)?[[:space:]]+(gluster\/glusterfs)?(bz)?#[[:digit:]]+" | awk -F '#' '{print $2}'); - # If this is a commit against master and does not have a bug ID - # it could be a feature or an RFE, check if there is a github - # issue reference, and if not suggest commit message amendment - if [ -z "$bug" ] && [ $branch = "master" ]; then - check_for_github_issue; + # If this is a commit against master and does not have a bug ID or a github + # issue reference. Warn the contributor that one of the 2 is required + if [ -z "${reference}" ] && [ $branch = "master" ]; then + warn_reference_missing; fi - if [ "$DRY_RUN" = 1 ]; then drier='echo -e Please use the following command to send your commits to review:\n\n' else drier= fi - if [ -z "$bug" ]; then + if [ -z "${reference}" ]; then $drier git push $ORIGIN HEAD:refs/for/$branch/rfc; else - $drier git push $ORIGIN HEAD:refs/for/$branch/bug-$bug; + $drier git push $ORIGIN HEAD:refs/for/$branch/ref-${reference}; fi } |