From: "Philip Oakley" <philipoakley@iee.org>
To: "Jeff King" <peff@peff.net>, "Junio C Hamano" <gitster@pobox.com>
Cc: "Johannes Schindelin" <johannes.schindelin@gmx.de>,
git@vger.kernel.org, "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: Re: [PATCH 01/15] handle_revision_arg: reset "dotdot" consistently
Date: Sat, 20 May 2017 15:56:32 +0100 [thread overview]
Message-ID: <F66E608B6CE34520BD764C404A2AD36C@PhilipOakley> (raw)
In-Reply-To: 20170519124834.ipk42isngqck2egu@sigill.intra.peff.net
From: "Jeff King" <peff@peff.net>
> When we are parsing a range like "a..b", we write a
> temporary NUL over the first ".", so that we can access the
> names "a" and "b" as C strings. But our restoration of the
> original "." is done at inconsistent times, which can lead
> to confusing results.
>
> For most calls, we restore the "." after we resolve the
> names, but before we call verify_non_filename(). This means
> that when we later call add_pending_object(), the name for
> the left-hand "a" has been re-expanded to "a..b". You can
> see this with:
>
> git log --source a...b
>
> where "b" will be correctly marked with "b", but "a" will be
> marked with "a...b". Likewise with "a..b" (though you need
> to use --boundary to even see "a" at all in that case).
>
> To top off the confusion, when the REVARG_CANNOT_BE_FILENAME
> flag is set, we skip the non-filename check, and leave the
> NUL in place.
>
> That means we do report the correct name for "a" in the
> pending array. But some code paths try to show the whole
> "a..b" name in error messages, and these erroneously show
> only "a" instead of "a..b". E.g.:
>
> $ git cherry-pick HEAD:foo..HEAD:foo
shouldn't this be three dots? Also the para above uses two dot examples in
its description but the paras before that start by describing the three dot
case.
--
Philip
> error: object d95f3ad14dee633a758d2e331151e950dd13e4ed is a blob, not a
> commit
> error: object d95f3ad14dee633a758d2e331151e950dd13e4ed is a blob, not a
> commit
> fatal: Invalid symmetric difference expression HEAD:foo
>
> (That last message should be "HEAD:foo...HEAD:foo"; I used
> cherry-pick because it passes the CANNOT_BE_FILENAME flag).
>
> As an interesting side note, cherry-pick actually looks at
> and re-resolves the arguments from the pending->name fields.
> So it would have been visibly broken by the first bug, but
> the effect was canceled out by the second one.
>
> This patch makes the whole function consistent by re-writing
> the NUL immediately after calling verify_non_filename(), and
> then restoring the "." as appropriate in some error-printing
> and early-return code paths.
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> I also considered just making a copy of the string rather than this
> in-place munging (technically we get it as a pointer-to-const; it's only
> the use of strstr() that lets us quietly drop the const). But it doesn't
> really make the code any cleaner; now instead of restoring the dot you
> have to remember to free() the string in each code path.
>
> revision.c | 3 +++
> t/t4202-log.sh | 9 +++++++++
> 2 files changed, 12 insertions(+)
>
> diff --git a/revision.c b/revision.c
> index 8a8c1789c..014bf52e3 100644
> --- a/revision.c
> +++ b/revision.c
> @@ -1477,12 +1477,14 @@ int handle_revision_arg(const char *arg_, struct
> rev_info *revs, int flags, unsi
> if (!cant_be_filename) {
> *dotdot = '.';
> verify_non_filename(revs->prefix, arg);
> + *dotdot = '\0';
> }
>
> a_obj = parse_object(from_sha1);
> b_obj = parse_object(sha1);
> if (!a_obj || !b_obj) {
> missing:
> + *dotdot = '.';
> if (revs->ignore_missing)
> return 0;
> die(symmetric
> @@ -1525,6 +1527,7 @@ int handle_revision_arg(const char *arg_, struct
> rev_info *revs, int flags, unsi
> REV_CMD_RIGHT, flags);
> add_pending_object(revs, a_obj, this);
> add_pending_object(revs, b_obj, next);
> + *dotdot = '.';
> return 0;
> }
> *dotdot = '.';
> diff --git a/t/t4202-log.sh b/t/t4202-log.sh
> index f57799071..6da1bbe91 100755
> --- a/t/t4202-log.sh
> +++ b/t/t4202-log.sh
> @@ -1380,4 +1380,13 @@ test_expect_success 'log --source paints tag names'
> '
> test_cmp expect actual
> '
>
> +test_expect_success 'log --source paints symmetric ranges' '
> + cat >expect <<-\EOF &&
> + 09e12a9 source-b three
> + 8e393e1 source-a two
> + EOF
> + git log --oneline --source source-a...source-b >actual &&
> + test_cmp expect actual
> +'
> +
> test_done
> --
> 2.13.0.219.g63f6bc368
>
next prev parent reply other threads:[~2017-05-20 14:56 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-15 15:23 [PATCH 0/2] Demonstrate and partially work around a gitattributes problem Johannes Schindelin
2017-05-15 15:23 ` [PATCH 1/2] gitattributes: demonstrate that Git tries to read a bogus file Johannes Schindelin
2017-05-15 15:24 ` [PATCH 2/2] mingw: Suppress warning that <commit>:.gitattributes does not exist Johannes Schindelin
2017-05-16 7:54 ` [PATCH 0/2] Demonstrate and partially work around a gitattributes problem Jeff King
2017-05-16 8:10 ` Jeff King
2017-05-17 1:38 ` Junio C Hamano
2017-05-17 2:05 ` Jeff King
2017-05-18 19:23 ` Johannes Schindelin
2017-05-19 0:00 ` Jeff King
2017-05-19 12:46 ` [PATCH 0/15] retain blob info for git diff HEAD:foo HEAD:bar Jeff King
2017-05-19 12:48 ` [PATCH 01/15] handle_revision_arg: reset "dotdot" consistently Jeff King
2017-05-20 14:56 ` Philip Oakley [this message]
2017-05-23 19:51 ` Jeff King
2017-05-23 23:47 ` Philip Oakley
2017-05-19 12:48 ` [PATCH 02/15] handle_revision_arg: simplify commit reference lookups Jeff King
2017-05-19 12:50 ` [PATCH 03/15] handle_revision_arg: stop using "dotdot" as a generic pointer Jeff King
2017-05-24 2:45 ` Junio C Hamano
2017-05-24 9:55 ` Jeff King
2017-05-19 12:51 ` [PATCH 04/15] handle_revision_arg: hoist ".." check out of range parsing Jeff King
2017-05-19 12:52 ` [PATCH 05/15] handle_revision_arg: add handle_dotdot() helper Jeff King
2017-05-24 2:30 ` Junio C Hamano
2017-05-19 12:52 ` [PATCH 06/15] sha1_name: consistently refer to object_context as "oc" Jeff King
2017-05-19 12:52 ` [PATCH 07/15] get_sha1_with_context: always initialize oc->symlink_path Jeff King
2017-05-19 12:54 ` [PATCH 08/15] get_sha1_with_context: dynamically allocate oc->path Jeff King
2017-05-19 12:54 ` [PATCH 09/15] t4063: add tests of direct blob diffs Jeff King
2017-05-19 12:55 ` [PATCH 10/15] handle_revision_arg: record modes for "a..b" endpoints Jeff King
2017-05-19 12:55 ` [PATCH 11/15] handle_revision_arg: record paths for pending objects Jeff King
2017-05-19 12:57 ` [PATCH 12/15] diff: pass whole pending entry in blobinfo Jeff King
2017-05-19 12:58 ` [PATCH 13/15] diff: use the word "path" instead of "name" for blobs Jeff King
2017-05-19 12:59 ` [PATCH 14/15] diff: use pending "path" if it is available Jeff King
2017-05-19 12:59 ` [PATCH 15/15] diff: use blob path for blob/file diffs Jeff King
2017-05-24 2:44 ` [PATCH 0/15] retain blob info for git diff HEAD:foo HEAD:bar Junio C Hamano
2017-05-24 9:57 ` Jeff King
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=F66E608B6CE34520BD764C404A2AD36C@PhilipOakley \
--to=philipoakley@iee.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox