From: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Denton Liu <liu.denton@gmail.com>,
Junio C Hamano <gitster@pobox.com>, Taylor Blau <me@ttaylorr.com>,
Taylor Blau <ttaylorr@github.com>,
ZheNing Hu <adlternative@gmail.com>,
ZheNing Hu <adlternative@gmail.com>
Subject: [PATCH v2] [GSOC][RFC] format-patch: pass --left-only to range-diff
Date: Tue, 09 Mar 2021 08:33:50 +0000 [thread overview]
Message-ID: <pull.898.v2.git.1615278830804.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.898.git.1615100240295.gitgitgadget@gmail.com>
From: ZheNing Hu <adlternative@gmail.com>
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>
---
[GSOC][RFC] format-patch: pass --left-only to range-diff
With the help of Taylor Blau, I understood why the upstream commit
appeared in the range-diff, and completed the writing of the test.
this want to fix #876 Thanks.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-898%2Fadlternative%2Fformat-patch-range-diff-right-only-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-898/adlternative/format-patch-range-diff-right-only-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/898
Range-diff vs v1:
1: 590bd06ee5ee ! 1: 8daffd4f7546 [GSOC][RFC] format-patch: pass --right-only to range-diff
@@ Metadata
Author: ZheNing Hu <adlternative@gmail.com>
## Commit message ##
- [GSOC][RFC] format-patch: pass --right-only to range-diff
+ [GSOC][RFC] format-patch: pass --left-only to range-diff
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 `--right-only`
- to range-diff, maybe can avoid this kind of mistake.
-
- Because `git rebase --apply` will internally call `git
- format-patch -k --stdout --full-index --cherry-pick --right-only
- --src-prefix=a/ --dst-prefix=b/ --no-renames --no-cover-letter
- --pretty=mboxrd --topo-order --no-base`, In order to avoid the
- ambiguity of `--right-only`, users can call `format-patch
- --range-diff --only-right` instead of `--right-only` to only emit
- output related to the second range.
+ 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>
@@ Documentation/git-format-patch.txt: SYNOPSIS
[--no-notes | --notes[=<ref>]]
[--interdiff=<previous>]
- [--range-diff=<previous> [--creation-factor=<percent>]]
-+ [--range-diff=<previous> [--creation-factor=<percent>] [--right-only]]
++ [--range-diff=<previous> [--creation-factor=<percent>] [--left-only]]
[--filename-max-length=<n>]
[--progress]
[<common diff options>]
@@ Documentation/git-format-patch.txt: material (this may change in the future).
creation/deletion cost fudge factor. See linkgit:git-range-diff[1])
for details.
-+--only-right:
-+ Used with `--range-diff`, only emit output related to the second range.
++--left-only:
++ Used with `--range-diff`, only emit output related to the first range.
+
--notes[=<ref>]::
--no-notes::
@@ builtin/log.c: static void make_cover_letter(struct rev_info *rev, int use_separ
int nr, struct commit **list,
const char *branch_name,
- int quiet)
-+ int quiet, int right_only)
++ int quiet, int left_only)
{
const char *committer;
struct shortlog log;
@@ builtin/log.c: static void make_cover_letter(struct rev_info *rev, int use_separ
.diffopt = &opts,
- .other_arg = &other_arg
+ .other_arg = &other_arg,
-+ .right_only = right_only
++ .left_only = left_only
};
diff_setup(&opts);
@@ builtin/log.c: int cmd_format_patch(int argc, const char **argv, const char *pre
struct strbuf rdiff2 = STRBUF_INIT;
struct strbuf rdiff_title = STRBUF_INIT;
int creation_factor = -1;
--
-+ int right_only = 0;
++ int left_only = 0;
+
const struct option builtin_format_patch_options[] = {
OPT_CALLBACK_F('n', "numbered", &numbered, NULL,
- N_("use [PATCH n/m] even with a single patch"),
@@ builtin/log.c: 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, "only-right", &right_only,
-+ N_("only emit output related to the second range")),
++ 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()
@@ builtin/log.c: 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)
+- die(_("--creation-factor requires --range-diff"));
-
-+ if (right_only && !rdiff_prev)
-+ die(_("--right_only 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"));
@@ builtin/log.c: int cmd_format_patch(int argc, const char **argv, const char *pre
make_cover_letter(&rev, !!output_directory,
- origin, nr, list, branch_name, quiet);
+ origin, nr, list, branch_name, quiet,
-+ right_only);
++ left_only);
print_bases(&bases, rev.diffopt.file);
print_signature(rev.diffopt.file);
total++;
+
+ ## t/t3206-range-diff.sh ##
+@@ t/t3206-range-diff.sh: 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
Documentation/git-format-patch.txt | 5 ++++-
builtin/log.c | 20 ++++++++++++++------
t/t3206-range-diff.sh | 28 ++++++++++++++++++++++++++++
3 files changed, 46 insertions(+), 7 deletions(-)
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
base-commit: be7935ed8bff19f481b033d0d242c5d5f239ed50
--
gitgitgadget
next prev parent reply other threads:[~2021-03-09 8:34 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-07 6:57 [PATCH] [GSOC][RFC] format-patch: pass --right-only to range-diff ZheNing Hu via GitGitGadget
2021-03-08 20:18 ` Taylor Blau
2021-03-09 7:28 ` ZheNing Hu
2021-03-12 21:55 ` Junio C Hamano
2021-03-12 22:09 ` Junio C Hamano
2021-03-09 8:33 ` ZheNing Hu via GitGitGadget [this message]
2021-03-09 9:00 ` [PATCH v2] [GSOC][RFC] format-patch: pass --left-only " Eric Sunshine
2021-03-09 9:35 ` ZheNing Hu
2021-03-09 10:28 ` [PATCH v3] " ZheNing Hu via GitGitGadget
2021-03-12 22:50 ` Junio C Hamano
2021-03-13 4:01 ` ZheNing Hu
2021-03-13 23:23 ` Junio C Hamano
2021-03-14 2:16 ` ZheNing Hu
2021-03-14 2:37 ` ZheNing Hu
2021-03-14 2:41 ` ZheNing Hu
2021-03-14 8:10 ` [PATCH v4] [GSOC] " ZheNing Hu via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.898.v2.git.1615278830804.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=adlternative@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=liu.denton@gmail.com \
--cc=me@ttaylorr.com \
--cc=ttaylorr@github.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.