mirror of
https://github.com/git/git.git
synced 2026-08-08 17:11:48 +00:00
Blame and "git log --stat" recover hunk coordinates by diffing blob pairs, and recompute them on every run. Add a cache of those coordinates at $GIT_DIR/objects/info/diff-hunks, beside the commit-graph, so a later run can look them up instead of decompressing the blobs and running xdiff again. The store is a single chunk-format file (see gitformat-chunk(5)): an 8-byte header, a DHIX index of fixed-size entries sorted by key, a DHDT segment of hunk records, and a trailing hash checksum. An entry is keyed by the two blob object ids and the xdl_opts the pair was diffed under, so a stored result is served only where that exact key recurs, independent of path. A zero-context diff trims unchanged lines from hunk edges and can pick a different but equally valid set of hunks than an untrimmed diff, so a recording caller stores a pair only when its trimmed and untrimmed diffs are identical; such an entry answers any consumer at any context, and the rare divergent pair is always computed. Identical hunk blocks are interned once and shared across keys. The library provides a reader (repo_diff_hunks_store and _replay, gated by core.diffHunks), loaded once and cached on the object database as the commit-graph is, and a writer that accumulates entries and flushes them in one atomic pass. An absent, corrupt, or disabled store reads as all misses. A record with no hunks is invalid too: replaying it would claim the pair equivalent, which the store never asserts, so it reads as a miss. Ordinary reads are diagnostic-free. Loading parses the chunk table through read_table_of_contents_quiet(), new in chunk-format, which prints nothing on a malformed table and takes the repository's hash algorithm rather than the_hash_algo, so the file is bounds-checked under the algorithm it is keyed by. The flush closes the repository's mmapped store and forgets that loading was attempted before committing the lockfile. A warming run that also reads may hold the file it is replacing mapped, and the rename must not land on a live mapping, which Windows refuses; a read after the flush then observes the committed file. commit-graph closes its graph before committing for the same reason. Writing is off by default, enabled per run by GIT_DIFF_HUNKS_WRITE or persistently by diffHunks.write, the environment winning. A writer seeds from the existing store, so a flush merges rather than replaces. The seed's checksum is verified first: a corrupt store is discarded, not rewritten with a fresh checksum verify could no longer catch. An entry that fails the shared diff_provider_check_hunk() or names no blob is dropped with a warning, since it would only ever read as a miss. A seed that discarded or dropped anything forces the flush even when the warming run computed nothing new. The writer fsyncs through a new diff-hunks core.fsync component. "git diff-hunks" inspects and manages the file: "verify" checks the checksum, chunk table, sort order, entry bounds, and every entry's hunk sequence against that shared check, so a store whose entries could only read as misses fails verify; "clear" removes the file. Later patches wire the readers and the writer into the diff and blame paths. Signed-off-by: Michael Montalbo <mmontalbo@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
265 lines
3.7 KiB
Plaintext
265 lines
3.7 KiB
Plaintext
/fuzz_corpora
|
|
/target/
|
|
/Cargo.lock
|
|
/GIT-BUILD-DIR
|
|
/GIT-BUILD-OPTIONS
|
|
/GIT-CFLAGS
|
|
/GIT-LDFLAGS
|
|
/GIT-PREFIX
|
|
/GIT-PERL-DEFINES
|
|
/GIT-PERL-HEADER
|
|
/GIT-PYTHON-VARS
|
|
/GIT-SCRIPT-DEFINES
|
|
/GIT-SPATCH-DEFINES
|
|
/GIT-TEST-SUITES
|
|
/GIT-USER-AGENT
|
|
/GIT-VERSION-FILE
|
|
/git
|
|
/git-add
|
|
/git-am
|
|
/git-annotate
|
|
/git-apply
|
|
/git-archimport
|
|
/git-archive
|
|
/git-backfill
|
|
/git-bisect
|
|
/git-blame
|
|
/git-branch
|
|
/git-bugreport
|
|
/git-bundle
|
|
/git-cat-file
|
|
/git-check-attr
|
|
/git-check-ignore
|
|
/git-check-mailmap
|
|
/git-check-ref-format
|
|
/git-checkout
|
|
/git-checkout--worker
|
|
/git-checkout-index
|
|
/git-cherry
|
|
/git-cherry-pick
|
|
/git-clean
|
|
/git-clone
|
|
/git-column
|
|
/git-commit
|
|
/git-commit-graph
|
|
/git-commit-tree
|
|
/git-config
|
|
/git-count-objects
|
|
/git-credential
|
|
/git-credential-cache
|
|
/git-credential-cache--daemon
|
|
/git-credential-store
|
|
/git-cvsexportcommit
|
|
/git-cvsimport
|
|
/git-cvsserver
|
|
/git-daemon
|
|
/git-diagnose
|
|
/git-diff
|
|
/git-diff-files
|
|
/git-diff-hunks
|
|
/git-diff-index
|
|
/git-diff-pairs
|
|
/git-diff-tree
|
|
/git-difftool
|
|
/git-difftool--helper
|
|
/git-describe
|
|
/git-fast-export
|
|
/git-fast-import
|
|
/git-fetch
|
|
/git-fetch-pack
|
|
/git-filter-branch
|
|
/git-fmt-merge-msg
|
|
/git-for-each-ref
|
|
/git-for-each-repo
|
|
/git-format-patch
|
|
/git-format-rev
|
|
/git-fsck
|
|
/git-fsck-objects
|
|
/git-fsmonitor--daemon
|
|
/git-gc
|
|
/git-get-tar-commit-id
|
|
/git-grep
|
|
/git-hash-object
|
|
/git-help
|
|
/git-history
|
|
/git-hook
|
|
/git-http-backend
|
|
/git-http-fetch
|
|
/git-http-push
|
|
/git-imap-send
|
|
/git-index-pack
|
|
/git-init
|
|
/git-init-db
|
|
/git-interpret-trailers
|
|
/git-instaweb
|
|
/git-last-modified
|
|
/git-log
|
|
/git-ls-files
|
|
/git-ls-remote
|
|
/git-ls-tree
|
|
/git-mailinfo
|
|
/git-mailsplit
|
|
/git-maintenance
|
|
/git-merge
|
|
/git-merge-base
|
|
/git-merge-index
|
|
/git-merge-file
|
|
/git-merge-tree
|
|
/git-merge-octopus
|
|
/git-merge-one-file
|
|
/git-merge-ours
|
|
/git-merge-recursive
|
|
/git-merge-resolve
|
|
/git-merge-subtree
|
|
/git-mergetool
|
|
/git-mergetool--lib
|
|
/git-mktag
|
|
/git-mktree
|
|
/git-multi-pack-index
|
|
/git-mv
|
|
/git-name-rev
|
|
/git-notes
|
|
/git-p4
|
|
/git-pack-redundant
|
|
/git-pack-objects
|
|
/git-pack-refs
|
|
/git-patch-id
|
|
/git-prune
|
|
/git-prune-packed
|
|
/git-pull
|
|
/git-push
|
|
/git-quiltimport
|
|
/git-range-diff
|
|
/git-read-tree
|
|
/git-rebase
|
|
/git-receive-pack
|
|
/git-reflog
|
|
/git-refs
|
|
/git-remote
|
|
/git-remote-http
|
|
/git-remote-https
|
|
/git-remote-ftp
|
|
/git-remote-ftps
|
|
/git-remote-fd
|
|
/git-remote-ext
|
|
/git-repack
|
|
/git-replace
|
|
/git-replay
|
|
/git-repo
|
|
/git-request-pull
|
|
/git-rerere
|
|
/git-reset
|
|
/git-restore
|
|
/git-rev-list
|
|
/git-rev-parse
|
|
/git-revert
|
|
/git-rm
|
|
/git-send-email
|
|
/git-send-pack
|
|
/git-sh-i18n
|
|
/git-sh-i18n--envsubst
|
|
/git-sh-setup
|
|
/git-shell
|
|
/git-shortlog
|
|
/git-show
|
|
/git-show-branch
|
|
/git-show-index
|
|
/git-show-ref
|
|
/git-sparse-checkout
|
|
/git-stage
|
|
/git-stash
|
|
/git-status
|
|
/git-stripspace
|
|
/git-submodule
|
|
/git-submodule--helper
|
|
/git-subtree
|
|
/git-svn
|
|
/git-switch
|
|
/git-symbolic-ref
|
|
/git-tag
|
|
/git-unpack-file
|
|
/git-unpack-objects
|
|
/git-update-index
|
|
/git-update-ref
|
|
/git-update-server-info
|
|
/git-upload-archive
|
|
/git-upload-pack
|
|
/git-url-parse
|
|
/git-var
|
|
/git-verify-commit
|
|
/git-verify-pack
|
|
/git-verify-tag
|
|
/git-version
|
|
/git-web--browse
|
|
/git-whatchanged
|
|
/git-worktree
|
|
/git-write-tree
|
|
/scalar
|
|
/git-core-*/?*
|
|
/git.res
|
|
/gitweb/GITWEB-BUILD-OPTIONS
|
|
/gitweb/gitweb.cgi
|
|
/gitweb/static/gitweb.js
|
|
/gitweb/static/gitweb.min.*
|
|
/config-list.h
|
|
/command-list.h
|
|
/hook-list.h
|
|
/version-def.h
|
|
*.tar.gz
|
|
*.dsc
|
|
*.deb
|
|
/git.rc
|
|
/git.spec
|
|
*.exe
|
|
*.[aos]
|
|
*.o.json
|
|
*.py[co]
|
|
.build/
|
|
.depend/
|
|
*.gcda
|
|
*.gcno
|
|
*.gcov
|
|
/coverage-untested-functions
|
|
/cover_db/
|
|
/cover_db_html/
|
|
*+
|
|
/config.mak
|
|
/autom4te.cache
|
|
/config.cache
|
|
/config.log
|
|
/config.status
|
|
/config.mak.autogen
|
|
/config.mak.append
|
|
/configure
|
|
/.vscode/
|
|
/tags
|
|
/TAGS
|
|
/cscope*
|
|
/compile_commands.json
|
|
/.cache/
|
|
*.hcc
|
|
*.obj
|
|
*.lib
|
|
*.sln
|
|
*.sp
|
|
*.suo
|
|
*.ncb
|
|
*.vcproj
|
|
*.user
|
|
*.idb
|
|
*.pdb
|
|
*.ilk
|
|
*.iobj
|
|
*.ipdb
|
|
*.dll
|
|
.vs/
|
|
Debug/
|
|
Release/
|
|
/UpgradeLog*.htm
|
|
/git.VC.VC.opendb
|
|
/git.VC.db
|
|
*.dSYM
|
|
/contrib/buildsystems/out
|
|
/contrib/libgit-rs/target
|
|
/contrib/libgit-sys/target
|