X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=check_fixes;h=84d72150734715e44c73da727f1f07d0d6658625;hb=HEAD;hp=17cfdf0c327135aeb926e7b61f9656a264d2466d;hpb=1e4ca00a37b80f79a47de3a4f2d3215fe767ff1b;p=next-scripts diff --git a/check_fixes b/check_fixes index 17cfdf0..84d7215 100755 --- a/check_fixes +++ b/check_fixes @@ -1,5 +1,7 @@ #!/bin/bash +shopt -s extglob + if [ "$#" -lt 1 ]; then printf 'Usage: %s \n', "$0" 1>&2 exit 1 @@ -10,47 +12,51 @@ if [ -z "$commits" ]; then exit 0 fi +# This should be a git tree that contains *only* Linus' tree Linus_tree="${HOME}/kernels/linus.git" -done_file="${HOME}/tmp/check_fixes_done" -split_re='^([[:xdigit:]]+)[[:space:]]+(.*)$' + +split_re='^([Cc][Oo][Mm][Mm][Ii][Tt])?[[:space:]]*([[:xdigit:]]{5,})([[:space:]]*)(.*)$' nl=$'\n' +tab=$'\t' +# Strip the leading and training spaces from a string strip_spaces() { - [[ "$1" =~ ^[[:space:]]*(.*[^[:space:]])[[:space:]]*$ ]] - echo "${BASH_REMATCH[1]}" + local str="${1##*([[:space:]])}" + str="${str%%*([[:space:]])}" + echo "$str" } for c in $commits; do - if [ -r "$done_file" ] && grep -q -Fx "$c" "$done_file"; then - continue - fi - - commit_msg="In commit - - $(git log -1 --format='%h ("%s")' $c) - -" - fixes_lines=$(git log -1 --format='%B' "$c" | - grep -i '^[[:space:]]*Fixes:') - - while read fline; do - f=$(echo "$fline" | sed 's/^[[:space:]]*Fixes:[[:space:]]*//i') - fixes_msg="Fixes tag - $fline + printf -v commit_msg 'In commit\n\n %s\n\n' \ + "$(git log -1 --format='%h ("%s")' "$c")" -has these problem(s): + readarray -t fixes_lines < <(git log -1 --format='%B' "$c" | + grep -i '^[[:space:]]*Fixes:') + fixes_lines=( "${fixes_lines[@]##*([[:space:]])}" ) + fixes_lines=( "${fixes_lines[@]%%*([[:space:]])}" ) -" + for fline in "${fixes_lines[@]}"; do + f="${fline##[Ff][Ii][Xx][Ee][Ss]:*([[:space:]])}" + printf -v fixes_msg 'Fixes tag\n\n %s\n\nhas these problem(s):\n\n' "$fline" sha= subject= msg= - [[ "$f" =~ $split_re ]] - sha="${BASH_REMATCH[1]}" - subject="${BASH_REMATCH[2]}" - - if [ -z "$sha" ]; then + if [[ "$f" =~ $split_re ]]; then + first="${BASH_REMATCH[1]}" + sha="${BASH_REMATCH[2]}" + spaces="${BASH_REMATCH[3]}" + subject="${BASH_REMATCH[4]}" + if [ "$first" ]; then + msg="${msg:+${msg}${nl}} - leading word '$first' unexpected" + fi + if [ -z "$subject" ]; then + msg="${msg:+${msg}${nl}} - missing subject" + elif [ -z "$spaces" ]; then + msg="${msg:+${msg}${nl}} - missing space between the SHA1 and the subject" + fi + else printf '%s%s - %s\n' "$commit_msg" "$fixes_msg" 'No SHA1 recognised' commit_msg='' continue @@ -62,7 +68,7 @@ has these problem(s): fi if [ "${#sha}" -lt 12 ]; then - msg="${msg:+${msg}${nl}} - SHA1 should be at least 12 digits long" + msg="${msg:+${msg}${nl}} - SHA1 should be at least 12 digits long${nl} Can be fixed by setting core.abbrev to 12 (or more) or (for git v2.11${nl} or later) just making sure it is not set (or set to \"auto\")." fi # reduce the subject to the part between () if there if [[ "$subject" =~ ^\((.*)\) ]]; then @@ -73,10 +79,19 @@ has these problem(s): fi # strip matching quotes at the start and end of the subject - re='^(['\''"])(.*)\1$' - if [[ "$subject" =~ $re ]]; then - subject="${BASH_REMATCH[2]}" - elif [[ "$subject" =~ ^[\'\"](.*)$ ]]; then + # the unicode characters in the classes are + # U+201C LEFT DOUBLE QUOTATION MARK + # U+201D RIGHT DOUBLE QUOTATION MARK + # U+2018 LEFT SINGLE QUOTATION MARK + # U+2019 RIGHT SINGLE QUOTATION MARK + re1=$'^[\"\u201C](.*)[\"\u201D]$' + re2=$'^[\'\u2018](.*)[\'\u2019]$' + re3=$'^[\"\'\u201C\u2018](.*)$' + if [[ "$subject" =~ $re1 ]]; then + subject="${BASH_REMATCH[1]}" + elif [[ "$subject" =~ $re2 ]]; then + subject="${BASH_REMATCH[1]}" + elif [[ "$subject" =~ $re3 ]]; then subject="${BASH_REMATCH[1]}" msg="${msg:+${msg}${nl}} - Subject has leading but no trailing quotes" fi @@ -107,9 +122,9 @@ has these problem(s): target_subject=$(strip_spaces "$target_subject") if [ "$subject" != "${target_subject:0:${#subject}}" ]; then - msg="${msg:+${msg}${nl}} - Subject does not match target commit subject" + msg="${msg:+${msg}${nl}} - Subject does not match target commit subject${nl} Just use${nl}${tab}git log -1 --format='Fixes: %h (\"%s\")'" fi - lsha=$(cd $Linus_tree; git rev-parse -q --verify "$sha") + lsha=$(cd "$Linus_tree" && git rev-parse -q --verify "$sha") if [ -z "$lsha" ]; then count=$(git rev-list --count "$sha".."$c") if [ "$count" -eq 0 ]; then @@ -120,7 +135,7 @@ has these problem(s): printf '%s%s%s\n' "$commit_msg" "$fixes_msg" "$msg" commit_msg='' fi - done <<< "$fixes_lines" + done done exit 0