Message ID | 20190806173638.17510-2-rohit.ashiwal265@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | rebase -i: support more options | expand |
Rohit Ashiwal <rohit.ashiwal265@gmail.com> writes: > diff --git a/builtin/rebase.c b/builtin/rebase.c > index db6ca9bd7d..3c195ddc73 100644 > --- a/builtin/rebase.c > +++ b/builtin/rebase.c > ... > @@ -511,6 +523,8 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) > argc = parse_options(argc, argv, NULL, options, > builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0); Curious. Did you rebase onto an older codebase? I think the round currently queued in my tree already has c0e78f7e46 which merged the jk/unused-params-final-batch topic that updated this call to parse_options() to pass prefix. Perhaps you want to fetch from me what has been on 'pu' (it should be "log master..10827432") and compare what you had? Unless there is no compelling reason not to, it would be a good idea to base the reroll on the same commit as the commit on which the previous version has been queued, which in this case is 9c9b961d ("The sixth batch", 2019-07-19). > diff --git a/t/t3433-rebase-options-compatibility.sh b/t/t3433-rebase-options-compatibility.sh > new file mode 100755 > index 0000000000..e617d3150e > --- /dev/null > +++ b/t/t3433-rebase-options-compatibility.sh > @@ -0,0 +1,65 @@ > ... > + > + git checkout --orphan master && > + cat >file <<-EOF && > + line 1 > + line 2 > + line 3 > + EOF The second line triggers "indent with spaces" whitespace error; you can protect these spaces in the leading indent like so: sed -e "s/^|//" <<-\EOF && |line 1 | line 2 |line 3 EOF Also make it a habit to always quote the EOF token that begins the here document (i.e. <<-\EOF) when the here document does not need variable interpolation. I suspect (but I did not read all of the tests) that there may be many other instances of here document in this patch that can use the same improvement. Thanks.
Hi Junio On Wed, Aug 7, 2019 at 11:08 AM Junio C Hamano <gitster@pobox.com> wrote: > > Rohit Ashiwal <rohit.ashiwal265@gmail.com> writes: > > > diff --git a/builtin/rebase.c b/builtin/rebase.c > > index db6ca9bd7d..3c195ddc73 100644 > > --- a/builtin/rebase.c > > +++ b/builtin/rebase.c > > ... > > @@ -511,6 +523,8 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) > > argc = parse_options(argc, argv, NULL, options, > > builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0); > > Curious. Did you rebase onto an older codebase? I think the round > currently queued in my tree already has c0e78f7e46 which merged the > jk/unused-params-final-batch topic that updated this call to > parse_options() to pass prefix. Perhaps you want to fetch from me > what has been on 'pu' (it should be "log master..10827432") and > compare what you had? Unless there is no compelling reason not to, > it would be a good idea to base the reroll on the same commit as > the commit on which the previous version has been queued, which in > this case is 9c9b961d ("The sixth batch", 2019-07-19). Oh~ I didn't notice it. I'll rebase and re send the patch. Thanks for pointing out. > > diff --git a/t/t3433-rebase-options-compatibility.sh b/t/t3433-rebase-options-compatibility.sh > > new file mode 100755 > > index 0000000000..e617d3150e > > --- /dev/null > > +++ b/t/t3433-rebase-options-compatibility.sh > > @@ -0,0 +1,65 @@ > > ... > > + > > + git checkout --orphan master && > > + cat >file <<-EOF && > > + line 1 > > + line 2 > > + line 3 > > + EOF > > The second line triggers "indent with spaces" whitespace error; you > can protect these spaces in the leading indent like so: > > sed -e "s/^|//" <<-\EOF && > |line 1 > | line 2 > |line 3 > EOF > > Also make it a habit to always quote the EOF token that begins the > here document (i.e. <<-\EOF) when the here document does not need > variable interpolation. I suspect (but I did not read all of the > tests) that there may be many other instances of here document in > this patch that can use the same improvement. Will keep this in mind. Thanks Rohit
Hi Rohit On 06/08/2019 18:36, Rohit Ashiwal wrote: > There are two backends available for rebasing, viz, the am and the > interactive. Naturally, there shall be some features that are > implemented in one but not in the other. One such flag is > --ignore-whitespace which indicates merge mechanism to treat lines > with only whitespace changes as unchanged. Wire the interactive > rebase to also understand the --ignore-whitespace flag by > translating it to -Xignore-space-change. > > Signed-off-by: Rohit Ashiwal <rohit.ashiwal265@gmail.com> > --- > Documentation/git-rebase.txt | 10 +++- > builtin/rebase.c | 26 ++++++++-- > t/t3422-rebase-incompatible-options.sh | 1 - > t/t3433-rebase-options-compatibility.sh | 65 +++++++++++++++++++++++++ > 4 files changed, 95 insertions(+), 7 deletions(-) > create mode 100755 t/t3433-rebase-options-compatibility.sh > > diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt > index 5e4e927647..85404fea52 100644 > --- a/Documentation/git-rebase.txt > +++ b/Documentation/git-rebase.txt > @@ -371,8 +371,13 @@ If either <upstream> or --root is given on the command line, then the > default is `--no-fork-point`, otherwise the default is `--fork-point`. > > --ignore-whitespace:: > + This flag is either passed to the 'git apply' program > + (see linkgit:git-apply[1]), or to 'git merge' program > + (see linkgit:git-merge[1]) as `-Xignore-space-change`, > + depending on which backend is selected by other options. I think it would be better to document the effect of this option rather than the implementation detail. It is confusing at the moment as it talks about 'git merge' but we don't allow this option with merges. > + > --whitespace=<option>:: > - These flag are passed to the 'git apply' program > + This flag is passed to the 'git apply' program > (see linkgit:git-apply[1]) that applies the patch. > + > See also INCOMPATIBLE OPTIONS below. > @@ -520,7 +525,6 @@ The following options: > * --committer-date-is-author-date > * --ignore-date > * --whitespace > - * --ignore-whitespace > * -C > > are incompatible with the following options: > @@ -543,6 +547,8 @@ 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 --ignore-whitespace > + * --rebase-merges and --ignore-whitespace > * --rebase-merges and --strategy > * --rebase-merges and --strategy-option > > diff --git a/builtin/rebase.c b/builtin/rebase.c > index db6ca9bd7d..3c195ddc73 100644 > --- a/builtin/rebase.c > +++ b/builtin/rebase.c > @@ -79,6 +79,7 @@ struct rebase_options { > int allow_rerere_autoupdate; > int keep_empty; > int autosquash; > + int ignore_whitespace; > char *gpg_sign_opt; > int autostash; > char *cmd; > @@ -97,7 +98,7 @@ struct rebase_options { > .git_format_patch_opt = STRBUF_INIT \ > } > > -static struct replay_opts get_replay_opts(const struct rebase_options *opts) > +static struct replay_opts get_replay_opts(struct rebase_options *opts) > { > struct replay_opts replay = REPLAY_OPTS_INIT; > > @@ -114,6 +115,17 @@ static struct replay_opts get_replay_opts(const struct rebase_options *opts) It's a shame this changes the rebase_options that are passed in, this function should ideally not modify what is passed in. > replay.reschedule_failed_exec = opts->reschedule_failed_exec; > replay.gpg_sign = xstrdup_or_null(opts->gpg_sign_opt); > replay.strategy = opts->strategy; > + > + if (opts->ignore_whitespace) { > + struct strbuf buf = STRBUF_INIT; > + > + if (opts->strategy_opts) > + strbuf_addstr(&buf, opts->strategy_opts); > + > + strbuf_addstr(&buf, " --ignore-space-change"); > + free(opts->strategy_opts); > + opts->strategy_opts = strbuf_detach(&buf, NULL); > + } Instead of modifying opts->strategy_opts perhaps we could just use a temporary variable Best Wishes Phillip > if (opts->strategy_opts) > parse_strategy_opts(&replay, opts->strategy_opts); > > @@ -511,6 +523,8 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) > argc = parse_options(argc, argv, NULL, options, > builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0); > > + opts.strategy_opts = xstrdup_or_null(opts.strategy_opts); > + > if (!is_null_oid(&squash_onto)) > opts.squash_onto = &squash_onto; > > @@ -954,6 +968,8 @@ static int run_am(struct rebase_options *opts) > am.git_cmd = 1; > argv_array_push(&am.args, "am"); > > + if (opts->ignore_whitespace) > + argv_array_push(&am.args, "--ignore-whitespace"); > if (opts->action && !strcmp("continue", opts->action)) { > argv_array_push(&am.args, "--resolved"); > argv_array_pushf(&am.args, "--resolvemsg=%s", resolvemsg); > @@ -1401,9 +1417,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) > PARSE_OPT_NOARG, NULL, REBASE_DIFFSTAT }, > OPT_BOOL(0, "signoff", &options.signoff, > N_("add a Signed-off-by: line to each commit")), > - OPT_PASSTHRU_ARGV(0, "ignore-whitespace", &options.git_am_opts, > - NULL, N_("passed to 'git am'"), > - PARSE_OPT_NOARG), > OPT_PASSTHRU_ARGV(0, "committer-date-is-author-date", > &options.git_am_opts, NULL, > N_("passed to 'git am'"), PARSE_OPT_NOARG), > @@ -1411,6 +1424,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) > N_("passed to 'git am'"), PARSE_OPT_NOARG), > OPT_PASSTHRU_ARGV('C', NULL, &options.git_am_opts, N_("n"), > N_("passed to 'git apply'"), 0), > + OPT_BOOL(0, "ignore-whitespace", &options.ignore_whitespace, > + N_("ignore changes in whitespace")), > OPT_PASSTHRU_ARGV(0, "whitespace", &options.git_am_opts, > N_("action"), N_("passed to 'git apply'"), 0), > OPT_BIT('f', "force-rebase", &options.flags, > @@ -1821,6 +1836,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) > } > > if (options.rebase_merges) { > + if (options.ignore_whitespace) > + die(_("cannot combine '--rebase-merges' with " > + "'--ignore-whitespace'")); > if (strategy_options.nr) > die(_("cannot combine '--rebase-merges' with " > "'--strategy-option'")); > diff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh > index a5868ea152..4342f79eea 100755 > --- a/t/t3422-rebase-incompatible-options.sh > +++ b/t/t3422-rebase-incompatible-options.sh > @@ -61,7 +61,6 @@ test_rebase_am_only () { > } > > test_rebase_am_only --whitespace=fix > -test_rebase_am_only --ignore-whitespace > test_rebase_am_only --committer-date-is-author-date > test_rebase_am_only -C4 > > diff --git a/t/t3433-rebase-options-compatibility.sh b/t/t3433-rebase-options-compatibility.sh > new file mode 100755 > index 0000000000..e617d3150e > --- /dev/null > +++ b/t/t3433-rebase-options-compatibility.sh > @@ -0,0 +1,65 @@ > +#!/bin/sh > +# > +# Copyright (c) 2019 Rohit Ashiwal > +# > + > +test_description='tests to ensure compatibility between am and interactive backends' > + > +. ./test-lib.sh > + > +# This is a special case in which both am and interactive backends > +# provide the same output. It was done intentionally because > +# both the backends fall short of optimal behaviour. > +test_expect_success 'setup' ' > + git checkout -b topic && > + q_to_tab >file <<-EOF && > + line 1 > + Qline 2 > + line 3 > + EOF > + git add file && > + git commit -m "add file" && > + cat >file <<-EOF && > + line 1 > + new line 2 > + line 3 > + EOF > + git commit -am "update file" && > + git tag side && > + > + git checkout --orphan master && > + cat >file <<-EOF && > + line 1 > + line 2 > + line 3 > + EOF > + git add file && > + git commit -m "add file" && > + git tag main > +' > + > +test_expect_success '--ignore-whitespace works with am backend' ' > + cat >expect <<-EOF && > + line 1 > + new line 2 > + line 3 > + EOF > + test_must_fail git rebase main side && > + git rebase --abort && > + git rebase --ignore-whitespace main side && > + test_cmp expect file > +' > + > +test_expect_success '--ignore-whitespace works with interactive backend' ' > + cat >expect <<-EOF && > + line 1 > + new line 2 > + line 3 > + EOF > + test_must_fail git rebase --merge main side && > + git rebase --abort && > + git rebase --merge --ignore-whitespace main side && > + test_cmp expect file > +' > + > +test_done >
Hi Phillip On Thu, 8 Aug 2019 17:44:38 +0100 Phillip Wood <phillip.wood123@gmail.com> wrote: > > [...] > > --ignore-whitespace:: > > + This flag is either passed to the 'git apply' program > > + (see linkgit:git-apply[1]), or to 'git merge' program > > + (see linkgit:git-merge[1]) as `-Xignore-space-change`, > > + depending on which backend is selected by other options. > > I think it would be better to document the effect of this option rather > than the implementation detail. It is confusing at the moment as it > talks about 'git merge' but we don't allow this option with merges. Oh, it is just to indicate the user where to look for the definitions as currently the behaviour of both the backends is not exactly the same neither do they work optimally. Hope in future when they are in harmony, then we can happily change it to match the then behaviour. > [...] Thanks Rohit
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 5e4e927647..85404fea52 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -371,8 +371,13 @@ If either <upstream> or --root is given on the command line, then the default is `--no-fork-point`, otherwise the default is `--fork-point`. --ignore-whitespace:: + This flag is either passed to the 'git apply' program + (see linkgit:git-apply[1]), or to 'git merge' program + (see linkgit:git-merge[1]) as `-Xignore-space-change`, + depending on which backend is selected by other options. + --whitespace=<option>:: - These flag are passed to the 'git apply' program + This flag is passed to the 'git apply' program (see linkgit:git-apply[1]) that applies the patch. + See also INCOMPATIBLE OPTIONS below. @@ -520,7 +525,6 @@ The following options: * --committer-date-is-author-date * --ignore-date * --whitespace - * --ignore-whitespace * -C are incompatible with the following options: @@ -543,6 +547,8 @@ 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 --ignore-whitespace + * --rebase-merges and --ignore-whitespace * --rebase-merges and --strategy * --rebase-merges and --strategy-option diff --git a/builtin/rebase.c b/builtin/rebase.c index db6ca9bd7d..3c195ddc73 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -79,6 +79,7 @@ struct rebase_options { int allow_rerere_autoupdate; int keep_empty; int autosquash; + int ignore_whitespace; char *gpg_sign_opt; int autostash; char *cmd; @@ -97,7 +98,7 @@ struct rebase_options { .git_format_patch_opt = STRBUF_INIT \ } -static struct replay_opts get_replay_opts(const struct rebase_options *opts) +static struct replay_opts get_replay_opts(struct rebase_options *opts) { struct replay_opts replay = REPLAY_OPTS_INIT; @@ -114,6 +115,17 @@ static struct replay_opts get_replay_opts(const struct rebase_options *opts) replay.reschedule_failed_exec = opts->reschedule_failed_exec; replay.gpg_sign = xstrdup_or_null(opts->gpg_sign_opt); replay.strategy = opts->strategy; + + if (opts->ignore_whitespace) { + struct strbuf buf = STRBUF_INIT; + + if (opts->strategy_opts) + strbuf_addstr(&buf, opts->strategy_opts); + + strbuf_addstr(&buf, " --ignore-space-change"); + free(opts->strategy_opts); + opts->strategy_opts = strbuf_detach(&buf, NULL); + } if (opts->strategy_opts) parse_strategy_opts(&replay, opts->strategy_opts); @@ -511,6 +523,8 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, NULL, options, builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0); + opts.strategy_opts = xstrdup_or_null(opts.strategy_opts); + if (!is_null_oid(&squash_onto)) opts.squash_onto = &squash_onto; @@ -954,6 +968,8 @@ static int run_am(struct rebase_options *opts) am.git_cmd = 1; argv_array_push(&am.args, "am"); + if (opts->ignore_whitespace) + argv_array_push(&am.args, "--ignore-whitespace"); if (opts->action && !strcmp("continue", opts->action)) { argv_array_push(&am.args, "--resolved"); argv_array_pushf(&am.args, "--resolvemsg=%s", resolvemsg); @@ -1401,9 +1417,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) PARSE_OPT_NOARG, NULL, REBASE_DIFFSTAT }, OPT_BOOL(0, "signoff", &options.signoff, N_("add a Signed-off-by: line to each commit")), - OPT_PASSTHRU_ARGV(0, "ignore-whitespace", &options.git_am_opts, - NULL, N_("passed to 'git am'"), - PARSE_OPT_NOARG), OPT_PASSTHRU_ARGV(0, "committer-date-is-author-date", &options.git_am_opts, NULL, N_("passed to 'git am'"), PARSE_OPT_NOARG), @@ -1411,6 +1424,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) N_("passed to 'git am'"), PARSE_OPT_NOARG), OPT_PASSTHRU_ARGV('C', NULL, &options.git_am_opts, N_("n"), N_("passed to 'git apply'"), 0), + OPT_BOOL(0, "ignore-whitespace", &options.ignore_whitespace, + N_("ignore changes in whitespace")), OPT_PASSTHRU_ARGV(0, "whitespace", &options.git_am_opts, N_("action"), N_("passed to 'git apply'"), 0), OPT_BIT('f', "force-rebase", &options.flags, @@ -1821,6 +1836,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) } if (options.rebase_merges) { + if (options.ignore_whitespace) + die(_("cannot combine '--rebase-merges' with " + "'--ignore-whitespace'")); if (strategy_options.nr) die(_("cannot combine '--rebase-merges' with " "'--strategy-option'")); diff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh index a5868ea152..4342f79eea 100755 --- a/t/t3422-rebase-incompatible-options.sh +++ b/t/t3422-rebase-incompatible-options.sh @@ -61,7 +61,6 @@ test_rebase_am_only () { } test_rebase_am_only --whitespace=fix -test_rebase_am_only --ignore-whitespace test_rebase_am_only --committer-date-is-author-date test_rebase_am_only -C4 diff --git a/t/t3433-rebase-options-compatibility.sh b/t/t3433-rebase-options-compatibility.sh new file mode 100755 index 0000000000..e617d3150e --- /dev/null +++ b/t/t3433-rebase-options-compatibility.sh @@ -0,0 +1,65 @@ +#!/bin/sh +# +# Copyright (c) 2019 Rohit Ashiwal +# + +test_description='tests to ensure compatibility between am and interactive backends' + +. ./test-lib.sh + +# This is a special case in which both am and interactive backends +# provide the same output. It was done intentionally because +# both the backends fall short of optimal behaviour. +test_expect_success 'setup' ' + git checkout -b topic && + q_to_tab >file <<-EOF && + line 1 + Qline 2 + line 3 + EOF + git add file && + git commit -m "add file" && + cat >file <<-EOF && + line 1 + new line 2 + line 3 + EOF + git commit -am "update file" && + git tag side && + + git checkout --orphan master && + cat >file <<-EOF && + line 1 + line 2 + line 3 + EOF + git add file && + git commit -m "add file" && + git tag main +' + +test_expect_success '--ignore-whitespace works with am backend' ' + cat >expect <<-EOF && + line 1 + new line 2 + line 3 + EOF + test_must_fail git rebase main side && + git rebase --abort && + git rebase --ignore-whitespace main side && + test_cmp expect file +' + +test_expect_success '--ignore-whitespace works with interactive backend' ' + cat >expect <<-EOF && + line 1 + new line 2 + line 3 + EOF + test_must_fail git rebase --merge main side && + git rebase --abort && + git rebase --merge --ignore-whitespace main side && + test_cmp expect file +' + +test_done
There are two backends available for rebasing, viz, the am and the interactive. Naturally, there shall be some features that are implemented in one but not in the other. One such flag is --ignore-whitespace which indicates merge mechanism to treat lines with only whitespace changes as unchanged. Wire the interactive rebase to also understand the --ignore-whitespace flag by translating it to -Xignore-space-change. Signed-off-by: Rohit Ashiwal <rohit.ashiwal265@gmail.com> --- Documentation/git-rebase.txt | 10 +++- builtin/rebase.c | 26 ++++++++-- t/t3422-rebase-incompatible-options.sh | 1 - t/t3433-rebase-options-compatibility.sh | 65 +++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 7 deletions(-) create mode 100755 t/t3433-rebase-options-compatibility.sh