git-commit-vandalism/builtin
Jeff King ffc4b8012d tag: speed up --contains calculation
When we want to know if commit A contains commit B (or any
one of a set of commits, B through Z), we generally
calculate the merge bases and see if B is a merge base of A
(or for a set, if any of the commits B through Z have that
property).

When we are going to check a series of commits A1 through An
to see whether each contains B (e.g., because we are
deciding which tags to show with "git tag --contains"), we
do a series of merge base calculations. This can be very
expensive, as we repeat a lot of traversal work.

Instead, let's leverage the fact that we are going to use
the same --contains list for each tag, and mark areas of the
commit graph is definitely containing those commits, or
definitely not containing those commits. Later tags can then
stop traversing as soon as they see a previously calculated
answer.

This sped up "git tag --contains HEAD~200" in the linux-2.6
repository from:

  real    0m15.417s
  user    0m15.197s
  sys     0m0.220s

to:

  real    0m5.329s
  user    0m5.144s
  sys     0m0.184s

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-06-11 22:32:25 -07:00
..
add.c Rewrite dynamic structure initializations to runtime assignment 2010-05-31 16:59:26 -07:00
annotate.c
apply.c Merge branch 'jp/string-list-api-cleanup' 2010-06-30 11:55:38 -07:00
archive.c
bisect--helper.c
blame.c Merge branch 'cp/textconv-cat-file' 2010-06-27 12:07:55 -07:00
branch.c Merge branch 'sm/branch-broken-ref' 2010-06-21 06:02:47 -07:00
bundle.c
cat-file.c Merge branch 'cp/textconv-cat-file' 2010-06-27 12:07:55 -07:00
check-attr.c Move 'builtin-*' into a 'builtin/' subdirectory 2010-02-22 14:29:41 -08:00
check-ref-format.c
checkout-index.c
checkout.c Merge branch 'gv/portable' 2010-06-21 06:02:44 -07:00
clean.c
clone.c Merge branch 'ph/clone-message-reword' 2010-06-18 11:16:53 -07:00
commit-tree.c
commit.c Merge branch 'jl/status-ignore-submodules' 2010-06-30 11:55:39 -07:00
config.c
count-objects.c
describe.c Merge branch 'sp/maint-describe-tiebreak-with-tagger-date' into maint 2010-06-16 16:21:15 -07:00
diff-files.c
diff-index.c
diff-tree.c
diff.c
fast-export.c string_list: Fix argument order for string_list_append 2010-06-27 10:06:52 -07:00
fetch-pack.c
fetch.c Merge branch 'jp/string-list-api-cleanup' 2010-06-30 11:55:38 -07:00
fmt-merge-msg.c Merge branch 'jp/string-list-api-cleanup' 2010-06-30 11:55:38 -07:00
for-each-ref.c Merge branch 'maint' 2010-06-07 22:15:31 -07:00
fsck.c
gc.c
grep.c Merge branch 'jn/grep-open' 2010-06-30 11:55:38 -07:00
hash-object.c
help.c enums: omit trailing comma for portability 2010-05-31 16:59:27 -07:00
index-pack.c Merge branch 'np/index-pack-memsave' into maint 2010-06-16 16:22:23 -07:00
init-db.c handle "git --bare init <dir>" properly 2010-05-10 11:25:37 -07:00
log.c Merge branch 'ar/decorate-color' 2010-06-30 11:55:40 -07:00
ls-files.c Merge branch 'jp/string-list-api-cleanup' 2010-06-30 11:55:38 -07:00
ls-remote.c ls-remote: print URL when no repo is specified 2010-05-11 22:55:44 -07:00
ls-tree.c
mailinfo.c enums: omit trailing comma for portability 2010-05-31 16:59:27 -07:00
mailsplit.c string_list: Fix argument order for string_list_insert 2010-06-27 10:06:51 -07:00
merge-base.c
merge-file.c Merge branch 'rs/diff-no-minimal' into maint 2010-06-21 05:38:50 -07:00
merge-index.c
merge-ours.c
merge-recursive.c
merge-tree.c Merge branch 'rs/diff-no-minimal' into maint 2010-06-21 05:38:50 -07:00
merge.c Merge branch 'tc/merge-m-log' 2010-06-18 11:16:54 -07:00
mktag.c
mktree.c
mv.c string_list: Fix argument order for string_list_insert 2010-06-27 10:06:51 -07:00
name-rev.c
notes.c Merge branch 'maint' 2010-06-28 17:42:26 -07:00
pack-objects.c Merge branch 'np/malloc-threading' into maint 2010-06-16 16:21:06 -07:00
pack-redundant.c
pack-refs.c
patch-id.c patch-id: Add support for mbox format 2010-04-19 13:01:49 -07:00
prune-packed.c
prune.c
push.c Merge branch 'maint' 2010-04-09 22:43:18 -07:00
read-tree.c
receive-pack.c Merge branch 'jp/string-list-api-cleanup' 2010-06-30 11:55:38 -07:00
reflog.c Merge branch 'jc/maint-no-reflog-expire-unreach-for-head' 2010-05-21 04:02:18 -07:00
remote.c Merge branch 'jp/string-list-api-cleanup' 2010-06-30 11:55:38 -07:00
replace.c
rerere.c Merge branch 'jp/string-list-api-cleanup' 2010-06-30 11:55:38 -07:00
reset.c
rev-list.c rev-list: introduce --count option 2010-06-12 09:39:06 -07:00
rev-parse.c parseopt: wrap rev-parse --parseopt usage for eval consumption 2010-06-13 09:38:14 -07:00
revert.c revert: do not rebuild argv on heap 2010-06-29 10:36:13 -07:00
rm.c
send-pack.c
shortlog.c string_list: Fix argument order for string_list_append 2010-06-27 10:06:52 -07:00
show-branch.c show-branch: use DEFAULT_ABBREV instead of 7 2010-05-25 09:48:49 -07:00
show-ref.c string_list: Fix argument order for string_list_insert 2010-06-27 10:06:51 -07:00
stripspace.c
symbolic-ref.c
tag.c tag: speed up --contains calculation 2011-06-11 22:32:25 -07:00
tar-tree.c
unpack-file.c
unpack-objects.c
update-index.c
update-ref.c
update-server-info.c
upload-archive.c
var.c
verify-pack.c
verify-tag.c
write-tree.c