1#!/bin/sh 2 3# Script for generating a list of candidates for cherry-picking to a stable branch 4# 5# Usage examples: 6# 7# $ bin/get-pick-list.sh 8# $ bin/get-pick-list.sh > picklist 9# $ bin/get-pick-list.sh | tee picklist 10# 11# The output is as follows: 12# [nomination_type] commit_sha commit summary 13 14is_stable_nomination() 15{ 16 git show --pretty=medium --summary "$1" | grep -q -i -o "CC:.*mesa-stable" 17} 18 19is_typod_nomination() 20{ 21 git show --pretty=medium --summary "$1" | grep -q -i -o "CC:.*mesa-dev" 22} 23 24fixes= 25 26# Helper to handle various mistypos of the fixes tag. 27# The tag string itself is passed as argument and normalised within. 28# 29# Resulting string in the global variable "fixes" and contains entries 30# in the form "fixes:$sha" 31is_sha_nomination() 32{ 33 fixes=`git show --pretty=medium -s $1 | tr -d "\n" | \ 34 sed -e 's/'"$2"'/\nfixes:/Ig' | \ 35 grep -Eo 'fixes:[a-f0-9]{4,40}'` 36 37 fixes_count=`echo "$fixes" | grep "fixes:" | wc -l` 38 if test $fixes_count -eq 0; then 39 return 1 40 fi 41 42 # Throw a warning for each invalid sha 43 while test $fixes_count -gt 0; do 44 # Treat only the current line 45 id=`echo "$fixes" | tail -n $fixes_count | head -n 1 | cut -d : -f 2` 46 fixes_count=$(($fixes_count-1)) 47 if ! git show $id >/dev/null 2>&1; then 48 echo WARNING: Commit $1 lists invalid sha $id 49 fi 50 done 51 52 return 0 53} 54 55# Checks if at least one of offending commits, listed in the global 56# "fixes", is in branch. 57sha_in_range() 58{ 59 fixes_count=`echo "$fixes" | grep "fixes:" | wc -l` 60 while test $fixes_count -gt 0; do 61 # Treat only the current line 62 id=`echo "$fixes" | tail -n $fixes_count | head -n 1 | cut -d : -f 2` 63 fixes_count=$(($fixes_count-1)) 64 65 # Be that cherry-picked ... 66 # ... or landed before the branchpoint. 67 if grep -q ^$id already_picked || 68 grep -q ^$id already_landed ; then 69 return 0 70 fi 71 done 72 return 1 73} 74 75is_fixes_nomination() 76{ 77 is_sha_nomination "$1" "fixes:[[:space:]]*" 78 if test $? -eq 0; then 79 return 0 80 fi 81 is_sha_nomination "$1" "fixes[[:space:]]\+" 82} 83 84is_brokenby_nomination() 85{ 86 is_sha_nomination "$1" "broken by" 87} 88 89is_revert_nomination() 90{ 91 is_sha_nomination "$1" "This reverts commit " 92} 93 94# Use the last branchpoint as our limit for the search 95latest_branchpoint=`git merge-base origin/master HEAD` 96 97# List all the commits between day 1 and the branch point... 98git log --reverse --pretty=%H $latest_branchpoint > already_landed 99 100# ... and the ones cherry-picked. 101git log --reverse --pretty=medium --grep="cherry picked from commit" $latest_branchpoint..HEAD |\ 102 grep "cherry picked from commit" |\ 103 sed -e 's/^[[:space:]]*(cherry picked from commit[[:space:]]*//' -e 's/)//' > already_picked 104 105# Grep for potential candidates 106git log --reverse --pretty=%H -i --grep='^CC:.*mesa-stable\|^CC:.*mesa-dev\|\<fixes\>\|\<broken by\>\|This reverts commit' $latest_branchpoint..origin/master |\ 107while read sha 108do 109 # Check to see whether the patch is on the ignore list. 110 if test -f bin/.cherry-ignore; then 111 if grep -q ^$sha bin/.cherry-ignore ; then 112 continue 113 fi 114 fi 115 116 # Check to see if it has already been picked over. 117 if grep -q ^$sha already_picked ; then 118 continue 119 fi 120 121 if is_fixes_nomination "$sha"; then 122 tag=fixes 123 elif is_brokenby_nomination "$sha"; then 124 tag=brokenby 125 elif is_revert_nomination "$sha"; then 126 tag=revert 127 elif is_stable_nomination "$sha"; then 128 tag=stable 129 elif is_typod_nomination "$sha"; then 130 tag=typod 131 else 132 continue 133 fi 134 135 case "$tag" in 136 fixes | brokenby | revert ) 137 if ! sha_in_range; then 138 continue 139 fi 140 ;; 141 * ) 142 ;; 143 esac 144 145 printf "[ %8s ] " "$tag" 146 git --no-pager show --no-patch --pretty=oneline $sha 147done 148 149rm -f already_picked 150rm -f already_landed 151