summaryrefslogtreecommitdiff
path: root/list-objects.c
diff options
context:
space:
mode:
authorLibravatar Nguyễn Thái Ngọc Duy <pclouds@gmail.com>2011-03-25 16:34:20 +0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2011-03-25 09:20:33 -0700
commit97d0b74a49f0c81c3f9673c1a17721ac0624c3df (patch)
treec4e7b7b6f2083cb9abf6a1cd7d97c0e693203744 /list-objects.c
parentConvert read_tree{,_recursive} to support struct pathspec (diff)
downloadtgif-97d0b74a49f0c81c3f9673c1a17721ac0624c3df.tar.xz
Improve tree_entry_interesting() handling code
t_e_i() can return -1 or 2 to early shortcut a search. Current code may use up to two variables to handle it. One for saving return value from t_e_i temporarily, one for saving return code 2. The second variable is not needed. If we make sure the first variable does not change until the next t_e_i() call, then we can do something like this: int ret = 0; while (...) { if (ret != 2) { ret = t_e_i(); if (ret < 0) /* no longer interesting */ break; if (ret == 0) /* skip this round */ continue; } /* ret > 0, interesting */ } Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'list-objects.c')
-rw-r--r--list-objects.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/list-objects.c b/list-objects.c
index 61f6cc98d9..cf9dbe23e4 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -68,7 +68,7 @@ static void process_tree(struct rev_info *revs,
struct tree_desc desc;
struct name_entry entry;
struct name_path me;
- int all_interesting = (revs->diffopt.pathspec.nr == 0);
+ int match = revs->diffopt.pathspec.nr == 0 ? 2 : 0;
int baselen = base->len;
if (!revs->tree_objects)
@@ -85,7 +85,7 @@ static void process_tree(struct rev_info *revs,
me.elem = name;
me.elem_len = strlen(name);
- if (!all_interesting) {
+ if (!match) {
strbuf_addstr(base, name);
if (base->len)
strbuf_addch(base, '/');
@@ -94,17 +94,13 @@ static void process_tree(struct rev_info *revs,
init_tree_desc(&desc, tree->buffer, tree->size);
while (tree_entry(&desc, &entry)) {
- if (!all_interesting) {
- int showit = tree_entry_interesting(&entry,
- base, 0,
- &revs->diffopt.pathspec);
-
- if (showit < 0)
+ if (match != 2) {
+ match = tree_entry_interesting(&entry, base, 0,
+ &revs->diffopt.pathspec);
+ if (match < 0)
break;
- else if (!showit)
+ if (match == 0)
continue;
- else if (showit == 2)
- all_interesting = 1;
}
if (S_ISDIR(entry.mode))