SCRIPTS: make git-show-backports capable of limiting its history

When comparing very different branches, it can take a very long time
to scan all commits from the very old common ancestor (eg: haproxy
1.4 to 1.7). Now it is possible to specify a range of commits instead
of a specific branch, and the analysis will be limited to this range
for all commits. The user is responsible for ensuring that the range
covers all possible backports from base to ref, otherwise some of them
may be reported missing while they are not.

This also works with linux kernels, for example :

   git-show-backports -u -q -m -r v3.14.69 -b v3.14.65 v3.10.101..HEAD
This commit is contained in:
Willy Tarreau 2016-05-16 17:01:12 +02:00
parent 29b684bf86
commit 29c44e1f1e
1 changed files with 26 additions and 4 deletions

View File

@ -28,7 +28,8 @@
# show-backports -q -m -r hapee-r2 hapee-r1
USAGE="Usage: ${0##*/} [-q] [-m] [-u] [-r reference] [-l logexpr] [-s subject] [-b base] branch [...]"
USAGE="Usage: ${0##*/} [-q] [-m] [-u] [-r reference] [-l logexpr] [-s subject] [-b base] {branch|range} [...]"
BASES=( )
BRANCHES=( )
REF=master
BASE=
@ -140,7 +141,22 @@ while [ -n "$1" -a -z "${1##-*}" ]; do
esac
done
BRANCHES=( "$@" )
# branches may also appear as id1..id2 to limit the history instead of looking
# back to the common base. The field is left empty if not set.
BRANCHES=( )
BASES=( )
while [ $# -gt 0 ]; do
branch="${1##*..}"
if [ "$branch" == "$1" ]; then
base=""
else
base="${1%%..*}"
fi
BASES[${#BRANCHES[@]}]="$base"
BRANCHES[${#BRANCHES[@]}]="$branch"
shift
done
if [ ${#BRANCHES[@]} = 0 ]; then
die "$USAGE"
fi
@ -170,12 +186,18 @@ rm -f "$WORK/${REF//\//_}"
git log --reverse ${LOGEXPR:+--grep $LOGEXPR} --pretty="%H %s" "$BASE".."$REF" | grep "${SUBJECT}" > "$WORK/${branch//\//_}" > "$WORK/${REF//\//_}"
# for each branch, enumerate all commits and their ancestry
for branch in "${BRANCHES[@]}"; do
branch_num=0;
while [ $branch_num -lt "${#BRANCHES[@]}" ]; do
branch="${BRANCHES[$branch_num]}"
base="${BASES[$branch_num]}"
base="${base:-$BASE}"
rm -f "$WORK/${branch//\//_}"
git log --reverse --pretty="%H %s" "$BASE".."$branch" | grep "${SUBJECT}" | while read h subject; do
git log --reverse --pretty="%H %s" "$base".."$branch" | grep "${SUBJECT}" | while read h subject; do
echo "$h" $(git log -1 --pretty --format=%B "$h" | \
sed -n 's/^commit \([^)]*\) upstream\.$/\1/p;s/^(cherry picked from commit \([^)]*\))/\1/p')
done > "$WORK/${branch//\//_}"
(( branch_num++ ))
done
count=0