git/builtin
Kevin Willford b3dfeebb92 rebase: avoid computing unnecessary patch IDs
The `rebase` family of Git commands avoid applying patches that were
already integrated upstream. They do that by using the revision walking
option that computes the patch IDs of the two sides of the rebase
(local-only patches vs upstream-only ones) and skipping those local
patches whose patch ID matches one of the upstream ones.

In many cases, this causes unnecessary churn, as already the set of
paths touched by a given commit would suffice to determine that an
upstream patch has no local equivalent.

This hurts performance in particular when there are a lot of upstream
patches, and/or large ones.

Therefore, let's introduce the concept of a "diff-header-only" patch ID,
compare those first, and only evaluate the "full" patch ID lazily.

Please note that in contrast to the "full" patch IDs, those
"diff-header-only" patch IDs are prone to collide with one another, as
adjacent commits frequently touch the very same files. Hence we now
have to be careful to allow multiple hash entries with the same hash.
We accomplish that by using the hashmap_add() function that does not even
test for hash collisions.  This also allows us to evaluate the full patch ID
lazily, i.e. only when we found commits with matching diff-header-only
patch IDs.

We add a performance test that demonstrates ~1-6% improvement.  In
practice this will depend on various factors such as how many upstream
changes and how big those changes are along with whether file system
caches are cold or warm.  As Git's test suite has no way of catching
performance regressions, we also add a regression test that verifies
that the full patch ID computation is skipped when the diff-header-only
computation suffices.

