aboutsummaryrefslogtreecommitdiff
path: root/git-rebase--interactive.sh
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-10-19 16:07:29 -0700
committerJunio C Hamano <gitster@pobox.com>2008-10-19 16:07:29 -0700
commit310237b9698219f58cb9dedd7cd9a3a968e1a196 (patch)
treec41e2ef769ba2da5d0e1ec055584140c1a35620b /git-rebase--interactive.sh
parent310d188f7e1d1fbbeace17d5c62e422fd0b5a824 (diff)
parentfaae853ca622844cbb2982700c43ee9b2d93a2c0 (diff)
downloadgit-310237b9698219f58cb9dedd7cd9a3a968e1a196.tar.gz
git-310237b9698219f58cb9dedd7cd9a3a968e1a196.tar.xz
Merge branch 'sh/maint-rebase3'
* sh/maint-rebase3: rebase--interactive: fix parent rewriting for dropped commits
Diffstat (limited to 'git-rebase--interactive.sh')
-rwxr-xr-xgit-rebase--interactive.sh37
1 files changed, 35 insertions, 2 deletions
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 86290f63b..39f8d73df 100755
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -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"