tree_entry_interesting(): allow it to say "everything is interesting"
In addition to optimizing pathspecs that would never match, which was done earlier, this optimizes pathspecs that would always match (e.g. "arch/" while the traversal is already in "arch/i386/" hierarchy). This patch makes the worst case slightly more palatable, while improving average case. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
ccc744abbb
commit
1d848f643c
33
tree-diff.c
33
tree-diff.c
@ -70,7 +70,8 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, const
|
|||||||
* Is a tree entry interesting given the pathspec we have?
|
* Is a tree entry interesting given the pathspec we have?
|
||||||
*
|
*
|
||||||
* Return:
|
* Return:
|
||||||
* - positive for yes
|
* - 2 for "yes, and all subsequent entries will be"
|
||||||
|
* - 1 for yes
|
||||||
* - zero for no
|
* - zero for no
|
||||||
* - negative for "no, and no subsequent entries will be either"
|
* - negative for "no, and no subsequent entries will be either"
|
||||||
*/
|
*/
|
||||||
@ -100,8 +101,11 @@ static int tree_entry_interesting(struct tree_desc *desc, const char *base, int
|
|||||||
if (strncmp(base, match, matchlen))
|
if (strncmp(base, match, matchlen))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* The base is a subdirectory of a path which was specified. */
|
/*
|
||||||
return 1;
|
* The base is a subdirectory of a path which
|
||||||
|
* was specified, so all of them are interesting.
|
||||||
|
*/
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Does the base match? */
|
/* Does the base match? */
|
||||||
@ -173,8 +177,18 @@ static int tree_entry_interesting(struct tree_desc *desc, const char *base, int
|
|||||||
/* A whole sub-tree went away or appeared */
|
/* A whole sub-tree went away or appeared */
|
||||||
static void show_tree(struct diff_options *opt, const char *prefix, struct tree_desc *desc, const char *base, int baselen)
|
static void show_tree(struct diff_options *opt, const char *prefix, struct tree_desc *desc, const char *base, int baselen)
|
||||||
{
|
{
|
||||||
|
int all_interesting = 0;
|
||||||
while (desc->size) {
|
while (desc->size) {
|
||||||
int show = tree_entry_interesting(desc, base, baselen, opt);
|
int show;
|
||||||
|
|
||||||
|
if (all_interesting)
|
||||||
|
show = 1;
|
||||||
|
else {
|
||||||
|
show = tree_entry_interesting(desc, base, baselen,
|
||||||
|
opt);
|
||||||
|
if (show == 2)
|
||||||
|
all_interesting = 1;
|
||||||
|
}
|
||||||
if (show < 0)
|
if (show < 0)
|
||||||
break;
|
break;
|
||||||
if (show)
|
if (show)
|
||||||
@ -215,8 +229,17 @@ static void show_entry(struct diff_options *opt, const char *prefix, struct tree
|
|||||||
|
|
||||||
static void skip_uninteresting(struct tree_desc *t, const char *base, int baselen, struct diff_options *opt)
|
static void skip_uninteresting(struct tree_desc *t, const char *base, int baselen, struct diff_options *opt)
|
||||||
{
|
{
|
||||||
|
int all_interesting = 0;
|
||||||
while (t->size) {
|
while (t->size) {
|
||||||
int show = tree_entry_interesting(t, base, baselen, opt);
|
int show;
|
||||||
|
|
||||||
|
if (all_interesting)
|
||||||
|
show = 1;
|
||||||
|
else {
|
||||||
|
show = tree_entry_interesting(t, base, baselen, opt);
|
||||||
|
if (show == 2)
|
||||||
|
all_interesting = 1;
|
||||||
|
}
|
||||||
if (!show) {
|
if (!show) {
|
||||||
update_tree_entry(t);
|
update_tree_entry(t);
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
Reference in New Issue
Block a user