Signed-off-by: Kevin Willford <kcwillford@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-08-11 14:39:16 -07:00
..
add.c
am.c builtin/am.c: use error_errno() 2016-05-09 12:29:08 -07:00
annotate.c
apply.c Merge branch 'rs/apply-name-terminate' 2016-06-03 14:38:04 -07:00
archive.c
bisect--helper.c
blame.c Merge branch 'tb/blame-force-read-cache-to-workaround-safe-crlf' 2016-04-13 14:12:41 -07:00
branch.c Merge branch 'nd/worktree-various-heads' 2016-05-23 14:54:29 -07:00
bundle.c
cat-file.c Merge branch 'jk/cat-file-buffered-batch-all' 2016-05-31 12:40:54 -07:00
check-attr.c
check-ignore.c
check-mailmap.c
check-ref-format.c
checkout-index.c
checkout.c Merge branch 'nd/worktree-various-heads' 2016-05-23 14:54:29 -07:00
clean.c
clone.c Merge branch 'sb/clone-shallow-passthru' 2016-05-06 14:45:43 -07:00
column.c
commit-tree.c Merge branch 'jc/commit-tree-ignore-commit-gpgsign' 2016-05-13 13:18:27 -07:00
commit.c Merge branch 'pb/commit-verbose-config' 2016-05-23 14:54:32 -07:00
config.c Merge branch 'jk/config-get-urlmatch' into maint 2016-04-14 18:57:43 -07:00
count-objects.c
credential.c
describe.c
diff-files.c diff: run arguments through precompose_argv 2016-05-13 14:35:49 -07:00
diff-index.c diff: run arguments through precompose_argv 2016-05-13 14:35:49 -07:00
diff-tree.c Merge branch 'ar/diff-args-osx-precompose' 2016-05-23 14:54:35 -07:00
diff.c Merge branch 'ar/diff-args-osx-precompose' 2016-05-23 14:54:35 -07:00
fast-export.c
fetch-pack.c fetch-pack: fix object_id of exact sha1 2016-03-01 11:19:19 -08:00
fetch.c Merge branch 'nd/error-errno' 2016-05-17 14:38:28 -07:00
fmt-merge-msg.c
for-each-ref.c
fsck.c fsck_head_link(): remove unneeded flag variable 2016-04-10 11:35:33 -07:00
gc.c
get-tar-commit-id.c
grep.c Merge branch 'bc/object-id' 2016-05-06 14:45:44 -07:00
hash-object.c
help.c builtin/help.c: use warning_errno() 2016-05-09 12:29:08 -07:00
index-pack.c Merge branch 'va/i18n-misc-updates' 2016-05-17 14:38:23 -07:00
init-db.c Merge branch 'jk/check-repository-format' 2016-04-13 14:12:28 -07:00
interpret-trailers.c
log.c rebase: avoid computing unnecessary patch IDs 2016-08-11 14:39:16 -07:00
ls-files.c
ls-remote.c
ls-tree.c
mailinfo.c
mailsplit.c builtin/mailsplit.c: use error_errno() 2016-05-09 12:29:08 -07:00
merge-base.c
merge-file.c builtin/merge-file.c: use error_errno() 2016-05-09 12:29:08 -07:00
merge-index.c
merge-ours.c
merge-recursive.c
merge-tree.c struct name_entry: use struct object_id instead of unsigned char sha1[20] 2016-04-25 14:23:42 -07:00
merge.c Merge branch 'en/merge-trivial-fix' 2016-04-25 15:17:15 -07:00
mktag.c
mktree.c
mv.c Merge branch 'sb/mv-submodule-fix' 2016-04-29 12:59:07 -07:00
name-rev.c Merge branch 'js/name-rev-use-oldest-ref' 2016-05-03 14:08:13 -07:00
notes.c worktree.c: make find_shared_symref() return struct worktree * 2016-04-22 14:09:37 -07:00
pack-objects.c Merge branch 'nd/error-errno' 2016-05-17 14:38:28 -07:00
pack-redundant.c
pack-refs.c
patch-id.c Merge branch 'rs/patch-id-use-skip-prefix' 2016-06-03 14:38:03 -07:00
prune-packed.c
prune.c
pull.c Merge branch 'va/i18n-misc-updates' 2016-05-17 14:38:23 -07:00
push.c
read-tree.c
receive-pack.c Merge branch 'dt/pre-refs-backend' 2016-04-25 15:17:15 -07:00
reflog.c struct name_entry: use struct object_id instead of unsigned char sha1[20] 2016-04-25 14:23:42 -07:00
remote-ext.c typofix: assorted typofixes in comments, documentation and messages 2016-05-06 13:16:37 -07:00
remote-fd.c
remote.c i18n: remote: add comment for translators 2016-05-09 12:20:40 -07:00
repack.c
replace.c Merge branch 'js/replace-edit-use-editor-configuration' 2016-04-29 12:59:07 -07:00
rerere.c
reset.c
rev-list.c Merge branch 'maint-2.4' into maint-2.5 2016-03-17 11:24:14 -07:00
rev-parse.c Merge branch 'jk/rev-parse-local-env-vars' into maint 2016-04-14 18:57:44 -07:00
revert.c
rm.c Merge branch 'nd/error-errno' 2016-05-17 14:38:28 -07:00
send-pack.c Merge branch 'sk/send-pack-all-fix' 2016-04-13 14:12:33 -07:00
shortlog.c
show-branch.c
show-ref.c
stripspace.c
submodule--helper.c submodule: remove bashism from shell script 2016-06-01 11:32:53 -07:00
symbolic-ref.c
tag.c Merge branch 'st/verify-tag' 2016-04-29 12:59:09 -07:00
unpack-file.c
unpack-objects.c
update-index.c builtin/update-index.c: prefer "err" to "errno" in process_lstat_error 2016-05-09 12:29:08 -07:00
update-ref.c
update-server-info.c
upload-archive.c builtin/upload-archive.c: use error_errno() 2016-05-09 12:29:08 -07:00
var.c
verify-commit.c
verify-pack.c
verify-tag.c verify-tag: move tag verification code to tag.c 2016-04-22 14:06:46 -07:00
worktree.c Merge branch 'nd/worktree-various-heads' 2016-05-23 14:54:29 -07:00
write-tree.c