git/builtin
Jeff King 73c3f0f704 index-pack: check .gitmodules files with --strict
Now that the internal fsck code has all of the plumbing we
need, we can start checking incoming .gitmodules files.
Naively, it seems like we would just need to add a call to
fsck_finish() after we've processed all of the objects. And
that would be enough to cover the initial test included
here. But there are two extra bits:

  1. We currently don't bother calling fsck_object() at all
     for blobs, since it has traditionally been a noop. We'd
     actually catch these blobs in fsck_finish() at the end,
     but it's more efficient to check them when we already
     have the object loaded in memory.

  2. The second pass done by fsck_finish() needs to access
     the objects, but we're actually indexing the pack in
     this process. In theory we could give the fsck code a
     special callback for accessing the in-pack data, but
     it's actually quite tricky:

       a. We don't have an internal efficient index mapping
	  oids to packfile offsets. We only generate it on
	  the fly as part of writing out the .idx file.

       b. We'd still have to reconstruct deltas, which means
          we'd basically have to replicate all of the
	  reading logic in packfile.c.

     Instead, let's avoid running fsck_finish() until after
     we've written out the .idx file, and then just add it
     to our internal packed_git list.

     This does mean that the objects are "in the repository"
     before we finish our fsck checks. But unpack-objects
     already exhibits this same behavior, and it's an
     acceptable tradeoff here for the same reason: the
     quarantine mechanism means that pushes will be
     fully protected.

In addition to a basic push test in t7415, we add a sneaky
pack that reverses the usual object order in the pack,
requiring that index-pack access the tree and blob during
the "finish" step.

This already works for unpack-objects (since it will have
written out loose objects), but we'll check it with this
sneaky pack for good measure.

Signed-off-by: Jeff King <peff@peff.net>
2018-05-21 23:55:12 -04:00
..
add.c Merge branch 'ma/skip-writing-unchanged-index' 2018-03-21 11:30:10 -07:00
am.c Merge branch 'nd/rebase-show-current-patch' 2018-03-06 14:54:02 -08:00
annotate.c
apply.c
archive.c correct error messages for NULL packet_read_line() 2018-02-08 12:37:30 -08:00
bisect--helper.c
blame.c blame: tighten command line parser 2018-02-07 12:41:36 -08:00
branch.c completion: use __gitcomp_builtin in _git_branch 2018-02-09 10:24:50 -08:00
bundle.c
cat-file.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
check-attr.c
check-ignore.c check-ignore: fix mix of directories and other file types 2018-02-12 13:09:35 -08:00
check-mailmap.c
check-ref-format.c
checkout-index.c parse-options: let OPT__FORCE take optional flags argument 2018-02-09 10:24:50 -08:00
checkout.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
clean.c completion: use __gitcomp_builtin in _git_clean 2018-02-09 10:24:50 -08:00
clone.c Merge branch 'jk/abort-clone-with-existing-dest' into maint 2018-02-15 15:18:13 -08:00
column.c
commit-tree.c commit: convert commit_tree* to object_id 2018-01-30 10:42:36 -08:00
commit.c Merge branch 'ma/skip-writing-unchanged-index' 2018-03-21 11:30:10 -07:00
config.c config: change default of `pager.config` to "on" 2018-02-21 14:27:30 -08:00
count-objects.c
credential.c
describe.c Merge branch 'sb/describe-blob' 2018-02-27 10:33:57 -08:00
diff-files.c
diff-index.c
diff-tree.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
diff.c
difftool.c
fast-export.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
fetch-pack.c fetch: inherit filter-spec from partial clone 2017-12-08 09:58:52 -08:00
fetch.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
fmt-merge-msg.c Merge branch 'rs/fmt-merge-msg-string-leak-fix' 2017-12-27 11:16:23 -08:00
for-each-ref.c
fsck.c fsck: call fsck_finish() after fscking objects 2018-05-21 23:55:12 -04:00
gc.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
get-tar-commit-id.c
grep.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
hash-object.c sha1_file: rename hash_sha1_file_literally 2018-01-30 10:42:36 -08:00
help.c help: rename 'new' variables 2018-02-22 10:08:05 -08:00
index-pack.c index-pack: check .gitmodules files with --strict 2018-05-21 23:55:12 -04:00
init-db.c init-db: rename 'template' variables 2018-02-22 10:08:05 -08:00
interpret-trailers.c
log.c format-patch: reduce patch diffstat width to 72 2018-02-02 10:40:34 -08:00
ls-files.c
ls-remote.c completion: use __gitcomp_builtin in _git_ls_remote 2018-02-09 10:24:51 -08:00
ls-tree.c
mailinfo.c
mailsplit.c
merge-base.c
merge-file.c
merge-index.c
merge-ours.c
merge-recursive.c
merge-tree.c
merge.c Merge branch 'ma/skip-writing-unchanged-index' 2018-03-21 11:30:10 -07:00
mktag.c sha1_file: convert write_sha1_file to object_id 2018-01-30 10:42:36 -08:00
mktree.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
mv.c Merge branch 'ma/skip-writing-unchanged-index' 2018-03-21 11:30:10 -07:00
name-rev.c
notes.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
pack-objects.c Merge branch 'nd/object-allocation-comments' 2018-03-14 12:01:06 -07:00
pack-redundant.c pack-redundant: rename 'new' variables 2018-02-22 10:08:05 -08:00
pack-refs.c
patch-id.c
prune-packed.c
prune.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
pull.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
push.c completion: use __gitcomp_builtin in _git_push 2018-02-09 10:24:52 -08:00
read-tree.c
rebase--helper.c Merge branch 'gs/rebase-allow-empty-message' 2018-02-21 12:45:04 -08:00
receive-pack.c sha1_file: convert write_sha1_file to object_id 2018-01-30 10:42:36 -08:00
reflog.c Merge branch 'nd/object-allocation-comments' 2018-03-14 12:01:06 -07:00
remote-ext.c
remote-fd.c
remote.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
repack.c gc: do not repack promisor packfiles 2017-12-08 09:52:42 -08:00
replace.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
rerere.c
reset.c Merge branch 'tg/reset-hard-show-head-with-pretty' 2018-02-15 14:55:45 -08:00
rev-list.c Merge branch 'rj/warning-uninitialized-fix' 2018-03-21 11:30:15 -07:00
rev-parse.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
revert.c sequencer: improve config handling 2017-12-13 11:15:14 -08:00
rm.c Merge branch 'ma/skip-writing-unchanged-index' 2018-03-21 11:30:10 -07:00
send-pack.c
shortlog.c
show-branch.c Merge branch 'ot/pretty' 2017-12-27 11:16:29 -08:00
show-ref.c
stripspace.c
submodule--helper.c Merge branch 'jk/submodule-name-verify-fix' into jk/submodule-name-verify-fsck 2018-05-21 23:54:28 -04:00
symbolic-ref.c
tag.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
unpack-file.c
unpack-objects.c unpack-objects: call fsck_finish() after fscking objects 2018-05-21 23:55:12 -04:00
update-index.c Merge branch 'jk/submodule-name-verify-fix' into jk/submodule-name-verify-fsck 2018-05-21 23:54:28 -04:00
update-ref.c
update-server-info.c parse-options: let OPT__FORCE take optional flags argument 2018-02-09 10:24:50 -08:00
upload-archive.c
var.c
verify-commit.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
verify-pack.c
verify-tag.c
worktree.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
write-tree.c