• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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