Skip to content

Commit

Permalink
tree_entry_interesting(): fix depth limit with overlapping pathspecs
Browse files Browse the repository at this point in the history
Suppose we have two pathspecs 'a' and 'a/b' (both are dirs) and depth
limit 1. In current code, pathspecs are checked in input order. When
'a/b' is checked against pathspec 'a', it fails depth limit and
therefore is excluded, although it should match 'a/b' pathspec.

This patch reorders all pathspecs alphabetically, then teaches
tree_entry_interesting() to check against the deepest pathspec first,
so depth limit of a shallower pathspec won't affect a deeper one.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Feb 3, 2011
1 parent bc96cc8 commit 86e4ca6
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
13 changes: 13 additions & 0 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1166,6 +1166,15 @@ int remove_path(const char *name)
return 0;
}

static int pathspec_item_cmp(const void *a_, const void *b_)
{
struct pathspec_item *a, *b;

a = (struct pathspec_item *)a_;
b = (struct pathspec_item *)b_;
return strcmp(a->match, b->match);
}

int init_pathspec(struct pathspec *pathspec, const char **paths)
{
const char **p = paths;
Expand All @@ -1189,6 +1198,10 @@ int init_pathspec(struct pathspec *pathspec, const char **paths)
item->match = path;
item->len = strlen(path);
}

qsort(pathspec->items, pathspec->nr,
sizeof(struct pathspec_item), pathspec_item_cmp);

return 0;
}

Expand Down
2 changes: 1 addition & 1 deletion tree-walk.c
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,7 @@ int tree_entry_interesting(const struct name_entry *entry,

pathlen = tree_entry_len(entry->path, entry->sha1);

for (i = 0; i < ps->nr; i++) {
for (i = ps->nr-1; i >= 0; i--) {
const struct pathspec_item *item = ps->items+i;
const char *match = item->match;
int matchlen = item->len;
Expand Down

0 comments on commit 86e4ca6

Please sign in to comment.