From: Junio C Hamano <gitster@pobox.com>
To: Jerry Zhang <jerry@skydio.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH V2] patch-id: fix scan_hunk_header on diffs with 1 line of before/after
Date: Mon, 31 Jan 2022 14:54:18 -0800 [thread overview]
Message-ID: <xmqqr18nh5yd.fsf@gitster.g> (raw)
In-Reply-To: <20220129024757.24763-1-jerry@skydio.com> (Jerry Zhang's message of "Fri, 28 Jan 2022 18:47:57 -0800")
Jerry Zhang <jerry@skydio.com> writes:
> Normally diffs will contain a hunk header of the format
> "@@ -2,2 +2,15 @@ code". However in certain situations git can
> omit the second comma separated value in either before or after
> line counts in the case where there is only one line.
>
> This can produce hunk headers that look like
> "@@ -2 +2,18 @@ code" or "@@ -2,2 +2 @@ code".
> As a result, scan_hunk_header mistakenly returns the line
> number as line count, which then results in unpredictable
> parsing errors with the rest of the patch, including giving
> multiple lines of output for a single commit.
>
> Fix by explicitly setting line count to 1 when there is
> no comma, and add a test.
>
> apply.c contains this same logic except it is correct. A
> worthwhile future project might be to unify these two diff
> parsers so they both benefit from fixes.
>
> Signed-off-by: Jerry Zhang <jerry@skydio.com>
> ---
> V1->V2:
> - Removed references to -U1 since this isn't limited to that
> - Added notes for future tasks
>
> builtin/patch-id.c | 9 +++++++--
> t/t4204-patch-id.sh | 32 +++++++++++++++++++++++++++++++-
> 2 files changed, 38 insertions(+), 3 deletions(-)
>
> diff --git a/builtin/patch-id.c b/builtin/patch-id.c
> index 822ffff51f..881fcf3273 100644
> --- a/builtin/patch-id.c
> +++ b/builtin/patch-id.c
> @@ -30,26 +30,31 @@ static int scan_hunk_header(const char *p, int *p_before, int *p_after)
>
> q = p + 4;
> n = strspn(q, digits);
> if (q[n] == ',') {
> q += n + 1;
> + *p_before = atoi(q);
> n = strspn(q, digits);
> + } else {
> + *p_before = 1;
> }
> +
> if (n == 0 || q[n] != ' ' || q[n+1] != '+')
> return 0;
>
> r = q + n + 2;
> n = strspn(r, digits);
> if (r[n] == ',') {
> r += n + 1;
> + *p_after = atoi(r);
> n = strspn(r, digits);
> + } else {
> + *p_after = 1;
> }
> if (n == 0)
> return 0;
>
> - *p_before = atoi(q);
> - *p_after = atoi(r);
> return 1;
> }
>
> static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
> struct strbuf *line_buf, int stable)
> diff --git a/t/t4204-patch-id.sh b/t/t4204-patch-id.sh
> index 80f4a65b28..34a386aee2 100755
> --- a/t/t4204-patch-id.sh
> +++ b/t/t4204-patch-id.sh
> @@ -36,11 +36,11 @@ test_expect_success 'patch-id output is well-formed' '
> calc_patch_id () {
> patch_name="$1"
> shift
> git patch-id "$@" >patch-id.output &&
> sed "s/ .*//" patch-id.output >patch-id_"$patch_name" &&
> - test_line_count -gt 0 patch-id_"$patch_name"
> + test_line_count -eq 1 patch-id_"$patch_name"
> }
>
> get_top_diff () {
> git log -p -1 "$@" -O bar-then-foo --
> }
> @@ -200,6 +200,36 @@ EOF
> test_expect_success 'patch-id handles no-nl-at-eof markers' '
> cat nonl | calc_patch_id nonl &&
> cat withnl | calc_patch_id withnl &&
> test_cmp patch-id_nonl patch-id_withnl
> '
> +
> +cat >diffu1 <<\EOF
> +diff --git a/bar b/bar
> +index bdaf90f..31051f6 100644
> +--- a/bar
> ++++ b/bar
> +@@ -2 +2,2 @@
> + b
> ++c
> +diff --git a/car b/car
> +index 00750ed..2ae5e34 100644
> +--- a/car
> ++++ b/car
> +@@ -1 +1,2 @@
> + 3
> ++d
> +diff --git a/foo b/foo
> +index e439850..7146eb8 100644
> +--- a/foo
> ++++ b/foo
> +@@ -2 +2,2 @@
> + a
> ++e
> +EOF
> +
> +test_expect_success 'patch-id handles diffs with one line of before/after'
There is a opening quote for the body missing here.
> + cat diffu1 | calc_patch_id diffu1 &&
> + test_config patchid.stable true &&
> + cat diffu1 | calc_patch_id diffu1stable
> +'
> test_done
next prev parent reply other threads:[~2022-01-31 22:54 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-25 22:16 [PATCH] patch-id: fix scan_hunk_header on diffs with -U1 Jerry Zhang
2022-01-26 5:13 ` Junio C Hamano
2022-01-29 2:47 ` [PATCH V2] patch-id: fix scan_hunk_header on diffs with 1 line of before/after Jerry Zhang
2022-01-31 18:55 ` Junio C Hamano
2022-01-31 22:54 ` Junio C Hamano [this message]
2022-01-31 23:05 ` Junio C Hamano
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=xmqqr18nh5yd.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=jerry@skydio.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.