blob: c92bebd4ce1ae61ad25e17eb97a95b369d86a845 [file] [log] [blame]
#!/bin/bash
#
# Try to grab commits from one stable tree into another, stopping to fix
# backports if required.
#
. common
function pick_one {
# Let's try cherry-picking the given commit first.
git cherry-pick --strategy=recursive -Xpatience -x $1 &> /dev/null
if [ $? -gt "0" ]; then
if [ $(git status -uno --porcelain | wc -l) -eq 0 ]; then
git reset --hard
return 1
fi
git reset --hard
# That didn't work? Let's try that with every variation of the commit
# in other stable trees.
for i in $(stable-find-alts $1); do
git cherry-pick --strategy=recursive -Xpatience -x $i &> /dev/null
if [ $? -eq 0 ]; then
return 0
fi
git reset --hard
done
# Still no? Let's go back to the original commit and hand it off to
# the user.
git cherry-pick -x $1 &> /dev/null
fi
return $?
}
function do_dep {
cmt=$1
#return
STABLE_MAJ_VER=$(grep VERSION Makefile | head -n1 | awk {'print $3'})
STABLE_MIN_VER=$(grep PATCHLEVEL Makefile | head -n1 | awk {'print $3'})
if [ $(cat ~/deps/v$STABLE_MAJ_VER.$STABLE_MIN_VER/$cmt | wc -l) -gt 10 ]; then
return
fi
#/bin/bash
echo -e "FAILED: $(git ol $cmt)\n\n" > ~/deps-list
oldhead=$(git branch --show-current)
if [ "$oldhead" == "" ]; then
oldhead=$(git rev-parse HEAD)
fi
git branch -D tmp-merge-triangle
git checkout -b tmp-merge-triangle
for i in $(cat ~/deps/v$STABLE_MAJ_VER.$STABLE_MIN_VER/$cmt | awk {'print $1'} | tac); do
if [ $(git show $i | grep '^Merge: ' | wc -l) -gt 0 ]; then
continue
fi
cur=$(git rev-parse HEAD)
stable steal-commits-nodeps $i^..$i
if [ "$(git rev-parse HEAD)" == "$cur" ]; then
stat="FAILED"
else
stat="OK"
fi
echo "$(git ol $i) - $stat" >> ~/deps-list
done
echo "Pausing for deps review..."
git checkout $oldhead
git merge --no-ff -F ~/deps-list tmp-merge-triangle
git branch -D tmp-merge-triangle
# /bin/bash
}
function do_one {
# for i in $(git log --no-merges --format="%H" -i --grep 'cc:.*stable' $1 | tac); do
# for i in $(git log --no-merges --format="%H" -i --grep 'cc:.*stable' --grep 'fixes:' $1 | tac); do
# for i in $(git log --no-merges --format="%H" --invert-grep --grep 'stable@' $1 $2 | tac); do
# for i in $(git log --no-merges --format="%H" --invert-grep -i --grep 'cc:.*stable' --grep "fixes:" $1 $2 | tac); do
for i in $(git log --no-merges --format="%H" $1 $2 | tac); do
# for i in $(git log --no-merges --format="%H" -i --grep 'Fixes:' $1 $2 | tac); do
# if [ $(git show $i | grep -i "cc:.*stable" | wc -l) -gt 0 ]; then
# continue
# fi
# for i in $(git log --no-merges --format="%H" -i --grep 'Fixes:' $1 $2 | tac); do
subj=$(git log -1 --format="%s" $i)
# Let's grab the mainline commit id, this is useful if the version tag
# doesn't exist in the commit we're looking at but exists upstream.
STABLE_MAJ_VER=$(grep VERSION Makefile | head -n1 | awk {'print $3'})
STABLE_MIN_VER=$(grep PATCHLEVEL Makefile | head -n1 | awk {'print $3'})
for ss in $(git log --no-merges --format="%H" -F --grep "$subj" v$STABLE_MAJ_VER.$STABLE_MIN_VER..origin/master); do
newsub=$(git log -1 --format="%s" $ss)
if [ "$newsub" == "$subj" ]; then
orig_cmt=$ss
fi
done
#orig_cmt=$i
# If the commit doesn't apply for us, skip it
check_relevant $orig_cmt
if [ $? -eq "0" ]; then
echo "This commits not relevant!"
continue
fi
stable commit-in-tree $orig_cmt
if [ $? -eq 1 ]; then
echo "This commit already in tree!"
continue
fi
if [ "$(git notes show $orig_cmt 2> /dev/null | wc -l)" -gt 0 ]; then
git notes show $orig_cmt
/bin/bash
fi
pick_one $i
if [ $? -gt 0 ] ; then
if [ $(git status -uno --porcelain | wc -l) -eq 0 ]; then
git reset --hard
continue
fi
echo "Cherry pick failed. Fix, commit (or reset) and exit."
git cherry-pick --quit; git reset --hard
do_dep $orig_cmt
echo $orig_cmt $STABLE_MAJ_VER.$STABLE_MIN_VER >> ~/failed
continue
fi
# If we didn't find the commit upstream then this must be a custom commit
# in the given tree - make sure the user checks this commit.
if [ "$orig_cmt" = "" ] ; then
msg="Custom"
orig_cmt=$(git rev-parse HEAD)
echo "Custom commit, please double-check!"
/bin/bash
fi
stable-make-pretty $orig_cmt $msg
done
}
if [ "$#" -ne 1 ] && [ "$#" -ne 2 ]; then
echo "Usage: stable steal-commits <commit range> [branch]"
exit 1
fi
do_one $1 $2