Merge branch 'sh/maint-rebase3'

* sh/maint-rebase3:
  rebase--interactive: fix parent rewriting for dropped commits
This commit is contained in:
Junio C Hamano
2008-10-19 16:07:29 -07:00
2 changed files with 174 additions and 2 deletions

View File

@ -38,6 +38,7 @@ DONE="$DOTEST"/done
MSG="$DOTEST"/message
SQUASH_MSG="$DOTEST"/message-squash
REWRITTEN="$DOTEST"/rewritten
DROPPED="$DOTEST"/dropped
PRESERVE_MERGES=
STRATEGY=
ONTO=
@ -182,8 +183,12 @@ pick_one_preserving_merges () {
# rewrite parents; if none were rewritten, we can fast-forward.
new_parents=
for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -f2-)
pend=" $(git rev-list --parents -1 $sha1 | cut -d' ' -f2-)"
while [ "$pend" != "" ]
do
p=$(expr "$pend" : ' \([^ ]*\)')
pend="${pend# $p}"
if test -f "$REWRITTEN"/$p
then
new_p=$(cat "$REWRITTEN"/$p)
@ -196,7 +201,13 @@ pick_one_preserving_merges () {
;;
esac
else
new_parents="$new_parents $p"
if test -f "$DROPPED"/$p
then
fast_forward=f
pend=" $(cat "$DROPPED"/$p)$pend"
else
new_parents="$new_parents $p"
fi
fi
done
case $fast_forward in
@ -607,6 +618,28 @@ first and then run 'git rebase --continue' again."
#
EOF
# Watch for commits that been dropped by --cherry-pick
if test t = "$PRESERVE_MERGES"
then
mkdir "$DROPPED"
# drop the --cherry-pick parameter this time
git rev-list $MERGES_OPTION --abbrev-commit \
--abbrev=7 $UPSTREAM...$HEAD --left-right | \
sed -n "s/^>//p" | while read rev
do
grep --quiet "$rev" "$TODO"
if [ $? -ne 0 ]
then
# Use -f2 because if rev-list is telling this commit is not
# worthwhile, we don't want to track its multiple heads,
# just the history of its first-parent for others that will
# be rebasing on top of us
full=$(git rev-parse $rev)
git rev-list --parents -1 $rev | cut -d' ' -f2 > "$DROPPED"/$full
fi
done
fi
has_action "$TODO" ||
die_abort "Nothing to do"