diff options
author | Thomas Haller <thaller@redhat.com> | 2015-08-07 12:57:11 +0200 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2015-08-17 14:10:45 +0200 |
commit | 0987f7f61edae39d9b56491cd23b96813997a9e3 (patch) | |
tree | cace61ac008c8c49ccde9f3913bb8700146b6e39 | |
parent | 0752bd18bdd78eecdf6221dc85ffda55c7dc84b6 (diff) | |
download | NetworkManager-0987f7f61edae39d9b56491cd23b96813997a9e3.tar.gz |
rh-utils: add script find-backports.sh
When backporting commits, we should do `git cherry-pick -x`,
so that the commit message contains:
(cherry picked from commit $SHA)
Similarly, when fixing an actual bug of a previous commit, we
mark the faulty commit with:
Fixes: $SHA
This script walks through a commit range of a stable branch,
and finds all $BACKPORTED_COMMITS (the sources from where we
cherry-picked).
Then it walks through a commit range of upstream/unstable branch,
and searches for $FIXES of the $BACKPORTED_COMMITS.
Then it prints all $FIXES, that are not yet backported. You probably
should backport those commits as well.
-rwxr-xr-x | contrib/rh-utils/find-backports.sh | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/contrib/rh-utils/find-backports.sh b/contrib/rh-utils/find-backports.sh new file mode 100755 index 0000000000..31b627691d --- /dev/null +++ b/contrib/rh-utils/find-backports.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +die() { + echo "$@" >&2 + exit 1 +} + +print_usage() { + echo "$0 [REF_BASE REF_STABLE REF_UPSTREAM]" + echo " for example $0 1.1.0-dev~ nm-1-0 master" +} + +ref_exists() { + git rev-parse --verify "$1" &> /dev/null +} + +get_cherry_picked_from() { + local H="$1" + local B + + for B in $(git log -n1 "$H" 2>&1 | sed -n -e 's/.*cherry.picked.*\<\([0-9a-f]\{6,40\}\)\>.*/\1/p'); do + if ref_exists "$B"; then + echo $B + + # if the original patch was cherry-picked too, continue + # recursively. + get_cherry_picked_from "$B" + fi + done +} + +get_backported_all() { + local RANGE="$1" + local H + + for H in $(git log --pretty="%H" "$RANGE"); do + get_cherry_picked_from "$H" + done | + sort | uniq +} + +get_fixes() { + local RANGE="$1" + local BACKPORTED="$2" + local H B + + for H in $BACKPORTED; do + for B in $(git log --format="%H" --no-walk --grep '[Ff]ixes: *'"${H:0:7}" "$RANGE"); do + echo "$B" + + # if commit $B fixes $H, and commit $B was itself backported (cherry-picked), + # then also all original versions of $B fix $H. + get_cherry_picked_from "$B" + done + done | + sort | uniq +} + +if [[ "$#" != 3 && "$#" != 0 ]]; then + print_usage + die "Wrong arguments" +fi + +if [[ "$#" == 3 ]]; then + REF_BASE="$1" + REF_STABLE="$2" + REF_UPSTREAM="$3" +else + REF_BASE=1.1.0-dev~ + REF_STABLE=nm-1-0 + REF_UPSTREAM=master +fi + +ref_exists "$REF_BASE" || die "Invalid REF_BASE=\"$REF_BASE\"" +ref_exists "$REF_UPSTREAM" || die "Invalid REF_UPSTREAM=\"$REF_UPSTREAM\"" +ref_exists "$REF_STABLE" || die "Invalid REF_STABLE=\"$REF_STABLE\"" + +BACKPORTED="$(get_backported_all "$REF_BASE..$REF_STABLE")" + +FIXES="$(get_fixes "$REF_BASE..$REF_UPSTREAM" "$BACKPORTED")" + +MISSING_BACKPORTS="$(printf '%s' "$FIXES" | grep $(printf '%s' "$BACKPORTED" | sed 's/^/-e /') - -v)" +if [ -n "$MISSING_BACKPORTS" ]; then + git log -p --no-walk $(echo "$MISSING_BACKPORTS") + printf "%s\n" "$MISSING_BACKPORTS" +fi + |