Drop support for git rebase --preserve-merges
Subsystems (2)
cover Drop support for git rebase --preserve-merges
In 427c3bd28ab (rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. This patch series drops that deprecated backend. Maybe we want to make that happen around v2.26.0?
Note: this patch series is based on js/git-svn-use-rebase-merges
Johannes Schindelin (8):
t5520: do not use pull.rebase=preserve
remote: warn about unhandled branch.<name>.rebase values
tests: stop testing git rebase --preserve-merges
pull: remove support for --rebase=preserve
rebase: drop support for --preserve-merges
git-svn: drop support for --preserve-merges
rebase: drop the internal rebase--interactive command
remote: no longer claim that branch.*.rebase=preserve is a thing
.gitignore | 1 - Documentation/config/branch.txt | 4 - Documentation/config/pull.txt | 4 - Documentation/git-pull.txt | 6 +- Documentation/git-rebase.txt | 47 - Documentation/git-svn.txt | 1 - Makefile | 2 - azure-pipelines.yml | 2 - builtin/pull.c | 12 +- builtin/rebase.c | 316 +----- builtin/remote.c | 5 +- contrib/completion/git-completion.bash | 2 +- git-rebase--preserve-merges.sh | 1067 --------------------- git-svn.perl | 1 - git.c | 1 - t/t3404-rebase-interactive.sh | 76 -- t/t3408-rebase-multi-line.sh | 10 - t/t3409-rebase-preserve-merges.sh | 127 --- t/t3410-rebase-preserve-dropped-merges.sh | 90 -- t/t3411-rebase-preserve-around-merges.sh | 80 -- t/t3412-rebase-root.sh | 37 - t/t3414-rebase-preserve-onto.sh | 85 -- t/t3418-rebase-continue.sh | 15 - t/t3421-rebase-topology-linear.sh | 19 - t/t3422-rebase-incompatible-options.sh | 11 - t/t3425-rebase-topology-merges.sh | 151 --- t/t3427-rebase-subtree.sh | 19 - t/t5520-pull.sh | 24 +- t/t7505-prepare-commit-msg-hook.sh | 1 - t/t7517-per-repo-email.sh | 13 - t/test-lib.sh | 4 - 31 files changed, 17 insertions(+), 2216 deletions(-) delete mode 100644 git-rebase--preserve-merges.sh delete mode 100755 t/t3409-rebase-preserve-merges.sh delete mode 100755 t/t3410-rebase-preserve-dropped-merges.sh delete mode 100755 t/t3411-rebase-preserve-around-merges.sh delete mode 100755 t/t3414-rebase-preserve-onto.sh
base-commit: ea8b7be1476a2301e3658a8e626b69c9d7f540bd
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-195%2Fdscho%2Fdrop-rebase-p-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-195/dscho/drop-rebase-p-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/195
Signature · 1 line
gitgitgadget
PATCH 1/8 t5520: do not use `pull.rebase=preserve`
From: Johannes Schindelin <[email protected]>
Even if those tests try to override that setting, let's not use it because it is deprecated: let's use merges instead.
--- t/t5520-pull.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
t/t5520-pull.sh +3 -3
@@ -509,7 +509,7 @@ test_expect_success '--rebase=false create a new merge commit' ' test_expect_success '--rebase=true rebases and flattens keep-merge' ' git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && + test_config pull.rebase merges && git pull --rebase=true . copy && test "$(git rev-parse HEAD^^)" = "$(git rev-parse copy)" && test file3 = "$(git show HEAD:file3.t)"
@@ -529,9 +529,9 @@ test_expect_success '--rebase=invalid fails' ' ! git pull --rebase=invalid . copy ' -test_expect_success '--rebase overrides pull.rebase=preserve and flattens keep-merge' ' +test_expect_success '--rebase overrides pull.rebase=merges and flattens keep-merge' ' git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && + test_config pull.rebase merges && git pull --rebase . copy && test "$(git rev-parse HEAD^^)" = "$(git rev-parse copy)" && test file3 = "$(git show HEAD:file3.t)"
Signature · 1 line
gitgitgadget
PATCH 2/8 remote: warn about unhandled branch.<name>.rebase values
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
We ignore them silently, but it actually makes sense to warn the users that their config setting has no effect.
--- builtin/remote.c | 3 +++ 1 file changed, 3 insertions(+)
builtin/remote.c +3 -0
@@ -315,6 +315,9 @@ static int config_read_branches(const char *key, const char *value, void *cb) info->rebase =REBASE_MERGES ; else if (!strcmp(value, "interactive")) info->rebase =INTERACTIVE_REBASE ; + else + warning(_("unhandled branch.%s.rebase=%s"), + name, value); } }return 0 ;
Signature · 1 line
gitgitgadget
PATCH 3/8 tests: stop testing `git rebase --preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
This backend has been deprecated in favor of git rebase --rebase-merges.
In preparation for dropping it, let's remove all the regression tests that would need it.
--- azure-pipelines.yml | 2 - t/t3404-rebase-interactive.sh | 76 ----------- t/t3408-rebase-multi-line.sh | 10 -- t/t3409-rebase-preserve-merges.sh | 127 ------------------ t/t3410-rebase-preserve-dropped-merges.sh | 90 ------------- t/t3411-rebase-preserve-around-merges.sh | 80 ------------ t/t3412-rebase-root.sh | 37 ------ t/t3414-rebase-preserve-onto.sh | 85 ------------ t/t3418-rebase-continue.sh | 15 --- t/t3421-rebase-topology-linear.sh | 19 --- t/t3422-rebase-incompatible-options.sh | 11 -- t/t3425-rebase-topology-merges.sh | 151 ---------------------- t/t3427-rebase-subtree.sh | 19 --- t/t5520-pull.sh | 18 --- t/t7505-prepare-commit-msg-hook.sh | 1 - t/t7517-per-repo-email.sh | 13 -- t/test-lib.sh | 4 - 17 files changed, 758 deletions(-) delete mode 100755 t/t3409-rebase-preserve-merges.sh delete mode 100755 t/t3410-rebase-preserve-dropped-merges.sh delete mode 100755 t/t3411-rebase-preserve-around-merges.sh delete mode 100755 t/t3414-rebase-preserve-onto.sh
azure-pipelines.yml +0 -2
@@ -106,7 +106,6 @@ jobs: HOME: $(Build.SourcesDirectory) MSYSTEM: MINGW64 NO_SVN_TESTS: 1 - GIT_TEST_SKIP_REBASE_P: 1 - powershell: | if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") { cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
@@ -265,7 +264,6 @@ jobs: HOME: $(Build.SourcesDirectory) MSYSTEM: MINGW64 NO_SVN_TESTS: 1 - GIT_TEST_SKIP_REBASE_P: 1 - powershell: | if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") { cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
t/t3404-rebase-interactive.sh +0 -76
82 lines not on this page · raw message
t/t3408-rebase-multi-line.sh +0 -10
@@ -52,14 +52,4 @@ test_expect_success rebase ' test_cmp expect actual ' -test_expect_success REBASE_P rebasep ' - - git checkout side-merge && - git rebase -p side && - git cat-file commit HEAD | sed -e "1,/^\$/d" >actual && - git cat-file commit side-merge-original | sed -e "1,/^\$/d" >expect && - test_cmp expect actual - -' - test_done
t/t3409-rebase-preserve-merges.sh deleted +0 -127
127 lines not on this page · raw message
t/t3410-rebase-preserve-dropped-merges.sh deleted +0 -90
90 lines not on this page · raw message
t/t3411-rebase-preserve-around-merges.sh deleted +0 -80
80 lines not on this page · raw message
t/t3412-rebase-root.sh +0 -37
@@ -86,17 +86,6 @@ test_expect_success 'pre-rebase got correct input (4)' ' test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work4 ' -test_expect_success REBASE_P 'rebase -i -p with linear history' ' - git checkout -b work5 other && - git rebase -i -p --root --onto master && - git log --pretty=tformat:"%s" > rebased5 && - test_cmp expect rebased5 -' - -test_expect_success REBASE_P 'pre-rebase got correct input (5)' ' - test "z$(cat .git/PRE-REBASE-INPUT)" = z--root, -' - test_expect_success 'set up merge history' ' git checkout other^ && git checkout -b side &&
@@ -120,13 +109,6 @@ commit work6~4 1 EOF -test_expect_success REBASE_P 'rebase -i -p with merge' ' - git checkout -b work6 other && - git rebase -i -p --root --onto master && - log_with_names work6 > rebased6 && - test_cmp expect-side rebased6 -' - test_expect_success 'set up second root and merge' ' git symbolic-ref HEAD refs/heads/third && rm .git/index &&
@@ -155,13 +137,6 @@ commit work7~5 1 EOF -test_expect_success REBASE_P 'rebase -i -p with two roots' ' - git checkout -b work7 other && - git rebase -i -p --root --onto master && - log_with_names work7 > rebased7 && - test_cmp expect-third rebased7 -' - test_expect_success 'setup pre-rebase hook that fails' ' mkdir -p .git/hooks && cat >.git/hooks/pre-rebase <<EOF &&
@@ -261,21 +236,9 @@ commit conflict3~6 1 EOF -test_expect_success REBASE_P 'rebase -i -p --root with conflict (first part)' ' - git checkout -b conflict3 other && - test_must_fail git rebase -i -p --root --onto master && - git ls-files -u | grep "B$" -' - test_expect_success 'fix the conflict' ' echo 3 > B && git add B ' -test_expect_success REBASE_P 'rebase -i -p --root with conflict (second part)' ' - git rebase --continue && - log_with_names conflict3 >out && - test_cmp expect-conflict-p out -' - test_done
t/t3414-rebase-preserve-onto.sh deleted +0 -85
85 lines not on this page · raw message
t/t3418-rebase-continue.sh +0 -15
@@ -106,20 +106,6 @@ test_expect_success 'rebase -i --continue handles merge strategy and options' ' test -f funny.was.run ' -test_expect_success REBASE_P 'rebase passes merge strategy options correctly' ' - rm -fr .git/rebase-* && - git reset --hard commit-new-file-F3-on-topic-branch && - test_commit theirs-to-merge && - git reset --hard HEAD^ && - test_commit some-commit && - test_tick && - git merge --no-ff theirs-to-merge && - FAKE_LINES="1 edit 2 3" git rebase -i -f -p -m \ - -s recursive --strategy-option=theirs HEAD~2 && - test_commit force-change && - git rebase --continue -' - test_expect_success 'rebase -r passes merge strategy options correctly' ' rm -fr .git/rebase-* && git reset --hard commit-new-file-F3-on-topic-branch &&
@@ -255,7 +241,6 @@ test_rerere_autoupdate test_rerere_autoupdate -m GIT_SEQUENCE_EDITOR=: && export GIT_SEQUENCE_EDITOR test_rerere_autoupdate -i -test_have_prereq !REBASE_P || test_rerere_autoupdate --preserve-merges unset GIT_SEQUENCE_EDITOR test_expect_success 'the todo command "break" works' '
t/t3421-rebase-topology-linear.sh +0 -19
@@ -29,7 +29,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_expect_success 'setup branches and remote tracking' ' git tag -l >tags &&
@@ -53,7 +52,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -70,7 +68,6 @@ test_run_rebase success '' test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -87,7 +84,6 @@ test_run_rebase success '' test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -102,7 +98,6 @@ test_run_rebase success '' test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p # f # /
@@ -142,7 +137,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -157,7 +151,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -172,7 +165,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -187,7 +179,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p # a---b---c---j! # \
@@ -215,7 +206,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -230,7 +220,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -245,7 +234,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase success --rebase-merges # m
@@ -285,7 +273,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -300,7 +287,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -315,7 +301,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -331,7 +316,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -346,7 +330,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -360,7 +343,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -375,6 +357,5 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_done
t/t3422-rebase-incompatible-options.sh +0 -11
@@ -65,15 +65,4 @@ test_rebase_am_only --ignore-whitespace test_rebase_am_only --committer-date-is-author-date test_rebase_am_only -C4 -test_expect_success REBASE_P '--preserve-merges incompatible with --signoff' ' - git checkout B^0 && - test_must_fail git rebase --preserve-merges --signoff A -' - -test_expect_success REBASE_P \ - '--preserve-merges incompatible with --rebase-merges' ' - git checkout B^0 && - test_must_fail git rebase --preserve-merges --rebase-merges A -' - test_done
t/t3425-rebase-topology-merges.sh +0 -151
155 lines not on this page · raw message
t/t3427-rebase-subtree.sh +0 -19
@@ -66,25 +66,6 @@ test_expect_success 'setup' ' git commit -m "Empty commit" --allow-empty ' -# FAILURE: Does not preserve master4. -test_expect_failure REBASE_P 'Rebase -Xsubtree --preserve-merges --onto commit' ' - reset_rebase && - git checkout -b rebase-preserve-merges to-rebase && - git rebase -Xsubtree=files_subtree --preserve-merges --onto files-master master && - verbose test "$(commit_message HEAD~)" = "master4" && - verbose test "$(commit_message HEAD)" = "files_subtree/master5" -' - -# FAILURE: Does not preserve master4. -test_expect_failure REBASE_P 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit' ' - reset_rebase && - git checkout -b rebase-keep-empty to-rebase && - git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master && - verbose test "$(commit_message HEAD~2)" = "master4" && - verbose test "$(commit_message HEAD~)" = "files_subtree/master5" && - verbose test "$(commit_message HEAD)" = "Empty commit" -' - test_expect_success 'Rebase -Xsubtree --keep-empty --onto commit' ' reset_rebase && git checkout -b rebase-onto to-rebase &&
t/t5520-pull.sh +0 -18
@@ -461,15 +461,6 @@ test_expect_success 'pull.rebase=1 is treated as true and flattens keep-merge' ' test file3 = "$(git show HEAD:file3.t)" ' -test_expect_success REBASE_P \ - 'pull.rebase=preserve rebases and merges keep-merge' ' - git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && - git pull . copy && - test "$(git rev-parse HEAD^^)" = "$(git rev-parse copy)" && - test "$(git rev-parse HEAD^2)" = "$(git rev-parse keep-merge)" -' - test_expect_success 'pull.rebase=interactive' ' write_script "$TRASH_DIRECTORY/fake-editor" <<-\EOF && echo I was here >fake.out &&
@@ -515,15 +506,6 @@ test_expect_success '--rebase=true rebases and flattens keep-merge' ' test file3 = "$(git show HEAD:file3.t)" ' -test_expect_success REBASE_P \ - '--rebase=preserve rebases and merges keep-merge' ' - git reset --hard before-preserve-rebase && - test_config pull.rebase true && - git pull --rebase=preserve . copy && - test "$(git rev-parse HEAD^^)" = "$(git rev-parse copy)" && - test "$(git rev-parse HEAD^2)" = "$(git rev-parse keep-merge)" -' - test_expect_success '--rebase=invalid fails' ' git reset --hard before-preserve-rebase && ! git pull --rebase=invalid . copy
t/t7505-prepare-commit-msg-hook.sh +0 -1
@@ -247,7 +247,6 @@ test_rebase () { } test_rebase success -test_have_prereq !REBASE_P || test_rebase success -p test_expect_success 'with hook (cherry-pick)' ' test_when_finished "git checkout -f master" &&
t/t7517-per-repo-email.sh +0 -13
@@ -72,19 +72,6 @@ test_expect_success 'noop interactive rebase does not care about ident' ' git rebase -i HEAD^ ' -test_expect_success REBASE_P \ - 'fast-forward rebase does not care about ident (preserve)' ' - git checkout -B tmp side-without-commit && - git rebase -p master -' - -test_expect_success REBASE_P \ - 'non-fast-forward rebase refuses to write commits (preserve)' ' - test_when_finished "git rebase --abort || true" && - git checkout -B tmp side-with-commit && - test_must_fail git rebase -p master -' - test_expect_success 'author.name overrides user.name' ' test_config user.name user && test_config user.email [email protected] &&
t/test-lib.sh +0 -4
@@ -1634,7 +1634,3 @@ test_lazy_prereq CURL ' test_lazy_prereq SHA1 ' test $(git hash-object /dev/null) = e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 ' - -test_lazy_prereq REBASE_P ' - test -z "$GIT_TEST_SKIP_REBASE_P" -'
Signature · 1 line
gitgitgadget
PATCH 4/8 pull: remove support for `--rebase=preserve`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
In preparation for git-rebase--preserve-merges.sh entering its after life, we remove this (deprecated) option that would still rely on it.
--- Documentation/config/branch.txt | 4 ---- Documentation/config/pull.txt | 4 ---- Documentation/git-pull.txt | 6 +----- builtin/pull.c | 12 +++--------- contrib/completion/git-completion.bash | 2 +- 5 files changed, 5 insertions(+), 23 deletions(-)
Documentation/config/branch.txt +0 -4
@@ -85,10 +85,6 @@ When `merges`, pass the `--rebase-merges` option to 'git rebase' so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When `preserve` (deprecated in favor of `merges`), also pass -`--preserve-merges` along to 'git rebase' so that locally committed merge -commits will not be flattened by running 'git pull'. -+ When the value is `interactive`, the rebase is run in interactive mode. + *NOTE*: this is a possibly dangerous operation; do *not* use
Documentation/config/pull.txt +0 -4
@@ -18,10 +18,6 @@ When `merges`, pass the `--rebase-merges` option to 'git rebase' so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When `preserve` (deprecated in favor of `merges`), also pass -`--preserve-merges` along to 'git rebase' so that locally committed merge -commits will not be flattened by running 'git pull'. -+ When the value is `interactive`, the rebase is run in interactive mode. + *NOTE*: this is a possibly dangerous operation; do *not* use
Documentation/git-pull.txt +1 -5
@@ -101,7 +101,7 @@ Options related to merging include::merge-options.txt[] -r:: ---rebase[=false|true|merges|preserve|interactive]:: +--rebase[=false|true|merges|interactive]:: When true, rebase the current branch on top of the upstream branch after fetching. If there is a remote-tracking branch corresponding to the upstream branch and the upstream branch
@@ -112,10 +112,6 @@ When set to `merges`, rebase using `git rebase --rebase-merges` so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When set to `preserve` (deprecated in favor of `merges`), rebase with the -`--preserve-merges` option passed to `git rebase` so that locally created -merge commits will not be flattened. -+ When false, merge the current branch into the upstream branch. + When `interactive`, enable the interactive mode of rebase.
builtin/pull.c +3 -9
@@ -30,7 +30,6 @@ enum rebase_type {REBASE_INVALID =-1 ,REBASE_FALSE =0 ,REBASE_TRUE , -REBASE_PRESERVE ,REBASE_MERGES , REBASE_INTERACTIVE };
@@ -38,9 +37,8 @@ enum rebase_type {/** * Parses the value of --rebase. If value is a false value, returns * REBASE_FALSE. If value is a true value, returns REBASE_TRUE. If value is -* "merges", returns REBASE_MERGES. If value is "preserve", returns -* REBASE_PRESERVE. If value is a invalid value, dies with a fatal error if -* fatal is true, otherwise returns REBASE_INVALID. +* "merges", returns REBASE_MERGES. If value is a invalid value, dies with +* a fatal error if fatal is true, otherwise returns REBASE_INVALID. */ static enum rebase_type parse_config_rebase (const char *key,const char *value,int fatal)
@@ -51,8 +49,6 @@ static enum rebase_type parse_config_rebase(const char *key, const char *value,return REBASE_FALSE ; else if (v > 0) return REBASE_TRUE; - else if (!strcmp(value, "preserve") || !strcmp(value, "p")) - return REBASE_PRESERVE; else if (!strcmp(value, "merges") || !strcmp(value, "m")) return REBASE_MERGES; else if (!strcmp(value, "interactive") || !strcmp(value, "i"))
@@ -145,7 +141,7 @@ static struct option pull_options[] = {/* Options passed to git-merge or git-rebase */ OPT_GROUP (N_ ("Options related to merging" )), { OPTION_CALLBACK, 'r', "rebase", &opt_rebase, -"(false|true|merges|preserve|interactive)" , +"(false|true|merges|interactive)" ,N_ ("incorporate changes by rebasing rather than merging" ), PARSE_OPT_OPTARG, parse_opt_rebase }, OPT_PASSTHRU('n', NULL, &opt_diffstat, NULL,
@@ -848,8 +844,6 @@ static int run_rebase(const struct object_id *curr_head,/* Options passed to git-rebase */ if (opt_rebase ==REBASE_MERGES )argv_array_push (&args,"--rebase-merges" ); -else if (opt_rebase ==REBASE_PRESERVE ) -argv_array_push (&args,"--preserve-merges" );else if (opt_rebase ==REBASE_INTERACTIVE )argv_array_push (&args,"--interactive" );if (opt_diffstat)
contrib/completion/git-completion.bash +1 -1
@@ -2276,7 +2276,7 @@ __git_complete_config_variable_value () return ;; branch.*.rebase) - __gitcomp "false true merges preserve interactive" "" "$cur_" + __gitcomp "false true merges interactive" "" "$cur_" return ;; remote.pushdefault)
Signature · 1 line
gitgitgadget
PATCH 5/8 rebase: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
This option was deprecated in favor of --rebase-merges some time ago, and now we retire it.
--- .gitignore | 1 - Documentation/git-rebase.txt | 47 -- Makefile | 2 - builtin/rebase.c | 135 +--- git-rebase--preserve-merges.sh | 1067 -------------------------------- 5 files changed, 6 insertions(+), 1246 deletions(-) delete mode 100644 git-rebase--preserve-merges.sh
.gitignore +0 -1
@@ -123,7 +123,6 @@ /git-range-diff /git-read-tree /git-rebase -/git-rebase--preserve-merges /git-receive-pack /git-reflog /git-remote
Documentation/git-rebase.txt +0 -47
83 lines not on this page · raw message
Makefile +0 -2
@@ -616,7 +616,6 @@ SCRIPT_SH += git-web--browse.sh SCRIPT_LIB += git-mergetool--lib SCRIPT_LIB += git-parse-remote -SCRIPT_LIB += git-rebase--preserve-merges SCRIPT_LIB += git-sh-setup SCRIPT_LIB += git-sh-i18n
@@ -2522,7 +2521,6 @@ XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \ LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H) LOCALIZED_SH = $(SCRIPT_SH) LOCALIZED_SH += git-parse-remote.sh -LOCALIZED_SH += git-rebase--preserve-merges.sh LOCALIZED_SH += git-sh-setup.sh LOCALIZED_PERL = $(SCRIPT_PERL)
builtin/rebase.c +6 -129
215 lines not on this page · raw message
git-rebase--preserve-merges.sh deleted +0 -1067
1,067 lines not on this page · raw message
Signature · 1 line
gitgitgadget
PATCH 6/8 git-svn: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
We already passed the --rebase-merges option to git rebase instead, now we make this move permanent.
--- Documentation/git-svn.txt | 1 - git-svn.perl | 1 - 2 files changed, 2 deletions(-)
Documentation/git-svn.txt +0 -1
@@ -678,7 +678,6 @@ config key: svn.authorsProg --strategy=<strategy>:: -p:: --rebase-merges:: ---preserve-merges (DEPRECATED):: These are only used with the 'dcommit' and 'rebase' commands. + Passed directly to 'git rebase' when using 'dcommit' if a
git-svn.perl +0 -1
@@ -271,7 +271,6 @@ sub _req_svn { 'fetch-all|all' => \$_fetch_all, 'dry-run|n' => \$_dry_run, 'rebase-merges|p' => \$_rebase_merges, - 'preserve-merges|p' => \$_rebase_merges, %fc_opts } ], 'commit-diff' => [ \&cmd_commit_diff, 'Commit a diff between two trees',
Signature · 1 line
gitgitgadget
Eric Wong
NAKRe: [PATCH 6/8] git-svn: drop support for `--preserve-merges`
Quoted 8 lines · Johannes Schindelin via GitGitGadget
We already passed the
--rebase-mergesoption togit rebaseinstead, now we make this move permanent.git-svn.perl +0
-0
git-svn.perl sub _req_svn { · line 276
Quoted 7 lines
git-svn.perl +0
-1@@ -271,7 +271,6 @@ sub _req_svn { 'fetch-all|all' => \$_fetch_all, 'dry-run|n' => \$_dry_run, 'rebase-merges|p' => \$_rebase_merges, - 'preserve-merges|p' => \$_rebase_merges, %fc_opts } ], 'commit-diff' => [ \&cmd_commit_diff, 'Commit a diff between two trees',
Nack, it breaks existing usages. Why the urgency with removal?
I don't know a whole lot about this rebase feature in particular, but deprecation periods should be measured in years or even decades because of LTS distros. Not months, especially for things which have been around for a long while.
Re: [PATCH 6/8] git-svn: drop support for `--preserve-merges`
Hi Eric,
Quoted 4 lines · Eric Wong
Quoted 2 lines · Johannes Schindelin via GitGitGadget
We already passed the
--rebase-mergesoption togit rebaseinstead, now we make this move permanent.
Quoted 14 lines
git-svn.perl sub _req_svn { · line 276
Quoted 12 lines
git-svn.perl +0
-1@@ -271,7 +271,6 @@ sub _req_svn { 'fetch-all|all' => \$_fetch_all, 'dry-run|n' => \$_dry_run, 'rebase-merges|p' => \$_rebase_merges, - 'preserve-merges|p' => \$_rebase_merges, %fc_opts } ], 'commit-diff' => [ \&cmd_commit_diff, 'Commit a diff between two trees',Nack, it breaks existing usages. Why the urgency with removal?
Which urgency? The cover letter spells it out quite clearly that this is not even intended for v2.25.0, which is still over 2 months out.
The reason I submitted this patch series now is so that we can avoid inadvertent new users of the --preserve-merges backend.
Quoted 4 lines
I don't know a whole lot about this rebase feature in particular, but deprecation periods should be measured in years or even decades because of LTS distros. Not months, especially for things which have been around for a long while.
The LTS distros will not even pick up this patch. So that's a red herring.
But yes, you're right, v2.25.0 will probably be the first version to even have the --rebase-merges option in git svn, and therefore v2.26.0 would be awfully early a time to drop --preserve-merges in git svn. Question is whether we want to split this patch series, or just rather wait with merging it to master until a year from now, or something like that?
Ciao,
Dscho
Re: [PATCH 6/8] git-svn: drop support for `--preserve-merges`
Quoted 19 lines · Johannes Schindelin
Quoted 4 lines
Quoted 2 lines · Johannes Schindelin via GitGitGadget
We already passed the
--rebase-mergesoption togit rebaseinstead, now we make this move permanent.Quoted 14 lines
git-svn.perl sub _req_svn { · line 276
Quoted 12 lines
git-svn.perl +0
-1@@ -271,7 +271,6 @@ sub _req_svn { 'fetch-all|all' => \$_fetch_all, 'dry-run|n' => \$_dry_run, 'rebase-merges|p' => \$_rebase_merges, - 'preserve-merges|p' => \$_rebase_merges, %fc_opts } ], 'commit-diff' => [ \&cmd_commit_diff, 'Commit a diff between two trees',Nack, it breaks existing usages. Why the urgency with removal?
Quoted 2 lines
Which urgency? The cover letter spells it out quite clearly that this is not even intended for v2.25.0, which is still over 2 months out.
"Months" a blink of an eye when it comes to deprecations and removals.
Quoted 2 lines
The reason I submitted this patch series now is so that we can avoid inadvertent new users of the
--preserve-mergesbackend.
Then documenting it as deprecated and warning is all that's needed.
Quoted 5 lines
Quoted 4 lines
I don't know a whole lot about this rebase feature in particular, but deprecation periods should be measured in years or even decades because of LTS distros. Not months, especially for things which have been around for a long while.
Quoted 8 lines
The LTS distros will not even pick up this patch. So that's a red herring.
But yes, you're right, v2.25.0 will probably be the first version to even have the
--rebase-mergesoption ingit svn, and therefore v2.26.0 would be awfully early a time to drop--preserve-mergesingit svn. Question is whether we want to split this patch series, or just rather wait with merging it tomasteruntil a year from now, or something like that?
Fwiw, I object to the regressions to all the other commands (rebase/pull/remote) in this series, too, but I mainly do Perl.
--preserve-merges was only deprecated in v2.22.0 (2019-06-07). LTS distro users are very likely on pre-v2.22.0, more likely v2.1x.0 and maybe even v2.x.0.
Their next LTS release could be several years from now. We could be on git 2.[345]x.0 by then and that's when the LTS packagers could package the next version. LTS users are likely to never see the entire period from v2.22.0..v2.25.0 and thus never see a deprecation warning.
Even Debian stable (not exactly LTS, but still on the slower side) went from v2.11.0 in Debian 9 all the way to v2.20.1 in Debian 10. Actual LTS users will see bigger jumps.
PATCH 7/8 rebase: drop the internal `rebase--interactive` command
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
It was only used by the --preserve-merges backend, which we just removed.
--- builtin/rebase.c | 181 ----------------------------------------------- git.c | 1 - 2 files changed, 182 deletions(-)
builtin/rebase.c +0 -181
@@ -142,81 +142,6 @@ static const char *action_names[] = { "undefined","edit_todo" , "show_current_patch" }; -static int add_exec_commands (struct string_list *commands) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); - -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - -todo_list_add_exec_commands (&todo_list, commands); - res =todo_list_write_to_file (the_repository, &todo_list, - todo_file,NULL ,NULL ,-1 ,0 ); -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} - -static int rearrange_squash_in_todo_file (void ) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res =0 ; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - - res =todo_list_rearrange_squash (&todo_list); -if (!res) - res =todo_list_write_to_file (the_repository, &todo_list, - todo_file,NULL ,NULL ,-1 ,0 ); - -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} - -static int transform_todo_file (unsigned flags) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); - -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - - res =todo_list_write_to_file (the_repository, &todo_list, todo_file, -NULL ,NULL ,-1 , flags); -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} -static int edit_todo_file (unsigned flags) {const char *todo_file =rebase_path_todo ();
@@ -408,24 +333,6 @@ static int run_rebase_interactive(struct rebase_options *opts,break ; } -case ACTION_SHORTEN_OIDS : -case ACTION_EXPAND_OIDS : - ret =transform_todo_file (flags); -break ; -case ACTION_CHECK_TODO_LIST : - ret =check_todo_list_from_file (the_repository); -break ; -case ACTION_REARRANGE_SQUASH : - ret =rearrange_squash_in_todo_file (); -break ; -case ACTION_ADD_EXEC : { -struct string_list commands =STRING_LIST_INIT_DUP ; - -split_exec_commands (opts->cmd, &commands); - ret =add_exec_commands (&commands); -string_list_clear (&commands,0 ); -break ; - }default :BUG ("invalid command '%d'" , command); }
@@ -433,94 +340,6 @@ static int run_rebase_interactive(struct rebase_options *opts,return ret; } -static const char *const builtin_rebase_interactive_usage[] = { -N_ ("git rebase--interactive [<options>]" ), -NULL -}; - -int cmd_rebase__interactive (int argc,const char **argv,const char *prefix) -{ -struct rebase_options opts =REBASE_OPTIONS_INIT ; -struct object_id squash_onto = null_oid; -enum action command =ACTION_NONE ; -struct option options[] = { -OPT_NEGBIT (0 ,"ff" , &opts.flags,N_ ("allow fast-forward" ), -REBASE_FORCE ), -OPT_BOOL (0 ,"keep-empty" , &opts.keep_empty,N_ ("keep empty commits" )), -OPT_BOOL (0 ,"allow-empty-message" , &opts.allow_empty_message, -N_ ("allow commits with empty messages" )), -OPT_BOOL (0 ,"rebase-merges" , &opts.rebase_merges,N_ ("rebase merge commits" )), -OPT_BOOL (0 ,"rebase-cousins" , &opts.rebase_cousins, -N_ ("keep original branch points of cousins" )), -OPT_BOOL (0 ,"autosquash" , &opts.autosquash, -N_ ("move commits that begin with squash!/fixup!" )), -OPT_BOOL (0 ,"signoff" , &opts.signoff,N_ ("sign commits" )), -OPT_BIT ('v' ,"verbose" , &opts.flags, -N_ ("display a diffstat of what changed upstream" ), -REBASE_NO_QUIET |REBASE_VERBOSE |REBASE_DIFFSTAT ), -OPT_CMDMODE (0 ,"continue" , &command,N_ ("continue rebase" ), -ACTION_CONTINUE ), -OPT_CMDMODE (0 ,"skip" , &command,N_ ("skip commit" ),ACTION_SKIP ), -OPT_CMDMODE (0 ,"edit-todo" , &command,N_ ("edit the todo list" ), -ACTION_EDIT_TODO ), -OPT_CMDMODE (0 ,"show-current-patch" , &command,N_ ("show the current patch" ), -ACTION_SHOW_CURRENT_PATCH ), -OPT_CMDMODE (0 ,"shorten-ids" , &command, -N_ ("shorten commit ids in the todo list" ),ACTION_SHORTEN_OIDS ), -OPT_CMDMODE (0 ,"expand-ids" , &command, -N_ ("expand commit ids in the todo list" ),ACTION_EXPAND_OIDS ), -OPT_CMDMODE (0 ,"check-todo-list" , &command, -N_ ("check the todo list" ),ACTION_CHECK_TODO_LIST ), -OPT_CMDMODE (0 ,"rearrange-squash" , &command, -N_ ("rearrange fixup/squash lines" ),ACTION_REARRANGE_SQUASH ), -OPT_CMDMODE (0 ,"add-exec-commands" , &command, -N_ ("insert exec commands in todo list" ),ACTION_ADD_EXEC ), - {OPTION_CALLBACK ,0 ,"onto" , &opts.onto,N_ ("onto" ),N_ ("onto" ), -PARSE_OPT_NONEG , parse_opt_commit,0 }, - {OPTION_CALLBACK ,0 ,"restrict-revision" , &opts.restrict_revision, -N_ ("restrict-revision" ),N_ ("restrict revision" ), -PARSE_OPT_NONEG , parse_opt_commit,0 }, - {OPTION_CALLBACK ,0 ,"squash-onto" , &squash_onto,N_ ("squash-onto" ), -N_ ("squash onto" ),PARSE_OPT_NONEG , parse_opt_object_id,0 }, - {OPTION_CALLBACK ,0 ,"upstream" , &opts.upstream,N_ ("upstream" ), -N_ ("the upstream commit" ),PARSE_OPT_NONEG , parse_opt_commit, -0 }, -OPT_STRING (0 ,"head-name" , &opts.head_name,N_ ("head-name" ),N_ ("head name" )), - {OPTION_STRING ,'S' ,"gpg-sign" , &opts.gpg_sign_opt,N_ ("key-id" ), -N_ ("GPG-sign commits" ), -PARSE_OPT_OPTARG ,NULL , (intptr_t )"" }, -OPT_STRING (0 ,"strategy" , &opts.strategy,N_ ("strategy" ), -N_ ("rebase strategy" )), -OPT_STRING (0 ,"strategy-opts" , &opts.strategy_opts,N_ ("strategy-opts" ), -N_ ("strategy options" )), -OPT_STRING (0 ,"switch-to" , &opts.switch_to,N_ ("switch-to" ), -N_ ("the branch or commit to checkout" )), -OPT_STRING (0 ,"onto-name" , &opts.onto_name,N_ ("onto-name" ),N_ ("onto name" )), -OPT_STRING (0 ,"cmd" , &opts.cmd,N_ ("cmd" ),N_ ("the command to run" )), -OPT_RERERE_AUTOUPDATE (&opts.allow_rerere_autoupdate), -OPT_BOOL (0 ,"reschedule-failed-exec" , &opts.reschedule_failed_exec, -N_ ("automatically re-schedule any `exec` that fails" )), -OPT_END () - }; - - opts.rebase_cousins =-1 ; - -if (argc ==1 ) -usage_with_options (builtin_rebase_interactive_usage, options); - - argc =parse_options (argc, argv, prefix, options, - builtin_rebase_interactive_usage,PARSE_OPT_KEEP_ARGV0 ); - -if (!is_null_oid (&squash_onto)) - opts.squash_onto = &squash_onto; - -if (opts.rebase_cousins >=0 && !opts.rebase_merges) -warning (_ ("--[no-]rebase-cousins has no effect without " -"--rebase-merges" )); - -return !!run_rebase_interactive (&opts, command); -} -static int is_interactive (struct rebase_options *opts) {return opts->type ==REBASE_INTERACTIVE ;
git.c +0 -1
@@ -551,7 +551,6 @@ static struct cmd_struct commands[] = { { "range-diff", cmd_range_diff, RUN_SETUP | USE_PAGER }, { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX}, { "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE }, - { "rebase--interactive", cmd_rebase__interactive, RUN_SETUP | NEED_WORK_TREE }, { "receive-pack", cmd_receive_pack }, { "reflog", cmd_reflog, RUN_SETUP }, { "remote", cmd_remote, RUN_SETUP },
Signature · 1 line
gitgitgadget
PATCH 8/8 remote: no longer claim that branch.*.rebase=preserve is a thing
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
--- builtin/remote.c | 2 -- 1 file changed, 2 deletions(-)
builtin/remote.c +0 -2
@@ -309,8 +309,6 @@ static int config_read_branches(const char *key, const char *value, void *cb)int v =git_parse_maybe_bool (value);if (v >=0 ) info->rebase = v; -else if (!strcmp (value,"preserve" )) - info->rebase =NORMAL_REBASE ;else if (!strcmp (value,"merges" )) info->rebase =REBASE_MERGES ;else if (!strcmp (value,"interactive" ))
Signature · 1 line
gitgitgadget
v2 cover Drop support for git rebase --preserve-merges
In reply to Johannes Schindelin via GitGitGadgetIn 427c3bd28ab (rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.
Changes since v1:
* Rebased onto v2.33.0
Johannes Schindelin (7):
t5520: do not use pull.rebase=preserve
remote: warn about unhandled branch.<name>.rebase values
tests: stop testing git rebase --preserve-merges
pull: remove support for --rebase=preserve
rebase: drop support for --preserve-merges
git-svn: drop support for --preserve-merges
rebase: drop the internal rebase--interactive command
.github/workflows/main.yml | 1 - .gitignore | 1 - Documentation/config/branch.txt | 4 - Documentation/config/pull.txt | 4 - Documentation/git-pull.txt | 6 +- Documentation/git-rebase.txt | 51 - Documentation/git-svn.txt | 1 - Makefile | 2 - builtin/pull.c | 9 +- builtin/rebase.c | 318 +------ builtin/remote.c | 3 + contrib/completion/git-completion.bash | 2 +- git-rebase--preserve-merges.sh | 1057 --------------------- git-svn.perl | 1 - git.c | 1 - rebase.c | 2 - rebase.h | 1 - t/t3404-rebase-interactive.sh | 76 -- t/t3408-rebase-multi-line.sh | 10 - t/t3409-rebase-preserve-merges.sh | 130 --- t/t3410-rebase-preserve-dropped-merges.sh | 90 -- t/t3411-rebase-preserve-around-merges.sh | 80 -- t/t3412-rebase-root.sh | 37 - t/t3414-rebase-preserve-onto.sh | 85 -- t/t3418-rebase-continue.sh | 15 - t/t3421-rebase-topology-linear.sh | 19 - t/t3422-rebase-incompatible-options.sh | 11 - t/t3425-rebase-topology-merges.sh | 151 --- t/t3427-rebase-subtree.sh | 19 - t/t5520-pull.sh | 24 +- t/t7505-prepare-commit-msg-hook.sh | 1 - t/t7517-per-repo-email.sh | 13 - t/test-lib.sh | 4 - 33 files changed, 17 insertions(+), 2212 deletions(-) delete mode 100644 git-rebase--preserve-merges.sh delete mode 100755 t/t3409-rebase-preserve-merges.sh delete mode 100755 t/t3410-rebase-preserve-dropped-merges.sh delete mode 100755 t/t3411-rebase-preserve-around-merges.sh delete mode 100755 t/t3414-rebase-preserve-onto.sh
base-commit: 225bc32a989d7a22fa6addafd4ce7dcd04675dbf
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-195%2Fdscho%2Fdrop-rebase-p-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-195/dscho/drop-rebase-p-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/195
Range-diff vs v1:
1: 662e16dbc12 ! 1: 8da29d539fc t5520: do not use pull.rebase=preserve
@@ t/t5520-pull.sh: test_expect_success '--rebase=false create a new merge commit'
- test_config pull.rebase preserve &&
+ test_config pull.rebase merges &&
git pull --rebase=true . copy &&
- test "$(git rev-parse HEAD^^)" = "$(git rev-parse copy)" &&
- test file3 = "$(git show HEAD:file3.t)"
+ test_cmp_rev HEAD^^ copy &&
+ echo file3 >expect &&
@@ t/t5520-pull.sh: test_expect_success '--rebase=invalid fails' '
- ! git pull --rebase=invalid . copy
+ test_must_fail git pull --rebase=invalid . copy
'
-test_expect_success '--rebase overrides pull.rebase=preserve and flattens keep-merge' '
@@ t/t5520-pull.sh: test_expect_success '--rebase=invalid fails' '
- test_config pull.rebase preserve &&
+ test_config pull.rebase merges &&
git pull --rebase . copy &&
- test "$(git rev-parse HEAD^^)" = "$(git rev-parse copy)" &&
- test file3 = "$(git show HEAD:file3.t)"
+ test_cmp_rev HEAD^^ copy &&
+ echo file3 >expect &&
2: fb531064b35 < -: ----------- remote: warn about unhandled branch.<name>.rebase values
-: ----------- > 2: acda0f59947 remote: warn about unhandled branch.<name>.rebase values
3: b614336f3df ! 3: cdb9fae4b93 tests: stop testing `git rebase --preserve-merges`
@@ Commit message
Signed-off-by: Johannes Schindelin <[email protected]>
- ## azure-pipelines.yml ##
-@@ azure-pipelines.yml: jobs:
- HOME: $(Build.SourcesDirectory)
- MSYSTEM: MINGW64
- NO_SVN_TESTS: 1
-- GIT_TEST_SKIP_REBASE_P: 1
- - powershell: |
- if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
- cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
-@@ azure-pipelines.yml: jobs:
- HOME: $(Build.SourcesDirectory)
- MSYSTEM: MINGW64
- NO_SVN_TESTS: 1
-- GIT_TEST_SKIP_REBASE_P: 1
- - powershell: |
- if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
- cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
+ ## .github/workflows/main.yml ##
+@@ .github/workflows/main.yml: jobs:
+ shell: bash
+ env:
+ NO_SVN_TESTS: 1
+- GIT_TEST_SKIP_REBASE_P: 1
+ run: ci/run-test-slice.sh ${{matrix.nr}} 10
+ - name: ci/print-test-failures.sh
+ if: failure()
## t/t3404-rebase-interactive.sh ##
@@ t/t3404-rebase-interactive.sh: test_expect_success 'retain authorship when squashing' '
@@ t/t3404-rebase-interactive.sh: test_expect_success 'retain authorship when squas
-'
-
-test_expect_success REBASE_P 'preserve merges with -p' '
-- git checkout -b to-be-preserved master^ &&
+- git checkout -b to-be-preserved primary^ &&
- : > unrelated-file &&
- git add unrelated-file &&
- test_tick &&
- git commit -m "unrelated" &&
-- git checkout -b another-branch master &&
+- git checkout -b another-branch primary &&
- echo B > file1 &&
- test_tick &&
- git commit -m J file1 &&
@@ t/t3404-rebase-interactive.sh: test_expect_success 'retain authorship when squas
- git commit -m M file1 &&
- git checkout -b to-be-rebased &&
- test_tick &&
-- git rebase -i -p --onto branch1 master &&
+- git rebase -i -p --onto branch1 primary &&
- git update-index --refresh &&
- git diff-files --quiet &&
- git diff-index --quiet --cached HEAD -- &&
-- test $(git rev-parse HEAD~6) = $(git rev-parse branch1) &&
-- test $(git rev-parse HEAD~4^2) = $(git rev-parse to-be-preserved) &&
-- test $(git rev-parse HEAD^^2^) = $(git rev-parse HEAD^^^) &&
+- test_cmp_rev HEAD~6 branch1 &&
+- test_cmp_rev HEAD~4^2 to-be-preserved &&
+- test_cmp_rev HEAD^^2^ HEAD^^^ &&
- test $(git show HEAD~5:file1) = B &&
- test $(git show HEAD~3:file1) = C &&
- test $(git show HEAD:file1) = E &&
@@ t/t3409-rebase-preserve-merges.sh (deleted)
-
-Run "git rebase -p" and check that merges are properly carried along
-'
+-GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
+-export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
+-
-. ./test-lib.sh
-
-if ! test_have_prereq REBASE_P; then
@@ t/t3409-rebase-preserve-merges.sh (deleted)
-
-# Clone 2 (conflicting merge):
-#
--# A1--A2--B3 <-- origin/master
+-# A1--A2--B3 <-- origin/main
-# \ \
-# B1------M <-- topic
-# \
@@ t/t3409-rebase-preserve-merges.sh (deleted)
-#
-# Clone 3 (no-ff merge):
-#
--# A1--A2--B3 <-- origin/master
+-# A1--A2--B3 <-- origin/main
-# \
-# B1------M <-- topic
-# \ /
@@ t/t3409-rebase-preserve-merges.sh (deleted)
- echo Second > B &&
- git add B &&
- git commit -m "Add B1" &&
-- git checkout -f master &&
+- git checkout -f main &&
- echo Third >> A &&
- git commit -a -m "Modify A2" &&
- echo Fifth > B &&
@@ t/t3409-rebase-preserve-merges.sh (deleted)
- (
- cd clone2 &&
- git checkout -b topic origin/topic &&
-- test_must_fail git merge origin/master &&
+- test_must_fail git merge origin/main &&
- echo Resolved >B &&
- git add B &&
-- git commit -m "Merge origin/master into topic"
+- git commit -m "Merge origin/main into topic"
- ) &&
-
- git clone ./. clone3 &&
@@ t/t3412-rebase-root.sh: test_expect_success 'pre-rebase got correct input (4)' '
-test_expect_success REBASE_P 'rebase -i -p with linear history' '
- git checkout -b work5 other &&
-- git rebase -i -p --root --onto master &&
+- git rebase -i -p --root --onto main &&
- git log --pretty=tformat:"%s" > rebased5 &&
- test_cmp expect rebased5
-'
@@ t/t3412-rebase-root.sh: commit work6~4
-test_expect_success REBASE_P 'rebase -i -p with merge' '
- git checkout -b work6 other &&
-- git rebase -i -p --root --onto master &&
+- git rebase -i -p --root --onto main &&
- log_with_names work6 > rebased6 &&
- test_cmp expect-side rebased6
-'
@@ t/t3412-rebase-root.sh: commit work7~5
-test_expect_success REBASE_P 'rebase -i -p with two roots' '
- git checkout -b work7 other &&
-- git rebase -i -p --root --onto master &&
+- git rebase -i -p --root --onto main &&
- log_with_names work7 > rebased7 &&
- test_cmp expect-third rebased7
-'
@@ t/t3412-rebase-root.sh: commit conflict3~6
-test_expect_success REBASE_P 'rebase -i -p --root with conflict (first part)' '
- git checkout -b conflict3 other &&
-- test_must_fail git rebase -i -p --root --onto master &&
+- test_must_fail git rebase -i -p --root --onto main &&
- git ls-files -u | grep "B$"
-'
-
@@ t/t3418-rebase-continue.sh: test_rerere_autoupdate
## t/t3421-rebase-topology-linear.sh ##
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase success -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_expect_success 'setup branches and remote tracking' '
git tag -l >tags &&
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase success -p
test_run_rebase () {
result=$1
-@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success ''
+@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success --apply
test_run_rebase success --fork-point
test_run_rebase success -m
test_run_rebase success -i
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success ''
test_run_rebase () {
result=$1
-@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success ''
+@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success --apply
test_run_rebase success --fork-point
test_run_rebase success -m
test_run_rebase success -i
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success ''
test_run_rebase () {
result=$1
-@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success ''
+@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success --apply
test_run_rebase success --fork-point
test_run_rebase success -m
test_run_rebase success -i
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase success ''
# f
# /
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase success -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase success -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase success -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase success -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
# a---b---c---j!
# \
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase failure --apply
test_run_rebase success -m
test_run_rebase success -i
--test_have_prereq !REBASE_P || test_run_rebase success -p
+-test_have_prereq !REBASE_P || test_run_rebase failure -p
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ }
test_run_rebase success -m
test_run_rebase success -i
--test_have_prereq !REBASE_P || test_run_rebase failure -p
+-test_have_prereq !REBASE_P || test_run_rebase success -p
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ }
test_run_rebase success -m
test_run_rebase success -i
--test_have_prereq !REBASE_P || test_run_rebase failure -p
+-test_have_prereq !REBASE_P || test_run_rebase success -p
test_run_rebase success --rebase-merges
# m
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase success -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase failure -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase success -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase failure -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_run_rebase () {
result=$1
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
- test_run_rebase success ''
+ test_run_rebase success --apply
test_run_rebase success -m
test_run_rebase success -i
-test_have_prereq !REBASE_P || test_run_rebase failure -p
@@ t/t3421-rebase-topology-linear.sh: test_run_rebase () {
test_done
## t/t3422-rebase-incompatible-options.sh ##
-@@ t/t3422-rebase-incompatible-options.sh: test_rebase_am_only --ignore-whitespace
- test_rebase_am_only --committer-date-is-author-date
+@@ t/t3422-rebase-incompatible-options.sh: test_rebase_am_only () {
+ test_rebase_am_only --whitespace=fix
test_rebase_am_only -C4
-test_expect_success REBASE_P '--preserve-merges incompatible with --signoff' '
@@ t/t3422-rebase-incompatible-options.sh: test_rebase_am_only --ignore-whitespace
test_done
## t/t3425-rebase-topology-merges.sh ##
-@@ t/t3425-rebase-topology-merges.sh: test_run_rebase success 'd n o e' ''
+@@ t/t3425-rebase-topology-merges.sh: test_run_rebase success 'd n o e' --apply
test_run_rebase success 'd n o e' -m
test_run_rebase success 'd n o e' -i
@@ t/t3427-rebase-subtree.sh: test_expect_success 'setup' '
git commit -m "Empty commit" --allow-empty
'
--# FAILURE: Does not preserve master4.
+-# FAILURE: Does not preserve topic_4.
-test_expect_failure REBASE_P 'Rebase -Xsubtree --preserve-merges --onto commit' '
- reset_rebase &&
- git checkout -b rebase-preserve-merges to-rebase &&
-- git rebase -Xsubtree=files_subtree --preserve-merges --onto files-master master &&
-- verbose test "$(commit_message HEAD~)" = "master4" &&
-- verbose test "$(commit_message HEAD)" = "files_subtree/master5"
+- git rebase -Xsubtree=files_subtree --preserve-merges --onto files-main main &&
+- verbose test "$(commit_message HEAD~)" = "topic_4" &&
+- verbose test "$(commit_message HEAD)" = "files_subtree/topic_5"
-'
-
--# FAILURE: Does not preserve master4.
+-# FAILURE: Does not preserve topic_4.
-test_expect_failure REBASE_P 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit' '
- reset_rebase &&
- git checkout -b rebase-keep-empty to-rebase &&
-- git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master &&
-- verbose test "$(commit_message HEAD~2)" = "master4" &&
-- verbose test "$(commit_message HEAD~)" = "files_subtree/master5" &&
+- git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-main main &&
+- verbose test "$(commit_message HEAD~2)" = "topic_4" &&
+- verbose test "$(commit_message HEAD~)" = "files_subtree/topic_5" &&
- verbose test "$(commit_message HEAD)" = "Empty commit"
-'
-
- test_expect_success 'Rebase -Xsubtree --keep-empty --onto commit' '
+ test_expect_success 'Rebase -Xsubtree --empty=ask --onto commit' '
reset_rebase &&
git checkout -b rebase-onto to-rebase &&
## t/t5520-pull.sh ##
@@ t/t5520-pull.sh: test_expect_success 'pull.rebase=1 is treated as true and flattens keep-merge' '
- test file3 = "$(git show HEAD:file3.t)"
+ test_cmp expect actual
'
-test_expect_success REBASE_P \
@@ t/t5520-pull.sh: test_expect_success 'pull.rebase=1 is treated as true and flatt
- git reset --hard before-preserve-rebase &&
- test_config pull.rebase preserve &&
- git pull . copy &&
-- test "$(git rev-parse HEAD^^)" = "$(git rev-parse copy)" &&
-- test "$(git rev-parse HEAD^2)" = "$(git rev-parse keep-merge)"
+- test_cmp_rev HEAD^^ copy &&
+- test_cmp_rev HEAD^2 keep-merge
-'
-
test_expect_success 'pull.rebase=interactive' '
write_script "$TRASH_DIRECTORY/fake-editor" <<-\EOF &&
echo I was here >fake.out &&
@@ t/t5520-pull.sh: test_expect_success '--rebase=true rebases and flattens keep-merge' '
- test file3 = "$(git show HEAD:file3.t)"
+ test_cmp expect actual
'
-test_expect_success REBASE_P \
@@ t/t5520-pull.sh: test_expect_success '--rebase=true rebases and flattens keep-me
- git reset --hard before-preserve-rebase &&
- test_config pull.rebase true &&
- git pull --rebase=preserve . copy &&
-- test "$(git rev-parse HEAD^^)" = "$(git rev-parse copy)" &&
-- test "$(git rev-parse HEAD^2)" = "$(git rev-parse keep-merge)"
+- test_cmp_rev HEAD^^ copy &&
+- test_cmp_rev HEAD^2 keep-merge
-'
-
test_expect_success '--rebase=invalid fails' '
git reset --hard before-preserve-rebase &&
- ! git pull --rebase=invalid . copy
+ test_must_fail git pull --rebase=invalid . copy
## t/t7505-prepare-commit-msg-hook.sh ##
@@ t/t7505-prepare-commit-msg-hook.sh: test_rebase () {
@@ t/t7505-prepare-commit-msg-hook.sh: test_rebase () {
-test_have_prereq !REBASE_P || test_rebase success -p
test_expect_success 'with hook (cherry-pick)' '
- test_when_finished "git checkout -f master" &&
+ test_when_finished "git checkout -f main" &&
## t/t7517-per-repo-email.sh ##
@@ t/t7517-per-repo-email.sh: test_expect_success 'noop interactive rebase does not care about ident' '
@@ t/t7517-per-repo-email.sh: test_expect_success 'noop interactive rebase does not
-test_expect_success REBASE_P \
- 'fast-forward rebase does not care about ident (preserve)' '
- git checkout -B tmp side-without-commit &&
-- git rebase -p master
+- git rebase -p main
-'
-
-test_expect_success REBASE_P \
- 'non-fast-forward rebase refuses to write commits (preserve)' '
- test_when_finished "git rebase --abort || true" &&
- git checkout -B tmp side-with-commit &&
-- test_must_fail git rebase -p master
+- test_must_fail git rebase -p main
-'
-
test_expect_success 'author.name overrides user.name' '
@@ t/t7517-per-repo-email.sh: test_expect_success 'noop interactive rebase does not
test_config user.email [email protected] &&
## t/test-lib.sh ##
-@@ t/test-lib.sh: test_lazy_prereq CURL '
- test_lazy_prereq SHA1 '
- test $(git hash-object /dev/null) = e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+@@ t/test-lib.sh: test_lazy_prereq SHA1 '
+ esac
'
--
+
-test_lazy_prereq REBASE_P '
- test -z "$GIT_TEST_SKIP_REBASE_P"
-'
+-
+ # Ensure that no test accidentally triggers a Git command
+ # that runs the actual maintenance scheduler, affecting a user's
+ # system permanently. 4: 0c8bfe5d18d ! 4: b493046134d pull: remove support for --rebase=preserve
@@ Commit message
## Documentation/config/branch.txt ##
-@@ Documentation/config/branch.txt: When merges, pass the --rebase-merges option to 'git rebase' +@@ Documentation/config/branch.txt: When merges (or just 'm'), pass the --rebase-merges option to 'git rebase'
so that the local merge commits are included in the rebase (see
linkgit:git-rebase[1] for details).
+
--When preserve (deprecated in favor of merges), also pass
+-When preserve (or just 'p', deprecated in favor of merges), also pass
---preserve-merges along to 'git rebase' so that locally committed merge
-commits will not be flattened by running 'git pull'.
-+
- When the value is interactive, the rebase is run in interactive mode.
+ When the value is interactive (or just 'i'), the rebase is run in interactive
+ mode.
+
- *NOTE*: this is a possibly dangerous operation; do *not* use
## Documentation/config/pull.txt ##
-@@ Documentation/config/pull.txt: When merges, pass the --rebase-merges option to 'git rebase' +@@ Documentation/config/pull.txt: When merges (or just 'm'), pass the --rebase-merges option to 'git rebase'
so that the local merge commits are included in the rebase (see
linkgit:git-rebase[1] for details).
+
--When preserve (deprecated in favor of merges), also pass
+-When preserve (or just 'p', deprecated in favor of merges), also pass
---preserve-merges along to 'git rebase' so that locally committed merge
-commits will not be flattened by running 'git pull'.
-+
- When the value is interactive, the rebase is run in interactive mode.
+ When the value is interactive (or just 'i'), the rebase is run in interactive
+ mode.
+
- *NOTE*: this is a possibly dangerous operation; do *not* use
## Documentation/git-pull.txt ##
@@ Documentation/git-pull.txt: Options related to merging
@@ Documentation/git-pull.txt: When set to merges, rebase using `git rebase --reb
---preserve-merges option passed to git rebase so that locally created -merge commits will not be flattened.
-+
- When false, merge the current branch into the upstream branch.
+ When false, merge the upstream branch into the current branch.
+
When interactive, enable the interactive mode of rebase.
## builtin/pull.c ##
-@@ builtin/pull.c: enum rebase_type {
- REBASE_INVALID = -1,
- REBASE_FALSE = 0,
- REBASE_TRUE,
-- REBASE_PRESERVE,
- REBASE_MERGES,
- REBASE_INTERACTIVE
- };
-@@ builtin/pull.c: enum rebase_type {
+@@
/**
* Parses the value of --rebase. If value is a false value, returns
* REBASE_FALSE. If value is a true value, returns REBASE_TRUE. If value is
@@ builtin/pull.c: enum rebase_type {
*/
static enum rebase_type parse_config_rebase(const char *key, const char *value,
int fatal)
-@@ builtin/pull.c: static enum rebase_type parse_config_rebase(const char *key, const char *value,
- return REBASE_FALSE;
- else if (v > 0)
- return REBASE_TRUE;
-- else if (!strcmp(value, "preserve") || !strcmp(value, "p"))
-- return REBASE_PRESERVE;
- else if (!strcmp(value, "merges") || !strcmp(value, "m"))
- return REBASE_MERGES;
- else if (!strcmp(value, "interactive") || !strcmp(value, "i"))
@@ builtin/pull.c: static struct option pull_options[] = {
/* Options passed to git-merge or git-rebase */
OPT_GROUP(N_("Options related to merging")),
- { OPTION_CALLBACK, 'r', "rebase", &opt_rebase,
-- "(false|true|merges|preserve|interactive)",
-+ "(false|true|merges|interactive)",
- N_("incorporate changes by rebasing rather than merging"),
- PARSE_OPT_OPTARG, parse_opt_rebase },
+ OPT_CALLBACK_F('r', "rebase", &opt_rebase,
+- "(false|true|merges|preserve|interactive)",
++ "(false|true|merges|interactive)",
+ N_("incorporate changes by rebasing rather than merging"),
+ PARSE_OPT_OPTARG, parse_opt_rebase),
OPT_PASSTHRU('n', NULL, &opt_diffstat, NULL,
-@@ builtin/pull.c: static int run_rebase(const struct object_id *curr_head,
+@@ builtin/pull.c: static int run_rebase(const struct object_id *newbase,
/* Options passed to git-rebase */
if (opt_rebase == REBASE_MERGES)
- argv_array_push(&args, "--rebase-merges");
+ strvec_push(&args, "--rebase-merges");
- else if (opt_rebase == REBASE_PRESERVE)
-- argv_array_push(&args, "--preserve-merges");
+- strvec_push(&args, "--preserve-merges");
else if (opt_rebase == REBASE_INTERACTIVE)
- argv_array_push(&args, "--interactive");
+ strvec_push(&args, "--interactive");
if (opt_diffstat)
## contrib/completion/git-completion.bash ##
@@ contrib/completion/git-completion.bash: __git_complete_config_variable_value ()
return
;;
remote.pushdefault)
+
+ ## rebase.c ##
+@@ rebase.c: enum rebase_type rebase_parse_value(const char *value)
+ return REBASE_FALSE;
+ else if (v > 0)
+ return REBASE_TRUE;
+- else if (!strcmp(value, "preserve") || !strcmp(value, "p"))
+- return REBASE_PRESERVE;
+ else if (!strcmp(value, "merges") || !strcmp(value, "m"))
+ return REBASE_MERGES;
+ else if (!strcmp(value, "interactive") || !strcmp(value, "i"))
+
+ ## rebase.h ##
+@@ rebase.h: enum rebase_type {
+ REBASE_INVALID = -1,
+ REBASE_FALSE = 0,
+ REBASE_TRUE,
+- REBASE_PRESERVE,
+ REBASE_MERGES,
+ REBASE_INTERACTIVE
+ };
5: 14e242b3cf9 ! 5: eb738b1bf05 rebase: drop support for --preserve-merges
@@ Documentation/git-rebase.txt: i.e. commits that would be excluded by linkgit:git
onto <upstream> (or <onto>, if specified).
+
-The --rebase-merges mode is similar in spirit to the deprecated
----preserve-merges, but in contrast to that option works well in interactive --rebases: commits can be reordered, inserted and dropped at will. +---preserve-merges but works with interactive rebases,
+-where commits can be reordered, inserted and dropped at will.
-+
It is currently only possible to recreate the merge commits using the recursive merge strategy; Different merge strategies can be used only via
@@ Documentation/git-rebase.txt: are incompatible with the following options:
- * --preserve-merges
* --interactive
* --exec
- * --keep-empty
+ * --no-keep-empty
@@ Documentation/git-rebase.txt: are incompatible with the following options:
In addition, the following pairs of options are incompatible:
@@ Documentation/git-rebase.txt: are incompatible with the following options:
- * --preserve-merges and --interactive
- * --preserve-merges and --signoff
- * --preserve-merges and --rebase-merges
+- * --preserve-merges and --empty=
+- * --preserve-merges and --ignore-whitespace
+- * --preserve-merges and --committer-date-is-author-date
+- * --preserve-merges and --ignore-date
* --keep-base and --onto
* --keep-base and --root
-
-@@ Documentation/git-rebase.txt: merge tlsv1.3
- merge cmake
- ------------
+ * --fork-point and --root
+@@ Documentation/git-rebase.txt: CONFIGURATION
+ include::config/rebase.txt[]
+ include::config/sequencer.txt[]
-BUGS
-----
@@ Documentation/git-rebase.txt: merge tlsv1.3
Part of the linkgit:git[1] suite
## Makefile ##
-@@ Makefile: SCRIPT_SH += git-web--browse.sh +@@ Makefile: SCRIPT_SH += git-submodule.sh
+ SCRIPT_SH += git-web--browse.sh
SCRIPT_LIB += git-mergetool--lib
- SCRIPT_LIB += git-parse-remote
-SCRIPT_LIB += git-rebase--preserve-merges
- SCRIPT_LIB += git-sh-setup
SCRIPT_LIB += git-sh-i18n
+ SCRIPT_LIB += git-sh-setup
@@ Makefile: XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
+ --keyword=__ --keyword=N__ --keyword="__n:1,2"
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H) LOCALIZED_SH = $(SCRIPT_SH)
- LOCALIZED_SH += git-parse-remote.sh
-LOCALIZED_SH += git-rebase--preserve-merges.sh
LOCALIZED_SH += git-sh-setup.sh
LOCALIZED_PERL = $(SCRIPT_PERL)
## builtin/rebase.c ##
-@@ builtin/rebase.c: enum rebase_type {
+@@ builtin/rebase.c: static GIT_PATH_FUNC(merge_dir, "rebase-merge")
+ enum rebase_type {
REBASE_UNSPECIFIED = -1,
- REBASE_AM,
- REBASE_MERGE,
-- REBASE_INTERACTIVE,
+ REBASE_APPLY,
+- REBASE_MERGE,
- REBASE_PRESERVE_MERGES
-+ REBASE_INTERACTIVE
++ REBASE_MERGE
};
- struct rebase_options {
+ enum empty_type {
@@ builtin/rebase.c: int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
- static int is_interactive(struct rebase_options *opts)
+ static int is_merge(struct rebase_options *opts) {
-- return opts->type == REBASE_INTERACTIVE ||
+- return opts->type == REBASE_MERGE ||
- opts->type == REBASE_PRESERVE_MERGES;
-+ return opts->type == REBASE_INTERACTIVE;
++ return opts->type == REBASE_MERGE;
}
- static void imply_interactive(struct rebase_options *opts, const char *option) -@@ builtin/rebase.c: static void imply_interactive(struct rebase_options *opts, const char *option)
- die(_("%s requires an interactive rebase"), option);
+ static void imply_merge(struct rebase_options *opts, const char *option)
+@@ builtin/rebase.c: static void imply_merge(struct rebase_options *opts, const char *option)
+ die(_("%s requires the merge backend"), option);
break;
- case REBASE_INTERACTIVE:
+ case REBASE_MERGE:
- case REBASE_PRESERVE_MERGES:
break;
- case REBASE_MERGE:
- /* we now implement --merge via --interactive */
+ default:
+ opts->type = REBASE_MERGE; /* implied */
@@ builtin/rebase.c: static struct commit *peel_committish(const char *name)
return (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT);
}
@@ builtin/rebase.c: static struct commit *peel_committish(const char *name)
- }
-}
-
- #define GIT_REFLOG_ACTION_ENVIRONMENT "GIT_REFLOG_ACTION"
-
- #define RESET_HEAD_DETACH (1<<0)
+ static int move_to_original_branch(struct rebase_options *opts)
+ {
+ struct strbuf orig_head_reflog = STRBUF_INIT, head_reflog = STRBUF_INIT;
@@ builtin/rebase.c: static int run_am(struct rebase_options *opts)
static int run_specific_rebase(struct rebase_options *opts, enum action action)
@@ builtin/rebase.c: static int run_am(struct rebase_options *opts)
int status;
- const char *backend, *backend_func;
- if (opts->type == REBASE_INTERACTIVE) {
- /* Run builtin interactive rebase */
+ if (opts->type == REBASE_MERGE) {
+ /* Run sequencer-based rebase */
@@ builtin/rebase.c: static int run_specific_rebase(struct rebase_options *opts, enum action action)
}
- status = run_rebase_interactive(opts, action);
+ status = run_sequencer_rebase(opts, action);
- goto finished_rebase;
- }
-
-- if (opts->type == REBASE_AM) {
-+ } else if (opts->type == REBASE_AM)
+- if (opts->type == REBASE_APPLY) {
++ } else if (opts->type == REBASE_APPLY)
status = run_am(opts);
- goto finished_rebase;
- }
@@ builtin/rebase.c: static int run_specific_rebase(struct rebase_options *opts, en
- add_var(&script_snippet, "revisions", opts->revisions);
- add_var(&script_snippet, "restrict_revision", opts->restrict_revision ?
- oid_to_hex(&opts->restrict_revision->object.oid) : NULL);
-- add_var(&script_snippet, "GIT_QUIET",
-- opts->flags & REBASE_NO_QUIET ? "" : "t");
-- sq_quote_argv_pretty(&buf, opts->git_am_opts.argv);
+- sq_quote_argv_pretty(&buf, opts->git_am_opts.v);
- add_var(&script_snippet, "git_am_opt", buf.buf);
- strbuf_release(&buf);
- add_var(&script_snippet, "verbose",
@@ builtin/rebase.c: static int run_specific_rebase(struct rebase_options *opts, en
- add_var(&script_snippet, "git_format_patch_opt",
- opts->git_format_patch_opt.buf);
-
-- if (is_interactive(opts) &&
+- if (is_merge(opts) &&
- !(opts->flags & REBASE_INTERACTIVE_EXPLICIT)) {
- strbuf_addstr(&script_snippet,
- "GIT_SEQUENCE_EDITOR=:; export GIT_SEQUENCE_EDITOR; ");
@@ builtin/rebase.c: static int run_specific_rebase(struct rebase_options *opts, en
-finished_rebase:
if (opts->dont_finish_rebase)
; /* do nothing */
- else if (opts->type == REBASE_INTERACTIVE)
+ else if (opts->type == REBASE_MERGE)
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
N_("let the user edit the list of commits to rebase"), PARSE_OPT_NOARG | PARSE_OPT_NONEG,
- parse_opt_interactive },
+ parse_opt_interactive),
- OPT_SET_INT_F('p', "preserve-merges", &options.type,
- N_("(DEPRECATED) try to recreate merges instead of "
- "ignoring them"),
- REBASE_PRESERVE_MERGES, PARSE_OPT_HIDDEN),
OPT_RERERE_AUTOUPDATE(&options.allow_rerere_autoupdate),
- OPT_BOOL('k', "keep-empty", &options.keep_empty,
- N_("preserve empty commits during rebase")),
+ OPT_CALLBACK_F(0, "empty", &options, "{drop,keep,ask}",
+ N_("how to handle commits that become empty"),
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
strbuf_reset(&buf);
strbuf_addf(&buf, "%s/rewritten", merge_dir());
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix
if (options.onto_name)
die(_("cannot combine '--keep-base' with '--onto'"));
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
+ case REBASE_APPLY:
die(_("--strategy requires --merge or --interactive"));
case REBASE_MERGE:
- case REBASE_INTERACTIVE:
- case REBASE_PRESERVE_MERGES:
/* compatible */
break;
case REBASE_UNSPECIFIED:
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
+
switch (options.type) {
case REBASE_MERGE:
- case REBASE_INTERACTIVE:
- case REBASE_PRESERVE_MERGES:
options.state_dir = merge_dir();
break;
- case REBASE_AM:
+ case REBASE_APPLY:
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
- }
+ options.reschedule_failed_exec = reschedule_failed_exec;
if (options.signoff) {
- if (options.type == REBASE_PRESERVE_MERGES)
- die("cannot combine '--signoff' with "
- "'--preserve-merges'");
- argv_array_push(&options.git_am_opts, "--signoff");
+ strvec_push(&options.git_am_opts, "--signoff");
options.flags |= REBASE_FORCE;
}
@@ git-rebase--preserve-merges.sh (deleted)
- fi
-}
-
--# Put the last action marked done at the beginning of the todo list --# again. If there has not been an action marked done yet, leave the list of --# items on the todo list unchanged.
--reschedule_last_action () {
-- tail -n 1 "$done" | cat - "$todo" >"$todo".new
-- sed -e \$d <"$done" >"$done".new
-- mv -f "$todo".new "$todo"
-- mv -f "$done".new "$done"
--}
--
-append_todo_help () {
- gettext "
-Commands:
6: b7ba83969da = 6: a987e9439af git-svn: drop support for `--preserve-merges`
7: 634e4141e97 ! 7: 4492cca369c rebase: drop the internal `rebase--interactive` command
@@ builtin/rebase.c: static const char *action_names[] = { "undefined",
static int edit_todo_file(unsigned flags)
{
const char *todo_file = rebase_path_todo();
-@@ builtin/rebase.c: static int run_rebase_interactive(struct rebase_options *opts,
+@@ builtin/rebase.c: static int run_sequencer_rebase(struct rebase_options *opts,
break;
}
@@ builtin/rebase.c: static int run_rebase_interactive(struct rebase_options *opts,
default:
BUG("invalid command '%d'", command);
}
-@@ builtin/rebase.c: static int run_rebase_interactive(struct rebase_options *opts,
- return ret;
+@@ builtin/rebase.c: static int parse_opt_keep_empty(const struct option *opt, const char *arg,
+ return 0;
}
-static const char * const builtin_rebase_interactive_usage[] = {
@@ builtin/rebase.c: static int run_rebase_interactive(struct rebase_options *opts,
-int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
-{
- struct rebase_options opts = REBASE_OPTIONS_INIT;
-- struct object_id squash_onto = null_oid;
+- struct object_id squash_onto = *null_oid();
- enum action command = ACTION_NONE;
- struct option options[] = {
- OPT_NEGBIT(0, "ff", &opts.flags, N_("allow fast-forward"),
- REBASE_FORCE),
-- OPT_BOOL(0, "keep-empty", &opts.keep_empty, N_("keep empty commits")),
-- OPT_BOOL(0, "allow-empty-message", &opts.allow_empty_message,
-- N_("allow commits with empty messages")),
+- OPT_CALLBACK_F('k', "keep-empty", &options, NULL,
+- N_("keep commits which start empty"),
+- PARSE_OPT_NOARG | PARSE_OPT_HIDDEN,
+- parse_opt_keep_empty),
+- OPT_BOOL_F(0, "allow-empty-message", &opts.allow_empty_message,
+- N_("allow commits with empty messages"),
+- PARSE_OPT_HIDDEN),
- OPT_BOOL(0, "rebase-merges", &opts.rebase_merges, N_("rebase merge commits")),
- OPT_BOOL(0, "rebase-cousins", &opts.rebase_cousins,
- N_("keep original branch points of cousins")),
@@ builtin/rebase.c: static int run_rebase_interactive(struct rebase_options *opts,
- warning(_("--[no-]rebase-cousins has no effect without "
- "--rebase-merges"));
-
-- return !!run_rebase_interactive(&opts, command);
+- return !!run_sequencer_rebase(&opts, command);
-}
-
- static int is_interactive(struct rebase_options *opts)
+ static int is_merge(struct rebase_options *opts)
{
- return opts->type == REBASE_INTERACTIVE;
+ return opts->type == REBASE_MERGE;
## git.c ##
@@ git.c: static struct cmd_struct commands[] = { 8: 45fee72059d < -: ----------- remote: no longer claim that branch.*.rebase=preserve is a thing
Signature · 1 line
gitgitgadget
PATCH v2 1/7 t5520: do not use `pull.rebase=preserve`
From: Johannes Schindelin <[email protected]>
Even if those tests try to override that setting, let's not use it because it is deprecated: let's use merges instead.
--- t/t5520-pull.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
t/t5520-pull.sh +3 -3
@@ -598,7 +598,7 @@ test_expect_success '--rebase=false create a new merge commit' ' test_expect_success '--rebase=true rebases and flattens keep-merge' ' git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && + test_config pull.rebase merges && git pull --rebase=true . copy && test_cmp_rev HEAD^^ copy && echo file3 >expect &&
@@ -620,9 +620,9 @@ test_expect_success '--rebase=invalid fails' ' test_must_fail git pull --rebase=invalid . copy ' -test_expect_success '--rebase overrides pull.rebase=preserve and flattens keep-merge' ' +test_expect_success '--rebase overrides pull.rebase=merges and flattens keep-merge' ' git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && + test_config pull.rebase merges && git pull --rebase . copy && test_cmp_rev HEAD^^ copy && echo file3 >expect &&
Signature · 1 line
gitgitgadget
PATCH v2 2/7 remote: warn about unhandled branch.<name>.rebase values
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
We ignore them silently, but it actually makes sense to warn the users that their config setting has no effect.
--- builtin/remote.c | 3 +++ 1 file changed, 3 insertions(+)
builtin/remote.c +3 -0
@@ -318,6 +318,9 @@ static int config_read_branches(const char *key, const char *value, void *cb)* truth value with >= REBASE_TRUE. */ info->rebase =rebase_parse_value (value); +if (info->rebase ==REBASE_INVALID ) +warning (_ ("unhandled branch.%s.rebase=%s; assuming " +"'true'" ), name, value);break ;case PUSH_REMOTE :if (info->push_remote_name)
Signature · 1 line
gitgitgadget
PATCH v2 3/7 tests: stop testing `git rebase --preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
This backend has been deprecated in favor of git rebase --rebase-merges.
In preparation for dropping it, let's remove all the regression tests that would need it.
--- .github/workflows/main.yml | 1 - t/t3404-rebase-interactive.sh | 76 ----------- t/t3408-rebase-multi-line.sh | 10 -- t/t3409-rebase-preserve-merges.sh | 130 ------------------- t/t3410-rebase-preserve-dropped-merges.sh | 90 ------------- t/t3411-rebase-preserve-around-merges.sh | 80 ------------ t/t3412-rebase-root.sh | 37 ------ t/t3414-rebase-preserve-onto.sh | 85 ------------ t/t3418-rebase-continue.sh | 15 --- t/t3421-rebase-topology-linear.sh | 19 --- t/t3422-rebase-incompatible-options.sh | 11 -- t/t3425-rebase-topology-merges.sh | 151 ---------------------- t/t3427-rebase-subtree.sh | 19 --- t/t5520-pull.sh | 18 --- t/t7505-prepare-commit-msg-hook.sh | 1 - t/t7517-per-repo-email.sh | 13 -- t/test-lib.sh | 4 - 17 files changed, 760 deletions(-) delete mode 100755 t/t3409-rebase-preserve-merges.sh delete mode 100755 t/t3410-rebase-preserve-dropped-merges.sh delete mode 100755 t/t3411-rebase-preserve-around-merges.sh delete mode 100755 t/t3414-rebase-preserve-onto.sh
.github/workflows/main.yml +0 -1
@@ -198,7 +198,6 @@ jobs: shell: bash env: NO_SVN_TESTS: 1 - GIT_TEST_SKIP_REBASE_P: 1 run: ci/run-test-slice.sh ${{matrix.nr}} 10 - name: ci/print-test-failures.sh if: failure()
t/t3404-rebase-interactive.sh +0 -76
82 lines not on this page · raw message
t/t3408-rebase-multi-line.sh +0 -10
@@ -55,14 +55,4 @@ test_expect_success rebase ' test_cmp expect actual ' -test_expect_success REBASE_P rebasep ' - - git checkout side-merge && - git rebase -p side && - git cat-file commit HEAD | sed -e "1,/^\$/d" >actual && - git cat-file commit side-merge-original | sed -e "1,/^\$/d" >expect && - test_cmp expect actual - -' - test_done
t/t3409-rebase-preserve-merges.sh deleted +0 -130
130 lines not on this page · raw message
t/t3410-rebase-preserve-dropped-merges.sh deleted +0 -90
90 lines not on this page · raw message
t/t3411-rebase-preserve-around-merges.sh deleted +0 -80
80 lines not on this page · raw message
t/t3412-rebase-root.sh +0 -37
@@ -89,17 +89,6 @@ test_expect_success 'pre-rebase got correct input (4)' ' test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work4 ' -test_expect_success REBASE_P 'rebase -i -p with linear history' ' - git checkout -b work5 other && - git rebase -i -p --root --onto main && - git log --pretty=tformat:"%s" > rebased5 && - test_cmp expect rebased5 -' - -test_expect_success REBASE_P 'pre-rebase got correct input (5)' ' - test "z$(cat .git/PRE-REBASE-INPUT)" = z--root, -' - test_expect_success 'set up merge history' ' git checkout other^ && git checkout -b side &&
@@ -123,13 +112,6 @@ commit work6~4 1 EOF -test_expect_success REBASE_P 'rebase -i -p with merge' ' - git checkout -b work6 other && - git rebase -i -p --root --onto main && - log_with_names work6 > rebased6 && - test_cmp expect-side rebased6 -' - test_expect_success 'set up second root and merge' ' git symbolic-ref HEAD refs/heads/third && rm .git/index &&
@@ -158,13 +140,6 @@ commit work7~5 1 EOF -test_expect_success REBASE_P 'rebase -i -p with two roots' ' - git checkout -b work7 other && - git rebase -i -p --root --onto main && - log_with_names work7 > rebased7 && - test_cmp expect-third rebased7 -' - test_expect_success 'setup pre-rebase hook that fails' ' mkdir -p .git/hooks && cat >.git/hooks/pre-rebase <<EOF &&
@@ -264,21 +239,9 @@ commit conflict3~6 1 EOF -test_expect_success REBASE_P 'rebase -i -p --root with conflict (first part)' ' - git checkout -b conflict3 other && - test_must_fail git rebase -i -p --root --onto main && - git ls-files -u | grep "B$" -' - test_expect_success 'fix the conflict' ' echo 3 > B && git add B ' -test_expect_success REBASE_P 'rebase -i -p --root with conflict (second part)' ' - git rebase --continue && - log_with_names conflict3 >out && - test_cmp expect-conflict-p out -' - test_done
t/t3414-rebase-preserve-onto.sh deleted +0 -85
85 lines not on this page · raw message
t/t3418-rebase-continue.sh +0 -15
@@ -109,20 +109,6 @@ test_expect_success 'rebase -i --continue handles merge strategy and options' ' test -f funny.was.run ' -test_expect_success REBASE_P 'rebase passes merge strategy options correctly' ' - rm -fr .git/rebase-* && - git reset --hard commit-new-file-F3-on-topic-branch && - test_commit theirs-to-merge && - git reset --hard HEAD^ && - test_commit some-commit && - test_tick && - git merge --no-ff theirs-to-merge && - FAKE_LINES="1 edit 2 3" git rebase -i -f -p -m \ - -s recursive --strategy-option=theirs HEAD~2 && - test_commit force-change && - git rebase --continue -' - test_expect_success 'rebase -r passes merge strategy options correctly' ' rm -fr .git/rebase-* && git reset --hard commit-new-file-F3-on-topic-branch &&
@@ -258,7 +244,6 @@ test_rerere_autoupdate test_rerere_autoupdate -m GIT_SEQUENCE_EDITOR=: && export GIT_SEQUENCE_EDITOR test_rerere_autoupdate -i -test_have_prereq !REBASE_P || test_rerere_autoupdate --preserve-merges unset GIT_SEQUENCE_EDITOR test_expect_success 'the todo command "break" works' '
t/t3421-rebase-topology-linear.sh +0 -19
@@ -29,7 +29,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_expect_success 'setup branches and remote tracking' ' git tag -l >tags &&
@@ -53,7 +52,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -70,7 +68,6 @@ test_run_rebase success --apply test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -87,7 +84,6 @@ test_run_rebase success --apply test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -102,7 +98,6 @@ test_run_rebase success --apply test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p # f # /
@@ -142,7 +137,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -157,7 +151,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -172,7 +165,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -187,7 +179,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p # a---b---c---j! # \
@@ -215,7 +206,6 @@ test_run_rebase () { test_run_rebase failure --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -229,7 +219,6 @@ test_run_rebase () { } test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -243,7 +232,6 @@ test_run_rebase () { } test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase success --rebase-merges # m
@@ -283,7 +271,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -298,7 +285,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -313,7 +299,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -329,7 +314,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -344,7 +328,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -358,7 +341,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -373,6 +355,5 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_done
t/t3422-rebase-incompatible-options.sh +0 -11
@@ -63,15 +63,4 @@ test_rebase_am_only () { test_rebase_am_only --whitespace=fix test_rebase_am_only -C4 -test_expect_success REBASE_P '--preserve-merges incompatible with --signoff' ' - git checkout B^0 && - test_must_fail git rebase --preserve-merges --signoff A -' - -test_expect_success REBASE_P \ - '--preserve-merges incompatible with --rebase-merges' ' - git checkout B^0 && - test_must_fail git rebase --preserve-merges --rebase-merges A -' - test_done
t/t3425-rebase-topology-merges.sh +0 -151
155 lines not on this page · raw message
t/t3427-rebase-subtree.sh +0 -19
@@ -69,25 +69,6 @@ test_expect_success 'setup' ' git commit -m "Empty commit" --allow-empty ' -# FAILURE: Does not preserve topic_4. -test_expect_failure REBASE_P 'Rebase -Xsubtree --preserve-merges --onto commit' ' - reset_rebase && - git checkout -b rebase-preserve-merges to-rebase && - git rebase -Xsubtree=files_subtree --preserve-merges --onto files-main main && - verbose test "$(commit_message HEAD~)" = "topic_4" && - verbose test "$(commit_message HEAD)" = "files_subtree/topic_5" -' - -# FAILURE: Does not preserve topic_4. -test_expect_failure REBASE_P 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit' ' - reset_rebase && - git checkout -b rebase-keep-empty to-rebase && - git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-main main && - verbose test "$(commit_message HEAD~2)" = "topic_4" && - verbose test "$(commit_message HEAD~)" = "files_subtree/topic_5" && - verbose test "$(commit_message HEAD)" = "Empty commit" -' - test_expect_success 'Rebase -Xsubtree --empty=ask --onto commit' ' reset_rebase && git checkout -b rebase-onto to-rebase &&
t/t5520-pull.sh +0 -18
@@ -546,15 +546,6 @@ test_expect_success 'pull.rebase=1 is treated as true and flattens keep-merge' ' test_cmp expect actual ' -test_expect_success REBASE_P \ - 'pull.rebase=preserve rebases and merges keep-merge' ' - git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && - git pull . copy && - test_cmp_rev HEAD^^ copy && - test_cmp_rev HEAD^2 keep-merge -' - test_expect_success 'pull.rebase=interactive' ' write_script "$TRASH_DIRECTORY/fake-editor" <<-\EOF && echo I was here >fake.out &&
@@ -606,15 +597,6 @@ test_expect_success '--rebase=true rebases and flattens keep-merge' ' test_cmp expect actual ' -test_expect_success REBASE_P \ - '--rebase=preserve rebases and merges keep-merge' ' - git reset --hard before-preserve-rebase && - test_config pull.rebase true && - git pull --rebase=preserve . copy && - test_cmp_rev HEAD^^ copy && - test_cmp_rev HEAD^2 keep-merge -' - test_expect_success '--rebase=invalid fails' ' git reset --hard before-preserve-rebase && test_must_fail git pull --rebase=invalid . copy
t/t7505-prepare-commit-msg-hook.sh +0 -1
@@ -250,7 +250,6 @@ test_rebase () { } test_rebase success -test_have_prereq !REBASE_P || test_rebase success -p test_expect_success 'with hook (cherry-pick)' ' test_when_finished "git checkout -f main" &&
t/t7517-per-repo-email.sh +0 -13
@@ -75,19 +75,6 @@ test_expect_success 'noop interactive rebase does not care about ident' ' git rebase -i HEAD^ ' -test_expect_success REBASE_P \ - 'fast-forward rebase does not care about ident (preserve)' ' - git checkout -B tmp side-without-commit && - git rebase -p main -' - -test_expect_success REBASE_P \ - 'non-fast-forward rebase refuses to write commits (preserve)' ' - test_when_finished "git rebase --abort || true" && - git checkout -B tmp side-with-commit && - test_must_fail git rebase -p main -' - test_expect_success 'author.name overrides user.name' ' test_config user.name user && test_config user.email [email protected] &&
t/test-lib.sh +0 -4
@@ -1708,10 +1708,6 @@ test_lazy_prereq SHA1 ' esac ' -test_lazy_prereq REBASE_P ' - test -z "$GIT_TEST_SKIP_REBASE_P" -' - # Ensure that no test accidentally triggers a Git command # that runs the actual maintenance scheduler, affecting a user's # system permanently.
Signature · 1 line
gitgitgadget
Re: [PATCH v2 3/7] tests: stop testing `git rebase --preserve-merges`
t/t3427-rebase-subtree.sh test_expect_success 'setup' ' · line 70
Quoted 7 lines · Johannes Schindelin via GitGitGadget
t/t3427-rebase-subtree.sh +0
-0@@ -69,25 +69,6 @@ test_expect_success 'setup' ' git commit -m "Empty commit" --allow-empty '
The comment at the start should be changed too, e.g. something like this to squash in:
t/t3427-rebase-subtree.sh +2 -5
@@ -36,11 +36,8 @@ commit_message() { # where the root commit adds three files: topic_1.t, topic_2.t and topic_3.t. # # This commit history is then rebased onto `topic_3` with the -# `-Xsubtree=files_subtree` option in three different ways: -# -# 1. using `--preserve-merges` -# 2. using `--preserve-merges` and --keep-empty -# 3. without specifying a rebase backend +# `-Xsubtree=files_subtree` option, both with and without +# specifying a rebase backend test_expect_success 'setup' ' test_commit README &&
PATCH v2 4/7 pull: remove support for `--rebase=preserve`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
In preparation for git-rebase--preserve-merges.sh entering its after life, we remove this (deprecated) option that would still rely on it.
--- Documentation/config/branch.txt | 4 ---- Documentation/config/pull.txt | 4 ---- Documentation/git-pull.txt | 6 +----- builtin/pull.c | 9 +++------ contrib/completion/git-completion.bash | 2 +- rebase.c | 2 -- rebase.h | 1 - 7 files changed, 5 insertions(+), 23 deletions(-)
Documentation/config/branch.txt +0 -4
@@ -85,10 +85,6 @@ When `merges` (or just 'm'), pass the `--rebase-merges` option to 'git rebase' so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When `preserve` (or just 'p', deprecated in favor of `merges`), also pass -`--preserve-merges` along to 'git rebase' so that locally committed merge -commits will not be flattened by running 'git pull'. -+ When the value is `interactive` (or just 'i'), the rebase is run in interactive mode. +
Documentation/config/pull.txt +0 -4
@@ -18,10 +18,6 @@ When `merges` (or just 'm'), pass the `--rebase-merges` option to 'git rebase' so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When `preserve` (or just 'p', deprecated in favor of `merges`), also pass -`--preserve-merges` along to 'git rebase' so that locally committed merge -commits will not be flattened by running 'git pull'. -+ When the value is `interactive` (or just 'i'), the rebase is run in interactive mode. +
Documentation/git-pull.txt +1 -5
@@ -102,7 +102,7 @@ Options related to merging include::merge-options.txt[] -r:: ---rebase[=false|true|merges|preserve|interactive]:: +--rebase[=false|true|merges|interactive]:: When true, rebase the current branch on top of the upstream branch after fetching. If there is a remote-tracking branch corresponding to the upstream branch and the upstream branch
@@ -113,10 +113,6 @@ When set to `merges`, rebase using `git rebase --rebase-merges` so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When set to `preserve` (deprecated in favor of `merges`), rebase with the -`--preserve-merges` option passed to `git rebase` so that locally created -merge commits will not be flattened. -+ When false, merge the upstream branch into the current branch. + When `interactive`, enable the interactive mode of rebase.
builtin/pull.c +3 -6
@@ -30,9 +30,8 @@/** * Parses the value of --rebase. If value is a false value, returns * REBASE_FALSE. If value is a true value, returns REBASE_TRUE. If value is -* "merges", returns REBASE_MERGES. If value is "preserve", returns -* REBASE_PRESERVE. If value is a invalid value, dies with a fatal error if -* fatal is true, otherwise returns REBASE_INVALID. +* "merges", returns REBASE_MERGES. If value is a invalid value, dies with +* a fatal error if fatal is true, otherwise returns REBASE_INVALID. */ static enum rebase_type parse_config_rebase (const char *key,const char *value,int fatal)
@@ -126,7 +125,7 @@ static struct option pull_options[] = {/* Options passed to git-merge or git-rebase */ OPT_GROUP (N_ ("Options related to merging" )),OPT_CALLBACK_F ('r' ,"rebase" , &opt_rebase, -"(false|true|merges|preserve|interactive)" , +"(false|true|merges|interactive)" ,N_ ("incorporate changes by rebasing rather than merging" ),PARSE_OPT_OPTARG , parse_opt_rebase), OPT_PASSTHRU('n', NULL, &opt_diffstat, NULL,
@@ -883,8 +882,6 @@ static int run_rebase(const struct object_id *newbase,/* Options passed to git-rebase */ if (opt_rebase ==REBASE_MERGES )strvec_push (&args,"--rebase-merges" ); -else if (opt_rebase ==REBASE_PRESERVE ) -strvec_push (&args,"--preserve-merges" );else if (opt_rebase ==REBASE_INTERACTIVE )strvec_push (&args,"--interactive" );if (opt_diffstat)
contrib/completion/git-completion.bash +1 -1
@@ -2543,7 +2543,7 @@ __git_complete_config_variable_value () return ;; branch.*.rebase) - __gitcomp "false true merges preserve interactive" "" "$cur_" + __gitcomp "false true merges interactive" "" "$cur_" return ;; remote.pushdefault)
rebase.c +0 -2
@@ -20,8 +20,6 @@ enum rebase_type rebase_parse_value(const char *value)return REBASE_FALSE ; else if (v > 0) return REBASE_TRUE; - else if (!strcmp(value, "preserve") || !strcmp(value, "p")) - return REBASE_PRESERVE; else if (!strcmp(value, "merges") || !strcmp(value, "m")) return REBASE_MERGES; else if (!strcmp(value, "interactive") || !strcmp(value, "i"))
rebase.h +0 -1
@@ -5,7 +5,6 @@ enum rebase_type {REBASE_INVALID =-1 ,REBASE_FALSE =0 ,REBASE_TRUE , -REBASE_PRESERVE ,REBASE_MERGES , REBASE_INTERACTIVE };
Signature · 1 line
gitgitgadget
PATCH v2 5/7 rebase: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
This option was deprecated in favor of --rebase-merges some time ago, and now we retire it.
--- .gitignore | 1 - Documentation/git-rebase.txt | 51 -- Makefile | 2 - builtin/rebase.c | 133 +--- git-rebase--preserve-merges.sh | 1057 -------------------------------- 5 files changed, 6 insertions(+), 1238 deletions(-) delete mode 100644 git-rebase--preserve-merges.sh
.gitignore +0 -1
@@ -125,7 +125,6 @@ /git-range-diff /git-read-tree /git-rebase -/git-rebase--preserve-merges /git-receive-pack /git-reflog /git-remote
Documentation/git-rebase.txt +0 -51
87 lines not on this page · raw message
Makefile +0 -2
@@ -616,7 +616,6 @@ SCRIPT_SH += git-submodule.sh SCRIPT_SH += git-web--browse.sh SCRIPT_LIB += git-mergetool--lib -SCRIPT_LIB += git-rebase--preserve-merges SCRIPT_LIB += git-sh-i18n SCRIPT_LIB += git-sh-setup
@@ -2649,7 +2648,6 @@ XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \ --keyword=__ --keyword=N__ --keyword="__n:1,2" LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H) LOCALIZED_SH = $(SCRIPT_SH) -LOCALIZED_SH += git-rebase--preserve-merges.sh LOCALIZED_SH += git-sh-setup.sh LOCALIZED_PERL = $(SCRIPT_PERL)
builtin/rebase.c +6 -127
213 lines not on this page · raw message
git-rebase--preserve-merges.sh deleted +0 -1057
1,057 lines not on this page · raw message
Signature · 1 line
gitgitgadget
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
builtin/rebase.c static int run_am(struct rebase_options *opts) · line 929
Quoted 2 lines · Johannes Schindelin via GitGitGadget
builtin/rebase.c +1
-1-struct strbuf script_snippet =STRBUF_INIT , buf =STRBUF_INIT ; +struct strbuf script_snippet =STRBUF_INIT ;
You end up removing all uses of script_snippet except the strbuf_release() for it, so this & that can be removed too.
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Hi Ævar,
Quoted 8 lines · Ævar Arnfjörð Bjarmason
builtin/rebase.c static int run_am(struct rebase_options *opts) · line 929
Quoted 2 lines · Johannes Schindelin via GitGitGadget
builtin/rebase.c +1
-1-struct strbuf script_snippet =STRBUF_INIT , buf =STRBUF_INIT ; +struct strbuf script_snippet =STRBUF_INIT ;You end up removing all uses of
script_snippetexcept thestrbuf_release()for it, so this & that can be removed too.
Valid point, I missed it because compiling with DEVELOPER=1 did not complain (because strbuf_release() "uses" the variable).
Ciao,
Dscho
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Quoted 7 lines · Johannes Schindelin
Hi Ævar,
Quoted 3 lines · Ævar Arnfjörð Bjarmason
On Wed, Sep 01 2021, Johannes Schindelin via GitGitGadget wrote:
Quoted 8 lines
Quoted 5 lines
builtin/rebase.c static int run_am(struct rebase_options *opts) · line 929
Quoted 2 lines
builtin/rebase.c +1
-1-struct strbuf script_snippet =STRBUF_INIT , buf =STRBUF_INIT ; +struct strbuf script_snippet =STRBUF_INIT ;You end up removing all uses of
script_snippetexcept thestrbuf_release()for it, so this & that can be removed too.Valid point, I missed it because compiling with
DEVELOPER=1did not complain (becausestrbuf_release()"uses" the variable).
As an aside I was looking the other day to see if some variant of -Wunused was smart enough to exclude (preferably a configurable) list of functions. E.g.:
void *some_var = malloc(123);
free(some_var);Could be unused if something was smart to see that a thing only interacting with "malloc" and "free" wasn't otherwise used, and likewise we could add "strbuf_release" and other such free() functions to such a list.
But I didn't find anything...
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetReview
Quoted 11 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
This option was deprecated in favor of
--rebase-mergessome time ago, and now we retire it.static int
is_merge(struct rebase_options *opts)
{(quoted diff) +1
-2- return opts->type == REBASE_MERGE || - opts->type == REBASE_PRESERVE_MERGES; + return opts->type == REBASE_MERGE; }
This leaves us with a rather pointless is_merge() function and nonsensical control flow in parse_opt_merge(). Let's squash this in:
builtin/rebase.c +7 -13
@@ -383,11 +383,6 @@ static int parse_opt_keep_empty(const struct option *opt, const char *arg,return 0 ; } -static int is_merge (struct rebase_options *opts) -{ -return opts->type ==REBASE_MERGE ; -} -static void imply_merge (struct rebase_options *opts,const char *option) {switch (opts->type) {
@@ -909,8 +904,7 @@ static int parse_opt_merge(const struct option *opt, const char *arg, int unset)BUG_ON_OPT_NEG (unset);BUG_ON_OPT_ARG (arg); -if (!is_merge (opts)) - opts->type =REBASE_MERGE ; + opts->type =REBASE_MERGE ;return 0 ; }
@@ -988,7 +982,7 @@ static void set_reflog_action(struct rebase_options *options)const char *env;struct strbuf buf =STRBUF_INIT ; -if (!is_merge (options)) +if (options->type !=REBASE_MERGE )return ; env =getenv (GIT_REFLOG_ACTION_ENVIRONMENT );
@@ -1208,12 +1202,12 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)die (_ ("No rebase in progress?" ));setenv (GIT_REFLOG_ACTION_ENVIRONMENT ,"rebase" ,0 ); -if (action ==ACTION_EDIT_TODO && !is_merge (&options)) +if (action ==ACTION_EDIT_TODO && options.type !=REBASE_MERGE )die (_ ("The --edit-todo action can only be used during " "interactive rebase." ));if (trace2_is_enabled ()) { -if (is_merge (&options)) +if (options.type ==REBASE_MERGE )trace2_cmd_mode ("interactive" );else if (exec.nr)trace2_cmd_mode ("interactive-exec" );
@@ -1465,7 +1459,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)break ;if (i >=0 ) { -if (is_merge (&options)) +if (options.type ==REBASE_MERGE )die (_ ("cannot combine apply options with " "merge options" ));else
@@ -1507,7 +1501,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)else options.empty =EMPTY_DROP ; } -if (reschedule_failed_exec >0 && !is_merge (&options)) +if (reschedule_failed_exec >0 && options.type !=REBASE_MERGE )die (_ ("--reschedule-failed-exec requires " "--exec or --interactive" ));if (reschedule_failed_exec >=0 )
@@ -1746,7 +1740,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)diff_flush (&opts); } -if (is_merge (&options)) +if (options.type ==REBASE_MERGE ) goto run_rebase;/* Detach HEAD and reset the tree */
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Hi Ævar,
Quoted 8 lines · Ævar Arnfjörð Bjarmason
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
This option was deprecated in favor of
--rebase-mergessome time ago, and now we retire it.
Quoted 9 lines
Review
Quoted 6 lines
static int
is_merge(struct rebase_options *opts)
{(quoted diff) +1
-2- return opts->type == REBASE_MERGE || - opts->type == REBASE_PRESERVE_MERGES; + return opts->type == REBASE_MERGE; }This leaves us with a rather pointless
is_merge()function and nonsensical control flow inparse_opt_merge().
Thank you for offering your perspective.
From a readability point of view, I disagree with your assessment. Just because it can be written shorter does not mean that it is clearer. Quite the contrary, if you ask me. And since _I_ am contributing this patch series, I will respectfully disagree and keep the version I find more intuitive.
You could potentially talk me into adding a patch that renames that function to is_merge_backend(), but that's as far as I would go. And I am not really certain that that would improve things, either.
Ciao,
Dscho
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Quoted 30 lines · Johannes Schindelin
Hi Ævar,
Quoted 8 lines · Ævar Arnfjörð Bjarmason
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
This option was deprecated in favor of
--rebase-mergessome time ago, and now we retire it.Quoted 9 lines
Review
Quoted 6 lines
static int
is_merge(struct rebase_options *opts)
{(quoted diff) +1
-2- return opts->type == REBASE_MERGE || - opts->type == REBASE_PRESERVE_MERGES; + return opts->type == REBASE_MERGE; }This leaves us with a rather pointless
is_merge()function and nonsensical control flow inparse_opt_merge().Thank you for offering your perspective.
From a readability point of view, I disagree with your assessment. Just because it can be written shorter does not mean that it is clearer. Quite the contrary, if you ask me. And since _I_ am contributing this patch series, I will respectfully disagree and keep the version I find more intuitive.
Quoted 3 lines
You could potentially talk me into adding a patch that renames that function to
is_merge_backend(), but that's as far as I would go. And I am not really certain that that would improve things, either.
I should have phrased that "Let's squash this in" less forcefully, to be clear it was just a suggestion. I'm fine with you not taking that squash. This series is good either way.
But just to poke a bit at the rationale: I'd be totally on-board with keeping it because we'd like the smallest possible diff here, even if that ends up including this oddity.
But in terms of making the end-result more readable I don't really see that.
We're left with a mismatch of some things comparing the enum label directly, and some using this function, and then there's REBASE_APPLY. To make it consistent we could alternatively have the diff here at the end, but having some mixture of both seems like the worst end-result, shouldn't we pick one way of inspecting these flags and use that consistently?
(I did not convert the few REBASE_UNSPECIFIED, but those comparisons could similarly be is_unspecified(), and all three could be named is_*_backend() per your suggestion).
builtin/rebase.c +14 -9
@@ -388,6 +388,11 @@ static int is_merge(struct rebase_options *opts)return opts->type ==REBASE_MERGE ; } +static int is_apply (struct rebase_options *opts) +{ +return opts->type ==REBASE_APPLY ; +} +static void imply_merge (struct rebase_options *opts,const char *option) {switch (opts->type) {
@@ -558,7 +563,7 @@ static int finish_rebase(struct rebase_options *opts)* user should see them. */ run_auto_maintenance (!(opts->flags & (REBASE_NO_QUIET |REBASE_VERBOSE ))); -if (opts->type ==REBASE_MERGE ) { +if (is_merge (opts)) {struct replay_opts replay =REPLAY_OPTS_INIT ; replay.action =REPLAY_INTERACTIVE_REBASE ;
@@ -744,7 +749,7 @@ static int run_specific_rebase(struct rebase_options *opts, enum action action)struct strbuf script_snippet =STRBUF_INIT ;int status; -if (opts->type ==REBASE_MERGE ) { +if (is_merge (opts)) {/* Run sequencer-based rebase */ setenv ("GIT_CHERRY_PICK_HELP" , resolvemsg,1 );if (!(opts->flags &REBASE_INTERACTIVE_EXPLICIT )) {
@@ -759,14 +764,14 @@ static int run_specific_rebase(struct rebase_options *opts, enum action action) } status =run_sequencer_rebase (opts, action); - }else if (opts->type ==REBASE_APPLY ) + }else if (is_apply (opts)) status =run_am (opts);else BUG ("Unhandled rebase type %d" , opts->type);if (opts->dont_finish_rebase) ;/* do nothing */ -else if (opts->type ==REBASE_MERGE ) +else if (is_merge (opts)) ;/* merge backend cleans up after itself */ else if (status ==0 ) {if (!file_exists (state_dir_path ("stopped-sha" , opts)))
@@ -1293,7 +1298,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) }case ACTION_QUIT : {save_autostash (state_dir_path ("autostash" , &options)); -if (options.type ==REBASE_MERGE ) { +if (is_merge (&options)) {struct replay_opts replay =REPLAY_OPTS_INIT ; replay.action =REPLAY_INTERACTIVE_REBASE ;
@@ -1406,7 +1411,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)imply_merge (&options,"--rebase-merges" ); } -if (options.type ==REBASE_APPLY ) { +if (is_apply (&options)) {if (ignore_whitespace)strvec_push (&options.git_am_opts,"--ignore-whitespace" );
@@ -1452,7 +1457,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) } } -if (options.type ==REBASE_MERGE ) +if (is_merge (&options))imply_merge (&options,"--merge" );if (options.root && !options.onto_name)
@@ -1461,7 +1466,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)if (isatty (2 ) && options.flags &REBASE_NO_QUIET )strbuf_addstr (&options.git_format_patch_opt," --progress" ); -if (options.git_am_opts.nr || options.type ==REBASE_APPLY ) { +if (options.git_am_opts.nr ||is_apply (&options)) {/* all am options except -q are compatible only with --apply */ for (i = options.git_am_opts.nr -1 ; i >=0 ; i--)if (strcmp (options.git_am_opts.v[i],"-q" ))
@@ -1486,7 +1491,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) options.default_backend); } -if (options.type ==REBASE_MERGE && +if (is_merge (&options) && !options.strategy &&getenv ("GIT_TEST_MERGE_ALGORITHM" )) options.strategy =xstrdup (getenv ("GIT_TEST_MERGE_ALGORITHM" ));
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetQuoted 48 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
This option was deprecated in favor of
--rebase-mergessome time ago, and now we retire it.Signed-off-by Johannes Schindelin <[email protected]>--- .gitignore | 1 - Documentation/git-rebase.txt | 51 -- Makefile | 2 - builtin/rebase.c | 133 +--- git-rebase--preserve-merges.sh | 1057 -------------------------------- 5 files changed, 6 insertions(+), 1238 deletions(-) delete mode 100644 git-rebase--preserve-merges.sh.gitignore +0
-1@@ -125,7 +125,6 @@ /git-range-diff /git-read-tree /git-rebase -/git-rebase--preserve-merges /git-receive-pack /git-reflog /git-remoteDocumentation/git-rebase.txt +0
-7@@ -525,29 +525,12 @@ i.e. commits that would be excluded by linkgit:git-log[1]'s the `rebase-cousins` mode is turned on, such commits are instead rebased onto `<upstream>` (or `<onto>`, if specified). + -The `--rebase-merges` mode is similar in spirit to the deprecated -`--preserve-merges` but works with interactive rebases, -where commits can be reordered, inserted and dropped at will. -+ It is currently only possible to recreate the merge commits using the `recursive` merge strategy; Different merge strategies can be used only via explicit `exec git merge -s <strategy> [...]` commands. + See also REBASING MERGES and INCOMPATIBLE OPTIONS below. --p:: ---preserve-merges:: - [DEPRECATED: use `--rebase-merges` instead] Recreate merge commits
Documentation/git-rebase.txt i.e. commits that would be excluded by linkgit:git-log[1]'s · line 550
Quoted 10 lines
Documentation/git-rebase.txt +0
-10- instead of flattening the history by replaying commits a merge commit - introduces. Merge conflict resolutions or manual amendments to merge - commits are not preserved. -+ -This uses the `--interactive` machinery internally, but combining it -with the `--interactive` option explicitly is generally not a good -idea unless you know what you are doing (see BUGS below). -+ -See also INCOMPATIBLE OPTIONS below. -
I wonder if we should leave some variant of this in, just as a last resort to help users who have some ancient version / finger memory & wonder why it doesn't work, something like;
-p::
--preserve-merges:
These options were used by the long-deprecated and now removed "rebase merges" backend. The --rebase-merges option is the similar in spirit replacement mode.
Also, per your ea8b7be1476 (git svn: stop using rebase --preserve-merges, 2019-11-22) the use in "git svn" couldn't really be directly compared to this, but there we usurped the "-p" flag for --rebase-merges. Perhaps we could/should do the same here (eventually, doesn't need to be in this series).
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetQuoted 1 line · Johannes Schindelin via GitGitGadget
git-rebase--preserve-merges.sh | 1057 --------------------------------
You could, but certainly don't have to, squash in the below. I.e. this is the last user of eval_ngettext!
I mentioned in <[email protected]> that I'd recently come up with pretty much the same diff, that was because I was seeing how much of the shellscript gettext support I could rip out.
This is a major step to getting a whole section of git's shellscript support infrastructure out-of-tree, i.e. git-sh-i18n.sh, and the sh-i18n--envsubst built-in helper.
If I then merge mirucam/git-bisect-work-part4-v6 & gitster/ar/submodule-run-update-procedure along with this we'll have a relatively small amount of gettext-in-sh code left, which should be entirely gone before too long. Yay!
git-sh-i18n.sh +0 -12
@@ -51,12 +51,6 @@ gettext_without_eval_gettext) ) } - eval_ngettext () { - ngettext "$1" "$2" "$3" | ( - export PATH $(git sh-i18n--envsubst --variables "$2"); - git sh-i18n--envsubst "$2" - ) - } ;; *) gettext () {
@@ -70,12 +64,6 @@ gettext_without_eval_gettext) ) } - eval_ngettext () { - (test "$3" = 1 && printf "%s" "$1" || printf "%s" "$2") | ( - export PATH $(git sh-i18n--envsubst --variables "$2"); - git sh-i18n--envsubst "$2" - ) - } ;; esac
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Quoted 6 lines · Ævar Arnfjörð Bjarmason
Quoted 1 line · Johannes Schindelin via GitGitGadget
git-rebase--preserve-merges.sh | 1057 --------------------------------You could, but certainly don't have to, squash in the below. I.e. this is the last user of
eval_ngettext!
Also get_author_ident_from_commit() in git-sh-setup.sh and Documentation/git-sh-setup.txt can be removed, git-rebase--preserve-merges.sh is the last user of it.
I looked over the other git-sh-setup functions, it seems that's the only one that could be removed along with git-rebase--preserve-merges.sh.
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Quoted 9 lines · Ævar Arnfjörð Bjarmason
Quoted 6 lines · Ævar Arnfjörð Bjarmason
Quoted 1 line · Johannes Schindelin via GitGitGadget
git-rebase--preserve-merges.sh | 1057 --------------------------------You could, but certainly don't have to, squash in the below. I.e. this is the last user of
eval_ngettext!
Quoted 6 lines
Also
get_author_ident_from_commit()ingit-sh-setup.shandDocumentation/git-sh-setup.txtcan be removed,git-rebase--preserve-merges.shis the last user of it.I looked over the other git-sh-setup functions, it seems that's the only one that could be removed along with
git-rebase--preserve-merges.sh.
Although with git-rebase--preserve-merges.sh gone the get_author_ident_from_commit(), parse_ident_from_commit() and pick_ident_script() can all be moved to its last user:git-filter-branch.sh
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
In reply to Ævar Arnfjörð BjarmasonHi Ævar,
Quoted 6 lines · Ævar Arnfjörð Bjarmason
Quoted 1 line · Johannes Schindelin via GitGitGadget
git-rebase--preserve-merges.sh | 1057 --------------------------------You could, but certainly don't have to, squash in the below. I.e. this is the last user of
eval_ngettext!
s/last user/last in-tree user/
Since we install git-sh-i18n and semi-advertised it as something to use in user scripts (which makes removing it somewhat questionable a goal, certainly when you do not even offer a deprecation period), and since the removal of such things is completely orthogonal to the intention of this patch series, I will not include this patch, let alone squash it into a commit whose purpose has nothing to do with gettext whatsoever.
Ciao,
Johannes
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Quoted 11 lines · Johannes Schindelin
Hi Ævar,
Quoted 6 lines · Ævar Arnfjörð Bjarmason
Quoted 1 line · Johannes Schindelin via GitGitGadget
git-rebase--preserve-merges.sh | 1057 --------------------------------You could, but certainly don't have to, squash in the below. I.e. this is the last user of
eval_ngettext!
Quoted 8 lines
s/last user/last in-tree user/
Since we install
git-sh-i18nand semi-advertised it as something to use in user scripts (which makes removing it somewhat questionable a goal, certainly when you do not even offer a deprecation period), and since the removal of such things is completely orthogonal to the intention of this patch series, I will not include this patch, let alone squash it into a commit whose purpose has nothing to do with gettext whatsoever.
Unlike whatever controversy we're having over git-sh-setup being removed (see <[email protected]>[1]), the git-sh-i18n's gettext() and eval_gettext() can't be useful to anyone out of git.git's tree, since they accept strings that are expected to be found in git.git's generated *.mo files.
So it's certainly possible that someone's used out out-of-tree, but that use of eval_gettext() won't have been doing anything useful in terms of translation, and if it did that would have been because someone copied a to-be-translated string as-is, and expected git.git to keep it byte-for-byte the same as their sources.
Anyway, if you don't want to squash this in I can submit it as some sort of follow-up, perhaps along with some of the suggestions in <[email protected]>[2] if you're generally aiming to keep the changes here to the depth of the first callstack, i.e. remove the --preserve-merges use of a foo(), but not a foo() function itself if that foo() then becomes orphaned as a result.
1. https://lore.kernel.org/git/[email protected]/
2. https://lore.kernel.org/git/[email protected]/
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Quoted 4 lines · Ævar Arnfjörð Bjarmason
... the
git-sh-i18n'sgettext()andeval_gettext()can't be useful to anyone out of git.git's tree, since they accept strings that are expected to be found in git.git's generated *.mo files.
True but removing it is probably outside the scope of this series. Removal of helper functions from sh-i18n can be discussed once the dust from this topic settles ("now the last caller of the helper is gone from 'master', we can remove X, Y and Z").
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetHi dscho
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
This option was deprecated in favor of
--rebase-mergessome time ago, and now we retire it.
This all looks good to me. I did see the comment below in builtin/rebase.c that could be tweaked if you reroll, but it is a very minor issue.
/* -i followed by -p is still explicitly interactive, but -p alone is not */ static int parse_opt_interactive(const struct option *opt, const char *arg,
int unset)
I do wonder if we need these option parsing functions now but that is a question for another day.
Best Wishes
Phillip
Quoted 1,431 lines
Signed-off-by Johannes Schindelin <[email protected]>--- .gitignore | 1 - Documentation/git-rebase.txt | 51 -- Makefile | 2 - builtin/rebase.c | 133 +--- git-rebase--preserve-merges.sh | 1057 -------------------------------- 5 files changed, 6 insertions(+), 1238 deletions(-)delete mode 100644
git-rebase--preserve-merges.sh.gitignore +0
-1@@ -125,7 +125,6 @@ /git-range-diff /git-read-tree /git-rebase -/git-rebase--preserve-merges /git-receive-pack /git-reflog /git-remoteDocumentation/git-rebase.txt +0
-51@@ -525,29 +525,12 @@ i.e. commits that would be excluded by linkgit:git-log[1]'s the `rebase-cousins` mode is turned on, such commits are instead rebased onto `<upstream>` (or `<onto>`, if specified). + -The `--rebase-merges` mode is similar in spirit to the deprecated -`--preserve-merges` but works with interactive rebases, -where commits can be reordered, inserted and dropped at will. -+ It is currently only possible to recreate the merge commits using the `recursive` merge strategy; Different merge strategies can be used only via explicit `exec git merge -s <strategy> [...]` commands. + See also REBASING MERGES and INCOMPATIBLE OPTIONS below. --p:: ---preserve-merges:: - [DEPRECATED: use `--rebase-merges` instead] Recreate merge commits - instead of flattening the history by replaying commits a merge commit - introduces. Merge conflict resolutions or manual amendments to merge - commits are not preserved. -+ -This uses the `--interactive` machinery internally, but combining it -with the `--interactive` option explicitly is generally not a good -idea unless you know what you are doing (see BUGS below). -+ -See also INCOMPATIBLE OPTIONS below. - -x <cmd>:: --exec <cmd>:: Append "exec <cmd>" after each line creating a commit in the@@ -579,9 +562,6 @@ See also INCOMPATIBLE OPTIONS below. the root commit(s) on a branch. When used with --onto, it will skip changes already contained in <newbase> (instead of <upstream>) whereas without --onto it will operate on every change. - When used together with both --onto and --preserve-merges, - 'all' root commits will be rewritten to have <newbase> as parent - instead. + See also INCOMPATIBLE OPTIONS below.@@ -643,7 +623,6 @@ are incompatible with the following options: * --allow-empty-message * --[no-]autosquash * --rebase-merges - * --preserve-merges * --interactive * --exec * --no-keep-empty@@ -654,13 +633,6 @@ are incompatible with the following options: In addition, the following pairs of options are incompatible: - * --preserve-merges and --interactive - * --preserve-merges and --signoff - * --preserve-merges and --rebase-merges - * --preserve-merges and --empty= - * --preserve-merges and --ignore-whitespace - * --preserve-merges and --committer-date-is-author-date - * --preserve-merges and --ignore-date * --keep-base and --onto * --keep-base and --root * --fork-point and --root@@ -1274,29 +1246,6 @@ CONFIGURATION include::config/rebase.txt[] include::config/sequencer.txt[] -BUGS ----- -The todo list presented by the deprecated `--preserve-merges --interactive` -does not represent the topology of the revision graph (use `--rebase-merges` -instead). Editing commits and rewording their commit messages should work -fine, but attempts to reorder commits tend to produce counterintuitive results. -Use `--rebase-merges` in such scenarios instead. - -For example, an attempt to rearrange ------------- -1 --- 2 --- 3 --- 4 --- 5 ------------- -to ------------- -1 --- 2 --- 4 --- 3 --- 5 ------------- -by moving the "pick 4" line will result in the following history: ------------- - 3 - / -1 --- 2 --- 4 --- 5 ------------- - GIT --- Part of the linkgit:git[1] suiteMakefile +0
-2@@ -616,7 +616,6 @@ SCRIPT_SH += git-submodule.sh SCRIPT_SH += git-web--browse.sh SCRIPT_LIB += git-mergetool--lib -SCRIPT_LIB += git-rebase--preserve-merges SCRIPT_LIB += git-sh-i18n SCRIPT_LIB += git-sh-setup@@ -2649,7 +2648,6 @@ XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \ --keyword=__ --keyword=N__ --keyword="__n:1,2" LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H) LOCALIZED_SH = $(SCRIPT_SH) -LOCALIZED_SH += git-rebase--preserve-merges.sh LOCALIZED_SH += git-sh-setup.sh LOCALIZED_PERL = $(SCRIPT_PERL)builtin/rebase.c +6
-127@@ -48,8 +48,7 @@ static GIT_PATH_FUNC(merge_dir, "rebase-merge")enum rebase_type {REBASE_UNSPECIFIED =-1 ,REBASE_APPLY , -REBASE_MERGE , -REBASE_PRESERVE_MERGES +REBASE_MERGE };enum empty_type {@@ -571,8 +570,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)static int is_merge (struct rebase_options *opts) { -return opts->type ==REBASE_MERGE || - opts->type ==REBASE_PRESERVE_MERGES ; +return opts->type ==REBASE_MERGE ; }static void imply_merge (struct rebase_options *opts,const char *option)@@ -582,7 +580,6 @@ static void imply_merge(struct rebase_options *opts, const char *option)die (_ ("%s requires the merge backend" ), option);break ;case REBASE_MERGE : -case REBASE_PRESERVE_MERGES :break ;default : opts->type =REBASE_MERGE ;/* implied */ @@ -773,17 +770,6 @@ static struct commit *peel_committish(const char *name)return (struct commit *)peel_to_type (name,0 , obj,OBJ_COMMIT ); } -static void add_var (struct strbuf *buf,const char *name,const char *value) -{ -if (!value) -strbuf_addf (buf,"unset %s; " , name); -else { -strbuf_addf (buf,"%s=" , name); -sq_quote_buf (buf, value); -strbuf_addstr (buf,"; " ); - } -} -static int move_to_original_branch (struct rebase_options *opts) {struct strbuf orig_head_reflog =STRBUF_INIT , head_reflog =STRBUF_INIT ;@@ -940,10 +926,8 @@ static int run_am(struct rebase_options *opts)static int run_specific_rebase (struct rebase_options *opts,enum action action) { -const char *argv[] = {NULL ,NULL }; -struct strbuf script_snippet =STRBUF_INIT , buf =STRBUF_INIT ; +struct strbuf script_snippet =STRBUF_INIT ;int status; -const char *backend, *backend_func;if (opts->type ==REBASE_MERGE ) {/* Run sequencer-based rebase */ @@ -960,87 +944,11 @@ static int run_specific_rebase(struct rebase_options *opts, enum action action) } status =run_sequencer_rebase (opts, action); - goto finished_rebase; - } - -if (opts->type ==REBASE_APPLY ) { + }else if (opts->type ==REBASE_APPLY ) status =run_am (opts); - goto finished_rebase; - } - -add_var (&script_snippet,"GIT_DIR" ,absolute_path (get_git_dir ())); -add_var (&script_snippet,"state_dir" , opts->state_dir); - -add_var (&script_snippet,"upstream_name" , opts->upstream_name); -add_var (&script_snippet,"upstream" , opts->upstream ? -oid_to_hex (&opts->upstream->object.oid) :NULL ); -add_var (&script_snippet,"head_name" , - opts->head_name ? opts->head_name :"detached HEAD" ); -add_var (&script_snippet,"orig_head" ,oid_to_hex (&opts->orig_head)); -add_var (&script_snippet,"onto" , opts->onto ? -oid_to_hex (&opts->onto->object.oid) :NULL ); -add_var (&script_snippet,"onto_name" , opts->onto_name); -add_var (&script_snippet,"revisions" , opts->revisions); -add_var (&script_snippet,"restrict_revision" , opts->restrict_revision ? -oid_to_hex (&opts->restrict_revision->object.oid) :NULL ); -sq_quote_argv_pretty (&buf, opts->git_am_opts.v); -add_var (&script_snippet,"git_am_opt" , buf.buf); -strbuf_release (&buf); -add_var (&script_snippet,"verbose" , - opts->flags &REBASE_VERBOSE ?"t" :"" ); -add_var (&script_snippet,"diffstat" , - opts->flags &REBASE_DIFFSTAT ?"t" :"" ); -add_var (&script_snippet,"force_rebase" , - opts->flags &REBASE_FORCE ?"t" :"" ); -if (opts->switch_to) -add_var (&script_snippet,"switch_to" , opts->switch_to); -add_var (&script_snippet,"action" , opts->action ? opts->action :"" ); -add_var (&script_snippet,"signoff" , opts->signoff ?"--signoff" :"" ); -add_var (&script_snippet,"allow_rerere_autoupdate" , - opts->allow_rerere_autoupdate ? - opts->allow_rerere_autoupdate ==RERERE_AUTOUPDATE ? -"--rerere-autoupdate" :"--no-rerere-autoupdate" :"" ); -add_var (&script_snippet,"keep_empty" , opts->keep_empty ?"yes" :"" ); -add_var (&script_snippet,"autosquash" , opts->autosquash ?"t" :"" ); -add_var (&script_snippet,"gpg_sign_opt" , opts->gpg_sign_opt); -add_var (&script_snippet,"cmd" , opts->cmd); -add_var (&script_snippet,"allow_empty_message" , - opts->allow_empty_message ?"--allow-empty-message" :"" ); -add_var (&script_snippet,"rebase_merges" , - opts->rebase_merges ?"t" :"" ); -add_var (&script_snippet,"rebase_cousins" , - opts->rebase_cousins ?"t" :"" ); -add_var (&script_snippet,"strategy" , opts->strategy); -add_var (&script_snippet,"strategy_opts" , opts->strategy_opts); -add_var (&script_snippet,"rebase_root" , opts->root ?"t" :"" ); -add_var (&script_snippet,"squash_onto" , - opts->squash_onto ?oid_to_hex (opts->squash_onto) :"" ); -add_var (&script_snippet,"git_format_patch_opt" , - opts->git_format_patch_opt.buf); - -if (is_merge (opts) && - !(opts->flags &REBASE_INTERACTIVE_EXPLICIT )) { -strbuf_addstr (&script_snippet, -"GIT_SEQUENCE_EDITOR=:; export GIT_SEQUENCE_EDITOR; " ); - opts->autosquash =0 ; - } - -switch (opts->type) { -case REBASE_PRESERVE_MERGES : - backend ="git-rebase--preserve-merges" ; - backend_func ="git_rebase__preserve_merges" ; -break ; -default : +else BUG ("Unhandled rebase type %d" , opts->type); -break ; - } -strbuf_addf (&script_snippet, -". git-sh-setup && . %s && %s" , backend, backend_func); - argv[0 ] = script_snippet.buf; - - status =run_command_v_opt (argv,RUN_USING_SHELL ); -finished_rebase:if (opts->dont_finish_rebase) ;/* do nothing */ else if (opts->type ==REBASE_MERGE )@@ -1377,10 +1285,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) N_("let the user edit the list of commits to rebase"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, parse_opt_interactive), -OPT_SET_INT_F ('p' ,"preserve-merges" , &options.type, -N_ ("(DEPRECATED) try to recreate merges instead of " -"ignoring them" ), -REBASE_PRESERVE_MERGES ,PARSE_OPT_HIDDEN ),OPT_RERERE_AUTOUPDATE (&options.allow_rerere_autoupdate), OPT_CALLBACK_F(0, "empty", &options, "{drop,keep,ask}", N_("how to handle commits that become empty"),@@ -1448,8 +1352,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)strbuf_reset (&buf);strbuf_addf (&buf,"%s/rewritten" ,merge_dir ());if (is_directory (buf.buf)) { - options.type =REBASE_PRESERVE_MERGES ; - options.flags |=REBASE_INTERACTIVE_EXPLICIT ; +die ("`rebase -p` is no longer supported" ); }else {strbuf_reset (&buf);strbuf_addf (&buf,"%s/interactive" ,merge_dir ());@@ -1479,10 +1382,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)usage_with_options (builtin_rebase_usage, builtin_rebase_options); -if (options.type ==REBASE_PRESERVE_MERGES ) -warning (_ ("git rebase --preserve-merges is deprecated. " -"Use --rebase-merges instead." )); -if (keep_base) {if (options.onto_name)die (_ ("cannot combine '--keep-base' with '--onto'" ));@@ -1728,7 +1627,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)case REBASE_APPLY :die (_ ("--strategy requires --merge or --interactive" ));case REBASE_MERGE : -case REBASE_PRESERVE_MERGES :/* compatible */ break ;case REBASE_UNSPECIFIED :@@ -1780,7 +1678,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)switch (options.type) {case REBASE_MERGE : -case REBASE_PRESERVE_MERGES : options.state_dir =merge_dir ();break ;case REBASE_APPLY :@@ -1805,28 +1702,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) options.reschedule_failed_exec = reschedule_failed_exec;if (options.signoff) { -if (options.type ==REBASE_PRESERVE_MERGES ) -die ("cannot combine '--signoff' with " -"'--preserve-merges'" );strvec_push (&options.git_am_opts,"--signoff" ); options.flags |=REBASE_FORCE ; } -if (options.type ==REBASE_PRESERVE_MERGES ) { -/* -* Note: incompatibility with --signoff handled in signoff block above -* Note: incompatibility with --interactive is just a strong warning; -* git-rebase.txt caveats with "unless you know what you are doing" -*/ -if (options.rebase_merges) -die (_ ("cannot combine '--preserve-merges' with " -"'--rebase-merges'" )); - -if (options.reschedule_failed_exec) -die (_ ("error: cannot combine '--preserve-merges' with " -"'--reschedule-failed-exec'" )); - } -if (!options.root) {if (argc <1 ) {struct branch *branch;git-rebase--preserve-merges.sh deleted +0
-1057@@ -1,1057 +0,0 @@ -# This shell script fragment is sourced by git-rebase to implement its -# preserve-merges mode. -# -# Copyright (c) 2006 Johannes E. Schindelin -# -# The file containing rebase commands, comments, and empty lines. -# This file is created by "git rebase -i" then edited by the user. As -# the lines are processed, they are removed from the front of this -# file and written to the tail of $done. -todo="$state_dir"/git-rebase-todo - -# The rebase command lines that have already been processed. A line -# is moved here when it is first handled, before any associated user -# actions. -done="$state_dir"/done - -# The commit message that is planned to be used for any changes that -# need to be committed following a user interaction. -msg="$state_dir"/message - -# The file into which is accumulated the suggested commit message for -# squash/fixup commands. When the first of a series of squash/fixups -# is seen, the file is created and the commit message from the -# previous commit and from the first squash/fixup commit are written -# to it. The commit message for each subsequent squash/fixup commit -# is appended to the file as it is processed. -# -# The first line of the file is of the form -# # This is a combination of $count commits. -# where $count is the number of commits whose messages have been -# written to the file so far (including the initial "pick" commit). -# Each time that a commit message is processed, this line is read and -# updated. It is deleted just before the combined commit is made. -squash_msg="$state_dir"/message-squash - -# If the current series of squash/fixups has not yet included a squash -# command, then this file exists and holds the commit message of the -# original "pick" commit. (If the series ends without a "squash" -# command, then this can be used as the commit message of the combined -# commit without opening the editor.) -fixup_msg="$state_dir"/message-fixup - -# $rewritten is the name of a directory containing files for each -# commit that is reachable by at least one merge base of $head and -# $upstream. They are not necessarily rewritten, but their children -# might be. This ensures that commits on merged, but otherwise -# unrelated side branches are left alone. (Think "X" in the man page's -# example.) -rewritten="$state_dir"/rewritten - -dropped="$state_dir"/dropped - -end="$state_dir"/end -msgnum="$state_dir"/msgnum - -# A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and -# GIT_AUTHOR_DATE that will be used for the commit that is currently -# being rebased. -author_script="$state_dir"/author-script - -# When an "edit" rebase command is being processed, the SHA1 of the -# commit to be edited is recorded in this file. When "git rebase -# --continue" is executed, if there are any staged changes then they -# will be amended to the HEAD commit, but only provided the HEAD -# commit is still the commit to be edited. When any other rebase -# command is processed, this file is deleted. -amend="$state_dir"/amend - -# For the post-rewrite hook, we make a list of rewritten commits and -# their new sha1s. The rewritten-pending list keeps the sha1s of -# commits that have been processed, but not committed yet, -# e.g. because they are waiting for a 'squash' command. -rewritten_list="$state_dir"/rewritten-list -rewritten_pending="$state_dir"/rewritten-pending - -# Work around Git for Windows' Bash whose "read" does not strip CRLF -# and leaves CR at the end instead. -cr=$(printf "\015") - -resolvemsg=" -$(gettext 'Resolve all conflicts manually, mark them as resolved with -"git add/rm <conflicted_files>", then run "git rebase --continue". -You can instead skip this commit: run "git rebase --skip". -To abort and get back to the state before "git rebase", run "git rebase --abort".') -" - -write_basic_state () { - echo "$head_name" > "$state_dir"/head-name && - echo "$onto" > "$state_dir"/onto && - echo "$orig_head" > "$state_dir"/orig-head && - test t = "$GIT_QUIET" && : > "$state_dir"/quiet - test t = "$verbose" && : > "$state_dir"/verbose - test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy - test -n "$strategy_opts" && echo "$strategy_opts" > \ - "$state_dir"/strategy_opts - test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \ - "$state_dir"/allow_rerere_autoupdate - test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt - test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff - test -n "$reschedule_failed_exec" && : > "$state_dir"/reschedule-failed-exec -} - -apply_autostash () { - if test -f "$state_dir/autostash" - then - stash_sha1=$(cat "$state_dir/autostash") - if git stash apply $stash_sha1 >/dev/null 2>&1 - then - echo "$(gettext 'Applied autostash.')" >&2 - else - git stash store -m "autostash" -q $stash_sha1 || - die "$(eval_gettext "Cannot store \$stash_sha1")" - gettext 'Applying autostash resulted in conflicts. -Your changes are safe in the stash. -You can run "git stash pop" or "git stash drop" at any time. -' >&2 - fi - fi -} - -output () { - case "$verbose" in - '') - output=$("$@" 2>&1 ) - status=$? - test $status != 0 && printf "%s\n" "$output" - return $status - ;; - *) - "$@" - ;; - esac -} - -strategy_args=${strategy:+--strategy=$strategy} -test -n "$strategy_opts" && -eval ' - for strategy_opt in '"$strategy_opts"' - do - strategy_args="$strategy_args -X$(git rev-parse --sq-quote "${strategy_opt#--}")" - done -' - -GIT_CHERRY_PICK_HELP="$resolvemsg" -export GIT_CHERRY_PICK_HELP - -comment_char=$(git config --get core.commentchar 2>/dev/null) -case "$comment_char" in -'' | auto) - comment_char="#" - ;; -?) - ;; -*) - comment_char=$(echo "$comment_char" | cut -c1) - ;; -esac - -warn () { - printf '%s\n' "$*" >&2 -} - -# Output the commit message for the specified commit. -commit_message () { - git cat-file commit "$1" | sed "1,/^$/d" -} - -orig_reflog_action="$GIT_REFLOG_ACTION" - -comment_for_reflog () { - case "$orig_reflog_action" in - ''|rebase*) - GIT_REFLOG_ACTION="rebase -i ($1)" - export GIT_REFLOG_ACTION - ;; - esac -} - -last_count= -mark_action_done () { - sed -e 1q < "$todo" >> "$done" - sed -e 1d < "$todo" >> "$todo".new - mv -f "$todo".new "$todo" - new_count=$(( $(git stripspace --strip-comments <"$done" | wc -l) )) - echo $new_count >"$msgnum" - total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l))) - echo $total >"$end" - if test "$last_count" != "$new_count" - then - last_count=$new_count - eval_gettext "Rebasing (\$new_count/\$total)"; printf "\r" - test -z "$verbose" || echo - fi -} - -append_todo_help () { - gettext " -Commands: -p, pick <commit> = use commit -r, reword <commit> = use commit, but edit the commit message -e, edit <commit> = use commit, but stop for amending -s, squash <commit> = use commit, but meld into previous commit -f, fixup <commit> = like \"squash\", but discard this commit's log message -x, exec <commit> = run command (the rest of the line) using shell -d, drop <commit> = remove commit -l, label <label> = label current HEAD with a name -t, reset <label> = reset HEAD to a label -m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] -. create a merge commit using the original merge commit's -. message (or the oneline, if no original merge commit was -. specified). Use -c <commit> to reword the commit message. - -These lines can be re-ordered; they are executed from top to bottom. -" | git stripspace --comment-lines >>"$todo" - - if test $(get_missing_commit_check_level) = error - then - gettext " -Do not remove any line. Use 'drop' explicitly to remove a commit. -" | git stripspace --comment-lines >>"$todo" - else - gettext " -If you remove a line here THAT COMMIT WILL BE LOST. -" | git stripspace --comment-lines >>"$todo" - fi -} - -make_patch () { - sha1_and_parents="$(git rev-list --parents -1 "$1")" - case "$sha1_and_parents" in - ?*' '?*' '?*) - git diff --cc $sha1_and_parents - ;; - ?*' '?*) - git diff-tree -p "$1^!" - ;; - *) - echo "Root commit" - ;; - esac > "$state_dir"/patch - test -f "$msg" || - commit_message "$1" > "$msg" - test -f "$author_script" || - get_author_ident_from_commit "$1" > "$author_script" -} - -die_with_patch () { - echo "$1" > "$state_dir"/stopped-sha - git update-ref REBASE_HEAD "$1" - make_patch "$1" - die "$2" -} - -exit_with_patch () { - echo "$1" > "$state_dir"/stopped-sha - git update-ref REBASE_HEAD "$1" - make_patch $1 - git rev-parse --verify HEAD > "$amend" - gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} - warn "$(eval_gettext "\ -You can amend the commit now, with - - git commit --amend \$gpg_sign_opt_quoted - -Once you are satisfied with your changes, run - - git rebase --continue")" - warn - exit $2 -} - -die_abort () { - apply_autostash - rm -rf "$state_dir" - die "$1" -} - -has_action () { - test -n "$(git stripspace --strip-comments <"$1")" -} - -is_empty_commit() { - tree=$(git rev-parse -q --verify "$1"^{tree} 2>/dev/null) || { - sha1=$1 - die "$(eval_gettext "\$sha1: not a commit that can be picked")" - } - ptree=$(git rev-parse -q --verify "$1"^^{tree} 2>/dev/null) || - ptree=4b825dc642cb6eb9a060e54bf8d69288fbee4904 - test "$tree" = "$ptree" -} - -is_merge_commit() -{ - git rev-parse --verify --quiet "$1"^2 >/dev/null 2>&1 -} - -# Run command with GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and -# GIT_AUTHOR_DATE exported from the current environment. -do_with_author () { - ( - export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE - "$@" - ) -} - -git_sequence_editor () { - if test -z "$GIT_SEQUENCE_EDITOR" - then - GIT_SEQUENCE_EDITOR="$(git config sequence.editor)" - if [ -z "$GIT_SEQUENCE_EDITOR" ] - then - GIT_SEQUENCE_EDITOR="$(git var GIT_EDITOR)" || return $? - fi - fi - - eval "$GIT_SEQUENCE_EDITOR" '"$@"' -} - -pick_one () { - ff=--ff - - case "$1" in -n) sha1=$2; ff= ;; *) sha1=$1 ;; esac - case "$force_rebase" in '') ;; ?*) ff= ;; esac - output git rev-parse --verify $sha1 || die "$(eval_gettext "Invalid commit name: \$sha1")" - - if is_empty_commit "$sha1" - then - empty_args="--allow-empty" - fi - - pick_one_preserving_merges "$@" -} - -pick_one_preserving_merges () { - fast_forward=t - case "$1" in - -n) - fast_forward=f - sha1=$2 - ;; - *) - sha1=$1 - ;; - esac - sha1=$(git rev-parse $sha1) - - if test -f "$state_dir"/current-commit && test "$fast_forward" = t - then - while read current_commit - do - git rev-parse HEAD > "$rewritten"/$current_commit - done <"$state_dir"/current-commit - rm "$state_dir"/current-commit || - die "$(gettext "Cannot write current commit's replacement sha1")" - fi - - echo $sha1 >> "$state_dir"/current-commit - - # rewrite parents; if none were rewritten, we can fast-forward. - new_parents= - pend=" $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-)" - if test "$pend" = " " - then - pend=" root" - fi - while [ "$pend" != "" ] - do - p=$(expr "$pend" : ' \([^ ]*\)') - pend="${pend# $p}" - - if test -f "$rewritten"/$p - then - new_p=$(cat "$rewritten"/$p) - - # If the todo reordered commits, and our parent is marked for - # rewriting, but hasn't been gotten to yet, assume the user meant to - # drop it on top of the current HEAD - if test -z "$new_p" - then - new_p=$(git rev-parse HEAD) - fi - - test $p != $new_p && fast_forward=f - case "$new_parents" in - *$new_p*) - ;; # do nothing; that parent is already there - *) - new_parents="$new_parents $new_p" - ;; - esac - else - if test -f "$dropped"/$p - then - fast_forward=f - replacement="$(cat "$dropped"/$p)" - test -z "$replacement" && replacement=root - pend=" $replacement$pend" - else - new_parents="$new_parents $p" - fi - fi - done - case $fast_forward in - t) - output warn "$(eval_gettext "Fast-forward to \$sha1")" - output git reset --hard $sha1 || - die "$(eval_gettext "Cannot fast-forward to \$sha1")" - ;; - f) - first_parent=$(expr "$new_parents" : ' \([^ ]*\)') - - if [ "$1" != "-n" ] - then - # detach HEAD to current parent - output git checkout $first_parent 2> /dev/null || - die "$(eval_gettext "Cannot move HEAD to \$first_parent")" - fi - - case "$new_parents" in - ' '*' '*) - test "a$1" = a-n && die "$(eval_gettext "Refusing to squash a merge: \$sha1")" - - # redo merge - author_script_content=$(get_author_ident_from_commit $sha1) - eval "$author_script_content" - msg_content="$(commit_message $sha1)" - # No point in merging the first parent, that's HEAD - new_parents=${new_parents# $first_parent} - merge_args="--no-log --no-ff" - if ! do_with_author output eval \ - git merge ${gpg_sign_opt:+$(git rev-parse \ - --sq-quote "$gpg_sign_opt")} \ - $allow_rerere_autoupdate "$merge_args" \ - "$strategy_args" \ - -m "$(git rev-parse --sq-quote "$msg_content")" \ - "$new_parents" - then - printf "%s\n" "$msg_content" > "$GIT_DIR"/MERGE_MSG - die_with_patch $sha1 "$(eval_gettext "Error redoing merge \$sha1")" - fi - echo "$sha1 $(git rev-parse HEAD^0)" >> "$rewritten_list" - ;; - *) - output eval git cherry-pick $allow_rerere_autoupdate \ - $allow_empty_message \ - ${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \ - "$strategy_args" "$@" || - die_with_patch $sha1 "$(eval_gettext "Could not pick \$sha1")" - ;; - esac - ;; - esac -} - -this_nth_commit_message () { - n=$1 - eval_gettext "This is the commit message #\${n}:" -} - -skip_nth_commit_message () { - n=$1 - eval_gettext "The commit message #\${n} will be skipped:" -} - -update_squash_messages () { - if test -f "$squash_msg"; then - mv "$squash_msg" "$squash_msg".bak || exit - count=$(($(sed -n \ - -e "1s/^$comment_char[^0-9]*\([0-9][0-9]*\).*/\1/p" \ - -e "q" < "$squash_msg".bak)+1)) - { - printf '%s\n' "$comment_char $(eval_ngettext \ - "This is a combination of \$count commit." \ - "This is a combination of \$count commits." \ - $count)" - sed -e 1d -e '2,/^./{ - /^$/d - }' <"$squash_msg".bak - } >"$squash_msg" - else - commit_message HEAD >"$fixup_msg" || - die "$(eval_gettext "Cannot write \$fixup_msg")" - count=2 - { - printf '%s\n' "$comment_char $(gettext "This is a combination of 2 commits.")" - printf '%s\n' "$comment_char $(gettext "This is the 1st commit message:")" - echo - cat "$fixup_msg" - } >"$squash_msg" - fi - case $1 in - squash) - rm -f "$fixup_msg" - echo - printf '%s\n' "$comment_char $(this_nth_commit_message $count)" - echo - commit_message $2 - ;; - fixup) - echo - printf '%s\n' "$comment_char $(skip_nth_commit_message $count)" - echo - # Change the space after the comment character to TAB: - commit_message $2 | git stripspace --comment-lines | sed -e 's/ / /' - ;; - esac >>"$squash_msg" -} - -peek_next_command () { - git stripspace --strip-comments <"$todo" | sed -n -e 's/ .*//p' -e q -} - -# A squash/fixup has failed. Prepare the long version of the squash -# commit message, then die_with_patch. This code path requires the -# user to edit the combined commit message for all commits that have -# been squashed/fixedup so far. So also erase the old squash -# messages, effectively causing the combined commit to be used as the -# new basis for any further squash/fixups. Args: sha1 rest -die_failed_squash() { - sha1=$1 - rest=$2 - mv "$squash_msg" "$msg" || exit - rm -f "$fixup_msg" - cp "$msg" "$GIT_DIR"/MERGE_MSG || exit - warn - warn "$(eval_gettext "Could not apply \$sha1... \$rest")" - die_with_patch $sha1 "" -} - -flush_rewritten_pending() { - test -s "$rewritten_pending" || return - newsha1="$(git rev-parse HEAD^0)" - sed "s/$/ $newsha1/" < "$rewritten_pending" >> "$rewritten_list" - rm -f "$rewritten_pending" -} - -record_in_rewritten() { - oldsha1="$(git rev-parse $1)" - echo "$oldsha1" >> "$rewritten_pending" - - case "$(peek_next_command)" in - squash|s|fixup|f) - ;; - *) - flush_rewritten_pending - ;; - esac -} - -do_pick () { - sha1=$1 - rest=$2 - if test "$(git rev-parse HEAD)" = "$squash_onto" - then - # Set the correct commit message and author info on the - # sentinel root before cherry-picking the original changes - # without committing (-n). Finally, update the sentinel again - # to include these changes. If the cherry-pick results in a - # conflict, this means our behaviour is similar to a standard - # failed cherry-pick during rebase, with a dirty index to - # resolve before manually running git commit --amend then git - # rebase --continue. - git commit --allow-empty --allow-empty-message --amend \ - --no-post-rewrite -n -q -C $sha1 $signoff && - pick_one -n $sha1 && - git commit --allow-empty --allow-empty-message \ - --amend --no-post-rewrite -n -q -C $sha1 $signoff \ - ${gpg_sign_opt:+"$gpg_sign_opt"} || - die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")" - else - pick_one $sha1 || - die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")" - fi -} - -do_next () { - rm -f "$msg" "$author_script" "$amend" "$state_dir"/stopped-sha || exit - read -r command sha1 rest < "$todo" - case "$command" in - "$comment_char"*|''|noop|drop|d) - mark_action_done - ;; - "$cr") - # Work around CR left by "read" (e.g. with Git for Windows' Bash). - mark_action_done - ;; - pick|p) - comment_for_reflog pick - - mark_action_done - do_pick $sha1 "$rest" - record_in_rewritten $sha1 - ;; - reword|r) - comment_for_reflog reword - - mark_action_done - do_pick $sha1 "$rest" - git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} \ - $allow_empty_message || { - warn "$(eval_gettext "\ -Could not amend commit after successfully picking \$sha1... \$rest -This is most likely due to an empty commit message, or the pre-commit hook -failed. If the pre-commit hook failed, you may need to resolve the issue before -you are able to reword the commit.")" - exit_with_patch $sha1 1 - } - record_in_rewritten $sha1 - ;; - edit|e) - comment_for_reflog edit - - mark_action_done - do_pick $sha1 "$rest" - sha1_abbrev=$(git rev-parse --short $sha1) - warn "$(eval_gettext "Stopped at \$sha1_abbrev... \$rest")" - exit_with_patch $sha1 0 - ;; - squash|s|fixup|f) - case "$command" in - squash|s) - squash_style=squash - ;; - fixup|f) - squash_style=fixup - ;; - esac - comment_for_reflog $squash_style - - test -f "$done" && has_action "$done" || - die "$(eval_gettext "Cannot '\$squash_style' without a previous commit")" - - mark_action_done - update_squash_messages $squash_style $sha1 - author_script_content=$(get_author_ident_from_commit HEAD) - echo "$author_script_content" > "$author_script" - eval "$author_script_content" - if ! pick_one -n $sha1 - then - git rev-parse --verify HEAD >"$amend" - die_failed_squash $sha1 "$rest" - fi - case "$(peek_next_command)" in - squash|s|fixup|f) - # This is an intermediate commit; its message will only be - # used in case of trouble. So use the long version: - do_with_author output git commit --amend --no-verify -F "$squash_msg" \ - ${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message || - die_failed_squash $sha1 "$rest" - ;; - *) - # This is the final command of this squash/fixup group - if test -f "$fixup_msg" - then - do_with_author git commit --amend --no-verify -F "$fixup_msg" \ - ${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message || - die_failed_squash $sha1 "$rest" - else - cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit - rm -f "$GIT_DIR"/MERGE_MSG - do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e \ - ${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message || - die_failed_squash $sha1 "$rest" - fi - rm -f "$squash_msg" "$fixup_msg" - ;; - esac - record_in_rewritten $sha1 - ;; - x|"exec") - read -r command rest < "$todo" - mark_action_done - eval_gettextln "Executing: \$rest" - "${SHELL:-@SHELL_PATH@}" -c "$rest" # Actual execution - status=$? - # Run in subshell because require_clean_work_tree can die. - dirty=f - (require_clean_work_tree "rebase" 2>/dev/null) || dirty=t - if test "$status" -ne 0 - then - warn "$(eval_gettext "Execution failed: \$rest")" - test "$dirty" = f || - warn "$(gettext "and made changes to the index and/or the working tree")" - - warn "$(gettext "\ -You can fix the problem, and then run - - git rebase --continue")" - warn - if test $status -eq 127 # command not found - then - status=1 - fi - exit "$status" - elif test "$dirty" = t - then - # TRANSLATORS: after these lines is a command to be issued by the user - warn "$(eval_gettext "\ -Execution succeeded: \$rest -but left changes to the index and/or the working tree -Commit or stash your changes, and then run - - git rebase --continue")" - warn - exit 1 - fi - ;; - *) - warn "$(eval_gettext "Unknown command: \$command \$sha1 \$rest")" - fixtodo="$(gettext "Please fix this using 'git rebase --edit-todo'.")" - if git rev-parse --verify -q "$sha1" >/dev/null - then - die_with_patch $sha1 "$fixtodo" - else - die "$fixtodo" - fi - ;; - esac - test -s "$todo" && return - - comment_for_reflog finish && - newhead=$(git rev-parse HEAD) && - case $head_name in - refs/*) - message="$GIT_REFLOG_ACTION: $head_name onto $onto" && - git update-ref -m "$message" $head_name $newhead $orig_head && - git symbolic-ref \ - -m "$GIT_REFLOG_ACTION: returning to $head_name" \ - HEAD $head_name - ;; - esac && { - test ! -f "$state_dir"/verbose || - git diff-tree --stat $orig_head..HEAD - } && - { - test -s "$rewritten_list" && - git notes copy --for-rewrite=rebase < "$rewritten_list" || - true # we don't care if this copying failed - } && - hook="$(git rev-parse --git-path hooks/post-rewrite)" - if test -x "$hook" && test -s "$rewritten_list"; then - "$hook" rebase < "$rewritten_list" - true # we don't care if this hook failed - fi && - warn "$(eval_gettext "Successfully rebased and updated \$head_name.")" - - return 1 # not failure; just to break the do_rest loop -} - -# can only return 0, when the infinite loop breaks -do_rest () { - while : - do - do_next || break - done -} - -expand_todo_ids() { - git rebase--interactive --expand-ids -} - -collapse_todo_ids() { - git rebase--interactive --shorten-ids -} - -# Switch to the branch in $into and notify it in the reflog -checkout_onto () { - GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" - output git checkout $onto || die_abort "$(gettext "could not detach HEAD")" - git update-ref ORIG_HEAD $orig_head -} - -get_missing_commit_check_level () { - check_level=$(git config --get rebase.missingCommitsCheck) - check_level=${check_level:-ignore} - # Don't be case sensitive - printf '%s' "$check_level" | tr 'A-Z' 'a-z' -} - -# Initiate an action. If the cannot be any -# further action it may exec a command -# or exit and not return. -# -# TODO: Consider a cleaner return model so it -# never exits and always return 0 if process -# is complete. -# -# Parameter 1 is the action to initiate. -# -# Returns 0 if the action was able to complete -# and if 1 if further processing is required. -initiate_action () { - case "$1" in - continue) - # do we have anything to commit? - if git diff-index --cached --quiet HEAD -- - then - # Nothing to commit -- skip this commit - - test ! -f "$GIT_DIR"/CHERRY_PICK_HEAD || - rm "$GIT_DIR"/CHERRY_PICK_HEAD || - die "$(gettext "Could not remove CHERRY_PICK_HEAD")" - else - if ! test -f "$author_script" - then - gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} - die "$(eval_gettext "\ -You have staged changes in your working tree. -If these changes are meant to be -squashed into the previous commit, run: - - git commit --amend \$gpg_sign_opt_quoted - -If they are meant to go into a new commit, run: - - git commit \$gpg_sign_opt_quoted - -In both cases, once you're done, continue with: - - git rebase --continue -")" - fi - . "$author_script" || - die "$(gettext "Error trying to find the author identity to amend commit")" - if test -f "$amend" - then - current_head=$(git rev-parse --verify HEAD) - test "$current_head" = $(cat "$amend") || - die "$(gettext "\ -You have uncommitted changes in your working tree. Please commit them -first and then run 'git rebase --continue' again.")" - do_with_author git commit --amend --no-verify -F "$msg" -e \ - ${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message || - die "$(gettext "Could not commit staged changes.")" - else - do_with_author git commit --no-verify -F "$msg" -e \ - ${gpg_sign_opt:+"$gpg_sign_opt"} $allow_empty_message || - die "$(gettext "Could not commit staged changes.")" - fi - fi - - if test -r "$state_dir"/stopped-sha - then - record_in_rewritten "$(cat "$state_dir"/stopped-sha)" - fi - - require_clean_work_tree "rebase" - do_rest - return 0 - ;; - skip) - git rerere clear - do_rest - return 0 - ;; - edit-todo) - git stripspace --strip-comments <"$todo" >"$todo".new - mv -f "$todo".new "$todo" - collapse_todo_ids - append_todo_help - gettext " -You are editing the todo file of an ongoing interactive rebase. -To continue rebase after editing, run: - git rebase --continue - -" | git stripspace --comment-lines >>"$todo" - - git_sequence_editor "$todo" || - die "$(gettext "Could not execute editor")" - expand_todo_ids - - exit - ;; - show-current-patch) - exec git show REBASE_HEAD -- - ;; - *) - return 1 # continue - ;; - esac -} - -setup_reflog_action () { - comment_for_reflog start - - if test ! -z "$switch_to" - then - GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" - output git checkout "$switch_to" -- || - die "$(eval_gettext "Could not checkout \$switch_to")" - - comment_for_reflog start - fi -} - -init_basic_state () { - orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")" - mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")" - rm -f "$(git rev-parse --git-path REBASE_HEAD)" - - : > "$state_dir"/interactive || die "$(gettext "Could not mark as interactive")" - write_basic_state -} - -init_revisions_and_shortrevisions () { - shorthead=$(git rev-parse --short $orig_head) - shortonto=$(git rev-parse --short $onto) - if test -z "$rebase_root" - # this is now equivalent to ! -z "$upstream" - then - shortupstream=$(git rev-parse --short $upstream) - revisions=$upstream...$orig_head - shortrevisions=$shortupstream..$shorthead - else - revisions=$onto...$orig_head - shortrevisions=$shorthead - test -z "$squash_onto" || - echo "$squash_onto" >"$state_dir"/squash-onto - fi -} - -complete_action() { - test -s "$todo" || echo noop >> "$todo" - test -z "$autosquash" || git rebase--interactive --rearrange-squash || exit - test -n "$cmd" && git rebase--interactive --add-exec-commands --cmd "$cmd" - - todocount=$(git stripspace --strip-comments <"$todo" | wc -l) - todocount=${todocount##* } - -cat >>"$todo" <<EOF - -$comment_char $(eval_ngettext \ - "Rebase \$shortrevisions onto \$shortonto (\$todocount command)" \ - "Rebase \$shortrevisions onto \$shortonto (\$todocount commands)" \ - "$todocount") -EOF - append_todo_help - gettext " -However, if you remove everything, the rebase will be aborted. - -" | git stripspace --comment-lines >>"$todo" - - if test -z "$keep_empty" - then - printf '%s\n' "$comment_char $(gettext "Note that empty commits are commented out")" >>"$todo" - fi - - - has_action "$todo" || - return 2 - - cp "$todo" "$todo".backup - collapse_todo_ids - git_sequence_editor "$todo" || - die_abort "$(gettext "Could not execute editor")" - - has_action "$todo" || - return 2 - - git rebase--interactive --check-todo-list || { - ret=$? - checkout_onto - exit $ret - } - - expand_todo_ids - checkout_onto - do_rest -} - -git_rebase__preserve_merges () { - initiate_action "$action" - ret=$? - if test $ret = 0; then - return 0 - fi - - setup_reflog_action - init_basic_state - - if test -z "$rebase_root" - then - mkdir "$rewritten" && - for c in $(git merge-base --all $orig_head $upstream) - do - echo $onto > "$rewritten"/$c || - die "$(gettext "Could not init rewritten commits")" - done - else - mkdir "$rewritten" && - echo $onto > "$rewritten"/root || - die "$(gettext "Could not init rewritten commits")" - fi - - init_revisions_and_shortrevisions - - format=$(git config --get rebase.instructionFormat) - # the 'rev-list .. | sed' requires %m to parse; the instruction requires %H to parse - git rev-list --format="%m%H ${format:-%s}" \ - --reverse --left-right --topo-order \ - $revisions ${restrict_revision+^$restrict_revision} | \ - sed -n "s/^>//p" | - while read -r sha1 rest - do - if test -z "$keep_empty" && is_empty_commit $sha1 && ! is_merge_commit $sha1 - then - comment_out="$comment_char " - else - comment_out= - fi - - if test -z "$rebase_root" - then - preserve=t - for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-) - do - if test -f "$rewritten"/$p - then - preserve=f - fi - done - else - preserve=f - fi - if test f = "$preserve" - then - touch "$rewritten"/$sha1 - printf '%s\n' "${comment_out}pick $sha1 $rest" >>"$todo" - fi - 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 | \ - sed -n "s/^>//p" > "$state_dir"/not-cherry-picks - # Now all commits and note which ones are missing in - # not-cherry-picks and hence being dropped - git rev-list $revisions | - while read rev - do - if test -f "$rewritten"/$rev && - ! sane_grep "$rev" "$state_dir"/not-cherry-picks >/dev/null - then - # Use -f2 because if rev-list is telling us 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 it - git rev-list --parents -1 $rev | cut -d' ' -s -f2 > "$dropped"/$rev - sha1=$(git rev-list -1 $rev) - sane_grep -v "^[a-z][a-z]* $sha1" <"$todo" > "${todo}2" ; mv "${todo}2" "$todo" - rm "$rewritten"/$rev - fi - done - - complete_action -}
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Hi Phillip,
Quoted 8 lines · Phillip Wood
Hi dscho
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
This option was deprecated in favor of
--rebase-mergessome time ago, and now we retire it.
Quoted 6 lines
This all looks good to me. I did see the comment below in
builtin/rebase.cthat could be tweaked if you reroll, but it is a very minor issue./* -i followed by -p is still explicitly interactive, but -p alone is not */ static int parse_opt_interactive(const struct option *opt, const char *arg,
int unset)
Right, without -p this comment does not make sense anymore. But once I replace the -p by -r, it _does_ make sense: git rebase -r is not interactive, but git rebase -ir _is_.
Quoted 2 lines
I do wonder if we need these option parsing functions now but that is a question for another day.
As the function parses the -i/--interactive option, which is not going anywhere, we still need it.
Thanks,
Dscho
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Hi Dscho
Quoted 23 lines · Johannes Schindelin
Hi Phillip,
Quoted 8 lines · Phillip Wood
Hi dscho
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
This option was deprecated in favor of
--rebase-mergessome time ago, and now we retire it.Quoted 6 lines
This all looks good to me. I did see the comment below in
builtin/rebase.cthat could be tweaked if you reroll, but it is a very minor issue./* -i followed by -p is still explicitly interactive, but -p alone is not */ static int parse_opt_interactive(const struct option *opt, const char *arg,
int unset)Right, without
-pthis comment does not make sense anymore. But once I replace the-pby-r, it _does_ make sense:git rebase -ris not interactive, butgit rebase -ir_is_.
Quoted 5 lines
Quoted 2 lines
I do wonder if we need these option parsing functions now but that is a question for another day.
As the function parses the
-i/--interactiveoption, which is not going anywhere, we still need it.
Sure I was just wondering if we could simplify things by using something like OPT_BOOL rather than OPT_CALLBACK_F for "--am", "-i" and "-m". I haven't looked too closely though
Thanks again for this series
Best Wishes
Phillip
Quoted 3 lines
Thanks,
Dscho
Re: [PATCH v2 5/7] rebase: drop support for `--preserve-merges`
Hi Phillip,
Quoted 26 lines · Phillip Wood
Quoted 25 lines · Johannes Schindelin
Quoted 6 lines · Phillip Wood
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
This option was deprecated in favor of
--rebase-mergessome time ago, and now we retire it.Quoted 8 lines
This all looks good to me. I did see the comment below in
builtin/rebase.cthat could be tweaked if you reroll, but it is a very minor issue./* -i followed by -p is still explicitly interactive, but -p alone is not */
static int parse_opt_interactive(const struct option *opt, const char *arg,
int unset)Right, without
-pthis comment does not make sense anymore. But once I replace the-pby-r, it _does_ make sense:git rebase -ris not interactive, butgit rebase -ir_is_.Quoted 2 lines
I do wonder if we need these option parsing functions now but that is a question for another day.
Quoted 6 lines
Quoted 2 lines
As the function parses the
-i/--interactiveoption, which is not going anywhere, we still need it.Sure I was just wondering if we could simplify things by using something like
OPT_BOOLrather thanOPT_CALLBACK_Ffor "--am", "-i" and "-m". I haven't looked too closely though
It's definitely a good question, and I wondered, too, but failed to share my conclusions with you.
The callback does two things: first, it switches the rebase type to merge, and then it also sets the flag (by setting a bit in the bit field) that the rebase is explicitly interactive.
The reason for this "explicitly interactive" wording is historical, of course, because historically some functionality was implemented by git-rebase--interactive.sh even if the rebase itself was intended _not_ to be run interactively. Think git rebase --exec <command>, for example.
These days, it is still true that rebase-interactive.c implements some functionality that is not necessarily meant to be executed interactively (again, --exec, but also --rebase-merges).
So there _is_ a need for that option to do more than one thing, and as some options can try to set, say, the rebase type, it is important to handle those options immediately (as opposed to trying to set a flag based on --interactive and then trying to infer the rebase type from that flag _after_ parse_options() is done).
Ciao,
Dscho
PATCH v2 6/7 git-svn: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
We already passed the --rebase-merges option to git rebase instead, now we make this move permanent.
--- Documentation/git-svn.txt | 1 - git-svn.perl | 1 - 2 files changed, 2 deletions(-)
Documentation/git-svn.txt +0 -1
@@ -678,7 +678,6 @@ config key: svn.authorsProg --strategy=<strategy>:: -p:: --rebase-merges:: ---preserve-merges (DEPRECATED):: These are only used with the 'dcommit' and 'rebase' commands. + Passed directly to 'git rebase' when using 'dcommit' if a
git-svn.perl +0 -1
@@ -273,7 +273,6 @@ my %cmd = ( 'fetch-all|all' => \$_fetch_all, 'dry-run|n' => \$_dry_run, 'rebase-merges|p' => \$_rebase_merges, - 'preserve-merges|p' => \$_rebase_merges, %fc_opts } ], 'commit-diff' => [ \&cmd_commit_diff, 'Commit a diff between two trees',
Signature · 1 line
gitgitgadget
Re: [PATCH v2 6/7] git-svn: drop support for `--preserve-merges`
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
We already passed the
--rebase-mergesoption togit rebaseinstead, now we make this move permanent.
Unlike the cover letter's claim of deprecated since v2.22, this in particular has only been deprecated since v2.25, i.e. your follow-up ea8b7be1476 (git svn: stop using rebase --preserve-merges, 2019-11-22).
I think it's fine to do this, but at least updating the commit message to note the difference would be good.
Re: [PATCH v2 6/7] git-svn: drop support for `--preserve-merges`
Hi Ævar,
Quoted 8 lines · Ævar Arnfjörð Bjarmason
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
We already passed the
--rebase-mergesoption togit rebaseinstead, now we make this move permanent.
Quoted 7 lines
Unlike the cover letter's claim of deprecated since v2.22, this in particular has only been deprecated since v2.25, i.e. your follow-up
ea8b7be1476(git svn: stop usingrebase --preserve-merges, 2019-11-22).I think it's fine to do this, but at least updating the commit message to note the difference would be good.
I will update the commit message.
Ciao,
Dscho
Re: [PATCH v2 6/7] git-svn: drop support for `--preserve-merges`
In reply to Ævar Arnfjörð BjarmasonHi Ævar,
Quoted 8 lines · Ævar Arnfjörð Bjarmason
Quoted 4 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
We already passed the
--rebase-mergesoption togit rebaseinstead, now we make this move permanent.
Quoted 7 lines
Unlike the cover letter's claim of deprecated since v2.22, this in particular has only been deprecated since v2.25, i.e. your follow-up
ea8b7be1476(git svn: stop usingrebase --preserve-merges, 2019-11-22).I think it's fine to do this, but at least updating the commit message to note the difference would be good.
Thank you for being super rigorous.
Ciao,
Dscho
PATCH v2 7/7 rebase: drop the internal `rebase--interactive` command
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
It was only used by the --preserve-merges backend, which we just removed.
--- builtin/rebase.c | 185 ----------------------------------------------- git.c | 1 - 2 files changed, 186 deletions(-)
builtin/rebase.c +0 -185
@@ -178,81 +178,6 @@ static const char *action_names[] = { "undefined","edit_todo" , "show_current_patch" }; -static int add_exec_commands (struct string_list *commands) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); - -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - -todo_list_add_exec_commands (&todo_list, commands); - res =todo_list_write_to_file (the_repository, &todo_list, - todo_file,NULL ,NULL ,-1 ,0 ); -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} - -static int rearrange_squash_in_todo_file (void ) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res =0 ; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - - res =todo_list_rearrange_squash (&todo_list); -if (!res) - res =todo_list_write_to_file (the_repository, &todo_list, - todo_file,NULL ,NULL ,-1 ,0 ); - -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} - -static int transform_todo_file (unsigned flags) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); - -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - - res =todo_list_write_to_file (the_repository, &todo_list, todo_file, -NULL ,NULL ,-1 , flags); -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} -static int edit_todo_file (unsigned flags) {const char *todo_file =rebase_path_todo ();
@@ -437,24 +362,6 @@ static int run_sequencer_rebase(struct rebase_options *opts,break ; } -case ACTION_SHORTEN_OIDS : -case ACTION_EXPAND_OIDS : - ret =transform_todo_file (flags); -break ; -case ACTION_CHECK_TODO_LIST : - ret =check_todo_list_from_file (the_repository); -break ; -case ACTION_REARRANGE_SQUASH : - ret =rearrange_squash_in_todo_file (); -break ; -case ACTION_ADD_EXEC : { -struct string_list commands =STRING_LIST_INIT_DUP ; - -split_exec_commands (opts->cmd, &commands); - ret =add_exec_commands (&commands); -string_list_clear (&commands,0 ); -break ; - }default :BUG ("invalid command '%d'" , command); }
@@ -476,98 +383,6 @@ static int parse_opt_keep_empty(const struct option *opt, const char *arg,return 0 ; } -static const char *const builtin_rebase_interactive_usage[] = { -N_ ("git rebase--interactive [<options>]" ), -NULL -}; - -int cmd_rebase__interactive (int argc,const char **argv,const char *prefix) -{ -struct rebase_options opts =REBASE_OPTIONS_INIT ; -struct object_id squash_onto = *null_oid (); -enum action command =ACTION_NONE ; -struct option options[] = { -OPT_NEGBIT (0 ,"ff" , &opts.flags,N_ ("allow fast-forward" ), -REBASE_FORCE ), -OPT_CALLBACK_F ('k' ,"keep-empty" , &options,NULL , -N_ ("keep commits which start empty" ), -PARSE_OPT_NOARG |PARSE_OPT_HIDDEN , - parse_opt_keep_empty), -OPT_BOOL_F (0 ,"allow-empty-message" , &opts.allow_empty_message, -N_ ("allow commits with empty messages" ), -PARSE_OPT_HIDDEN ), -OPT_BOOL (0 ,"rebase-merges" , &opts.rebase_merges,N_ ("rebase merge commits" )), -OPT_BOOL (0 ,"rebase-cousins" , &opts.rebase_cousins, -N_ ("keep original branch points of cousins" )), -OPT_BOOL (0 ,"autosquash" , &opts.autosquash, -N_ ("move commits that begin with squash!/fixup!" )), -OPT_BOOL (0 ,"signoff" , &opts.signoff,N_ ("sign commits" )), -OPT_BIT ('v' ,"verbose" , &opts.flags, -N_ ("display a diffstat of what changed upstream" ), -REBASE_NO_QUIET |REBASE_VERBOSE |REBASE_DIFFSTAT ), -OPT_CMDMODE (0 ,"continue" , &command,N_ ("continue rebase" ), -ACTION_CONTINUE ), -OPT_CMDMODE (0 ,"skip" , &command,N_ ("skip commit" ),ACTION_SKIP ), -OPT_CMDMODE (0 ,"edit-todo" , &command,N_ ("edit the todo list" ), -ACTION_EDIT_TODO ), -OPT_CMDMODE (0 ,"show-current-patch" , &command,N_ ("show the current patch" ), -ACTION_SHOW_CURRENT_PATCH ), -OPT_CMDMODE (0 ,"shorten-ids" , &command, -N_ ("shorten commit ids in the todo list" ),ACTION_SHORTEN_OIDS ), -OPT_CMDMODE (0 ,"expand-ids" , &command, -N_ ("expand commit ids in the todo list" ),ACTION_EXPAND_OIDS ), -OPT_CMDMODE (0 ,"check-todo-list" , &command, -N_ ("check the todo list" ),ACTION_CHECK_TODO_LIST ), -OPT_CMDMODE (0 ,"rearrange-squash" , &command, -N_ ("rearrange fixup/squash lines" ),ACTION_REARRANGE_SQUASH ), -OPT_CMDMODE (0 ,"add-exec-commands" , &command, -N_ ("insert exec commands in todo list" ),ACTION_ADD_EXEC ), - {OPTION_CALLBACK ,0 ,"onto" , &opts.onto,N_ ("onto" ),N_ ("onto" ), -PARSE_OPT_NONEG , parse_opt_commit,0 }, - {OPTION_CALLBACK ,0 ,"restrict-revision" , &opts.restrict_revision, -N_ ("restrict-revision" ),N_ ("restrict revision" ), -PARSE_OPT_NONEG , parse_opt_commit,0 }, - {OPTION_CALLBACK ,0 ,"squash-onto" , &squash_onto,N_ ("squash-onto" ), -N_ ("squash onto" ),PARSE_OPT_NONEG , parse_opt_object_id,0 }, - {OPTION_CALLBACK ,0 ,"upstream" , &opts.upstream,N_ ("upstream" ), -N_ ("the upstream commit" ),PARSE_OPT_NONEG , parse_opt_commit, -0 }, -OPT_STRING (0 ,"head-name" , &opts.head_name,N_ ("head-name" ),N_ ("head name" )), - {OPTION_STRING ,'S' ,"gpg-sign" , &opts.gpg_sign_opt,N_ ("key-id" ), -N_ ("GPG-sign commits" ), -PARSE_OPT_OPTARG ,NULL , (intptr_t )"" }, -OPT_STRING (0 ,"strategy" , &opts.strategy,N_ ("strategy" ), -N_ ("rebase strategy" )), -OPT_STRING (0 ,"strategy-opts" , &opts.strategy_opts,N_ ("strategy-opts" ), -N_ ("strategy options" )), -OPT_STRING (0 ,"switch-to" , &opts.switch_to,N_ ("switch-to" ), -N_ ("the branch or commit to checkout" )), -OPT_STRING (0 ,"onto-name" , &opts.onto_name,N_ ("onto-name" ),N_ ("onto name" )), -OPT_STRING (0 ,"cmd" , &opts.cmd,N_ ("cmd" ),N_ ("the command to run" )), -OPT_RERERE_AUTOUPDATE (&opts.allow_rerere_autoupdate), -OPT_BOOL (0 ,"reschedule-failed-exec" , &opts.reschedule_failed_exec, -N_ ("automatically re-schedule any `exec` that fails" )), -OPT_END () - }; - - opts.rebase_cousins =-1 ; - -if (argc ==1 ) -usage_with_options (builtin_rebase_interactive_usage, options); - - argc =parse_options (argc, argv, prefix, options, - builtin_rebase_interactive_usage,PARSE_OPT_KEEP_ARGV0 ); - -if (!is_null_oid (&squash_onto)) - opts.squash_onto = &squash_onto; - -if (opts.rebase_cousins >=0 && !opts.rebase_merges) -warning (_ ("--[no-]rebase-cousins has no effect without " -"--rebase-merges" )); - -return !!run_sequencer_rebase (&opts, command); -} -static int is_merge (struct rebase_options *opts) {return opts->type ==REBASE_MERGE ;
git.c +0 -1
@@ -577,7 +577,6 @@ static struct cmd_struct commands[] = { { "range-diff", cmd_range_diff, RUN_SETUP | USE_PAGER }, { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX}, { "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE }, - { "rebase--interactive", cmd_rebase__interactive, RUN_SETUP | NEED_WORK_TREE }, { "receive-pack", cmd_receive_pack }, { "reflog", cmd_reflog, RUN_SETUP }, { "remote", cmd_remote, RUN_SETUP },
Signature · 1 line
gitgitgadget
Re: [PATCH v2 7/7] rebase: drop the internal `rebase--interactive` command
Hi dscho
Thanks for working on this, it opens up the possibility of future cleanups now we're not constrained by supporting cmd_rebase__interactive()
Quoted 14 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]> [...]
builtin/rebase.c +0
-8@@ -437,24 +362,6 @@ static int run_sequencer_rebase(struct rebase_options *opts,break ; } -case ACTION_SHORTEN_OIDS : -case ACTION_EXPAND_OIDS : - ret =transform_todo_file (flags); -break ; -case ACTION_CHECK_TODO_LIST : - ret =check_todo_list_from_file (the_repository); -break ; -case ACTION_REARRANGE_SQUASH :
builtin/rebase.c static int run_sequencer_rebase(struct rebase_options *opts, · line 457
Quoted 10 lines
builtin/rebase.c +0
-10- ret =rearrange_squash_in_todo_file (); -break ; -case ACTION_ADD_EXEC : { -struct string_list commands =STRING_LIST_INIT_DUP ; - -split_exec_commands (opts->cmd, &commands); - ret =add_exec_commands (&commands); -string_list_clear (&commands,0 ); -break ; - }
As Alban mentioned, I think it would be worth removing the enum members as well as the case clauses here.
Best Wishes
Phillip
Quoted 115 lines
builtin/rebase.c +0
-92default :BUG ("invalid command '%d'" , command); }@@ -476,98 +383,6 @@ static int parse_opt_keep_empty(const struct option *opt, const char *arg,return 0 ; } -static const char *const builtin_rebase_interactive_usage[] = { -N_ ("git rebase--interactive [<options>]" ), -NULL -}; - -int cmd_rebase__interactive (int argc,const char **argv,const char *prefix) -{ -struct rebase_options opts =REBASE_OPTIONS_INIT ; -struct object_id squash_onto = *null_oid (); -enum action command =ACTION_NONE ; -struct option options[] = { -OPT_NEGBIT (0 ,"ff" , &opts.flags,N_ ("allow fast-forward" ), -REBASE_FORCE ), -OPT_CALLBACK_F ('k' ,"keep-empty" , &options,NULL , -N_ ("keep commits which start empty" ), -PARSE_OPT_NOARG |PARSE_OPT_HIDDEN , - parse_opt_keep_empty), -OPT_BOOL_F (0 ,"allow-empty-message" , &opts.allow_empty_message, -N_ ("allow commits with empty messages" ), -PARSE_OPT_HIDDEN ), -OPT_BOOL (0 ,"rebase-merges" , &opts.rebase_merges,N_ ("rebase merge commits" )), -OPT_BOOL (0 ,"rebase-cousins" , &opts.rebase_cousins, -N_ ("keep original branch points of cousins" )), -OPT_BOOL (0 ,"autosquash" , &opts.autosquash, -N_ ("move commits that begin with squash!/fixup!" )), -OPT_BOOL (0 ,"signoff" , &opts.signoff,N_ ("sign commits" )), -OPT_BIT ('v' ,"verbose" , &opts.flags, -N_ ("display a diffstat of what changed upstream" ), -REBASE_NO_QUIET |REBASE_VERBOSE |REBASE_DIFFSTAT ), -OPT_CMDMODE (0 ,"continue" , &command,N_ ("continue rebase" ), -ACTION_CONTINUE ), -OPT_CMDMODE (0 ,"skip" , &command,N_ ("skip commit" ),ACTION_SKIP ), -OPT_CMDMODE (0 ,"edit-todo" , &command,N_ ("edit the todo list" ), -ACTION_EDIT_TODO ), -OPT_CMDMODE (0 ,"show-current-patch" , &command,N_ ("show the current patch" ), -ACTION_SHOW_CURRENT_PATCH ), -OPT_CMDMODE (0 ,"shorten-ids" , &command, -N_ ("shorten commit ids in the todo list" ),ACTION_SHORTEN_OIDS ), -OPT_CMDMODE (0 ,"expand-ids" , &command, -N_ ("expand commit ids in the todo list" ),ACTION_EXPAND_OIDS ), -OPT_CMDMODE (0 ,"check-todo-list" , &command, -N_ ("check the todo list" ),ACTION_CHECK_TODO_LIST ), -OPT_CMDMODE (0 ,"rearrange-squash" , &command, -N_ ("rearrange fixup/squash lines" ),ACTION_REARRANGE_SQUASH ), -OPT_CMDMODE (0 ,"add-exec-commands" , &command, -N_ ("insert exec commands in todo list" ),ACTION_ADD_EXEC ), - {OPTION_CALLBACK ,0 ,"onto" , &opts.onto,N_ ("onto" ),N_ ("onto" ), -PARSE_OPT_NONEG , parse_opt_commit,0 }, - {OPTION_CALLBACK ,0 ,"restrict-revision" , &opts.restrict_revision, -N_ ("restrict-revision" ),N_ ("restrict revision" ), -PARSE_OPT_NONEG , parse_opt_commit,0 }, - {OPTION_CALLBACK ,0 ,"squash-onto" , &squash_onto,N_ ("squash-onto" ), -N_ ("squash onto" ),PARSE_OPT_NONEG , parse_opt_object_id,0 }, - {OPTION_CALLBACK ,0 ,"upstream" , &opts.upstream,N_ ("upstream" ), -N_ ("the upstream commit" ),PARSE_OPT_NONEG , parse_opt_commit, -0 }, -OPT_STRING (0 ,"head-name" , &opts.head_name,N_ ("head-name" ),N_ ("head name" )), - {OPTION_STRING ,'S' ,"gpg-sign" , &opts.gpg_sign_opt,N_ ("key-id" ), -N_ ("GPG-sign commits" ), -PARSE_OPT_OPTARG ,NULL , (intptr_t )"" }, -OPT_STRING (0 ,"strategy" , &opts.strategy,N_ ("strategy" ), -N_ ("rebase strategy" )), -OPT_STRING (0 ,"strategy-opts" , &opts.strategy_opts,N_ ("strategy-opts" ), -N_ ("strategy options" )), -OPT_STRING (0 ,"switch-to" , &opts.switch_to,N_ ("switch-to" ), -N_ ("the branch or commit to checkout" )), -OPT_STRING (0 ,"onto-name" , &opts.onto_name,N_ ("onto-name" ),N_ ("onto name" )), -OPT_STRING (0 ,"cmd" , &opts.cmd,N_ ("cmd" ),N_ ("the command to run" )), -OPT_RERERE_AUTOUPDATE (&opts.allow_rerere_autoupdate), -OPT_BOOL (0 ,"reschedule-failed-exec" , &opts.reschedule_failed_exec, -N_ ("automatically re-schedule any `exec` that fails" )), -OPT_END () - }; - - opts.rebase_cousins =-1 ; - -if (argc ==1 ) -usage_with_options (builtin_rebase_interactive_usage, options); - - argc =parse_options (argc, argv, prefix, options, - builtin_rebase_interactive_usage,PARSE_OPT_KEEP_ARGV0 ); - -if (!is_null_oid (&squash_onto)) - opts.squash_onto = &squash_onto; - -if (opts.rebase_cousins >=0 && !opts.rebase_merges) -warning (_ ("--[no-]rebase-cousins has no effect without " -"--rebase-merges" )); - -return !!run_sequencer_rebase (&opts, command); -} -static int is_merge (struct rebase_options *opts) {return opts->type ==REBASE_MERGE ;git.c +0
-1@@ -577,7 +577,6 @@ static struct cmd_struct commands[] = { { "range-diff", cmd_range_diff, RUN_SETUP | USE_PAGER }, { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX}, { "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE }, - { "rebase--interactive", cmd_rebase__interactive, RUN_SETUP | NEED_WORK_TREE }, { "receive-pack", cmd_receive_pack }, { "reflog", cmd_reflog, RUN_SETUP }, { "remote", cmd_remote, RUN_SETUP },
Re: [PATCH v2 7/7] rebase: drop the internal `rebase--interactive` command
Hi Phillip,
Quoted 4 lines · Phillip Wood
Hi dscho
Thanks for working on this, it opens up the possibility of future cleanups now we're not constrained by supporting
cmd_rebase__interactive()
Yes!!!
Quoted 21 lines · Johannes Schindelin via GitGitGadget
Quoted 20 lines
From: Johannes Schindelin <[email protected]> [...]
builtin/rebase.c +0
-13@@ -437,24 +362,6 @@ static int run_sequencer_rebase(struct rebase_options *opts, break; } -case ACTION_SHORTEN_OIDS : -case ACTION_EXPAND_OIDS : - ret =transform_todo_file (flags); -break ; -case ACTION_CHECK_TODO_LIST : - ret =check_todo_list_from_file (the_repository); -break ; -case ACTION_REARRANGE_SQUASH : - ret =rearrange_squash_in_todo_file (); -break ; -case ACTION_ADD_EXEC : { -struct string_list commands =STRING_LIST_INIT_DUP ; -
Quoted 8 lines
builtin/rebase.c static int run_sequencer_rebase(struct rebase_options *opts, · line 457
Quoted 5 lines
builtin/rebase.c +0
-5-split_exec_commands (opts->cmd, &commands); - ret =add_exec_commands (&commands); -string_list_clear (&commands,0 ); -break ; - }As Alban mentioned, I think it would be worth removing the enum members as well as the case clauses here.
Makes sense.
Thank you for your review,
Dscho
Quoted 148 lines
Best Wishes
Phillip
Quoted 140 lines
builtin/rebase.c +0
-0default :BUG ("invalid command '%d'" , command);}
builtin/rebase.c +0
-20@@ -476,98 +383,6 @@ static int parse_opt_keep_empty(const struct option *opt, const char *arg, return 0; } -static const char * const builtin_rebase_interactive_usage[] = { -N_ ("git rebase--interactive [<options>]" ), -NULL -}; - -int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) -{ - struct rebase_options opts = REBASE_OPTIONS_INIT; - struct object_id squash_onto = *null_oid(); - enum action command = ACTION_NONE; - struct option options[] = { - OPT_NEGBIT(0, "ff", &opts.flags, N_("allow fast-forward"), - REBASE_FORCE), - OPT_CALLBACK_F('k', "keep-empty", &options, NULL, - N_("keep commits which start empty"), - PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, - parse_opt_keep_empty), - OPT_BOOL_F(0, "allow-empty-message", &opts.allow_empty_message, - N_("allow commits with empty messages"), - PARSE_OPT_HIDDEN), - OPT_BOOL(0, "rebase-merges", &opts.rebase_merges, N_("rebasemerge commits")),
builtin/rebase.c +0
-11-OPT_BOOL (0 ,"rebase-cousins" , &opts.rebase_cousins, -N_ ("keep original branch points of cousins" )), -OPT_BOOL (0 ,"autosquash" , &opts.autosquash, -N_ ("move commits that begin with squash!/fixup!" )), -OPT_BOOL (0 ,"signoff" , &opts.signoff,N_ ("sign commits" )), -OPT_BIT ('v' ,"verbose" , &opts.flags, -N_ ("display a diffstat of what changed upstream" ), -REBASE_NO_QUIET |REBASE_VERBOSE |REBASE_DIFFSTAT ), -OPT_CMDMODE (0 ,"continue" , &command,N_ ("continue rebase" ), -ACTION_CONTINUE ), - OPT_CMDMODE(0, "skip", &command, N_("skip commit"),
ACTION_SKIP),(quoted diff) +0
-1- OPT_CMDMODE(0, "edit-todo", &command, N_("edit the todolist"),
(quoted diff) +0
-2- ACTION_EDIT_TODO), - OPT_CMDMODE(0, "show-current-patch", &command, N_("show thecurrent patch"),
builtin/rebase.c +0
-3- ACTION_SHOW_CURRENT_PATCH), - OPT_CMDMODE(0, "shorten-ids", &command, - N_("shorten commit ids in the todo list"),
ACTION_SHORTEN_OIDS),(quoted diff) +0
-2- OPT_CMDMODE(0, "expand-ids", &command, - N_("expand commit ids in the todo list"),
ACTION_EXPAND_OIDS),builtin/rebase.c +0
-4-OPT_CMDMODE (0 ,"check-todo-list" , &command, -N_ ("check the todo list" ),ACTION_CHECK_TODO_LIST ), - OPT_CMDMODE(0, "rearrange-squash", &command, - N_("rearrange fixup/squash lines"),
ACTION_REARRANGE_SQUASH),(quoted diff) +0
-2- OPT_CMDMODE(0, "add-exec-commands", &command, - N_("insert exec commands in todo list"),
ACTION_ADD_EXEC),(quoted diff) +0
-1- { OPTION_CALLBACK, 0, "onto", &opts.onto, N_("onto"),
N_("onto"),(quoted diff) +0
-2- PARSE_OPT_NONEG, parse_opt_commit, 0 }, - { OPTION_CALLBACK, 0, "restrict-revision",&opts.restrict_revision,
builtin/rebase.c +0
-3-N_ ("restrict-revision" ),N_ ("restrict revision" ), - PARSE_OPT_NONEG, parse_opt_commit, 0 }, - { OPTION_CALLBACK, 0, "squash-onto", &squash_onto,
N_("squash-onto"),(quoted diff) +0
-1- N_("squash onto"), PARSE_OPT_NONEG, parse_opt_object_id, 0},
(quoted diff) +0
-1- { OPTION_CALLBACK, 0, "upstream", &opts.upstream,
N_("upstream"),(quoted diff) +0
-1- N_("the upstream commit"), PARSE_OPT_NONEG,
parse_opt_commit,(quoted diff) +0
-2- 0 }, - OPT_STRING(0, "head-name", &opts.head_name, N_("head-name"),
N_("head name")),(quoted diff) +0
-1- { OPTION_STRING, 'S', "gpg-sign", &opts.gpg_sign_opt,
N_("key-id"),builtin/rebase.c +0
-5-N_ ("GPG-sign commits" ), - PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, -OPT_STRING (0 ,"strategy" , &opts.strategy,N_ ("strategy" ), -N_ ("rebase strategy" )), - OPT_STRING(0, "strategy-opts", &opts.strategy_opts,
N_("strategy-opts"),builtin/rebase.c +0
-4- N_("strategy options")), -OPT_STRING (0 ,"switch-to" , &opts.switch_to,N_ ("switch-to" ), -N_ ("the branch or commit to checkout" )), - OPT_STRING(0, "onto-name", &opts.onto_name, N_("onto-name"),
N_("onto name")),(quoted diff) +0
-1- OPT_STRING(0, "cmd", &opts.cmd, N_("cmd"), N_("the command torun")),
(quoted diff) +0
-2- OPT_RERERE_AUTOUPDATE(&opts.allow_rerere_autoupdate), - OPT_BOOL(0, "reschedule-failed-exec",&opts.reschedule_failed_exec,
(quoted diff) +0
-1- N_("automatically re-schedule any `exec` thatfails")),
builtin/rebase.c +0
-10-OPT_END () - }; - - opts.rebase_cousins =-1 ; - -if (argc ==1 ) -usage_with_options (builtin_rebase_interactive_usage, options); - - argc = parse_options(argc, argv, prefix, options, - builtin_rebase_interactive_usage,
PARSE_OPT_KEEP_ARGV0);builtin/rebase.c +0
-11- -if (!is_null_oid (&squash_onto)) - opts.squash_onto = &squash_onto; - -if (opts.rebase_cousins >=0 && !opts.rebase_merges) -warning (_ ("--[no-]rebase-cousins has no effect without " -"--rebase-merges" )); - -return !!run_sequencer_rebase (&opts, command); -} -static int is_merge (struct rebase_options *opts) {return opts->type ==REBASE_MERGE ;git.c +0
-1@@ -577,7 +577,6 @@ static struct cmd_struct commands[] = { { "range-diff", cmd_range_diff, RUN_SETUP | USE_PAGER }, { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX}, { "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE }, - { "rebase--interactive", cmd_rebase__interactive, RUN_SETUP | NEED_WORK_TREE }, { "receive-pack", cmd_receive_pack }, { "reflog", cmd_reflog, RUN_SETUP },{ "remote",
cmd_remote,RUN_SETUP},
Quoted 8 lines · Johannes Schindelin via GitGitGadget
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Changes since v1:
* Rebased onto v2.33.0
I'm very much in favor if this series.
I independently came up with pretty much the same at the beginning of last month before finding your v1 in the list archive. The comments I left inline are based on the diff between our two versions, i.e. I found some spots you missed (and your version has spots I missed).
You're also leaving behind a comment in builtin/rebase.c referring to PRESERVE_MERGES. Perhaps we should just turn that into an "else if" while we're at it (the "ignore-space-change" argument won't need wrapping anymore then):
builtin/rebase.c- } else {builtin/rebase.c: /* REBASE_MERGE and PRESERVE_MERGES */
builtin/rebase.c- if (ignore_whitespace) {
builtin/rebase.c- string_list_append(&strategy_options,
builtin/rebase.c- "ignore-space-change");
builtin/rebase.c- }
builtin/rebase.c- }
I do find the left-behind "enum rebase_type" rather unpleasant, i.e. we have a REBASE_UNSPECIFIED during the initial parse_options() phase, and after that just REBASE_{APPLY,MERGE}, but some of those codepaths use switch(), some just check on or the other, and it's not immediately obvious where we are in the control flow. Ideally we'd take care of parsing out the option(s) early, and could just have an "int rebase_apply" in the struct to clearly indicate the rarer cases where we take the REBASE_APPLY path.
But I wasn't able to make that work with some quick hacking, and in any case that can be left as a cleanup for later.
Ideally with the code comments I left addressed, but either way the correctness of the end result isn't affected in terms of what the program ends up doing:
Hi Ævar,
Quoted 24 lines · Ævar Arnfjörð Bjarmason
Quoted 8 lines · Johannes Schindelin via GitGitGadget
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Changes since v1:
* Rebased onto v2.33.0
I'm very much in favor if this series.
I independently came up with pretty much the same at the beginning of last month before finding your v1 in the list archive. The comments I left inline are based on the diff between our two versions, i.e. I found some spots you missed (and your version has spots I missed).
You're also leaving behind a comment in
builtin/rebase.creferring toPRESERVE_MERGES. Perhaps we should just turn that into an "else if" while we're at it (the "ignore-space-change" argument won't need wrapping anymore then):
Quoted 7 lines
builtin/rebase.c- } else {
builtin/rebase.c: /*REBASE_MERGEandPRESERVE_MERGES*/
builtin/rebase.c- if (ignore_whitespace) {
builtin/rebase.c- string_list_append(&strategy_options,
builtin/rebase.c- "ignore-space-change");
builtin/rebase.c- }
builtin/rebase.c- }
While it would be technically correct to turn this into an else if, by all other standards it would be incorrect. As I commented on your earlier
comment: just because it uses less lines does not make the intention clearer. In this instance, I am actually quite certain that it dilutes the intention. The if (options.type == REBASE_APPLY) clearly indicates a top-level decision on the rebase backend, and an else if (ignore_whitespace) would disrupt that idea to be about distinguishing between completely unrelated concerns.
In other words: while I accept that your taste would prefer the suggested change, my taste prefers the opposite, and since I am the owner of this patch series contribution, I go with my taste.
Quoted 8 lines
I do find the left-behind "enum
rebase_type" rather unpleasant, i.e. we have aREBASE_UNSPECIFIEDduring the initialparse_options()phase, and after that just REBASE_{APPLY,MERGE}, but some of those codepaths useswitch(), some just check on or the other, and it's not immediately obvious where we are in the control flow. Ideally we'd take care of parsing out the option(s) early, and could just have an "intrebase_apply" in the struct to clearly indicate the rarer cases where we take theREBASE_APPLYpath.
Thank you for offering your opinion.
This encourages me to offer my (differing) opinion to keep the enum rebase_type to clarify that we have multiple rebase backends, and even leave Git's source code open to future contributions of other rebase backends.
Ciao,
Dscho
Quoted 45 lines · Johannes Schindelin
Hi Ævar,
Quoted 24 lines · Ævar Arnfjörð Bjarmason
Quoted 8 lines · Johannes Schindelin via GitGitGadget
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Changes since v1:
* Rebased onto v2.33.0
I'm very much in favor if this series.
I independently came up with pretty much the same at the beginning of last month before finding your v1 in the list archive. The comments I left inline are based on the diff between our two versions, i.e. I found some spots you missed (and your version has spots I missed).
You're also leaving behind a comment in
builtin/rebase.creferring toPRESERVE_MERGES. Perhaps we should just turn that into an "else if" while we're at it (the "ignore-space-change" argument won't need wrapping anymore then):Quoted 7 lines
builtin/rebase.c- } else {
builtin/rebase.c: /*REBASE_MERGEandPRESERVE_MERGES*/
builtin/rebase.c- if (ignore_whitespace) {
builtin/rebase.c- string_list_append(&strategy_options,
builtin/rebase.c- "ignore-space-change");
builtin/rebase.c- }
builtin/rebase.c- }While it would be technically correct to turn this into an
else if, by all other standards it would be incorrect. As I commented on your earlier
comment: just because it uses less lines does not make the intention clearer. In this instance, I am actually quite certain that it dilutes the intention. Theif (options.type == REBASE_APPLY)clearly indicates a top-level decision on the rebase backend, and anelse if (ignore_whitespace)would disrupt that idea to be about distinguishing between completely unrelated concerns.
Quoted 3 lines
In other words: while I accept that your taste would prefer the suggested change, my taste prefers the opposite, and since I am the owner of this patch series contribution, I go with my taste.
Sounds good.
Quoted 9 lines
Quoted 8 lines
I do find the left-behind "enum
rebase_type" rather unpleasant, i.e. we have aREBASE_UNSPECIFIEDduring the initialparse_options()phase, and after that just REBASE_{APPLY,MERGE}, but some of those codepaths useswitch(), some just check on or the other, and it's not immediately obvious where we are in the control flow. Ideally we'd take care of parsing out the option(s) early, and could just have an "intrebase_apply" in the struct to clearly indicate the rarer cases where we take theREBASE_APPLYpath.
Quoted 6 lines
Thank you for offering your opinion.
This encourages me to offer my (differing) opinion to keep the
enum rebase_typeto clarify that we have multiple rebase backends, and even leave Git's source code open to future contributions of other rebase backends.
Just to clarify this isn't a comment describing the suggested is_merge() changes I had elsewhere, or that we should get rid of "enum rebase_type".
But rather that if we were to split up the "we haven't decided on the type yet" from "we know the rebase type, let's act on it" which only happens around the option/config/directory introspection etc. from the rest of the code, we could stick on the "real" rebase types in the enum.
We could then have just two enum arms for switches (less verbosity) and no "default: BUG(...)" case.
Such a change should make it easier for contributors to add new backends, as they'd get the compiler helping them to see where they'd need to add their code. Now you need to hunt around for various is_merge, "opts.type == " etc, switches with "default" etc. comparisons.
Of course such a change might not be worth it, i.e. maybe it's too painful to untangle REBASE_UNSPECIFIED from the existing enum. I just wanted to clarify what it was that I was suggesting here.
"Johannes Schindelin via GitGitGadget" <[email protected]>
Quoted 4 lines · writes:
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
Thanks.
Hi Junio,
Quoted 8 lines · Junio C Hamano
"Johannes Schindelin via GitGitGadget" <[email protected]>
Quoted 4 lines · writes:
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.
Quoted 5 lines
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
I think that I managed to address whatever concerns there were about the --rebase-merges backend in the meantime.
To be honest, I developed one (minor) concern in the meantime... Should we maybe try to be nicer to our users and keep handling the --preserve-merges option by explicitly erroring out with the suggestion to use --rebase-merges instead? Not everybody reads release notes, after all. In fact, it is my experience that preciously few users have the time to even skim release notes...
Ciao,
Dscho
Am 02.09.21 um 16:18 schrieb Johannes Schindelin:
Quoted 9 lines · Junio C Hamano
Quoted 5 lines
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
I think that I managed to address whatever concerns there were about the
--rebase-mergesbackend in the meantime.
That was either my suggestion/desire to make no-rebase-cousins the default. That has been settled.
Or my wish not to redo the merge, but to replay the first-parent difference. The idea never got traction, and I've long since abandoned my implementation of it.
Quoted 6 lines
To be honest, I developed one (minor) concern in the meantime... Should we maybe try to be nicer to our users and keep handling the
--preserve-mergesoption by explicitly erroring out with the suggestion to use--rebase-mergesinstead? Not everybody reads release notes, after all. In fact, it is my experience that preciously few users have the time to even skim release notes...
A valid concern, I would think.
-- Hannes
Hi Hannes,
Quoted 11 lines · Johannes Sixt
Am 02.09.21 um 16:18 schrieb Johannes Schindelin:
Quoted 9 lines · Junio C Hamano
Quoted 5 lines
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
I think that I managed to address whatever concerns there were about the
--rebase-mergesbackend in the meantime.
Quoted 6 lines
That was either my suggestion/desire to make no-rebase-cousins the default. That has been settled.
Or my wish not to redo the merge, but to replay the first-parent difference. The idea never got traction, and I've long since abandoned my implementation of it.
Thank you for clarifying.
Yes, I remember how that idea came up, and I even tried that strategy for a couple of merging rebases of Git for Windows' branch thicket. Sadly, it did not work half as well as I had hoped.
The best idea I had back then still is in want of being implemented: sort of a "four-way merge". It is basically the same as a three-way merge, but allows for the pre-images to differ in the context (and yes, this cannot be represented using the current conflict markers). Definitely not trivial.
Quoted 8 lines
Quoted 6 lines
To be honest, I developed one (minor) concern in the meantime... Should we maybe try to be nicer to our users and keep handling the
--preserve-mergesoption by explicitly erroring out with the suggestion to use--rebase-mergesinstead? Not everybody reads release notes, after all. In fact, it is my experience that preciously few users have the time to even skim release notes...A valid concern, I would think.
Good. Since you concur with my hunch, I implemented that change.
Thank you for reviewing,
Dscho
Quoted 29 lines · Johannes Schindelin
Hi Hannes,
Quoted 11 lines · Johannes Sixt
Am 02.09.21 um 16:18 schrieb Johannes Schindelin:
Quoted 9 lines · Junio C Hamano
Quoted 5 lines
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
I think that I managed to address whatever concerns there were about the
--rebase-mergesbackend in the meantime.Quoted 6 lines
That was either my suggestion/desire to make no-rebase-cousins the default. That has been settled.
Or my wish not to redo the merge, but to replay the first-parent difference. The idea never got traction, and I've long since abandoned my implementation of it.
Thank you for clarifying.
Yes, I remember how that idea came up, and I even tried that strategy for a couple of merging rebases of Git for Windows' branch thicket. Sadly, it did not work half as well as I had hoped.
Quoted 5 lines
The best idea I had back then still is in want of being implemented: sort of a "four-way merge". It is basically the same as a three-way merge, but allows for the pre-images to differ in the context (and yes, this cannot be represented using the current conflict markers). Definitely not trivial.
merge-ort opens a new possibility (since it does merges without touching the index or working tree): Take the merge commit, M, that you are trying to transplant. Hold on to it for a minute. Do what rebase-merges does now; namely, do a simple merge of the desired new branches that otherwise ignores M to get your new merge commit N. Hang on to N too for a minute. Now use merge-ort to auto-remerge M (much like AUTO_MERGE or --remerge-diff does) to get a new merge commit that we'll call pre-M. If M was a clean merge that the user didn't amend, then pre-M will match M. If M wasn't a clean merge or was amended, then pre-M will otherwise differ from M by not including any manual changes the user made when they originally created M -- such as removing conflict markers, fixing semantic conflicts, evil changes, etc.
Now we've got three merge commits: pre-M, M, and N. (Technically, pre-M and N might be toplevel trees rather than full commits, but whatever.) The difference between pre-M and M represent the manual work the user did in order to create M. Now, do a three-way (non-recursive) merge of those commits, to get the rebased result, R. This operation has the affect of applying the changes from pre-M to M on top of N.
There's obviously some edge cases (e.g. nested conflict markers), but I think they're better than the edge cases presented by the alternatives:
* the first-parent difference idea silently discards intermediate
changes from reapplying other patches (especially if other patches are added or dropped), which to me feels _very_ dangerous
* the current rebase-merges idea silently discards manual user
changes within the original merge commit (i.e. it hopes that there is no difference between pre-M and M), which can also be lossy
* I don't think this idea drops any data, but it does run the risk
of conflicts that are difficult to understand. But I suspect less so than your five-way merge would entail.
If the difficulty of conflicts in this scheme is too high, we could do a few things like providing multiple versions (e.g. if either pre-M:file or N:file had conflicts, or maybe if R:file has nested conflicts, then place both R:file and N:file in the working tree somewhere) or pointing at special commands that help users figure out what went on (e.g. 'git log -1 --remerge-diff M -- file').
Hi Elijah,
Quoted 70 lines · Elijah Newren
Quoted 27 lines · Johannes Schindelin
Quoted 11 lines · Johannes Sixt
Am 02.09.21 um 16:18 schrieb Johannes Schindelin:
Quoted 9 lines · Junio C Hamano
Quoted 5 lines
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
I think that I managed to address whatever concerns there were about the
--rebase-mergesbackend in the meantime.Quoted 6 lines
That was either my suggestion/desire to make no-rebase-cousins the default. That has been settled.
Or my wish not to redo the merge, but to replay the first-parent difference. The idea never got traction, and I've long since abandoned my implementation of it.
Thank you for clarifying.
Yes, I remember how that idea came up, and I even tried that strategy for a couple of merging rebases of Git for Windows' branch thicket. Sadly, it did not work half as well as I had hoped.
Quoted 5 lines
The best idea I had back then still is in want of being implemented: sort of a "four-way merge". It is basically the same as a three-way merge, but allows for the pre-images to differ in the context (and yes, this cannot be represented using the current conflict markers). Definitely not trivial.
merge-ort opens a new possibility (since it does merges without touching the index or working tree): Take the merge commit, M, that you are trying to transplant. Hold on to it for a minute. Do what rebase-merges does now; namely, do a simple merge of the desired new branches that otherwise ignores M to get your new merge commit N. Hang on to N too for a minute. Now use merge-ort to auto-remerge M (much like
AUTO_MERGEor --remerge-diff does) to get a new merge commit that we'll call pre-M. If M was a clean merge that the user didn't amend, then pre-M will match M. If M wasn't a clean merge or was amended, then pre-M will otherwise differ from M by not including any manual changes the user made when they originally created M -- such as removing conflict markers, fixing semantic conflicts, evil changes, etc.Now we've got three merge commits: pre-M, M, and N. (Technically, pre-M and N might be toplevel trees rather than full commits, but whatever.) The difference between pre-M and M represent the manual work the user did in order to create M. Now, do a three-way (non-recursive) merge of those commits, to get the rebased result, R. This operation has the affect of applying the changes from pre-M to M on top of N.
There's obviously some edge cases (e.g. nested conflict markers), but I think they're better than the edge cases presented by the alternatives:
* the first-parent difference idea silently discards intermediate
changes from reapplying other patches (especially if other patches are added or dropped), which to me feels _very_ dangerous
* the current rebase-merges idea silently discards manual user
changes within the original merge commit (i.e. it hopes that there is no difference between pre-M and M), which can also be lossy
* I don't think this idea drops any data, but it does run the risk
of conflicts that are difficult to understand. But I suspect less so than your five-way merge would entail.
Quoted 6 lines
If the difficulty of conflicts in this scheme is too high, we could do a few things like providing multiple versions (e.g. if either pre-M:file or N:file had conflicts, or maybe if R:file has nested conflicts, then place both R:file and N:file in the working tree somewhere) or pointing at special commands that help users figure out what went on (e.g. 'git log -1 --remerge-diff M -- file').
While I agree that merge-ort makes a lot of things much better, I think in this context we need to keep in mind that those nested merge conflicts can really hurt.
In my tests (I tried to implement a strategy where a 3-way merge is done with M and N^, using the parent commits of M as merge parents successively, see
https://lore.kernel.org/git/nycvar.QRO.7.76.6.1804130002090.65@ZVAVAG-6OXH6DA.rhebcr.pbec.zvpebfbsg.pbz/
for the nitty gritty), I ran into _nasty_ nested merge conflicts, even with trivial examples. And I came to the conviction that treating the merge conflict markers as Just Another Line was the main culprit.
I wish I had the time to try out your proposed strategy with the conconcted example I presented in that mail I linked above. Because now I am curious what it would do...
Ciao,
Dscho
Quoted 8 lines · Johannes Schindelin
Hi Elijah,
Quoted 3 lines · Elijah Newren
Quoted 1 line · Johannes Schindelin
...
Quoted 54 lines
Quoted 47 lines
Quoted 11 lines
Thank you for clarifying.
Yes, I remember how that idea came up, and I even tried that strategy for a couple of merging rebases of Git for Windows' branch thicket. Sadly, it did not work half as well as I had hoped.
The best idea I had back then still is in want of being implemented: sort of a "four-way merge". It is basically the same as a three-way merge, but allows for the pre-images to differ in the context (and yes, this cannot be represented using the current conflict markers). Definitely not trivial.
merge-ort opens a new possibility (since it does merges without touching the index or working tree): Take the merge commit, M, that you are trying to transplant. Hold on to it for a minute. Do what rebase-merges does now; namely, do a simple merge of the desired new branches that otherwise ignores M to get your new merge commit N. Hang on to N too for a minute. Now use merge-ort to auto-remerge M (much like
AUTO_MERGEor --remerge-diff does) to get a new merge commit that we'll call pre-M. If M was a clean merge that the user didn't amend, then pre-M will match M. If M wasn't a clean merge or was amended, then pre-M will otherwise differ from M by not including any manual changes the user made when they originally created M -- such as removing conflict markers, fixing semantic conflicts, evil changes, etc.Now we've got three merge commits: pre-M, M, and N. (Technically, pre-M and N might be toplevel trees rather than full commits, but whatever.) The difference between pre-M and M represent the manual work the user did in order to create M. Now, do a three-way (non-recursive) merge of those commits, to get the rebased result, R. This operation has the affect of applying the changes from pre-M to M on top of N.
There's obviously some edge cases (e.g. nested conflict markers), but I think they're better than the edge cases presented by the alternatives:
* the first-parent difference idea silently discards intermediate
changes from reapplying other patches (especially if other patches are added or dropped), which to me feels _very_ dangerous
* the current rebase-merges idea silently discards manual user
changes within the original merge commit (i.e. it hopes that there is no difference between pre-M and M), which can also be lossy
* I don't think this idea drops any data, but it does run the risk
of conflicts that are difficult to understand. But I suspect less so than your five-way merge would entail.Quoted 6 lines
If the difficulty of conflicts in this scheme is too high, we could do a few things like providing multiple versions (e.g. if either pre-M:file or N:file had conflicts, or maybe if R:file has nested conflicts, then place both R:file and N:file in the working tree somewhere) or pointing at special commands that help users figure out what went on (e.g. 'git log -1 --remerge-diff M -- file').
Quoted 3 lines
While I agree that
merge-ortmakes a lot of things much better, I think in this context we need to keep in mind that those nested merge conflicts can really hurt.
Yes, and I'm not sure you fully appreciate how much either. Your discussion in the other thread of nested conflicts suggests you may not be aware of a few facts; for regular merges (not talking about rebase-merges yet):
* Merges can have nested conflicts DESPITE having unique merge bases and NOT using merge.conflictstyle=diff3
* With unique merge bases (i.e. not a "recursive" merge), a merge will have at most two layers of conflicts
* non-unique merge-bases and merge.conflictstyle=diff3 make nested conflicts much more likely
* There is no limit on the number of nestings of conflict markers for a merge
Now, in terms of rebase-merges:
You noted in the other thread the possibility of being unable to differentiate conflict markers because they had the same length. However, increasing the length on the second merge by one or two characters is not sufficient in general, because that might just make you match the length of one of the nested conflicts from the other merge. You need to programmatically determine the sizes of the conflict markers in the first merge, and then adjust based on it for your other merge(s).
I know this will sound like I'm scaring you off of my idea even further, but I actually think despite the above that my ideas for rebase-merges may have merit. I just want people to actually understand the edge and corner cases. From my reading of the previous threads on rebasing merges, I'm concerned that there is no discussion of arbitrarily nested conflict markers and a complete omission of any considerations for path-based rather than content-based conflicts.
Quoted 7 lines
In my tests (I tried to implement a strategy where a 3-way merge is done with M and N^, using the parent commits of M as merge parents successively, see
https://lore.kernel.org/git/nycvar.QRO.7.76.6.1804130002090.65@ZVAVAG-6OXH6DA.rhebcr.pbec.zvpebfbsg.pbz/
for the nitty gritty), I ran into _nasty_ nested merge conflicts, even with trivial examples. And I came to the conviction that treating the merge conflict markers as Just Another Line was the main culprit.
I agree that we should not treat merge conflict markers as Just Another Line. There are other issues I can mention besides the above here, but I'm getting kind of long already.
However, I think a big part of the problem you ran into was that the previous suggestions only work nicely in _really_ simple cases. In particular, although I like Phillip's suggested sequence of merges[1] a lot more than the other suggestions in that thread or from prior threads, his suggestion is going to be prone to unnecessary nested conflict markers, as you found in your testcase.
[1] https://lore.kernel.org/git/[email protected]/
Quoted 3 lines
I wish I had the time to try out your proposed strategy with the conconcted example I presented in that mail I linked above. Because now I am curious what it would do...
For this simple testcase, as best I understood it (you didn't quite describe it fully so I had to take a guess or two), it provides a simpler conflict than either of the two you showed you got (from
different merge orderings of Phillip's suggestion). However, let me
double check that I understood your testcase correctly; please correct any errors in my understanding. I believe the commit graph you were describing was this:
* rebase-of-original-merge
|\
| * rebase-of-local-add-caller-of-core
* | rebase-of-local-rename-to-hi
|/
* upstream
| | | | * original-merge | |\ | | * local-add-caller-of-core | |/ |/| | * local-rename-to-hi |/
* initial-version
Further, the versions of main.c in each of those are as follows:
==> initial-version:
int core(void) {
printf("Hello, world!\n");
}==> local-rename-to-hi:
int hi(void) {
printf("Hello, world!\n");
}==> local-add-caller-of-core:
int core(void) {
printf("Hello, world!\n");
}
/* caller */
void caller(void) {
core();
}==> what an automatic merge of the two local-* branches would give:
int hi(void) {
printf("Hello, world!\n");
}
/* caller */
void caller(void) {
core();
}==> original-merge (amended from above by s/core/hi/ in caller()):
int hi(void) {
printf("Hello, world!\n");
}
/* caller */
void caller(void) {
hi();
}==> upstream:
int greeting(void) {
printf("Hello, world!\n");
}
/* main event loop */
void event_loop(void) {
/* TODO: place holder for now */
}==> rebase-of-local-rename-to-hi (kept 'hi' over 'greeting'):
int hi(void) {
printf("Hello, world!\n");
}
/* main event loop */
void event_loop(void) {
/* TODO: place holder for now */
}==> rebase-of-local-add-caller-of-core (kept both new functions, updated caller):
int greeting(void) {
printf("Hello, world!\n");
}
/* main event loop */
void event_loop(void) {
/* TODO: place holder for now */
}
/* caller */
void caller(void) {
greeting();
}If I've understood that all correctly, then my idea will give you the following conflict to resolve:
==> rebase-of-original-merge, before conflict resolution:
int hi(void) {
printf("Hello, world!\n");
}
/* main event loop */
void event_loop(void) {
/* TODO: place holder for now */
}
/* caller */
void caller(void) {
<<<<<<< HEAD
greeting();
||||||| auto-remerge of original-merge
core();
=======
hi();Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
original-merge
}
merge-ort and --rebase-merges, was Re: [PATCH v2 0/7] Drop support for git rebase --preserve-merges
Hi Elijah,
Quoted 10 lines · Elijah Newren
Quoted 8 lines · Johannes Schindelin
Quoted 5 lines · Elijah Newren
On Tue, Sep 7, 2021 at 11:51 AM Johannes Schindelin <[email protected]> wrote:
[... talk about re-resolving merge conflicts when recreating merges
in agit rebase --rebase-mergesrun ...]
Quoted 7 lines
...
Quoted 4 lines
While I agree that
merge-ortmakes a lot of things much better, I think in this context we need to keep in mind that those nested merge conflicts can really hurt.Yes, and I'm not sure you fully appreciate how much either.
*grin*
Quoted 89 lines
[... a lot of insight that I totally agree with ...]
I believe the commit graph you were describing was this:
* rebase-of-original-merge
|\
| * rebase-of-local-add-caller-of-core
* | rebase-of-local-rename-to-hi
|/
* upstream| | | | * original-merge | |\ | | * local-add-caller-of-core | |/ |/| | * local-rename-to-hi |/* initial-version
Further, the versions of
main.cin each of those are as follows:==> initial-version:
int core(void) { printf("Hello, world!\n"); }==> local-rename-to-hi:
int hi(void) { printf("Hello, world!\n"); }==> local-add-caller-of-core:
int core(void) { printf("Hello, world!\n"); } /* caller */ void caller(void) { core(); }==> what an automatic merge of the two local-* branches would give:
int hi(void) { printf("Hello, world!\n"); } /* caller */ void caller(void) { core(); }==> original-merge (amended from above by s/core/hi/ in
caller()):int hi(void) { printf("Hello, world!\n"); } /* caller */ void caller(void) { hi(); }==> upstream:
int greeting(void) { printf("Hello, world!\n"); } /* main event loop */ void event_loop(void) { /* TODO: place holder for now */ }==> rebase-of-local-rename-to-hi (kept 'hi' over 'greeting'):
int hi(void) { printf("Hello, world!\n"); } /* main event loop */ void event_loop(void) { /* TODO: place holder for now */ }==> rebase-of-local-add-caller-of-core (kept both new functions, updated caller):
Quoted 11 lines
int greeting(void) {
printf("Hello, world!\n");
}
/* main event loop */
void event_loop(void) {
/* TODO: place holder for now */
}
/* caller */
void caller(void) {
greeting();
}That all matches my recollection of what I wanted to drive at.
Quoted 19 lines
If I've understood that all correctly, then my idea will give you the following conflict to resolve:
==> rebase-of-original-merge, before conflict resolution:
int hi(void) { printf("Hello, world!\n"); } /* main event loop */ void event_loop(void) { /* TODO: place holder for now */ } /* caller */ void caller(void) { <<<<<<< HEAD greeting(); ||||||| auto-remerge of original-merge core(); ======= hi();
Quoted 2 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
original-merge
}
That looks very intriguing! I would _love_ to play with this a bit, and I think you provided enough guidance to get going. I am currently preparing to go mostly offline for the second half of September, read: I won't be able to play with this before October. But I am definitely interested, this sounds very exciting.
Ciao,
Dscho
Re: merge-ort and --rebase-merges, was Re: [PATCH v2 0/7] Drop support for git rebase --preserve-merges
Quoted 10 lines · Johannes Schindelin
Hi Elijah,
Quoted 5 lines · Elijah Newren
Quoted 3 lines · Johannes Schindelin
On Tue, 7 Sep 2021, Elijah Newren wrote:
[...snip...]
Quoted 19 lines
Quoted 19 lines
If I've understood that all correctly, then my idea will give you the following conflict to resolve:
==> rebase-of-original-merge, before conflict resolution:
int hi(void) { printf("Hello, world!\n"); } /* main event loop */ void event_loop(void) { /* TODO: place holder for now */ } /* caller */ void caller(void) { <<<<<<< HEAD greeting(); ||||||| auto-remerge of original-merge core(); ======= hi();
Quoted 8 lines
Quoted 2 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
original-merge
}
That looks very intriguing! I would _love_ to play with this a bit, and I think you provided enough guidance to get going. I am currently preparing to go mostly offline for the second half of September, read: I won't be able to play with this before October. But I am definitely interested, this sounds very exciting.
If you start working on it, let me know. I was thinking of playing with it, but don't know exactly when I'll get time to do so; very unlikely before October, and reasonably likely not even before the end of the year.
While I've provided the high level details in this thread which are good enough to handle the simple cases, I think that the interesting bits are the non-simple cases. I have not thought all of them through, but I'll include below some notes of mine that might be helpful if you get to it first. Note that I focus below on the non-simple cases, and discuss content-based conflicts before covering path-based ones:
* We're doing a three way merge of merges: pre-M, M, and N to get R; M is the original merge, pre-M is (automatic) remerge of M, and N is automatic merge of rebased parents of M.
* Note that N is what current rebase-merges uses, so we have all information from that merge and can provide it to the user when or if it is helpful.
* Both pre-M and N may themselves have conflicts.
* We need to programmatically handle conflict marker length when pre-M and/or N have nested conflicts. (must modify merge routines to return the maximal conflict marker depth used)
* Special case that pre-M matches N (per hunk): If both pre-M and N have conflict markers, but they happen to match, then we know to take the version from M and the result IS clean (at least for that hunk). So, you can still get a clean merge even if there are conflicts in both pre-M and N.
* Special case that pre-M matches M (per hunk): Usually in the three-way merge of "Base, Left, Right => Result", if Base matches either side then you get a clean merge. However, if pre-M matches M but N has conflicts, the result is NOT clean. Another way to look at this is that conflict markers are special and should be treated differently than other lines. (And path-based conflicts probably need special handling too, as discussed below.)
* In the case of complicated conflicts, consider providing user with both R:resulting-file and N:resulting-file (and point them at git log -1 --remerge-diff M [-- resulting-file])
* Having either binary files or path-based conflicts (e.g. modify/delete, file vs. directory vs. submodule, switch to symlink vs. switch to executable, rename/add, rename/rename -- either 1to2 or 2to1, directory rename detection, etc.) in either pre-M or N -- or both -- are going to need special care.
* One example of path-based conflicts: Let's say pre-M had no conflict at path P, and that pre-M:P and M:P matched. Let's say that N:P had a modify/delete conflict. Note that for modify/delete conflicts we tend to print a message to the console and leave the modified version of the file in the working tree. Here, despite the fact that pre-M:P and M:P matched, we cannot just take the modified file from N at P as the merge result. The modify/delete conflict should persist and the user given an opportunity to resolve it. Representing the modify/delete might be an interesting question, though since...
* If both pre-M and N have conflicts, then pre-M would have had up to three versions of file in the index at higher stages, N would have had up to three versions of file in the index at higher stages, and M would have one. We cannot represent all 7 versions of the file in the index at the end, which means conflict representation might be tricky. content-based conflicts are easier to handle here than path-based ones, since content-based conflicts can just do similar to what rename/rename(2to1) conflicts do today: just stick the result of the preliminary three-way merges into the index. path-based conflicts get more interesting because you can't do a preliminary merge of binary files or a preliminary merge of a modify/delete, etc.
* If both pre-M and N have path-based conflicts, but of different types, how exactly do we mention that to the user? Just list all the types? (This probably qualifies as a case of a "complicated" conflict where we want to (also?) provide the user with N:resulting-file instead of (just?) R:resulting-file.) We may also need to modify merge machinery to return types of conflicts per-path, an extension of what my "merge-into" series (not yet submitted) provides.
Quoted 8 lines · Junio C Hamano
"Johannes Schindelin via GitGitGadget" <[email protected]>
Quoted 4 lines · writes:
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.
Quoted 5 lines
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
Fair enough. To be clear I think this series is fine as-is, we've just usually done "now that this function is dead, rm it" as part of the series that makes it dead, so I figured fixups/squashes to change those parts would be welcome & integrated, likewise Alban Gruin's suggestions in <[email protected]>.
But the git-sh-i18n.sh change and/or his suggestions can be done after this lands...
Quoted 16 lines · Ævar Arnfjörð Bjarmason
Quoted 8 lines · Junio C Hamano
"Johannes Schindelin via GitGitGadget" <[email protected]>
Quoted 4 lines · writes:
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Quoted 5 lines
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
Quoted 8 lines
Fair enough. To be clear I think this series is fine as-is, we've just usually done "now that this function is dead, rm it" as part of the series that makes it dead, so I figured fixups/squashes to change those parts would be welcome & integrated, likewise Alban Gruin's suggestions in <[email protected]>.
But the
git-sh-i18n.shchange and/or his suggestions can be done after this lands...
I have this funny feeling that the "Fair enough" is thrown at a comment that you didn't intend to ;-)
Quoted 24 lines · Junio C Hamano
Quoted 22 lines · Ævar Arnfjörð Bjarmason
Quoted 8 lines · Junio C Hamano
"Johannes Schindelin via GitGitGadget" <[email protected]>
Quoted 4 lines · writes:
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Quoted 5 lines
A good goal. There is no remaining use case where (a fictitious and properly working version of) "--preserve-merges" option cannot be replaced by "--rebase-merges", is it? I somehow had a feeling that the other Johannes (sorry if it weren't you, j6t) had cases that the former worked better, but perhaps I am mis-remembering things.
Fair enough. To be clear I think this series is fine as-is, we've just usually done "now that this function is dead, rm it" as part of the series that makes it dead, so I figured fixups/squashes to change those parts would be welcome & integrated, likewise Alban Gruin's suggestions in <[email protected]>.
Quoted 5 lines
Quoted 2 lines
But the
git-sh-i18n.shchange and/or his suggestions can be done after this lands...I have this funny feeling that the "Fair enough" is thrown at a comment that you didn't intend to ;-)
I think I meant to reply to
https://lore.kernel.org/git/[email protected]/; I don't know how I got them mixed up, sorry about that.
Hi Johannes,
Le 01/09/2021 à 13:57, Johannes Schindelin via GitGitGadget a écrit :
Quoted 9 lines
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Changes since v1:
* Rebased onto v2.33.0
Quoted 9 lines
Johannes Schindelin (7):
t5520: do not usepull.rebase=preserve
remote: warn about unhandled branch.<name>.rebase values
tests: stop testinggit rebase --preserve-merges
pull: remove support for--rebase=preserve
rebase: drop support for--preserve-merges
git-svn: drop support for--preserve-merges
rebase: drop the internalrebase--interactivecommand
This is good.
preserve-merge is the only user of `rebase--interactive'. In builtin/rebase.c, it is the only producer of the following actions:
- ACTION_SHORTEN_OIDS
- ACTION_EXPAND_OIDS
- ACTION_CHECK_TODO_LIST
- ACTION_REARRANGE_SQUASH
- ACTION_ADD_EXEC
Which in turn, are the only reason for these functions to exist:
- transform_todo_file()
- check_todo_list_from_file() (from the sequencer)
- rearrange_squash_in_todo_file()
- add_exec_commands()
This is from a cursory glance, it may go a bit deeper.
Should we remove these as well?
Alban
Hi Alban and Johannes
Quoted 22 lines · Alban Gruin
Hi Johannes,
Le 01/09/2021 à 13:57, Johannes Schindelin via GitGitGadget a écrit :
Quoted 9 lines
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Changes since v1:
* Rebased onto v2.33.0
Quoted 9 lines
Johannes Schindelin (7):
t5520: do not usepull.rebase=preserve
remote: warn about unhandled branch.<name>.rebase values
tests: stop testinggit rebase --preserve-merges
pull: remove support for--rebase=preserve
rebase: drop support for--preserve-merges
git-svn: drop support for--preserve-merges
rebase: drop the internalrebase--interactivecommand
Quoted 1 line
This is good.
I agree
Quoted 9 lines
preserve-merge is the only user of `rebase--interactive'. In
builtin/rebase.c, it is the only producer of the following actions:-
ACTION_SHORTEN_OIDS
-ACTION_EXPAND_OIDS
-ACTION_CHECK_TODO_LIST
-ACTION_REARRANGE_SQUASH
-ACTION_ADD_EXEC
Quoted 8 lines
Which in turn, are the only reason for these functions to exist:
-
transform_todo_file()
-check_todo_list_from_file()(from the sequencer)
-rearrange_squash_in_todo_file()
-add_exec_commands()This is from a cursory glance, it may go a bit deeper.
I think patch 7 addresses most of that apart from the removal of the enum members and check_todo_list_from_file()
Best Wishes
Phillip
Quoted 5 lines
Should we remove these as well?
Alban
Hi Alban,
Quoted 20 lines · Alban Gruin
Le 01/09/2021 à 13:57, Johannes Schindelin via GitGitGadget a écrit :
Quoted 9 lines
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Changes since v1:
* Rebased onto v2.33.0
Quoted 9 lines
Johannes Schindelin (7):
t5520: do not usepull.rebase=preserve
remote: warn about unhandled branch.<name>.rebase values
tests: stop testinggit rebase --preserve-merges
pull: remove support for--rebase=preserve
rebase: drop support for--preserve-merges
git-svn: drop support for--preserve-merges
rebase: drop the internalrebase--interactivecommand
Quoted 1 line
This is good.
Thanks!
Quoted 8 lines
preserve-merge is the only user of `rebase--interactive'. In
builtin/rebase.c, it is the only producer of the following actions:-
ACTION_SHORTEN_OIDS
-ACTION_EXPAND_OIDS
-ACTION_CHECK_TODO_LIST
-ACTION_REARRANGE_SQUASH
-ACTION_ADD_EXEC
Makes sense!
Quoted 3 lines
Which in turn, are the only reason for these functions to exist:
-
transform_todo_file()
My patch series already removed this.
Quoted 1 line
-
check_todo_list_from_file()(from the sequencer)
Good point!
Quoted 1 line
-
rearrange_squash_in_todo_file()
This was already removed by my patch series.
Quoted 1 line
-
add_exec_commands()
Actually, this function is still needed, but its scope can be reduced.
Thank you!
Dscho
v3 cover Drop support for git rebase --preserve-merges
In reply to Johannes Schindelin via GitGitGadgetIn 427c3bd28ab (rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.
Changes since v2:
* Removed the no-longer-needed script_snippet variable
* Enhanced the commit message of the git svn patch to clarify that the deprecation happened only in v2.25 there
* Adjusted code comments that still talked about the removed option
* Removed some no-longer-needed ACTION_* enum values
* We now also drop check_todo_list_from_file() because it is no longer needed
* The todo_list_add_exec_commands() function is now scoped to the file (because there are no longer any outside users)
* When users still use the options, they are no longer met by Git's blank stares, but by a helpful error message suggesting to use --rebase-merges instead
Changes since v1:
* Rebased onto v2.33.0
Johannes Schindelin (11):
t5520: do not use pull.rebase=preserve
remote: warn about unhandled branch.<name>.rebase values
tests: stop testing git rebase --preserve-merges
pull: remove support for --rebase=preserve
rebase: drop support for --preserve-merges
git-svn: drop support for --preserve-merges
rebase: drop the internal rebase--interactive command
rebase: remove obsolete code comment
rebase: stop mentioning the -p option in comments
rebase: remove a no-longer-used function
sequencer: restrict scope of a formerly public function
.github/workflows/main.yml | 1 - .gitignore | 1 - Documentation/config/branch.txt | 4 - Documentation/config/pull.txt | 4 - Documentation/git-pull.txt | 6 +- Documentation/git-rebase.txt | 51 - Documentation/git-svn.txt | 1 - Makefile | 2 - builtin/pull.c | 9 +- builtin/rebase.c | 335 +------ builtin/remote.c | 3 + contrib/completion/git-completion.bash | 2 +- git-rebase--preserve-merges.sh | 1057 --------------------- git-svn.perl | 1 - git.c | 1 - rebase-interactive.c | 29 - rebase-interactive.h | 2 - rebase.c | 5 +- rebase.h | 1 - sequencer.c | 4 +- sequencer.h | 2 - t/t3404-rebase-interactive.sh | 76 -- t/t3408-rebase-multi-line.sh | 10 - t/t3409-rebase-preserve-merges.sh | 130 --- t/t3410-rebase-preserve-dropped-merges.sh | 90 -- t/t3411-rebase-preserve-around-merges.sh | 80 -- t/t3412-rebase-root.sh | 37 - t/t3414-rebase-preserve-onto.sh | 85 -- t/t3418-rebase-continue.sh | 15 - t/t3421-rebase-topology-linear.sh | 19 - t/t3422-rebase-incompatible-options.sh | 11 - t/t3425-rebase-topology-merges.sh | 151 --- t/t3427-rebase-subtree.sh | 26 +- t/t5520-pull.sh | 24 +- t/t7505-prepare-commit-msg-hook.sh | 1 - t/t7517-per-repo-email.sh | 13 - t/test-lib.sh | 4 - 37 files changed, 33 insertions(+), 2260 deletions(-) delete mode 100644 git-rebase--preserve-merges.sh delete mode 100755 t/t3409-rebase-preserve-merges.sh delete mode 100755 t/t3410-rebase-preserve-dropped-merges.sh delete mode 100755 t/t3411-rebase-preserve-around-merges.sh delete mode 100755 t/t3414-rebase-preserve-onto.sh
base-commit: 225bc32a989d7a22fa6addafd4ce7dcd04675dbf
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-195%2Fdscho%2Fdrop-rebase-p-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-195/dscho/drop-rebase-p-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/195
Range-diff vs v2:
1: 8da29d539fc = 1: 8da29d539fc t5520: do not use `pull.rebase=preserve` 2: acda0f59947 = 2: acda0f59947 remote: warn about unhandled branch.<name>.rebase values 3: cdb9fae4b93 ! 3: e4b683f0cd6 tests: stop testing `git rebase --preserve-merges`
@@ t/t3425-rebase-topology-merges.sh: test_run_rebase success 'd n o e' --apply
test_done
## t/t3427-rebase-subtree.sh ##
+@@ t/t3427-rebase-subtree.sh: commit_message() {
+ # where the root commit adds three files: topic_1.t, topic_2.t and topic_3.t.
+ #
+ # This commit history is then rebased onto topic_3 with the +-# -Xsubtree=files_subtree option in three different ways:
++# -Xsubtree=files_subtree option in two different ways:
+ #
+-# 1. using --preserve-merges
+-# 2. using --preserve-merges and --keep-empty
+-# 3. without specifying a rebase backend
++# 1. without specifying a rebase backend
++# 2. using the --rebase-merges backend
+
+ test_expect_success 'setup' '
+ test_commit README &&
@@ t/t3427-rebase-subtree.sh: test_expect_success 'setup' '
git commit -m "Empty commit" --allow-empty
'
4: b493046134d ! 4: 6e45e90abe5 pull: remove support for --rebase=preserve
@@ Commit message
In preparation for git-rebase--preserve-merges.sh entering its after life, we remove this (deprecated) option that would still rely on it.
+ To help users transition who still did not receive the memo about the
+ deprecation, we offer a helpful error message instead of throwing our
+ hands in the air and saying that we don't know that option, never heard
+ of it.
+
## Documentation/config/branch.txt ##
@@ contrib/completion/git-completion.bash: __git_complete_config_variable_value ()
remote.pushdefault)
## rebase.c ##
+@@
+ #include "rebase.h"
+ #include "config.h"
++#include "gettext.h"
+
+ /*
+ * Parses textual value for pull.rebase, branch.<name>.rebase, etc. @@ rebase.c: enum rebase_type rebase_parse_value(const char *value) return REBASE_FALSE;
else if (v > 0)
@@ rebase.c: enum rebase_type rebase_parse_value(const char *value)
else if (!strcmp(value, "merges") || !strcmp(value, "m"))
return REBASE_MERGES;
else if (!strcmp(value, "interactive") || !strcmp(value, "i"))
+ return REBASE_INTERACTIVE;
++ else if (!strcmp(value, "preserve") || !strcmp(value, "p"))
++ error(_("%s: 'preserve' superseded by 'merges'"), value);
+ /*
+ * Please update _git_config() in git-completion.bash when you
+ * add new rebase modes.
## rebase.h ##
@@ rebase.h: enum rebase_type {
5: eb738b1bf05 ! 5: 2d7a4a2c564 rebase: drop support for --preserve-merges
@@ Commit message
This option was deprecated in favor of --rebase-merges some time ago, and now we retire it.
+ To assist users to transition away, we do not _actually_ remove the
+ option, but now we no longer implement the functionality. Instead, we
+ offer a helpful error message suggesting which option to use.
+
## .gitignore ##
@@ builtin/rebase.c: static int run_am(struct rebase_options *opts)
{
- const char *argv[] = { NULL, NULL };
- struct strbuf script_snippet = STRBUF_INIT, buf = STRBUF_INIT;
-+ struct strbuf script_snippet = STRBUF_INIT;
int status;
- const char *backend, *backend_func;
@@ builtin/rebase.c: static int run_specific_rebase(struct rebase_options *opts, en
BUG("Unhandled rebase type %d", opts->type);
- break;
- }
-
+-
- strbuf_addf(&script_snippet,
- ". git-sh-setup && . %s && %s", backend, backend_func);
- argv[0] = script_snippet.buf;
--
+
- status = run_command_v_opt(argv, RUN_USING_SHELL);
-finished_rebase:
if (opts->dont_finish_rebase)
; /* do nothing */
else if (opts->type == REBASE_MERGE)
+@@ builtin/rebase.c: finished_rebase:
+ die("Nothing to do");
+ }
+
+- strbuf_release(&script_snippet);
+-
+ return status ? -1 : 0;
+ }
+
+@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
+ char *squash_onto_name = NULL;
+ int reschedule_failed_exec = -1;
+ int allow_preemptive_ff = 1;
++ int preserve_merges_selected = 0;
+ struct option builtin_rebase_options[] = {
+ OPT_STRING(0, "onto", &options.onto_name,
+ N_("revision"),
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
N_("let the user edit the list of commits to rebase"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, parse_opt_interactive),
- OPT_SET_INT_F('p', "preserve-merges", &options.type,
-- N_("(DEPRECATED) try to recreate merges instead of "
-- "ignoring them"),
++ OPT_SET_INT_F('p', "preserve-merges", &preserve_merges_selected,
+ N_("(DEPRECATED) try to recreate merges instead of "
+ "ignoring them"),
- REBASE_PRESERVE_MERGES, PARSE_OPT_HIDDEN),
++ 1, PARSE_OPT_HIDDEN),
OPT_RERERE_AUTOUPDATE(&options.allow_rerere_autoupdate), OPT_CALLBACK_F(0, "empty", &options, "{drop,keep,ask}",
N_("how to handle commits that become empty"),
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix
} else {
strbuf_reset(&buf);
strbuf_addf(&buf, "%s/interactive", merge_dir());
+@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
+ builtin_rebase_options,
+ builtin_rebase_usage, 0);
+
++ if (preserve_merges_selected)
++ die(_("--preserve-merges was replaced by --rebase-merges"));
++
+ if (action != ACTION_NONE && total_argc != 2) {
+ usage_with_options(builtin_rebase_usage,
+ builtin_rebase_options);
@@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix)
usage_with_options(builtin_rebase_usage,
builtin_rebase_options);
6: a987e9439af ! 6: 913647d8e76 git-svn: drop support for --preserve-merges
@@ Commit message
We already passed the --rebase-merges option to git rebase instead, now we make this move permanent.
+ As pointed out by Ævar Arnfjörð Bjarmason, in contrast to the
+ deprecation of git rebase's --preserve-merges backend, git svn
+ only deprecated this option in v2.25.0 (because this developer missed
+ git svn's use of that backend when deprecating the rebase backend
+ running up to Git v2.22).
+
+ Still, v2.25.0 has been released on January 13th, 2020. In other words,
+ git svn deprecated this option over one and a half years ago, _and_
+ has been redirecting to the --rebase-merges option during all that
+ time (read: git svn rebase --preserve-merges didn't do _precisely_
+ what the user asked, since v2.25.0, anyway, it fell back to pretending
+ that the user asked for git svn rebase --rebase-merges instead).
+
+ It is time to act on that deprecation and remove that option after all.
+
## Documentation/git-svn.txt ##
7: 4492cca369c ! 7: b5a16e205e6 rebase: drop the internal rebase--interactive command
@@ Commit message
It was only used by the `--preserve-merges` backend, which we just
removed.
+ Helped-by: Alban Gruin <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
## builtin/rebase.c ##
+@@ builtin/rebase.c: enum action {
+ ACTION_ABORT,
+ ACTION_QUIT,
+ ACTION_EDIT_TODO,
+- ACTION_SHOW_CURRENT_PATCH,
+- ACTION_SHORTEN_OIDS,
+- ACTION_EXPAND_OIDS,
+- ACTION_CHECK_TODO_LIST,
+- ACTION_REARRANGE_SQUASH,
+- ACTION_ADD_EXEC
++ ACTION_SHOW_CURRENT_PATCH
+ };
+
+ static const char *action_names[] = { "undefined",
@@ builtin/rebase.c: static const char *action_names[] = { "undefined",
"edit_todo",
"show_current_patch" };
@@ builtin/rebase.c: static const char *action_names[] = { "undefined",
{
const char *todo_file = rebase_path_todo();
@@ builtin/rebase.c: static int run_sequencer_rebase(struct rebase_options *opts,
+ flags |= opts->rebase_merges ? TODO_LIST_REBASE_MERGES : 0;
+ flags |= opts->rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0;
+ flags |= opts->root_with_onto ? TODO_LIST_ROOT_WITH_ONTO : 0;
+- flags |= command == ACTION_SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0;
+ flags |= opts->reapply_cherry_picks ? TODO_LIST_REAPPLY_CHERRY_PICKS : 0;
+
+ switch (command) {
+@@ builtin/rebase.c: static int run_sequencer_rebase(struct rebase_options *opts,
break;
}
-: ----------- > 8: d23f245b684 rebase: remove obsolete code comment
-: ----------- > 9: 6905c8746ba rebase: stop mentioning the -p option in comments
-: ----------- > 10: 5bb04ea3f6c rebase: remove a no-longer-used function
-: ----------- > 11: aae9323b25f sequencer: restrict scope of a formerly public functionSignature · 1 line
gitgitgadget
PATCH v3 1/11 t5520: do not use `pull.rebase=preserve`
From: Johannes Schindelin <[email protected]>
Even if those tests try to override that setting, let's not use it because it is deprecated: let's use merges instead.
--- t/t5520-pull.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
t/t5520-pull.sh +3 -3
@@ -598,7 +598,7 @@ test_expect_success '--rebase=false create a new merge commit' ' test_expect_success '--rebase=true rebases and flattens keep-merge' ' git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && + test_config pull.rebase merges && git pull --rebase=true . copy && test_cmp_rev HEAD^^ copy && echo file3 >expect &&
@@ -620,9 +620,9 @@ test_expect_success '--rebase=invalid fails' ' test_must_fail git pull --rebase=invalid . copy ' -test_expect_success '--rebase overrides pull.rebase=preserve and flattens keep-merge' ' +test_expect_success '--rebase overrides pull.rebase=merges and flattens keep-merge' ' git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && + test_config pull.rebase merges && git pull --rebase . copy && test_cmp_rev HEAD^^ copy && echo file3 >expect &&
Signature · 1 line
gitgitgadget
PATCH v3 2/11 remote: warn about unhandled branch.<name>.rebase values
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
We ignore them silently, but it actually makes sense to warn the users that their config setting has no effect.
--- builtin/remote.c | 3 +++ 1 file changed, 3 insertions(+)
builtin/remote.c +3 -0
@@ -318,6 +318,9 @@ static int config_read_branches(const char *key, const char *value, void *cb)* truth value with >= REBASE_TRUE. */ info->rebase =rebase_parse_value (value); +if (info->rebase ==REBASE_INVALID ) +warning (_ ("unhandled branch.%s.rebase=%s; assuming " +"'true'" ), name, value);break ;case PUSH_REMOTE :if (info->push_remote_name)
Signature · 1 line
gitgitgadget
PATCH v3 3/11 tests: stop testing `git rebase --preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
This backend has been deprecated in favor of git rebase --rebase-merges.
In preparation for dropping it, let's remove all the regression tests that would need it.
--- .github/workflows/main.yml | 1 - t/t3404-rebase-interactive.sh | 76 ----------- t/t3408-rebase-multi-line.sh | 10 -- t/t3409-rebase-preserve-merges.sh | 130 ------------------- t/t3410-rebase-preserve-dropped-merges.sh | 90 ------------- t/t3411-rebase-preserve-around-merges.sh | 80 ------------ t/t3412-rebase-root.sh | 37 ------ t/t3414-rebase-preserve-onto.sh | 85 ------------ t/t3418-rebase-continue.sh | 15 --- t/t3421-rebase-topology-linear.sh | 19 --- t/t3422-rebase-incompatible-options.sh | 11 -- t/t3425-rebase-topology-merges.sh | 151 ---------------------- t/t3427-rebase-subtree.sh | 26 +--- t/t5520-pull.sh | 18 --- t/t7505-prepare-commit-msg-hook.sh | 1 - t/t7517-per-repo-email.sh | 13 -- t/test-lib.sh | 4 - 17 files changed, 3 insertions(+), 764 deletions(-) delete mode 100755 t/t3409-rebase-preserve-merges.sh delete mode 100755 t/t3410-rebase-preserve-dropped-merges.sh delete mode 100755 t/t3411-rebase-preserve-around-merges.sh delete mode 100755 t/t3414-rebase-preserve-onto.sh
.github/workflows/main.yml +0 -1
@@ -198,7 +198,6 @@ jobs: shell: bash env: NO_SVN_TESTS: 1 - GIT_TEST_SKIP_REBASE_P: 1 run: ci/run-test-slice.sh ${{matrix.nr}} 10 - name: ci/print-test-failures.sh if: failure()
t/t3404-rebase-interactive.sh +0 -76
82 lines not on this page · raw message
t/t3408-rebase-multi-line.sh +0 -10
@@ -55,14 +55,4 @@ test_expect_success rebase ' test_cmp expect actual ' -test_expect_success REBASE_P rebasep ' - - git checkout side-merge && - git rebase -p side && - git cat-file commit HEAD | sed -e "1,/^\$/d" >actual && - git cat-file commit side-merge-original | sed -e "1,/^\$/d" >expect && - test_cmp expect actual - -' - test_done
t/t3409-rebase-preserve-merges.sh deleted +0 -130
130 lines not on this page · raw message
t/t3410-rebase-preserve-dropped-merges.sh deleted +0 -90
90 lines not on this page · raw message
t/t3411-rebase-preserve-around-merges.sh deleted +0 -80
80 lines not on this page · raw message
t/t3412-rebase-root.sh +0 -37
@@ -89,17 +89,6 @@ test_expect_success 'pre-rebase got correct input (4)' ' test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work4 ' -test_expect_success REBASE_P 'rebase -i -p with linear history' ' - git checkout -b work5 other && - git rebase -i -p --root --onto main && - git log --pretty=tformat:"%s" > rebased5 && - test_cmp expect rebased5 -' - -test_expect_success REBASE_P 'pre-rebase got correct input (5)' ' - test "z$(cat .git/PRE-REBASE-INPUT)" = z--root, -' - test_expect_success 'set up merge history' ' git checkout other^ && git checkout -b side &&
@@ -123,13 +112,6 @@ commit work6~4 1 EOF -test_expect_success REBASE_P 'rebase -i -p with merge' ' - git checkout -b work6 other && - git rebase -i -p --root --onto main && - log_with_names work6 > rebased6 && - test_cmp expect-side rebased6 -' - test_expect_success 'set up second root and merge' ' git symbolic-ref HEAD refs/heads/third && rm .git/index &&
@@ -158,13 +140,6 @@ commit work7~5 1 EOF -test_expect_success REBASE_P 'rebase -i -p with two roots' ' - git checkout -b work7 other && - git rebase -i -p --root --onto main && - log_with_names work7 > rebased7 && - test_cmp expect-third rebased7 -' - test_expect_success 'setup pre-rebase hook that fails' ' mkdir -p .git/hooks && cat >.git/hooks/pre-rebase <<EOF &&
@@ -264,21 +239,9 @@ commit conflict3~6 1 EOF -test_expect_success REBASE_P 'rebase -i -p --root with conflict (first part)' ' - git checkout -b conflict3 other && - test_must_fail git rebase -i -p --root --onto main && - git ls-files -u | grep "B$" -' - test_expect_success 'fix the conflict' ' echo 3 > B && git add B ' -test_expect_success REBASE_P 'rebase -i -p --root with conflict (second part)' ' - git rebase --continue && - log_with_names conflict3 >out && - test_cmp expect-conflict-p out -' - test_done
t/t3414-rebase-preserve-onto.sh deleted +0 -85
85 lines not on this page · raw message
t/t3418-rebase-continue.sh +0 -15
@@ -109,20 +109,6 @@ test_expect_success 'rebase -i --continue handles merge strategy and options' ' test -f funny.was.run ' -test_expect_success REBASE_P 'rebase passes merge strategy options correctly' ' - rm -fr .git/rebase-* && - git reset --hard commit-new-file-F3-on-topic-branch && - test_commit theirs-to-merge && - git reset --hard HEAD^ && - test_commit some-commit && - test_tick && - git merge --no-ff theirs-to-merge && - FAKE_LINES="1 edit 2 3" git rebase -i -f -p -m \ - -s recursive --strategy-option=theirs HEAD~2 && - test_commit force-change && - git rebase --continue -' - test_expect_success 'rebase -r passes merge strategy options correctly' ' rm -fr .git/rebase-* && git reset --hard commit-new-file-F3-on-topic-branch &&
@@ -258,7 +244,6 @@ test_rerere_autoupdate test_rerere_autoupdate -m GIT_SEQUENCE_EDITOR=: && export GIT_SEQUENCE_EDITOR test_rerere_autoupdate -i -test_have_prereq !REBASE_P || test_rerere_autoupdate --preserve-merges unset GIT_SEQUENCE_EDITOR test_expect_success 'the todo command "break" works' '
t/t3421-rebase-topology-linear.sh +0 -19
@@ -29,7 +29,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_expect_success 'setup branches and remote tracking' ' git tag -l >tags &&
@@ -53,7 +52,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -70,7 +68,6 @@ test_run_rebase success --apply test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -87,7 +84,6 @@ test_run_rebase success --apply test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -102,7 +98,6 @@ test_run_rebase success --apply test_run_rebase success --fork-point test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p # f # /
@@ -142,7 +137,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -157,7 +151,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -172,7 +165,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -187,7 +179,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p # a---b---c---j! # \
@@ -215,7 +206,6 @@ test_run_rebase () { test_run_rebase failure --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -229,7 +219,6 @@ test_run_rebase () { } test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -243,7 +232,6 @@ test_run_rebase () { } test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase success --rebase-merges # m
@@ -283,7 +271,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -298,7 +285,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -313,7 +299,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_run_rebase () { result=$1
@@ -329,7 +314,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -344,7 +328,6 @@ test_run_rebase () { test_run_rebase success --apply test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -358,7 +341,6 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase failure -p test_run_rebase () { result=$1
@@ -373,6 +355,5 @@ test_run_rebase () { test_run_rebase success '' test_run_rebase success -m test_run_rebase success -i -test_have_prereq !REBASE_P || test_run_rebase success -p test_done
t/t3422-rebase-incompatible-options.sh +0 -11
@@ -63,15 +63,4 @@ test_rebase_am_only () { test_rebase_am_only --whitespace=fix test_rebase_am_only -C4 -test_expect_success REBASE_P '--preserve-merges incompatible with --signoff' ' - git checkout B^0 && - test_must_fail git rebase --preserve-merges --signoff A -' - -test_expect_success REBASE_P \ - '--preserve-merges incompatible with --rebase-merges' ' - git checkout B^0 && - test_must_fail git rebase --preserve-merges --rebase-merges A -' - test_done
t/t3425-rebase-topology-merges.sh +0 -151
155 lines not on this page · raw message
t/t3427-rebase-subtree.sh +3 -23
@@ -36,11 +36,10 @@ commit_message() { # where the root commit adds three files: topic_1.t, topic_2.t and topic_3.t. # # This commit history is then rebased onto `topic_3` with the -# `-Xsubtree=files_subtree` option in three different ways: +# `-Xsubtree=files_subtree` option in two different ways: # -# 1. using `--preserve-merges` -# 2. using `--preserve-merges` and --keep-empty -# 3. without specifying a rebase backend +# 1. without specifying a rebase backend +# 2. using the `--rebase-merges` backend test_expect_success 'setup' ' test_commit README &&
@@ -69,25 +68,6 @@ test_expect_success 'setup' ' git commit -m "Empty commit" --allow-empty ' -# FAILURE: Does not preserve topic_4. -test_expect_failure REBASE_P 'Rebase -Xsubtree --preserve-merges --onto commit' ' - reset_rebase && - git checkout -b rebase-preserve-merges to-rebase && - git rebase -Xsubtree=files_subtree --preserve-merges --onto files-main main && - verbose test "$(commit_message HEAD~)" = "topic_4" && - verbose test "$(commit_message HEAD)" = "files_subtree/topic_5" -' - -# FAILURE: Does not preserve topic_4. -test_expect_failure REBASE_P 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit' ' - reset_rebase && - git checkout -b rebase-keep-empty to-rebase && - git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-main main && - verbose test "$(commit_message HEAD~2)" = "topic_4" && - verbose test "$(commit_message HEAD~)" = "files_subtree/topic_5" && - verbose test "$(commit_message HEAD)" = "Empty commit" -' - test_expect_success 'Rebase -Xsubtree --empty=ask --onto commit' ' reset_rebase && git checkout -b rebase-onto to-rebase &&
t/t5520-pull.sh +0 -18
@@ -546,15 +546,6 @@ test_expect_success 'pull.rebase=1 is treated as true and flattens keep-merge' ' test_cmp expect actual ' -test_expect_success REBASE_P \ - 'pull.rebase=preserve rebases and merges keep-merge' ' - git reset --hard before-preserve-rebase && - test_config pull.rebase preserve && - git pull . copy && - test_cmp_rev HEAD^^ copy && - test_cmp_rev HEAD^2 keep-merge -' - test_expect_success 'pull.rebase=interactive' ' write_script "$TRASH_DIRECTORY/fake-editor" <<-\EOF && echo I was here >fake.out &&
@@ -606,15 +597,6 @@ test_expect_success '--rebase=true rebases and flattens keep-merge' ' test_cmp expect actual ' -test_expect_success REBASE_P \ - '--rebase=preserve rebases and merges keep-merge' ' - git reset --hard before-preserve-rebase && - test_config pull.rebase true && - git pull --rebase=preserve . copy && - test_cmp_rev HEAD^^ copy && - test_cmp_rev HEAD^2 keep-merge -' - test_expect_success '--rebase=invalid fails' ' git reset --hard before-preserve-rebase && test_must_fail git pull --rebase=invalid . copy
t/t7505-prepare-commit-msg-hook.sh +0 -1
@@ -250,7 +250,6 @@ test_rebase () { } test_rebase success -test_have_prereq !REBASE_P || test_rebase success -p test_expect_success 'with hook (cherry-pick)' ' test_when_finished "git checkout -f main" &&
t/t7517-per-repo-email.sh +0 -13
@@ -75,19 +75,6 @@ test_expect_success 'noop interactive rebase does not care about ident' ' git rebase -i HEAD^ ' -test_expect_success REBASE_P \ - 'fast-forward rebase does not care about ident (preserve)' ' - git checkout -B tmp side-without-commit && - git rebase -p main -' - -test_expect_success REBASE_P \ - 'non-fast-forward rebase refuses to write commits (preserve)' ' - test_when_finished "git rebase --abort || true" && - git checkout -B tmp side-with-commit && - test_must_fail git rebase -p main -' - test_expect_success 'author.name overrides user.name' ' test_config user.name user && test_config user.email [email protected] &&
t/test-lib.sh +0 -4
@@ -1708,10 +1708,6 @@ test_lazy_prereq SHA1 ' esac ' -test_lazy_prereq REBASE_P ' - test -z "$GIT_TEST_SKIP_REBASE_P" -' - # Ensure that no test accidentally triggers a Git command # that runs the actual maintenance scheduler, affecting a user's # system permanently.
Signature · 1 line
gitgitgadget
PATCH v3 4/11 pull: remove support for `--rebase=preserve`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
In preparation for git-rebase--preserve-merges.sh entering its after life, we remove this (deprecated) option that would still rely on it.
To help users transition who still did not receive the memo about the deprecation, we offer a helpful error message instead of throwing our hands in the air and saying that we don't know that option, never heard of it.
--- Documentation/config/branch.txt | 4 ---- Documentation/config/pull.txt | 4 ---- Documentation/git-pull.txt | 6 +----- builtin/pull.c | 9 +++------ contrib/completion/git-completion.bash | 2 +- rebase.c | 5 +++-- rebase.h | 1 - 7 files changed, 8 insertions(+), 23 deletions(-)
Documentation/config/branch.txt +0 -4
@@ -85,10 +85,6 @@ When `merges` (or just 'm'), pass the `--rebase-merges` option to 'git rebase' so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When `preserve` (or just 'p', deprecated in favor of `merges`), also pass -`--preserve-merges` along to 'git rebase' so that locally committed merge -commits will not be flattened by running 'git pull'. -+ When the value is `interactive` (or just 'i'), the rebase is run in interactive mode. +
Documentation/config/pull.txt +0 -4
@@ -18,10 +18,6 @@ When `merges` (or just 'm'), pass the `--rebase-merges` option to 'git rebase' so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When `preserve` (or just 'p', deprecated in favor of `merges`), also pass -`--preserve-merges` along to 'git rebase' so that locally committed merge -commits will not be flattened by running 'git pull'. -+ When the value is `interactive` (or just 'i'), the rebase is run in interactive mode. +
Documentation/git-pull.txt +1 -5
@@ -102,7 +102,7 @@ Options related to merging include::merge-options.txt[] -r:: ---rebase[=false|true|merges|preserve|interactive]:: +--rebase[=false|true|merges|interactive]:: When true, rebase the current branch on top of the upstream branch after fetching. If there is a remote-tracking branch corresponding to the upstream branch and the upstream branch
@@ -113,10 +113,6 @@ When set to `merges`, rebase using `git rebase --rebase-merges` so that the local merge commits are included in the rebase (see linkgit:git-rebase[1] for details). + -When set to `preserve` (deprecated in favor of `merges`), rebase with the -`--preserve-merges` option passed to `git rebase` so that locally created -merge commits will not be flattened. -+ When false, merge the upstream branch into the current branch. + When `interactive`, enable the interactive mode of rebase.
builtin/pull.c +3 -6
@@ -30,9 +30,8 @@/** * Parses the value of --rebase. If value is a false value, returns * REBASE_FALSE. If value is a true value, returns REBASE_TRUE. If value is -* "merges", returns REBASE_MERGES. If value is "preserve", returns -* REBASE_PRESERVE. If value is a invalid value, dies with a fatal error if -* fatal is true, otherwise returns REBASE_INVALID. +* "merges", returns REBASE_MERGES. If value is a invalid value, dies with +* a fatal error if fatal is true, otherwise returns REBASE_INVALID. */ static enum rebase_type parse_config_rebase (const char *key,const char *value,int fatal)
@@ -126,7 +125,7 @@ static struct option pull_options[] = {/* Options passed to git-merge or git-rebase */ OPT_GROUP (N_ ("Options related to merging" )),OPT_CALLBACK_F ('r' ,"rebase" , &opt_rebase, -"(false|true|merges|preserve|interactive)" , +"(false|true|merges|interactive)" ,N_ ("incorporate changes by rebasing rather than merging" ),PARSE_OPT_OPTARG , parse_opt_rebase), OPT_PASSTHRU('n', NULL, &opt_diffstat, NULL,
@@ -883,8 +882,6 @@ static int run_rebase(const struct object_id *newbase,/* Options passed to git-rebase */ if (opt_rebase ==REBASE_MERGES )strvec_push (&args,"--rebase-merges" ); -else if (opt_rebase ==REBASE_PRESERVE ) -strvec_push (&args,"--preserve-merges" );else if (opt_rebase ==REBASE_INTERACTIVE )strvec_push (&args,"--interactive" );if (opt_diffstat)
contrib/completion/git-completion.bash +1 -1
@@ -2543,7 +2543,7 @@ __git_complete_config_variable_value () return ;; branch.*.rebase) - __gitcomp "false true merges preserve interactive" "" "$cur_" + __gitcomp "false true merges interactive" "" "$cur_" return ;; remote.pushdefault)
rebase.c +3 -2
@@ -1,5 +1,6 @@#include "rebase.h" #include "config.h" +#include "gettext.h" /* * Parses textual value for pull.rebase, branch.<name>.rebase, etc.
@@ -20,12 +21,12 @@ enum rebase_type rebase_parse_value(const char *value)return REBASE_FALSE ; else if (v > 0) return REBASE_TRUE; - else if (!strcmp(value, "preserve") || !strcmp(value, "p")) - return REBASE_PRESERVE; else if (!strcmp(value, "merges") || !strcmp(value, "m")) return REBASE_MERGES; else if (!strcmp(value, "interactive") || !strcmp(value, "i")) return REBASE_INTERACTIVE; + else if (!strcmp(value, "preserve") || !strcmp(value, "p")) + error(_("%s: 'preserve' superseded by 'merges'"), value);/* * Please update _git_config() in git-completion.bash when you * add new rebase modes.
rebase.h +0 -1
@@ -5,7 +5,6 @@ enum rebase_type {REBASE_INVALID =-1 ,REBASE_FALSE =0 ,REBASE_TRUE , -REBASE_PRESERVE ,REBASE_MERGES , REBASE_INTERACTIVE };
Signature · 1 line
gitgitgadget
PATCH v3 5/11 rebase: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
This option was deprecated in favor of --rebase-merges some time ago, and now we retire it.
To assist users to transition away, we do not _actually_ remove the option, but now we no longer implement the functionality. Instead, we offer a helpful error message suggesting which option to use.
--- .gitignore | 1 - Documentation/git-rebase.txt | 51 -- Makefile | 2 - builtin/rebase.c | 138 +---- git-rebase--preserve-merges.sh | 1057 -------------------------------- 5 files changed, 11 insertions(+), 1238 deletions(-) delete mode 100644 git-rebase--preserve-merges.sh
.gitignore +0 -1
@@ -125,7 +125,6 @@ /git-range-diff /git-read-tree /git-rebase -/git-rebase--preserve-merges /git-receive-pack /git-reflog /git-remote
Documentation/git-rebase.txt +0 -51
87 lines not on this page · raw message
Makefile +0 -2
@@ -616,7 +616,6 @@ SCRIPT_SH += git-submodule.sh SCRIPT_SH += git-web--browse.sh SCRIPT_LIB += git-mergetool--lib -SCRIPT_LIB += git-rebase--preserve-merges SCRIPT_LIB += git-sh-i18n SCRIPT_LIB += git-sh-setup
@@ -2649,7 +2648,6 @@ XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \ --keyword=__ --keyword=N__ --keyword="__n:1,2" LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H) LOCALIZED_SH = $(SCRIPT_SH) -LOCALIZED_SH += git-rebase--preserve-merges.sh LOCALIZED_SH += git-sh-setup.sh LOCALIZED_PERL = $(SCRIPT_PERL)
builtin/rebase.c +11 -127
238 lines not on this page · raw message
git-rebase--preserve-merges.sh deleted +0 -1057
1,057 lines not on this page · raw message
Signature · 1 line
gitgitgadget
Re: [PATCH v3 05/11] rebase: drop support for `--preserve-merges`
builtin/rebase.c static GIT_PATH_FUNC(merge_dir, "rebase-merge") · line 52
Quoted 12 lines · Johannes Schindelin via GitGitGadget
builtin/rebase.c +1
-2@@ -48,8 +48,7 @@ static GIT_PATH_FUNC(merge_dir, "rebase-merge")enum rebase_type {REBASE_UNSPECIFIED =-1 ,REBASE_APPLY , -REBASE_MERGE , -REBASE_PRESERVE_MERGES +REBASE_MERGE };
This definitely doesn't require a re-roll, but just in case you didn't know, from CodingGuidelines:
. since early 2012 with e1327023ea, we have been using an enum
definition whose last element is followed by a comma. This, like an array initializer that ends with a trailing comma, can be used to reduce the patch noise when adding a new identifier at the end.
(That was added in cc0c42975a2 (CodingGuidelines: spell out post-C89 rules, 2019-07-16))
I.e. in case you're slavisly following this particular bit of C syntax for C89 compatibility it's not needed anymore, which helps to make diffs smaller, and writing code generation loops less annoying.
re-mentioning --preserve-merges in the docs (was: [PATCH v3 05/11] rebase: drop support for `--preserve-merges`)
In reply to Johannes Schindelin via GitGitGadgetDocumentation/git-rebase.txt i.e. commits that would be excluded by linkgit:git-log[1]'s · line 543
Quoted 8 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]> [...]
--p::
---preserve-merges::Documentation/git-rebase.txt +0
-4- [DEPRECATED: use `--rebase-merges` instead] Recreate merge commits - instead of flattening the history by replaying commits a merge commit - introduces. Merge conflict resolutions or manual amendments to merge - commits are not preserved.
[In reply to an old commit]
I opened "man git-rebase" today due to an on-list discussion and went through pretty much:
1. /preserve-merges # fails
2. skimming the SYNOPSIS, forgetting what the new thing is called
3. Paging down, eventually findinging & remembering the new thing is
"--rebase-merges".
I wonder if there's objections to reinstating this in the docs somewhere, just as something like:
--preserve-merges:
An old "rebase" backend which is no longer supported, and which was removed from git in version v2.35.0.
We don't do that with all flags that we've dropped, but perhaps this one was well known enough to not leave readers hanging...
Re: re-mentioning --preserve-merges in the docs
Quoted 24 lines · Ævar Arnfjörð Bjarmason
Documentation/git-rebase.txt i.e. commits that would be excluded by linkgit:git-log[1]'s · line 543
Quoted 8 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]> [...]
--p::
---preserve-merges::Documentation/git-rebase.txt +0
-4- [DEPRECATED: use `--rebase-merges` instead] Recreate merge commits - instead of flattening the history by replaying commits a merge commit - introduces. Merge conflict resolutions or manual amendments to merge - commits are not preserved.[In reply to an old commit]
I opened "man git-rebase" today due to an on-list discussion and went through pretty much:
1. /preserve-merges # fails
2. skimming the SYNOPSIS, forgetting what the new thing is called
3. Paging down, eventually findinging & remembering the new thing is"--rebase-merges".I wonder if there's objections to reinstating this in the docs somewhere, just as something like:
Quoted 6 lines
--preserve-merges:
An old "rebase" backend which is no longer supported, and which was removed from git in version v2.35.0.We don't do that with all flags that we've dropped, but perhaps this one was well known enough to not leave readers hanging...
My impression is that we consider that we have done so already for a few releases by keeping "DEPRECATED: use rebase-merges", exactly because "this one was well known enough", and now it is time to go one step further, i.e. drop it from the document like the quoted patch does, while recognising an attempt to use the option and giving a custom message than the bog-standard "unknown option".
$ git rebase --preserve-merges
fatal: --preserve-merges was replaced by --rebase-merges
Note: Your `pull.rebase` configuration may also be set to 'preserve',
which is no longer supported; use 'merges' insteadThe next step will be to drop that custom error support, I think.
Re: re-mentioning --preserve-merges in the docs
Hi Junio,
Quoted 40 lines · Junio C Hamano
Quoted 24 lines · Ævar Arnfjörð Bjarmason
Documentation/git-rebase.txt i.e. commits that would be excluded by linkgit:git-log[1]'s · line 543
Quoted 8 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]> [...]
--p::
---preserve-merges::Documentation/git-rebase.txt +0
-4- [DEPRECATED: use `--rebase-merges` instead] Recreate merge commits - instead of flattening the history by replaying commits a merge commit - introduces. Merge conflict resolutions or manual amendments to merge - commits are not preserved.[In reply to an old commit]
I opened "man git-rebase" today due to an on-list discussion and went through pretty much:
1. /preserve-merges # fails
2. skimming the SYNOPSIS, forgetting what the new thing is called
3. Paging down, eventually findinging & remembering the new thing is"--rebase-merges".I wonder if there's objections to reinstating this in the docs somewhere, just as something like:
Quoted 6 lines
--preserve-merges:
An old "rebase" backend which is no longer supported, and which was removed from git in version v2.35.0.We don't do that with all flags that we've dropped, but perhaps this one was well known enough to not leave readers hanging...
My impression is that we consider that we have done so already for a few releases by keeping "DEPRECATED: use rebase-merges", exactly because "this one was well known enough", and now it is time to go one step further, i.e. drop it from the document like the quoted patch does, while recognising an attempt to use the option and giving a custom message than the bog-standard "unknown option".
Quoted 6 lines
$ git rebase --preserve-merges fatal: --preserve-merges was replaced by --rebase-merges Note: Your `pull.rebase` configuration may also be set to 'preserve', which is no longer supported; use 'merges' insteadThe next step will be to drop that custom error support, I think.
Fully agree.
I _could_ see us introducing a sentence in the explanation of --rebase-merges that leaves a historical note about superseding the now-removed --preserve-merges option. But such historical notes tend to go pretty stale pretty quickly, and eventually cause more confusion than clarification.
So just like you said, I'd rather not re-introduce any text mentioning --preserve-merges into the manual page.
Ciao,
Dscho
PATCH v3 6/11 git-svn: drop support for `--preserve-merges`
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
We already passed the --rebase-merges option to git rebase instead, now we make this move permanent.
As pointed out by Ævar Arnfjörð Bjarmason, in contrast to the deprecation of git rebase's --preserve-merges backend, git svn only deprecated this option in v2.25.0 (because this developer missed git svn's use of that backend when deprecating the rebase backend running up to Git v2.22).
Still, v2.25.0 has been released on January 13th, 2020. In other words, git svn deprecated this option over one and a half years ago, _and_ has been redirecting to the --rebase-merges option during all that time (read: git svn rebase --preserve-merges didn't do _precisely_ what the user asked, since v2.25.0, anyway, it fell back to pretending that the user asked for git svn rebase --rebase-merges instead).
It is time to act on that deprecation and remove that option after all.
--- Documentation/git-svn.txt | 1 - git-svn.perl | 1 - 2 files changed, 2 deletions(-)
Documentation/git-svn.txt +0 -1
@@ -678,7 +678,6 @@ config key: svn.authorsProg --strategy=<strategy>:: -p:: --rebase-merges:: ---preserve-merges (DEPRECATED):: These are only used with the 'dcommit' and 'rebase' commands. + Passed directly to 'git rebase' when using 'dcommit' if a
git-svn.perl +0 -1
@@ -273,7 +273,6 @@ my %cmd = ( 'fetch-all|all' => \$_fetch_all, 'dry-run|n' => \$_dry_run, 'rebase-merges|p' => \$_rebase_merges, - 'preserve-merges|p' => \$_rebase_merges, %fc_opts } ], 'commit-diff' => [ \&cmd_commit_diff, 'Commit a diff between two trees',
Signature · 1 line
gitgitgadget
PATCH v3 7/11 rebase: drop the internal `rebase--interactive` command
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
It was only used by the --preserve-merges backend, which we just removed.
--- builtin/rebase.c | 193 +---------------------------------------------- git.c | 1 - 2 files changed, 1 insertion(+), 193 deletions(-)
builtin/rebase.c +1 -192
@@ -162,12 +162,7 @@ enum action {ACTION_ABORT ,ACTION_QUIT ,ACTION_EDIT_TODO , -ACTION_SHOW_CURRENT_PATCH , -ACTION_SHORTEN_OIDS , -ACTION_EXPAND_OIDS , -ACTION_CHECK_TODO_LIST , -ACTION_REARRANGE_SQUASH , -ACTION_ADD_EXEC +ACTION_SHOW_CURRENT_PATCH }; static const char *action_names[] = { "undefined",
@@ -178,81 +173,6 @@ static const char *action_names[] = { "undefined","edit_todo" , "show_current_patch" }; -static int add_exec_commands (struct string_list *commands) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); - -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - -todo_list_add_exec_commands (&todo_list, commands); - res =todo_list_write_to_file (the_repository, &todo_list, - todo_file,NULL ,NULL ,-1 ,0 ); -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} - -static int rearrange_squash_in_todo_file (void ) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res =0 ; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - - res =todo_list_rearrange_squash (&todo_list); -if (!res) - res =todo_list_write_to_file (the_repository, &todo_list, - todo_file,NULL ,NULL ,-1 ,0 ); - -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} - -static int transform_todo_file (unsigned flags) -{ -const char *todo_file =rebase_path_todo (); -struct todo_list todo_list =TODO_LIST_INIT ; -int res; - -if (strbuf_read_file (&todo_list.buf, todo_file,0 ) <0 ) -return error_errno (_ ("could not read '%s'." ), todo_file); - -if (todo_list_parse_insn_buffer (the_repository, todo_list.buf.buf, - &todo_list)) { -todo_list_release (&todo_list); -return error (_ ("unusable todo list: '%s'" ), todo_file); - } - - res =todo_list_write_to_file (the_repository, &todo_list, todo_file, -NULL ,NULL ,-1 , flags); -todo_list_release (&todo_list); - -if (res) -return error_errno (_ ("could not write '%s'." ), todo_file); -return 0 ; -} -static int edit_todo_file (unsigned flags) {const char *todo_file =rebase_path_todo ();
@@ -402,7 +322,6 @@ static int run_sequencer_rebase(struct rebase_options *opts, flags |= opts->rebase_merges ?TODO_LIST_REBASE_MERGES :0 ; flags |= opts->rebase_cousins >0 ?TODO_LIST_REBASE_COUSINS :0 ; flags |= opts->root_with_onto ?TODO_LIST_ROOT_WITH_ONTO :0 ; - flags |= command ==ACTION_SHORTEN_OIDS ?TODO_LIST_SHORTEN_IDS :0 ; flags |= opts->reapply_cherry_picks ?TODO_LIST_REAPPLY_CHERRY_PICKS :0 ;switch (command) {
@@ -437,24 +356,6 @@ static int run_sequencer_rebase(struct rebase_options *opts,break ; } -case ACTION_SHORTEN_OIDS : -case ACTION_EXPAND_OIDS : - ret =transform_todo_file (flags); -break ; -case ACTION_CHECK_TODO_LIST : - ret =check_todo_list_from_file (the_repository); -break ; -case ACTION_REARRANGE_SQUASH : - ret =rearrange_squash_in_todo_file (); -break ; -case ACTION_ADD_EXEC : { -struct string_list commands =STRING_LIST_INIT_DUP ; - -split_exec_commands (opts->cmd, &commands); - ret =add_exec_commands (&commands); -string_list_clear (&commands,0 ); -break ; - }default :BUG ("invalid command '%d'" , command); }
@@ -476,98 +377,6 @@ static int parse_opt_keep_empty(const struct option *opt, const char *arg,return 0 ; } -static const char *const builtin_rebase_interactive_usage[] = { -N_ ("git rebase--interactive [<options>]" ), -NULL -}; - -int cmd_rebase__interactive (int argc,const char **argv,const char *prefix) -{ -struct rebase_options opts =REBASE_OPTIONS_INIT ; -struct object_id squash_onto = *null_oid (); -enum action command =ACTION_NONE ; -struct option options[] = { -OPT_NEGBIT (0 ,"ff" , &opts.flags,N_ ("allow fast-forward" ), -REBASE_FORCE ), -OPT_CALLBACK_F ('k' ,"keep-empty" , &options,NULL , -N_ ("keep commits which start empty" ), -PARSE_OPT_NOARG |PARSE_OPT_HIDDEN , - parse_opt_keep_empty), -OPT_BOOL_F (0 ,"allow-empty-message" , &opts.allow_empty_message, -N_ ("allow commits with empty messages" ), -PARSE_OPT_HIDDEN ), -OPT_BOOL (0 ,"rebase-merges" , &opts.rebase_merges,N_ ("rebase merge commits" )), -OPT_BOOL (0 ,"rebase-cousins" , &opts.rebase_cousins, -N_ ("keep original branch points of cousins" )), -OPT_BOOL (0 ,"autosquash" , &opts.autosquash, -N_ ("move commits that begin with squash!/fixup!" )), -OPT_BOOL (0 ,"signoff" , &opts.signoff,N_ ("sign commits" )), -OPT_BIT ('v' ,"verbose" , &opts.flags, -N_ ("display a diffstat of what changed upstream" ), -REBASE_NO_QUIET |REBASE_VERBOSE |REBASE_DIFFSTAT ), -OPT_CMDMODE (0 ,"continue" , &command,N_ ("continue rebase" ), -ACTION_CONTINUE ), -OPT_CMDMODE (0 ,"skip" , &command,N_ ("skip commit" ),ACTION_SKIP ), -OPT_CMDMODE (0 ,"edit-todo" , &command,N_ ("edit the todo list" ), -ACTION_EDIT_TODO ), -OPT_CMDMODE (0 ,"show-current-patch" , &command,N_ ("show the current patch" ), -ACTION_SHOW_CURRENT_PATCH ), -OPT_CMDMODE (0 ,"shorten-ids" , &command, -N_ ("shorten commit ids in the todo list" ),ACTION_SHORTEN_OIDS ), -OPT_CMDMODE (0 ,"expand-ids" , &command, -N_ ("expand commit ids in the todo list" ),ACTION_EXPAND_OIDS ), -OPT_CMDMODE (0 ,"check-todo-list" , &command, -N_ ("check the todo list" ),ACTION_CHECK_TODO_LIST ), -OPT_CMDMODE (0 ,"rearrange-squash" , &command, -N_ ("rearrange fixup/squash lines" ),ACTION_REARRANGE_SQUASH ), -OPT_CMDMODE (0 ,"add-exec-commands" , &command, -N_ ("insert exec commands in todo list" ),ACTION_ADD_EXEC ), - {OPTION_CALLBACK ,0 ,"onto" , &opts.onto,N_ ("onto" ),N_ ("onto" ), -PARSE_OPT_NONEG , parse_opt_commit,0 }, - {OPTION_CALLBACK ,0 ,"restrict-revision" , &opts.restrict_revision, -N_ ("restrict-revision" ),N_ ("restrict revision" ), -PARSE_OPT_NONEG , parse_opt_commit,0 }, - {OPTION_CALLBACK ,0 ,"squash-onto" , &squash_onto,N_ ("squash-onto" ), -N_ ("squash onto" ),PARSE_OPT_NONEG , parse_opt_object_id,0 }, - {OPTION_CALLBACK ,0 ,"upstream" , &opts.upstream,N_ ("upstream" ), -N_ ("the upstream commit" ),PARSE_OPT_NONEG , parse_opt_commit, -0 }, -OPT_STRING (0 ,"head-name" , &opts.head_name,N_ ("head-name" ),N_ ("head name" )), - {OPTION_STRING ,'S' ,"gpg-sign" , &opts.gpg_sign_opt,N_ ("key-id" ), -N_ ("GPG-sign commits" ), -PARSE_OPT_OPTARG ,NULL , (intptr_t )"" }, -OPT_STRING (0 ,"strategy" , &opts.strategy,N_ ("strategy" ), -N_ ("rebase strategy" )), -OPT_STRING (0 ,"strategy-opts" , &opts.strategy_opts,N_ ("strategy-opts" ), -N_ ("strategy options" )), -OPT_STRING (0 ,"switch-to" , &opts.switch_to,N_ ("switch-to" ), -N_ ("the branch or commit to checkout" )), -OPT_STRING (0 ,"onto-name" , &opts.onto_name,N_ ("onto-name" ),N_ ("onto name" )), -OPT_STRING (0 ,"cmd" , &opts.cmd,N_ ("cmd" ),N_ ("the command to run" )), -OPT_RERERE_AUTOUPDATE (&opts.allow_rerere_autoupdate), -OPT_BOOL (0 ,"reschedule-failed-exec" , &opts.reschedule_failed_exec, -N_ ("automatically re-schedule any `exec` that fails" )), -OPT_END () - }; - - opts.rebase_cousins =-1 ; - -if (argc ==1 ) -usage_with_options (builtin_rebase_interactive_usage, options); - - argc =parse_options (argc, argv, prefix, options, - builtin_rebase_interactive_usage,PARSE_OPT_KEEP_ARGV0 ); - -if (!is_null_oid (&squash_onto)) - opts.squash_onto = &squash_onto; - -if (opts.rebase_cousins >=0 && !opts.rebase_merges) -warning (_ ("--[no-]rebase-cousins has no effect without " -"--rebase-merges" )); - -return !!run_sequencer_rebase (&opts, command); -} -static int is_merge (struct rebase_options *opts) {return opts->type ==REBASE_MERGE ;
git.c +0 -1
@@ -577,7 +577,6 @@ static struct cmd_struct commands[] = { { "range-diff", cmd_range_diff, RUN_SETUP | USE_PAGER }, { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX}, { "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE }, - { "rebase--interactive", cmd_rebase__interactive, RUN_SETUP | NEED_WORK_TREE }, { "receive-pack", cmd_receive_pack }, { "reflog", cmd_reflog, RUN_SETUP }, { "remote", cmd_remote, RUN_SETUP },
Signature · 1 line
gitgitgadget
PATCH v3 8/11 rebase: remove obsolete code comment
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
Now that we no longer have a --preserve-merges backend, this comment needs to be adjusted.
--- builtin/rebase.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
builtin/rebase.c +1 -1
@@ -1415,7 +1415,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)if (options.ignore_date)strvec_push (&options.git_am_opts,"--ignore-date" ); }else { -/* REBASE_MERGE and PRESERVE_MERGES */ +/* REBASE_MERGE */ if (ignore_whitespace) {string_list_append (&strategy_options,"ignore-space-change" );
Signature · 1 line
gitgitgadget
PATCH v3 9/11 rebase: stop mentioning the -p option in comments
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
We no longer support --preserve-merges, therefore it does not make sense to keep mentioning that option, even in code comments.
--- builtin/rebase.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
builtin/rebase.c +1 -1
@@ -909,7 +909,7 @@ static int parse_opt_merge(const struct option *opt, const char *arg, int unset)return 0 ; } -/* -i followed by -p is still explicitly interactive, but -p alone is not */ +/* -i followed by -r is still explicitly interactive, but -r alone is not */ static int parse_opt_interactive (const struct option *opt,const char *arg,int unset) {
Signature · 1 line
gitgitgadget
PATCH v3 10/11 rebase: remove a no-longer-used function
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
With the --preserve-merges option going away, we no longer need this function.
--- rebase-interactive.c | 29 ----------------------------- rebase-interactive.h | 2 -- 2 files changed, 31 deletions(-)
rebase-interactive.c +0 -29
@@ -226,32 +226,3 @@ int todo_list_check_against_backup(struct repository *r, struct todo_list *todo_todo_list_release (&backup);return res; } - -int check_todo_list_from_file (struct repository *r) -{ -struct todo_list old_todo =TODO_LIST_INIT , new_todo =TODO_LIST_INIT ; -int res =0 ; - -if (strbuf_read_file (&new_todo.buf,rebase_path_todo (),0 ) <0 ) { - res =error (_ ("could not read '%s'." ),rebase_path_todo ()); - goto out; - } - -if (strbuf_read_file (&old_todo.buf,rebase_path_todo_backup (),0 ) <0 ) { - res =error (_ ("could not read '%s'." ),rebase_path_todo_backup ()); - goto out; - } - - res =todo_list_parse_insn_buffer (r, old_todo.buf.buf, &old_todo); -if (!res) - res =todo_list_parse_insn_buffer (r, new_todo.buf.buf, &new_todo); -if (res) -fprintf (stderr,_ (edit_todo_list_advice)); -if (!res) - res =todo_list_check (&old_todo, &new_todo); -out: -todo_list_release (&old_todo); -todo_list_release (&new_todo); - -return res; -}
rebase-interactive.h +0 -2
@@ -16,6 +16,4 @@ int todo_list_check(struct todo_list *old_todo, struct todo_list *new_todo);int todo_list_check_against_backup (struct repository *r,struct todo_list *todo_list); -int check_todo_list_from_file (struct repository *r); -#endif
Signature · 1 line
gitgitgadget
PATCH v3 11/11 sequencer: restrict scope of a formerly public function
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
The function to add the exec commands to the todo list only needed to be public API because it was not only used internally by the sequencer, but also by git rebase --preserve-merges.
Now that that mode has been removed, we no longer need that function to be scoped publicly.
--- sequencer.c | 4 ++-- sequencer.h | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-)
sequencer.c +2 -2
@@ -5387,8 +5387,8 @@ int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,* Add commands after pick and (series of) squash/fixup commands * in the todo list. */ -void todo_list_add_exec_commands (struct todo_list *todo_list, -struct string_list *commands) +static void todo_list_add_exec_commands (struct todo_list *todo_list, +struct string_list *commands) {struct strbuf *buf = &todo_list->buf;size_t base_offset = buf->len;
sequencer.h +0 -2
@@ -160,8 +160,6 @@ int sequencer_remove_state(struct replay_opts *opts);int sequencer_make_script (struct repository *r,struct strbuf *out,int argc,const char **argv,unsigned flags); -void todo_list_add_exec_commands (struct todo_list *todo_list, -struct string_list *commands); int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags, const char *shortrevisions, const char *onto_name, struct commit *onto, const struct object_id *orig_head,
Signature · 1 line
gitgitgadget
Quoted 24 lines · Johannes Schindelin via GitGitGadget
In
427c3bd28ab(rebase: deprecate --preserve-merges, 2019-03-11) (which was included in v2.22.0), we officially deprecated the --preserve-merges backend. Over two years later, it is time to drop that backend, and here is a patch series that does just that.Changes since v2:
* Removed the no-longer-needed
script_snippetvariable
* Enhanced the commit message of the git svn patch to clarify that the deprecation happened only in v2.25 there
* Adjusted code comments that still talked about the removed option
* Removed some no-longer-needed ACTION_* enum values
* We now also dropcheck_todo_list_from_file()because it is no longer needed
* Thetodo_list_add_exec_commands()function is now scoped to the file (because there are no longer any outside users)
* When users still use the options, they are no longer met by Git's blank stares, but by a helpful error message suggesting to use --rebase-merges insteadChanges since v1:
* Rebased onto v2.33.0
Quoted 12 lines
Johannes Schindelin (11):
t5520: do not usepull.rebase=preserve
remote: warn about unhandled branch.<name>.rebase values
tests: stop testinggit rebase --preserve-merges
pull: remove support for--rebase=preserve
rebase: drop support for--preserve-merges
git-svn: drop support for--preserve-merges
rebase: drop the internalrebase--interactivecommand
rebase: remove obsolete code comment
rebase: stop mentioning the -p option in comments
rebase: remove a no-longer-used function
sequencer: restrict scope of a formerly public function
I've looked this version over & followed all the discussions on the earlier rounds (this year), this looks good to me. Thanks a lot for working on it: