Performance optimization for detection of modified submodules
In the worst case is_submodule_modified() got called three times for each submodule. The information we got from scanning the whole submodule tree the first time can be reused instead. New parameters have been added to diff_change() and diff_addremove(), the information is stored in a new member of struct diff_filespec. Its value is then reused instead of calling is_submodule_modified() again. When no explicit "-dirty" is needed in the output the call to is_submodule_modified() is not necessary when the submodules HEAD already disagrees with the ref of the superproject, as this alone marks it as modified. To achieve that, get_stat_data() got an extra argument. Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
f17a5d3494
commit
e3d42c4773
@ -68,7 +68,7 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, const
|
||||
if (DIFF_OPT_TST(opt, TREE_IN_RECURSIVE)) {
|
||||
newbase[baselen + pathlen1] = 0;
|
||||
opt->change(opt, mode1, mode2,
|
||||
sha1, sha2, newbase);
|
||||
sha1, sha2, newbase, 0, 0);
|
||||
newbase[baselen + pathlen1] = '/';
|
||||
}
|
||||
retval = diff_tree_sha1(sha1, sha2, newbase, opt);
|
||||
@ -77,7 +77,7 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, const
|
||||
}
|
||||
|
||||
fullname = malloc_fullname(base, baselen, path1, pathlen1);
|
||||
opt->change(opt, mode1, mode2, sha1, sha2, fullname);
|
||||
opt->change(opt, mode1, mode2, sha1, sha2, fullname, 0, 0);
|
||||
free(fullname);
|
||||
return 0;
|
||||
}
|
||||
@ -241,7 +241,7 @@ static void show_entry(struct diff_options *opt, const char *prefix, struct tree
|
||||
|
||||
if (DIFF_OPT_TST(opt, TREE_IN_RECURSIVE)) {
|
||||
newbase[baselen + pathlen] = 0;
|
||||
opt->add_remove(opt, *prefix, mode, sha1, newbase);
|
||||
opt->add_remove(opt, *prefix, mode, sha1, newbase, 0);
|
||||
newbase[baselen + pathlen] = '/';
|
||||
}
|
||||
|
||||
@ -252,7 +252,7 @@ static void show_entry(struct diff_options *opt, const char *prefix, struct tree
|
||||
free(newbase);
|
||||
} else {
|
||||
char *fullname = malloc_fullname(base, baselen, path, pathlen);
|
||||
opt->add_remove(opt, prefix[0], mode, sha1, fullname);
|
||||
opt->add_remove(opt, prefix[0], mode, sha1, fullname, 0);
|
||||
free(fullname);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user