Message ID | pull.898.v2.git.1615278830804.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v2,GSOC,RFC] format-patch: pass --left-only to range-diff | expand |
On Tue, Mar 9, 2021 at 3:35 AM ZheNing Hu via GitGitGadget <gitgitgadget@gmail.com> wrote: > In https://lore.kernel.org/git/YBx5rmVsg1LJhSKN@nand.local/, > Taylor Blau proposing `git format-patch --cover-letter > --range-diff` may mistakenly place upstream commit in the > range-diff output. Teach `format-patch` pass `--left-only` > to range-diff,can avoid this kind of mistake. > > Signed-off-by: ZheNing Hu <adlternative@gmail.com> > --- > diff --git a/builtin/log.c b/builtin/log.c > @@ -2085,9 +2089,12 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) > if (creation_factor < 0) > creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT; > - else if (!rdiff_prev) > - die(_("--creation-factor requires --range-diff")); > - > + else if (!rdiff_prev) { > + if (creation_factor >= 0) > + die(_("--creation-factor requires --range-diff")); > + if (left_only) > + die(_("--left-only requires --range-diff")); > + } This logic starts getting difficult to reason about. It would be easier to understand if written like this: if (!rdiff_prev) { if (creation_factor >= 0) die(_("--creation-factor requires --range-diff")); if (left_only) die(_("--left-only requires --range-diff")); } if (creation_factor < 0) creation_factor = RANGE_DIFF_..._DEFAULT; or this (which reduces the indentation a bit): if (creation_factor >= 0 && !rdiff_prev) die(_("--creation-factor requires --range-diff")); if (left_only && !rdiff_prev) die(_("--left-only requires --range-diff")); if (creation_factor < 0) creation_factor = RANGE_DIFF_..._DEFAULT; Subjective; not necessarily worth a re-roll. > @@ -2134,7 +2141,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) > make_cover_letter(&rev, !!output_directory, > - origin, nr, list, branch_name, quiet); > + origin, nr, list, branch_name, quiet, > + left_only); Nit: This indentation looks odd. One would expect `origin` and `left_only` to have the same indentation. > diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh > @@ -748,4 +748,32 @@ test_expect_success '--left-only/--right-only' ' > +test_expect_success 'format-patch --range-diff --left-only' ' > + rm -fr repo && > + git init repo && > + ... > + ! grep "> 1: .* feature$" 0000-cover-letter.patch > +' > + > + > test_done Nit: One blank line before test_done() is typical, not two.
Eric Sunshine <sunshine@sunshineco.com> 于2021年3月9日周二 下午5:00写道: > > On Tue, Mar 9, 2021 at 3:35 AM ZheNing Hu via GitGitGadget > <gitgitgadget@gmail.com> wrote: > > In https://lore.kernel.org/git/YBx5rmVsg1LJhSKN@nand.local/, > > Taylor Blau proposing `git format-patch --cover-letter > > --range-diff` may mistakenly place upstream commit in the > > range-diff output. Teach `format-patch` pass `--left-only` > > to range-diff,can avoid this kind of mistake. > > > > Signed-off-by: ZheNing Hu <adlternative@gmail.com> > > --- > > diff --git a/builtin/log.c b/builtin/log.c > > @@ -2085,9 +2089,12 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) > > if (creation_factor < 0) > > creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT; > > - else if (!rdiff_prev) > > - die(_("--creation-factor requires --range-diff")); > > - > > + else if (!rdiff_prev) { > > + if (creation_factor >= 0) > > + die(_("--creation-factor requires --range-diff")); > > + if (left_only) > > + die(_("--left-only requires --range-diff")); > > + } > > This logic starts getting difficult to reason about. It would be > easier to understand if written like this: > > if (!rdiff_prev) { > if (creation_factor >= 0) > die(_("--creation-factor requires --range-diff")); > if (left_only) > die(_("--left-only requires --range-diff")); > } > > if (creation_factor < 0) > creation_factor = RANGE_DIFF_..._DEFAULT; > > or this (which reduces the indentation a bit): > > if (creation_factor >= 0 && !rdiff_prev) > die(_("--creation-factor requires --range-diff")); > if (left_only && !rdiff_prev) > die(_("--left-only requires --range-diff")); > > if (creation_factor < 0) > creation_factor = RANGE_DIFF_..._DEFAULT; > Emm,I would prefer to use the above. > Subjective; not necessarily worth a re-roll. > > > @@ -2134,7 +2141,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) > > make_cover_letter(&rev, !!output_directory, > > - origin, nr, list, branch_name, quiet); > > + origin, nr, list, branch_name, quiet, > > + left_only); > > Nit: This indentation looks odd. One would expect `origin` and > `left_only` to have the same indentation. > > > diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh > > @@ -748,4 +748,32 @@ test_expect_success '--left-only/--right-only' ' > > +test_expect_success 'format-patch --range-diff --left-only' ' > > + rm -fr repo && > > + git init repo && > > + ... > > + ! grep "> 1: .* feature$" 0000-cover-letter.patch > > +' > > + > > + > > test_done > > Nit: One blank line before test_done() is typical, not two. Thanks for the reminder. I'm going to modify these format errors.
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 3e49bf221087..8c5eca0ba1e3 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -27,7 +27,7 @@ SYNOPSIS [--[no-]encode-email-headers] [--no-notes | --notes[=<ref>]] [--interdiff=<previous>] - [--range-diff=<previous> [--creation-factor=<percent>]] + [--range-diff=<previous> [--creation-factor=<percent>] [--left-only]] [--filename-max-length=<n>] [--progress] [<common diff options>] @@ -301,6 +301,9 @@ material (this may change in the future). creation/deletion cost fudge factor. See linkgit:git-range-diff[1]) for details. +--left-only: + Used with `--range-diff`, only emit output related to the first range. + --notes[=<ref>]:: --no-notes:: Append the notes (see linkgit:git-notes[1]) for the commit diff --git a/builtin/log.c b/builtin/log.c index f67b67d80ed1..5620dfafb37e 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1153,7 +1153,7 @@ static void make_cover_letter(struct rev_info *rev, int use_separate_file, struct commit *origin, int nr, struct commit **list, const char *branch_name, - int quiet) + int quiet, int left_only) { const char *committer; struct shortlog log; @@ -1228,7 +1228,8 @@ static void make_cover_letter(struct rev_info *rev, int use_separate_file, .creation_factor = rev->creation_factor, .dual_color = 1, .diffopt = &opts, - .other_arg = &other_arg + .other_arg = &other_arg, + .left_only = left_only }; diff_setup(&opts); @@ -1732,6 +1733,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) struct strbuf rdiff2 = STRBUF_INIT; struct strbuf rdiff_title = STRBUF_INIT; int creation_factor = -1; + int left_only = 0; const struct option builtin_format_patch_options[] = { OPT_CALLBACK_F('n', "numbered", &numbered, NULL, @@ -1814,6 +1816,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) parse_opt_object_name), OPT_STRING(0, "range-diff", &rdiff_prev, N_("refspec"), N_("show changes against <refspec> in cover letter or single patch")), + OPT_BOOL(0, "left-only", &left_only, + N_("only emit output related to the first range")), OPT_INTEGER(0, "creation-factor", &creation_factor, N_("percentage by which creation is weighted")), OPT_END() @@ -2085,9 +2089,12 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (creation_factor < 0) creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT; - else if (!rdiff_prev) - die(_("--creation-factor requires --range-diff")); - + else if (!rdiff_prev) { + if (creation_factor >= 0) + die(_("--creation-factor requires --range-diff")); + if (left_only) + die(_("--left-only requires --range-diff")); + } if (rdiff_prev) { if (!cover_letter && total != 1) die(_("--range-diff requires --cover-letter or single patch")); @@ -2134,7 +2141,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (thread) gen_message_id(&rev, "cover"); make_cover_letter(&rev, !!output_directory, - origin, nr, list, branch_name, quiet); + origin, nr, list, branch_name, quiet, + left_only); print_bases(&bases, rev.diffopt.file); print_signature(rev.diffopt.file); total++; diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh index 1b26c4c2ef91..abb0cf7fb465 100755 --- a/t/t3206-range-diff.sh +++ b/t/t3206-range-diff.sh @@ -748,4 +748,32 @@ test_expect_success '--left-only/--right-only' ' test_cmp expect actual ' +test_expect_success 'format-patch --range-diff --left-only' ' + rm -fr repo && + git init repo && + cd repo && + git branch -M main && + echo "base" >base && + git add base && + git commit -m "base" && + git checkout -b my-feature && + echo "feature" >feature && + git add feature && + git commit -m "feature" && + base="$(git rev-parse main)" && + old="$(git rev-parse my-feature)" && + git checkout main && + echo "other" >>base && + git add base && + git commit -m "new" && + git checkout my-feature && + git rebase $base --onto main && + tip="$(git rev-parse my-feature)" && + git format-patch --range-diff $base $old $tip --cover-letter && + grep "> 1: .* feature$" 0000-cover-letter.patch && + git format-patch --range-diff $base $old $tip --left-only --cover-letter && + ! grep "> 1: .* feature$" 0000-cover-letter.patch +' + + test_done