The code in git-rebase--interactive that creates the todo file contains if-blocks that depend on whether $preserve_merges is active. There is only a very small amount of code in between that is shared with non-merge-preserving code path, so remove the repeated conditions and duplicate the small amount of shared code instead. --- git-rebase--interactive.sh | 69 ++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index fa722b6..4bb8e3f 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -793,28 +793,6 @@ mkdir "$state_dir" || die "Could not create temporary $state_dir" : > "$state_dir"/interactive || die "Could not mark as interactive" write_basic_state -if test t = "$preserve_merges" -then - if test -z "$rebase_root" - then - mkdir "$rewritten" && - for c in $(git merge-base --all $orig_head $upstream) - do - echo $onto > "$rewritten"/$c || - die "Could not init rewritten commits" - done - else - mkdir "$rewritten" && - echo $onto > "$rewritten"/root || - die "Could not init rewritten commits" - fi - # No cherry-pick because our first pass is to determine - # parents to rewrite and skipping dropped commits would - # prematurely end our probe - merges_option= -else - merges_option="--no-merges --cherry-pick" -fi shorthead=$(git rev-parse --short $orig_head) shortonto=$(git rev-parse --short $onto) @@ -839,16 +817,30 @@ add_pick_line () { printf '%s\n' "${comment_out}pick $1 $2" >>"$todo" } -git rev-list $merges_option --pretty=oneline --abbrev-commit \ - --abbrev=7 --reverse --left-right --topo-order \ - $revisions | \ - sed -n "s/^>//p" | -while read -r shortsha1 rest -do - if test t != "$preserve_merges" +if test t = "$preserve_merges" +then + if test -z "$rebase_root" then - add_pick_line $shortsha1 "$rest" + mkdir "$rewritten" && + for c in $(git merge-base --all $orig_head $upstream) + do + echo $onto > "$rewritten"/$c || + die "Could not init rewritten commits" + done else + mkdir "$rewritten" && + echo $onto > "$rewritten"/root || + die "Could not init rewritten commits" + fi + # No cherry-pick because our first pass is to determine + # parents to rewrite and skipping dropped commits would + # prematurely end our probe + git rev-list --pretty=oneline --abbrev-commit \ + --abbrev=7 --reverse --left-right --topo-order \ + $revisions | + sed -n "s/^>//p" | + while read -r shortsha1 rest + do sha1=$(git rev-parse $shortsha1) if test -z "$rebase_root" then @@ -868,12 +860,8 @@ do touch "$rewritten"/$sha1 add_pick_line $shortsha1 "$rest" fi - fi -done - -# Watch for commits that been dropped by --cherry-pick -if test t = "$preserve_merges" -then + done + # Watch for commits that been dropped by --cherry-pick mkdir "$dropped" # Save all non-cherry-picked changes git rev-list $revisions --left-right --cherry-pick | \ @@ -895,6 +883,15 @@ then rm "$rewritten"/$rev fi done +else + git rev-list --no-merges --cherry-pick --pretty=oneline --abbrev-commit \ + --abbrev=7 --reverse --left-right --topo-order \ + $revisions | + sed -n "s/^>//p" | + while read -r shortsha1 rest + do + add_pick_line $shortsha1 "$rest" + done fi test -s "$todo" || echo noop >> "$todo" -- 1.7.11.1.104.ge7b44f1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html