git-commit-vandalism/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 apply: move lockfile into apply_state 2017-10-06 10:07:18 +09:00
archive.c correct error messages for NULL packet_read_line() 2018-02-08 12:37:30 -08:00
bisect--helper.c bisect: mention "view" as an alternative to "visualize" 2017-11-13 10:51:14 +09:00
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 bundle: use prefix_filename with bundle path 2017-03-21 11:18:41 -07:00
cat-file.c Merge branch 'bw/c-plus-plus' 2018-03-06 14:54:07 -08:00
check-attr.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
check-ignore.c check-ignore: fix mix of directories and other file types 2018-02-12 13:09:35 -08:00
check-mailmap.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
check-ref-format.c Merge branch 'jc/check-ref-format-oor' into maint 2017-11-15 12:04:57 +09:00
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 config: don't include config.h by default 2017-06-15 12:56:22 -07:00
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 pack: move open_pack_index(), parse_pack_index() 2017-08-23 15:12:06 -07:00
credential.c credential: handle invalid arguments earlier 2017-05-30 14:45:03 +09:00
describe.c Merge branch 'sb/describe-blob' 2018-02-27 10:33:57 -08:00
diff-files.c submodule: remove gitmodules_config 2017-08-03 13:11:02 -07:00
diff-index.c Merge branch 'ma/builtin-unleak' 2017-10-07 16:27:55 +09:00
diff-tree.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
diff.c Switch empty tree and blob lookups to use hash abstraction 2017-11-13 13:20:44 +09:00
difftool.c read-cache: leave lock in right state in write_locked_index() 2017-10-07 10:20:56 +09:00
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 provide --color option for all ref-filter users 2017-10-04 11:35:29 +09:00
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 distinguish error versus short read from read_in_full() 2017-09-27 15:45:24 +09:00
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 Merge branch 'jk/trailers-parse' 2017-08-26 22:55:04 -07:00
log.c format-patch: reduce patch diffstat width to 72 2018-02-02 10:40:34 -08:00
ls-files.c Merge branch 'bp/fsmonitor' 2017-11-21 14:07:50 +09:00
ls-remote.c completion: use __gitcomp_builtin in _git_ls_remote 2018-02-09 10:24:51 -08:00
ls-tree.c Merge branch 'bw/config-h' 2017-06-24 14:28:41 -07:00
mailinfo.c prefix_filename: return newly allocated string 2017-03-21 11:18:41 -07:00
mailsplit.c mailinfo & mailsplit: check for EOF while parsing 2017-05-08 12:18:19 +09:00
merge-base.c Merge branch 'ma/reduce-heads-leakfix' 2017-11-15 12:14:32 +09:00
merge-file.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
merge-index.c Convert GIT_SHA1_HEXSZ used for allocation to GIT_MAX_HEXSZ 2017-03-26 22:08:21 -07:00
merge-ours.c Merge branch 'bw/diff-opt-impl-to-bitfields' 2017-11-09 14:31:27 +09:00
merge-recursive.c i18n: merge-recursive: mark verbose message for translation 2016-09-15 13:17:32 -07:00
merge-tree.c tree-walk: convert fill_tree_descriptor() to object_id 2017-08-14 12:38:54 -07:00
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 Merge branch 'mg/timestamp-t-fix' into maint 2017-10-18 14:19:09 +09:00
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 refs: delete pack_refs() in favor of refs_pack_refs() 2017-04-14 03:53:25 -07:00
patch-id.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
prune-packed.c Merge branch 'jt/packmigrate' 2017-08-26 22:55:09 -07:00
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 submodule: remove gitmodules_config 2017-08-03 13:11:02 -07:00
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 consistently use "fallthrough" comments in switches 2017-09-22 12:49:57 +09:00
remote-fd.c remote-{ext,fd}: print usage message on invalid arguments 2017-05-30 14:45:04 +09:00
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 avoid "write_in_full(fd, buf, len) != len" pattern 2017-09-14 15:17:59 +09:00
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 Merge branch 'ma/parse-maybe-bool' 2017-08-22 10:29:03 -07:00
shortlog.c shortlog: skip format/parse roundtrip for internal traversal 2017-09-09 01:57:03 +09:00
show-branch.c Merge branch 'ot/pretty' 2017-12-27 11:16:29 -08:00
show-ref.c refs: convert peel_ref to struct object_id 2017-10-16 11:05:51 +09:00
stripspace.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
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 refs: rename constant REF_NODEREF to REF_NO_DEREF 2017-11-06 10:31:08 +09:00
tag.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
unpack-file.c Merge branch 'jk/write-in-full-fix' 2017-09-25 15:24:06 +09:00
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 refs: rename constant REF_NODEREF to REF_NO_DEREF 2017-11-06 10:31:08 +09:00
update-server-info.c parse-options: let OPT__FORCE take optional flags argument 2018-02-09 10:24:50 -08:00
upload-archive.c upload-archive: handle "-h" option early 2017-05-30 14:45:04 +09:00
var.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
verify-commit.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
verify-pack.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
verify-tag.c Merge branch 'jk/ref-filter-colors' 2017-08-11 13:26:58 -07:00
worktree.c Merge branch 'nd/parseopt-completion' 2018-03-14 12:01:07 -07:00
write-tree.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00