From: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Denton Liu" <liu.denton@gmail.com>,
"Eric Sunshine" <sunshine@sunshineco.com>,
"Đoàn Trần Công Danh" <congdanhqx@gmail.com>,
"ZheNing Hu" <adlternative@gmail.com>,
"ZheNing Hu" <adlternative@gmail.com>
Subject: [PATCH v9] format-patch: allow a non-integral version numbers
Date: Sun, 21 Mar 2021 09:00:25 +0000 [thread overview]
Message-ID: <pull.885.v9.git.1616317225769.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.885.v8.git.1616252178414.gitgitgadget@gmail.com>
From: ZheNing Hu <adlternative@gmail.com>
The `-v<n>` option of `format-patch` can give nothing but an
integral iteration number to patches in a series. Some people,
however, prefer to mark a new iteration with only a small fixup
with a non integral iteration number (e.g. an "oops, that was
wrong" fix-up patch for v4 iteration may be labeled as "v4.1").
Allow `format-patch` to take such a non-integral iteration
number.
`<n>` can be any string, such as '3.1' or '4rev2'. In the case
where it is a non-integral value, the "Range-diff" and "Interdiff"
headers will not include the previous version.
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
[GSOC] format-patch: allow a non-integral version numbers
this want to fix #882 Thanks.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-885%2Fadlternative%2Fformat_patch_non_intergral-v9
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-885/adlternative/format_patch_non_intergral-v9
Pull-Request: https://github.com/gitgitgadget/git/pull/885
Range-diff vs v8:
1: 89458d384fd0 ! 1: 97eaae4a8d9e format-patch: allow a non-integral version numbers
@@ Metadata
## Commit message ##
format-patch: allow a non-integral version numbers
- Usually we can only use `format-patch -v<n>` to generate integral
- version numbers patches, but sometimes a small fixup should be
- labeled as a non-integral version like `v1.1`, so teach `format-patch`
- to allow a non-integral version which may be helpful to send those
- patches.
+ The `-v<n>` option of `format-patch` can give nothing but an
+ integral iteration number to patches in a series. Some people,
+ however, prefer to mark a new iteration with only a small fixup
+ with a non integral iteration number (e.g. an "oops, that was
+ wrong" fix-up patch for v4 iteration may be labeled as "v4.1").
+
+ Allow `format-patch` to take such a non-integral iteration
+ number.
`<n>` can be any string, such as '3.1' or '4rev2'. In the case
where it is a non-integral value, the "Range-diff" and "Interdiff"
@@ Documentation/git-format-patch.txt: populated with placeholder text.
`--subject-prefix` option) has ` v<n>` appended to it. E.g.
`--reroll-count=4` may produce `v4-0001-add-makefile.patch`
file that has "Subject: [PATCH v4 1/20] Add makefile" in it.
-+ `<n>` may be a non-integer number. E.g. `--reroll-count=4.4`
-+ may produce `v4.4-0001-add-makefile.patch` file that has
-+ "Subject: [PATCH v4.4 1/20] Add makefile" in it.
-+ `--reroll-count=4rev2` may produce `v4rev2-0001-add-makefile.patch`
-+ file that has "Subject: [PATCH v4rev2 1/20] Add makefile" in it.
++ `<n>` does not have to be an integer (e.g. "--reroll-count=4.4",
++ or "--reroll-count=4rev2" are allowed), but the downside of
++ using such a reroll-count is that the range-diff/interdiff
++ with the previous version does not state exactly which
++ version the new interation is compared against.
--to=<email>::
Add a `To:` header to the email headers. This is in addition
@@ builtin/log.c: int cmd_format_patch(int argc, const char **argv, const char *pre
## log-tree.c ##
@@ log-tree.c: void fmt_output_subject(struct strbuf *filename,
+ int nr = info->nr;
int start_len = filename->len;
int max_len = start_len + info->patch_name_max - (strlen(suffix) + 1);
++ struct strbuf temp = STRBUF_INIT;
- if (0 < info->reroll_count)
- strbuf_addf(filename, "v%d-", info->reroll_count);
-+ if (info->reroll_count)
-+ strbuf_addf(filename, "v%s-", info->reroll_count);
++ if (info->reroll_count) {
++ strbuf_addf(&temp, "v%s", info->reroll_count);
++ format_sanitized_subject(filename, temp.buf, temp.len);
++ strbuf_addstr(filename, "-");
++ strbuf_release(&temp);
++ }
strbuf_addf(filename, "%04d-%s", nr, subject);
if (max_len < filename->len)
@@ t/t4014-format-patch.sh: test_expect_success 'reroll count (-v)' '
+
+test_expect_success 'reroll (-v) count with a non number' '
+ rm -fr patches &&
-+ git format-patch -o patches --cover-letter --reroll-count 4rev2 main..side >list &&
++ git format-patch -o patches --cover-letter -v4rev2 main..side >list &&
+ ! grep -v "^patches/v4rev2-000[0-3]-" list &&
+ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
+ ! grep -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects
+'
++
++test_expect_success 'reroll (-v) count with a "injection (1)"' '
++ rm -fr patches &&
++ git format-patch -o patches --cover-letter -v4..././../1/.2// main..side >list &&
++ ! grep -v "^patches/v4.-.-.-1-.2-000[0-3]-" list &&
++ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
++ ! grep -v "^Subject: \[PATCH v4..././../1/.2// [0-3]/3\] " subjects
++'
++
++test_expect_success 'reroll (-v) count with a "injection (2)"' '
++ rm -fr patches &&
++ git format-patch -o patches --cover-letter -v4-----//1//--.-- main..side >list &&
++ ! grep -v "^patches/v4-1-000[0-3]-" list &&
++ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
++ ! grep -v "^Subject: \[PATCH v4-----//1//--.-- [0-3]/3\] " subjects
++'
+
check_threading () {
expect="$1" &&
Documentation/git-format-patch.txt | 5 +++
builtin/log.c | 25 ++++++++-----
log-tree.c | 9 +++--
revision.h | 2 +-
t/t3206-range-diff.sh | 23 ++++++++++++
t/t4014-format-patch.sh | 58 ++++++++++++++++++++++++++++++
6 files changed, 110 insertions(+), 12 deletions(-)
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index 3e49bf221087..741c9f8b2b88 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -221,6 +221,11 @@ populated with placeholder text.
`--subject-prefix` option) has ` v<n>` appended to it. E.g.
`--reroll-count=4` may produce `v4-0001-add-makefile.patch`
file that has "Subject: [PATCH v4 1/20] Add makefile" in it.
+ `<n>` does not have to be an integer (e.g. "--reroll-count=4.4",
+ or "--reroll-count=4rev2" are allowed), but the downside of
+ using such a reroll-count is that the range-diff/interdiff
+ with the previous version does not state exactly which
+ version the new interation is compared against.
--to=<email>::
Add a `To:` header to the email headers. This is in addition
diff --git a/builtin/log.c b/builtin/log.c
index f67b67d80ed1..af853f111464 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -1662,13 +1662,19 @@ static void print_bases(struct base_tree_info *bases, FILE *file)
oidclr(&bases->base_commit);
}
-static const char *diff_title(struct strbuf *sb, int reroll_count,
- const char *generic, const char *rerolled)
+static const char *diff_title(struct strbuf *sb,
+ const char *reroll_count,
+ const char *generic,
+ const char *rerolled)
{
- if (reroll_count <= 0)
+ int v;
+
+ /* RFC may be v0, so allow -v1 to diff against v0 */
+ if (reroll_count && !strtol_i(reroll_count, 10, &v) &&
+ v >= 1)
+ strbuf_addf(sb, rerolled, v - 1);
+ else
strbuf_addstr(sb, generic);
- else /* RFC may be v0, so allow -v1 to diff against v0 */
- strbuf_addf(sb, rerolled, reroll_count - 1);
return sb->buf;
}
@@ -1717,7 +1723,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
struct strbuf buf = STRBUF_INIT;
int use_patch_format = 0;
int quiet = 0;
- int reroll_count = -1;
+ const char *reroll_count = NULL;
char *cover_from_description_arg = NULL;
char *branch_name = NULL;
char *base_commit = NULL;
@@ -1751,7 +1757,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
N_("use <sfx> instead of '.patch'")),
OPT_INTEGER(0, "start-number", &start_number,
N_("start numbering patches at <n> instead of 1")),
- OPT_INTEGER('v', "reroll-count", &reroll_count,
+ OPT_STRING('v', "reroll-count", &reroll_count, N_("reroll-count"),
N_("mark the series as Nth re-roll")),
OPT_INTEGER(0, "filename-max-length", &fmt_patch_name_max,
N_("max length of output filename")),
@@ -1862,9 +1868,10 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
if (cover_from_description_arg)
cover_from_description_mode = parse_cover_from_description(cover_from_description_arg);
- if (0 < reroll_count) {
+ if (reroll_count) {
struct strbuf sprefix = STRBUF_INIT;
- strbuf_addf(&sprefix, "%s v%d",
+
+ strbuf_addf(&sprefix, "%s v%s",
rev.subject_prefix, reroll_count);
rev.reroll_count = reroll_count;
rev.subject_prefix = strbuf_detach(&sprefix, NULL);
diff --git a/log-tree.c b/log-tree.c
index 4531cebfab38..ebdeb29f92a2 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -368,9 +368,14 @@ void fmt_output_subject(struct strbuf *filename,
int nr = info->nr;
int start_len = filename->len;
int max_len = start_len + info->patch_name_max - (strlen(suffix) + 1);
+ struct strbuf temp = STRBUF_INIT;
- if (0 < info->reroll_count)
- strbuf_addf(filename, "v%d-", info->reroll_count);
+ if (info->reroll_count) {
+ strbuf_addf(&temp, "v%s", info->reroll_count);
+ format_sanitized_subject(filename, temp.buf, temp.len);
+ strbuf_addstr(filename, "-");
+ strbuf_release(&temp);
+ }
strbuf_addf(filename, "%04d-%s", nr, subject);
if (max_len < filename->len)
diff --git a/revision.h b/revision.h
index e6be3c845e66..097d08354c61 100644
--- a/revision.h
+++ b/revision.h
@@ -235,7 +235,7 @@ struct rev_info {
const char *mime_boundary;
const char *patch_suffix;
int numbered_files;
- int reroll_count;
+ const char *reroll_count;
char *message_id;
struct ident_split from_ident;
struct string_list *ref_message_ids;
diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh
index 1b26c4c2ef91..a501949575fa 100755
--- a/t/t3206-range-diff.sh
+++ b/t/t3206-range-diff.sh
@@ -521,6 +521,29 @@ test_expect_success 'format-patch --range-diff as commentary' '
grep "> 1: .* new message" 0001-*
'
+test_expect_success 'format-patch --range-diff reroll-count with a non-integer' '
+ git format-patch --range-diff=HEAD~1 -v2.9 HEAD~1 >actual &&
+ test_when_finished "rm v2.9-0001-*" &&
+ test_line_count = 1 actual &&
+ test_i18ngrep "^Range-diff:$" v2.9-0001-* &&
+ grep "> 1: .* new message" v2.9-0001-*
+'
+
+test_expect_success 'format-patch --range-diff reroll-count with a integer' '
+ git format-patch --range-diff=HEAD~1 -v2 HEAD~1 >actual &&
+ test_when_finished "rm v2-0001-*" &&
+ test_line_count = 1 actual &&
+ test_i18ngrep "^Range-diff ..* v1:$" v2-0001-* &&
+ grep "> 1: .* new message" v2-0001-*
+'
+
+test_expect_success 'format-patch --range-diff with v0' '
+ git format-patch --range-diff=HEAD~1 -v0 HEAD~1 >actual &&
+ test_when_finished "rm v0-0001-*" &&
+ test_line_count = 1 actual &&
+ test_i18ngrep "^Range-diff:$" v0-0001-* &&
+ grep "> 1: .* new message" v0-0001-*
+'
test_expect_success 'range-diff overrides diff.noprefix internally' '
git -c diff.noprefix=true range-diff HEAD^...
'
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 66630c8413d5..d59a06248dbd 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -378,6 +378,22 @@ test_expect_success 'reroll count' '
! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects
'
+test_expect_success 'reroll count with a fractional number' '
+ rm -fr patches &&
+ git format-patch -o patches --cover-letter --reroll-count 4.4 main..side >list &&
+ ! grep -v "^patches/v4.4-000[0-3]-" list &&
+ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
+ ! grep -v "^Subject: \[PATCH v4.4 [0-3]/3\] " subjects
+'
+
+test_expect_success 'reroll count with a non number' '
+ rm -fr patches &&
+ git format-patch -o patches --cover-letter --reroll-count 4rev2 main..side >list &&
+ ! grep -v "^patches/v4rev2-000[0-3]-" list &&
+ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
+ ! grep -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects
+'
+
test_expect_success 'reroll count (-v)' '
rm -fr patches &&
git format-patch -o patches --cover-letter -v4 main..side >list &&
@@ -386,6 +402,38 @@ test_expect_success 'reroll count (-v)' '
! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects
'
+test_expect_success 'reroll count (-v) with a fractional number' '
+ rm -fr patches &&
+ git format-patch -o patches --cover-letter -v4.4 main..side >list &&
+ ! grep -v "^patches/v4.4-000[0-3]-" list &&
+ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
+ ! grep -v "^Subject: \[PATCH v4.4 [0-3]/3\] " subjects
+'
+
+test_expect_success 'reroll (-v) count with a non number' '
+ rm -fr patches &&
+ git format-patch -o patches --cover-letter -v4rev2 main..side >list &&
+ ! grep -v "^patches/v4rev2-000[0-3]-" list &&
+ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
+ ! grep -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects
+'
+
+test_expect_success 'reroll (-v) count with a "injection (1)"' '
+ rm -fr patches &&
+ git format-patch -o patches --cover-letter -v4..././../1/.2// main..side >list &&
+ ! grep -v "^patches/v4.-.-.-1-.2-000[0-3]-" list &&
+ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
+ ! grep -v "^Subject: \[PATCH v4..././../1/.2// [0-3]/3\] " subjects
+'
+
+test_expect_success 'reroll (-v) count with a "injection (2)"' '
+ rm -fr patches &&
+ git format-patch -o patches --cover-letter -v4-----//1//--.-- main..side >list &&
+ ! grep -v "^patches/v4-1-000[0-3]-" list &&
+ sed -n -e "/^Subject: /p" $(cat list) >subjects &&
+ ! grep -v "^Subject: \[PATCH v4-----//1//--.-- [0-3]/3\] " subjects
+'
+
check_threading () {
expect="$1" &&
shift &&
@@ -2255,6 +2303,16 @@ test_expect_success 'interdiff: reroll-count' '
test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
'
+test_expect_success 'interdiff: reroll-count with a non-integer' '
+ git format-patch --cover-letter --interdiff=boop~2 -v2.2 -1 boop &&
+ test_i18ngrep "^Interdiff:$" v2.2-0000-cover-letter.patch
+'
+
+test_expect_success 'interdiff: reroll-count with a integer' '
+ git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop &&
+ test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
+'
+
test_expect_success 'interdiff: solo-patch' '
cat >expect <<-\EOF &&
+fleep
base-commit: 966e671106b2fd38301e7c344c754fd118d0bb07
--
gitgitgadget
next prev parent reply other threads:[~2021-03-21 9:01 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-25 16:15 [PATCH] format-patch: allow a non-integral version numbers ZheNing Hu via GitGitGadget
2021-02-25 17:56 ` Eric Sunshine
2021-02-27 7:00 ` ZheNing Hu
2021-02-25 18:13 ` Junio C Hamano
2021-02-27 7:30 ` ZheNing Hu
2021-03-17 11:46 ` Đoàn Trần Công Danh
2021-03-17 19:17 ` Junio C Hamano
2021-03-01 8:40 ` [PATCH v2] " ZheNing Hu via GitGitGadget
2021-03-03 3:44 ` Junio C Hamano
2021-03-03 9:02 ` Denton Liu
2021-03-04 0:54 ` Junio C Hamano
2021-03-04 2:08 ` ZheNing Hu
2021-03-04 3:27 ` Eric Sunshine
2021-03-04 8:41 ` Denton Liu
2021-03-04 12:12 ` [PATCH v3] " ZheNing Hu via GitGitGadget
2021-03-04 12:49 ` Denton Liu
2021-03-05 4:56 ` ZheNing Hu
2021-03-05 7:10 ` [PATCH v4] " ZheNing Hu via GitGitGadget
2021-03-15 23:41 ` Eric Sunshine
2021-03-16 5:48 ` ZheNing Hu
2021-03-16 6:15 ` Eric Sunshine
2021-03-17 17:27 ` Junio C Hamano
2021-03-16 8:25 ` [PATCH v5] " ZheNing Hu via GitGitGadget
2021-03-16 23:36 ` Eric Sunshine
2021-03-17 2:05 ` ZheNing Hu
2021-03-18 6:00 ` [PATCH v6] " ZheNing Hu via GitGitGadget
2021-03-19 6:00 ` Eric Sunshine
2021-03-19 7:25 ` ZheNing Hu
2021-03-19 11:21 ` [PATCH v7] " ZheNing Hu via GitGitGadget
2021-03-19 16:01 ` Junio C Hamano
2021-03-20 3:08 ` ZheNing Hu
2021-03-19 17:28 ` Junio C Hamano
2021-03-20 3:04 ` ZheNing Hu
2021-03-20 14:56 ` [PATCH v8] " ZheNing Hu via GitGitGadget
2021-03-20 19:55 ` Junio C Hamano
2021-03-21 2:45 ` ZheNing Hu
2021-03-21 4:05 ` Eric Sunshine
2021-03-21 5:45 ` Junio C Hamano
2021-03-21 5:54 ` Eric Sunshine
2021-03-24 8:46 ` Denton Liu
2021-03-21 7:22 ` ZheNing Hu
2021-03-21 9:00 ` ZheNing Hu via GitGitGadget [this message]
2021-03-23 5:31 ` [PATCH v9] " Eric Sunshine
2021-03-23 6:42 ` Junio C Hamano
2021-03-23 8:53 ` ZheNing Hu
2021-03-23 9:16 ` ZheNing Hu
2021-03-23 11:12 ` [PATCH v10] " ZheNing Hu via GitGitGadget
2021-03-24 3:58 ` Eric Sunshine
2021-03-24 4:43 ` ZheNing Hu
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.885.v9.git.1616317225769.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=adlternative@gmail.com \
--cc=congdanhqx@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=liu.denton@gmail.com \
--cc=sunshine@sunshineco.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.