Skip to content

Commit

Permalink
pathspec: only match across submodule boundaries when requested
Browse files Browse the repository at this point in the history
Commit 74ed437 (grep: enable recurse-submodules to work on <tree>
objects, 2016-12-16) taught 'tree_entry_interesting()' to be able to
match across submodule boundaries in the presence of wildcards.  This is
done by performing literal matching up to the first wildcard and then
punting to the submodule itself to perform more accurate pattern
matching.  Instead of introducing a new flag to request this behavior,
commit 74ed437 overloaded the already existing 'recursive' flag in
'struct pathspec' to request this behavior.

This leads to a bug where whenever any other caller has the 'recursive'
flag set as well as a pathspec with wildcards that all submodules will
be indicated as matches.  One simple example of this is:

	git init repo
	cd repo

	git init submodule
	git -C submodule commit -m initial --allow-empty

	touch "[bracket]"
	git add "[bracket]"
	git commit -m bracket
	git add submodule
	git commit -m submodule

	git rev-list HEAD -- "[bracket]"

Fix this by introducing the new flag 'recurse_submodules' in 'struct
pathspec' and using this flag to determine if matches should be allowed
to cross submodule boundaries.

This fixes git-for-windows#1371.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
bmwill authored and gitster committed Dec 5, 2017
1 parent 9560e62 commit eef3df5
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 2 deletions.
1 change: 1 addition & 0 deletions builtin/grep.c
Original file line number Diff line number Diff line change
Expand Up @@ -1015,6 +1015,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
prefix, argv + i);
pathspec.max_depth = opt.max_depth;
pathspec.recursive = 1;
pathspec.recurse_submodules = !!recurse_submodules;

#ifndef NO_PTHREADS
if (list.nr || cached || show_in_pager)
Expand Down
1 change: 1 addition & 0 deletions pathspec.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ struct pathspec {
int nr;
unsigned int has_wildcard:1;
unsigned int recursive:1;
unsigned int recurse_submodules:1;
unsigned magic;
int max_depth;
struct pathspec_item {
Expand Down
19 changes: 19 additions & 0 deletions t/t4208-log-magic-pathspec.sh
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,23 @@ test_expect_success 'command line pathspec parsing for "git log"' '
git log --merge -- a
'

test_expect_success 'tree_entry_interesting does not match past submodule boundaries' '
test_when_finished "rm -rf repo submodule" &&
git init submodule &&
test_commit -C submodule initial &&
git init repo &&
>"repo/[bracket]" &&
git -C repo add "[bracket]" &&
test_tick &&
git -C repo commit -m bracket &&
git -C repo rev-list HEAD -- "[bracket]" >expect &&
git -C repo submodule add ../submodule &&
test_tick &&
git -C repo commit -m submodule &&
git -C repo rev-list HEAD -- "[bracket]" >actual &&
test_cmp expect actual
'

test_done
5 changes: 3 additions & 2 deletions tree-walk.c
Original file line number Diff line number Diff line change
Expand Up @@ -1011,7 +1011,8 @@ static enum interesting do_match(const struct name_entry *entry,
* character. More accurate matching can then
* be performed in the submodule itself.
*/
if (ps->recursive && S_ISGITLINK(entry->mode) &&
if (ps->recurse_submodules &&
S_ISGITLINK(entry->mode) &&
!ps_strncmp(item, match + baselen,
entry->path,
item->nowildcard_len - baselen))
Expand Down Expand Up @@ -1060,7 +1061,7 @@ static enum interesting do_match(const struct name_entry *entry,
* character. More accurate matching can then
* be performed in the submodule itself.
*/
if (ps->recursive && S_ISGITLINK(entry->mode) &&
if (ps->recurse_submodules && S_ISGITLINK(entry->mode) &&
!ps_strncmp(item, match, base->buf + base_offset,
item->nowildcard_len)) {
strbuf_setlen(base, base_offset + baselen);
Expand Down

0 comments on commit eef3df5

Please sign in to comment.