From: Junio C Hamano Date: Sun, 19 Oct 2008 23:07:29 +0000 (-0700) Subject: Merge branch 'sh/maint-rebase3' X-Git-Tag: v1.6.1-rc1~125 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/310237b9698219f58cb9dedd7cd9a3a968e1a196?ds=inline;hp=-c Merge branch 'sh/maint-rebase3' * sh/maint-rebase3: rebase--interactive: fix parent rewriting for dropped commits --- 310237b9698219f58cb9dedd7cd9a3a968e1a196 diff --combined git-rebase--interactive.sh index 86290f63b2,30e45237a2..39f8d73dfa --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@@ -26,7 -26,6 +26,7 @@@ i,interactive always used (no-op continue continue rebasing process abort abort rebasing process and restore original branch skip skip current patch and continue rebasing process +no-verify override pre-rebase hook from stopping the operation " . git-sh-setup @@@ -38,11 -37,11 +38,12 @@@ DONE="$DOTEST"/don MSG="$DOTEST"/message SQUASH_MSG="$DOTEST"/message-squash REWRITTEN="$DOTEST"/rewritten + DROPPED="$DOTEST"/dropped PRESERVE_MERGES= STRATEGY= ONTO= VERBOSE= +OK_TO_SKIP_PRE_REBASE= GIT_CHERRY_PICK_HELP=" After resolving the conflicts, mark the corrected paths with 'git add ', and @@@ -68,8 -67,7 +69,8 @@@ output () } run_pre_rebase_hook () { - if test -x "$GIT_DIR/hooks/pre-rebase" + if test -z "$OK_TO_SKIP_PRE_REBASE" && + test -x "$GIT_DIR/hooks/pre-rebase" then "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} || { echo >&2 "The pre-rebase hook refused to rebase." @@@ -182,8 -180,12 +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 -198,13 +201,13 @@@ ;; 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 @@@ -424,11 -432,6 +435,11 @@@ get_saved_options () while test $# != 0 do case "$1" in + --no-verify) + OK_TO_SKIP_PRE_REBASE=yes + ;; + --verify) + ;; --continue) is_standalone "$@" || usage get_saved_options @@@ -607,6 -610,28 +618,28 @@@ first and then run 'git rebase --contin # 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"