blob: 40a1388f96cf52f50423b217ad8301aad36915cd [file] [log] [blame]
Ian Romanick2d95db62012-10-19 22:30:53 +02001#!/bin/sh
2
Andreas Bollfa27a0d2012-10-19 22:54:56 +02003# Script for generating a list of candidates for cherry-picking to a stable branch
Andreas Bollb8e41db2013-04-18 09:32:39 +02004#
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
Emil Velikovfac10162018-11-08 15:05:14 +000010#
11# The output is as follows:
12# [nomination_type] commit_sha commit summary
13
14is_stable_nomination()
15{
Dylan Bakeraff52dd2019-02-12 14:03:21 -080016 git show --pretty=medium --summary "$1" | grep -q -i -o "CC:.*mesa-stable"
Emil Velikovfac10162018-11-08 15:05:14 +000017}
Andreas Bollfa27a0d2012-10-19 22:54:56 +020018
Emil Velikove6b3a3b2018-11-08 15:05:15 +000019is_typod_nomination()
20{
Dylan Bakeraff52dd2019-02-12 14:03:21 -080021 git show --pretty=medium --summary "$1" | grep -q -i -o "CC:.*mesa-dev"
Emil Velikove6b3a3b2018-11-08 15:05:15 +000022}
23
Emil Velikov6b296f62018-12-17 15:44:25 +000024fixes=
25
Emil Velikovb7418d12018-11-08 15:05:18 +000026# Helper to handle various mistypos of the fixes tag.
27# The tag string itself is passed as argument and normalised within.
Emil Velikov6b296f62018-12-17 15:44:25 +000028#
29# Resulting string in the global variable "fixes" and contains entries
30# in the form "fixes:$sha"
Emil Velikovb7418d12018-11-08 15:05:18 +000031is_sha_nomination()
Emil Velikov181203f2018-11-08 15:05:16 +000032{
33 fixes=`git show --pretty=medium -s $1 | tr -d "\n" | \
Emil Velikovb7418d12018-11-08 15:05:18 +000034 sed -e 's/'"$2"'/\nfixes:/Ig' | \
Juan A. Suarez Romerob3c25e62019-09-10 10:30:43 +020035 grep -Eo 'fixes:[a-f0-9]{4,40}'`
Emil Velikov181203f2018-11-08 15:05:16 +000036
Emil Velikov6b296f62018-12-17 15:44:25 +000037 fixes_count=`echo "$fixes" | grep "fixes:" | wc -l`
Emil Velikovc0012a02018-11-08 15:05:21 +000038 if test $fixes_count -eq 0; then
Emil Velikov6b296f62018-12-17 15:44:25 +000039 return 1
Emil Velikov181203f2018-11-08 15:05:16 +000040 fi
Emil Velikove0dbfc92018-12-17 16:25:40 +000041
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))
Andres Gomez3ec9ab82019-01-11 16:43:27 +020047 if ! git show $id >/dev/null 2>&1; then
Emil Velikove0dbfc92018-12-17 16:25:40 +000048 echo WARNING: Commit $1 lists invalid sha $id
49 fi
50 done
51
Emil Velikov6b296f62018-12-17 15:44:25 +000052 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`
Emil Velikovc0012a02018-11-08 15:05:21 +000060 while test $fixes_count -gt 0; do
Emil Velikov181203f2018-11-08 15:05:16 +000061 # 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
Emil Velikov181203f2018-11-08 15:05:16 +000065 # 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
Emil Velikovb7418d12018-11-08 15:05:18 +000075is_fixes_nomination()
76{
77 is_sha_nomination "$1" "fixes:[[:space:]]*"
Emil Velikov209525a2018-11-08 15:05:19 +000078 if test $? -eq 0; then
79 return 0
80 fi
81 is_sha_nomination "$1" "fixes[[:space:]]\+"
Emil Velikovb7418d12018-11-08 15:05:18 +000082}
83
Emil Velikov77ff0bf2018-11-08 15:05:20 +000084is_brokenby_nomination()
85{
86 is_sha_nomination "$1" "broken by"
87}
88
Emil Velikovadbdfc62018-11-14 18:49:54 +000089is_revert_nomination()
90{
91 is_sha_nomination "$1" "This reverts commit "
92}
93
Emil Velikovd6b1d112017-02-13 00:37:03 +000094# Use the last branchpoint as our limit for the search
95latest_branchpoint=`git merge-base origin/master HEAD`
96
Emil Velikov181203f2018-11-08 15:05:16 +000097# 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.
Dylan Bakerc8acfd52018-05-21 10:30:42 -0700101git log --reverse --pretty=medium --grep="cherry picked from commit" $latest_branchpoint..HEAD |\
Andreas Boll135ec3a2012-10-19 23:13:12 +0200102 grep "cherry picked from commit" |\
103 sed -e 's/^[[:space:]]*(cherry picked from commit[[:space:]]*//' -e 's/)//' > already_picked
104
Emil Velikov181203f2018-11-08 15:05:16 +0000105# Grep for potential candidates
Emil Velikovadbdfc62018-11-14 18:49:54 +0000106git log --reverse --pretty=%H -i --grep='^CC:.*mesa-stable\|^CC:.*mesa-dev\|\<fixes\>\|\<broken by\>\|This reverts commit' $latest_branchpoint..origin/master |\
Ian Romanick2d95db62012-10-19 22:30:53 +0200107while read sha
108do
Andreas Boll3e3ff4c2012-10-20 21:50:30 +0200109 # Check to see whether the patch is on the ignore list.
Emil Velikovc0012a02018-11-08 15:05:21 +0000110 if test -f bin/.cherry-ignore; then
Andreas Bollca898862012-10-22 21:18:17 +0200111 if grep -q ^$sha bin/.cherry-ignore ; then
Andreas Boll3e3ff4c2012-10-20 21:50:30 +0200112 continue
113 fi
Ian Romanick2d95db62012-10-19 22:30:53 +0200114 fi
115
116 # Check to see if it has already been picked over.
Andreas Boll135ec3a2012-10-19 23:13:12 +0200117 if grep -q ^$sha already_picked ; then
118 continue
Ian Romanick2d95db62012-10-19 22:30:53 +0200119 fi
120
Emil Velikov6b296f62018-12-17 15:44:25 +0000121 if is_fixes_nomination "$sha"; then
Emil Velikov181203f2018-11-08 15:05:16 +0000122 tag=fixes
Emil Velikov77ff0bf2018-11-08 15:05:20 +0000123 elif is_brokenby_nomination "$sha"; then
124 tag=brokenby
Emil Velikovadbdfc62018-11-14 18:49:54 +0000125 elif is_revert_nomination "$sha"; then
126 tag=revert
Emil Velikov6b296f62018-12-17 15:44:25 +0000127 elif is_stable_nomination "$sha"; then
128 tag=stable
129 elif is_typod_nomination "$sha"; then
130 tag=typod
Emil Velikovfac10162018-11-08 15:05:14 +0000131 else
132 continue
133 fi
134
Emil Velikov6b296f62018-12-17 15:44:25 +0000135 case "$tag" in
136 fixes | brokenby | revert )
137 if ! sha_in_range; then
138 continue
139 fi
140 ;;
141 * )
142 ;;
143 esac
144
Emil Velikovfac10162018-11-08 15:05:14 +0000145 printf "[ %8s ] " "$tag"
Dylan Baker60861382019-09-23 11:05:16 -0700146 git --no-pager show --no-patch --pretty=oneline $sha
Ian Romanick2d95db62012-10-19 22:30:53 +0200147done
Andreas Boll135ec3a2012-10-19 23:13:12 +0200148
149rm -f already_picked
Emil Velikov181203f2018-11-08 15:05:16 +0000150rm -f already_landed