Check cherry-pick hashes in pep8 tox target

NOTE(elod.illes): This is a combination of 2 commits: the cherry-pick
hash checker script and a fix for the script.

1. Check cherry-pick hashes in pep8 tox target

This adds a tools/ script that checks any cherry-picked hashes
on the current commit (or a provided commit) to make sure that
all the hashes exist on at least master or stable/.* branches.
This should help avoid accidentally merging stable backports
where one of the hashes along the line has changed due to conflicts.

2. Fix cherry-pick check for merge patch

Cherry-pick check script validates the proposed patch's commit message.
If a patch is not on top of the given branch then Zuul rebases it to
the top and the patch becomes a merge patch. In this case the script
validates the merge patch's commit message instead of the original
patch's commit message and fails.

This fix selects the parent of the patch if it is a merge patch.

(cherry picked from commit c7c48c6f52)
(cherry picked from commit 02f213b831)
(cherry picked from commit 7a5111ba29)

Change-Id: I4afaa0808b75cc31a8dd14663912c162281a1a42
(cherry picked from commit aebc829c4e)
(cherry picked from commit 5cacfaab82)
(cherry picked from commit d307b964ce)
This commit is contained in:
Dan Smith 2020-06-11 10:42:13 -07:00 committed by Elod Illes
parent d7a1cb5724
commit c3dd9f86f1
2 changed files with 43 additions and 0 deletions

42
tools/check-cherry-picks.sh Executable file
View File

@ -0,0 +1,42 @@
#!/bin/sh
#
# A tool to check the cherry-pick hashes from the current git commit message
# to verify that they're all on either master or stable/ branches
#
commit_hash=""
# Check if the patch is a merge patch by counting the number of parents.
# If the patch has 2 parents, then the 2nd parent is the patch we want
# to validate.
parent_number=$(git show --format='%P' --quiet | awk '{print NF}')
if [ $parent_number -eq 2 ]; then
commit_hash=$(git show --format='%P' --quiet | awk '{print $NF}')
fi
hashes=$(git show --format='%b' --quiet $commit_hash | sed -nr 's/^.cherry picked from commit (.*).$/\1/p')
checked=0
branches+=""
for hash in $hashes; do
branch=$(git branch -a --contains "$hash" 2>/dev/null| grep -oE '(master|stable/[a-z]+)')
if [ $? -ne 0 ]; then
echo "Cherry pick hash $hash not on any master or stable branches"
exit 1
fi
branches+=" $branch"
checked=$(($checked + 1))
done
if [ $checked -eq 0 ]; then
if ! grep -q '^defaultbranch=stable/' .gitreview; then
echo "Checked $checked cherry-pick hashes: OK"
exit 0
else
if ! git show --format='%B' --quiet | grep -qi 'stable.*only'; then
echo 'Stable branch requires either cherry-pick -x headers or [stable-only] tag!'
exit 1
fi
fi
else
echo Checked $checked cherry-pick hashes on branches: $(echo $branches | tr ' ' '\n' | sort | uniq)
fi

View File

@ -61,6 +61,7 @@ commands =
bash -c "! find doc/ -type f -name *.json | xargs grep -U -n $'\r'"
# Check that all included JSON files are valid JSON
bash -c '! find doc/ -type f -name *.json | xargs -t -n1 python -m json.tool 2>&1 > /dev/null | grep -B1 -v ^python'
bash tools/check-cherry-picks.sh
[testenv:fast8]
description =