From: Junio C Hamano <hidden> Date: 2017-01-20 22:18:34
Stefan Hajnoczi [off-list ref] writes:
quoted hunk
If the tree contains a sub-directory then git-grep(1) output contains a
colon character instead of a path separator:
$ git grep malloc v2.9.3:t
v2.9.3:t:test-lib.sh: setup_malloc_check () {
$ git show v2.9.3:t:test-lib.sh
fatal: Path 't:test-lib.sh' does not exist in 'v2.9.3'
This patch attempts to use the correct delimiter:
$ git grep malloc v2.9.3:t
v2.9.3:t/test-lib.sh: setup_malloc_check () {
$ git show v2.9.3:t/test-lib.sh
(success)
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
builtin/grep.c | 4 +++-
t/t7810-grep.sh | 5 +++++
2 files changed, 8 insertions(+), 1 deletion(-)
@@ -494,7 +494,9 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,/* Add a delimiter if there isn't one already */if(name[len-1]!='/'&&name[len-1]!=':'){-strbuf_addch(&base,':');+/* rev: or rev:path/ */+chardelim=obj->type==OBJ_COMMIT?':':'/';
Why check the equality with commit, rather than un-equality with
tree? Wouldn't you want to treat $commit:path and $tag:path the
same way?
I also think the two patches should be squashed together, as it is
only after this patch that the code does the "right thing" by
changing the delimiter depending on obj->type.
@@ -1445,6 +1445,11 @@ test_expect_success 'grep outputs valid <rev>:<path> for HEAD:t/' 'test_cmpexpectedactual'+test_expect_success'grep outputs valid <rev>:<path> for HEAD:t''+gitgrepvvvHEAD:t>actual&&+test_cmpexpectedactual+'+
Perhaps you want an annotated tag object refs/tags/v1.0 that points
at the commit at the HEAD, and then run the same grep on v1.0:t, in
addition to the above test.
From: Brandon Williams <hidden> Date: 2017-01-20 23:52:28
On 01/20, Junio C Hamano wrote:
Stefan Hajnoczi [off-list ref] writes:
quoted
If the tree contains a sub-directory then git-grep(1) output contains a
colon character instead of a path separator:
$ git grep malloc v2.9.3:t
v2.9.3:t:test-lib.sh: setup_malloc_check () {
$ git show v2.9.3:t:test-lib.sh
fatal: Path 't:test-lib.sh' does not exist in 'v2.9.3'
This patch attempts to use the correct delimiter:
$ git grep malloc v2.9.3:t
v2.9.3:t/test-lib.sh: setup_malloc_check () {
$ git show v2.9.3:t/test-lib.sh
(success)
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
builtin/grep.c | 4 +++-
t/t7810-grep.sh | 5 +++++
2 files changed, 8 insertions(+), 1 deletion(-)
@@ -494,7 +494,9 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,/* Add a delimiter if there isn't one already */if(name[len-1]!='/'&&name[len-1]!=':'){-strbuf_addch(&base,':');+/* rev: or rev:path/ */+chardelim=obj->type==OBJ_COMMIT?':':'/';
Why check the equality with commit, rather than un-equality with
tree? Wouldn't you want to treat $commit:path and $tag:path the
same way?
I assume Stefan just grabbed my naive suggestion hence why it checks
equality with a commit. So that's my fault :) Either of these may
not be enough though, since if you do 'git grep malloc v2.9.3^{tree}'
with this change the output prefix is 'v2.9.3^{tree}/' instead of the
correct prefix 'v2.9.3^{tree}:'
I also think the two patches should be squashed together, as it is
only after this patch that the code does the "right thing" by
changing the delimiter depending on obj->type.
@@ -1445,6 +1445,11 @@ test_expect_success 'grep outputs valid <rev>:<path> for HEAD:t/' 'test_cmpexpectedactual'+test_expect_success'grep outputs valid <rev>:<path> for HEAD:t''+gitgrepvvvHEAD:t>actual&&+test_cmpexpectedactual+'+
Perhaps you want an annotated tag object refs/tags/v1.0 that points
at the commit at the HEAD, and then run the same grep on v1.0:t, in
addition to the above test.
From: Stefan Hajnoczi <stefanha@redhat.com> Date: 2017-02-07 15:04:32
On Fri, Jan 20, 2017 at 03:51:33PM -0800, Brandon Williams wrote:
On 01/20, Junio C Hamano wrote:
quoted
Stefan Hajnoczi [off-list ref] writes:
quoted
If the tree contains a sub-directory then git-grep(1) output contains a
colon character instead of a path separator:
$ git grep malloc v2.9.3:t
v2.9.3:t:test-lib.sh: setup_malloc_check () {
$ git show v2.9.3:t:test-lib.sh
fatal: Path 't:test-lib.sh' does not exist in 'v2.9.3'
This patch attempts to use the correct delimiter:
$ git grep malloc v2.9.3:t
v2.9.3:t/test-lib.sh: setup_malloc_check () {
$ git show v2.9.3:t/test-lib.sh
(success)
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
builtin/grep.c | 4 +++-
t/t7810-grep.sh | 5 +++++
2 files changed, 8 insertions(+), 1 deletion(-)
@@ -494,7 +494,9 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,/* Add a delimiter if there isn't one already */if(name[len-1]!='/'&&name[len-1]!=':'){-strbuf_addch(&base,':');+/* rev: or rev:path/ */+chardelim=obj->type==OBJ_COMMIT?':':'/';
Why check the equality with commit, rather than un-equality with
tree? Wouldn't you want to treat $commit:path and $tag:path the
same way?
I assume Stefan just grabbed my naive suggestion hence why it checks
equality with a commit. So that's my fault :) Either of these may
not be enough though, since if you do 'git grep malloc v2.9.3^{tree}'
with this change the output prefix is 'v2.9.3^{tree}/' instead of the
correct prefix 'v2.9.3^{tree}:'
I revisited this series again today and am coming to the conclusion that
forming output based on the user's rev is really hard to get right in
all cases. I don't have a good solution to the v2.9.3^{tree} problem.
Perhaps it's better to leave this than to merge code that doesn't work
correctly 100% of the time.
Stefan
From: Jeff King <hidden> Date: 2017-02-07 19:50:47
On Tue, Feb 07, 2017 at 03:04:14PM +0000, Stefan Hajnoczi wrote:
quoted
I assume Stefan just grabbed my naive suggestion hence why it checks
equality with a commit. So that's my fault :) Either of these may
not be enough though, since if you do 'git grep malloc v2.9.3^{tree}'
with this change the output prefix is 'v2.9.3^{tree}/' instead of the
correct prefix 'v2.9.3^{tree}:'
I revisited this series again today and am coming to the conclusion that
forming output based on the user's rev is really hard to get right in
all cases. I don't have a good solution to the v2.9.3^{tree} problem.
I think the rule you need is not "are we at a tree", but rather "did we
traverse a path while resolving the name?". Only the get_sha1() parser
can tell you that. I think:
char delim = ':';
struct object_context oc;
if (get_sha1_with_context(name, 0, sha1, &oc))
die("...");
if (oc.path[0])
delim = '/'; /* name had a partial path */
would work. Root trees via "v2.9.3^{tree}" or "v2.9.3:" would have no
path, but "v2.9.3:Documentation" would. I think you'd still need to
avoid duplicating a trailing delimiter, but I can't think of a case
where it is wrong to do that based purely on the name.
-Peff