git/builtin
Antonio Ospite 76e9bdc437 submodule: support reading .gitmodules when it's not in the working tree
When the .gitmodules file is not available in the working tree, try
using the content from the index and from the current branch. This
covers the case when the file is part of the repository but for some
reason it is not checked out, for example because of a sparse checkout.

This makes it possible to use at least the 'git submodule' commands
which *read* the gitmodules configuration file without fully populating
the working tree.

Writing to .gitmodules will still require that the file is checked out,
so check for that before calling config_set_in_gitmodules_file_gently.

Add a similar check also in git-submodule.sh::cmd_add() to anticipate
the eventual failure of the "git submodule add" command when .gitmodules
is not safely writeable; this prevents the command from leaving the
repository in a spurious state (e.g. the submodule repository was cloned
but .gitmodules was not updated because
config_set_in_gitmodules_file_gently failed).

Moreover, since config_from_gitmodules() now accesses the global object
store, it is necessary to protect all code paths which call the function
against concurrent access to the global object store. Currently this
only happens in builtin/grep.c::grep_submodules(), so call
grep_read_lock() before invoking code involving
config_from_gitmodules().

Finally, add t7418-submodule-sparse-gitmodules.sh to verify that reading
from .gitmodules succeeds and that writing to it fails when the file is
not checked out.

NOTE: there is one rare case where this new feature does not work
properly yet: nested submodules without .gitmodules in their working
tree.  This has been documented with a warning and a test_expect_failure
item in t7814, and in this case the current behavior is not altered: no
config is read.

Signed-off-by: Antonio Ospite <ao2@ao2.it>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-10-31 15:01:30 +09:00
..
add.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
am.c Merge branch 'en/directory-renames-nothanks' 2018-09-04 14:31:38 -07:00
annotate.c
apply.c apply.c: make init_apply_state() take a struct repository 2018-08-13 14:14:44 -07:00
archive.c archive.c: avoid access to the_index 2018-08-13 14:14:43 -07:00
bisect--helper.c bisect: mention "view" as an alternative to "visualize" 2017-11-13 10:51:14 +09:00
blame.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
branch.c branch: support configuring --sort via .gitconfig 2018-08-16 11:17:10 -07:00
bundle.c
cat-file.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
check-attr.c attr: remove index from git_attr_set_direction() 2018-08-13 14:14:43 -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 Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
checkout.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
clean.c dir.c: remove an implicit dependency on the_index in pathspec code 2018-08-13 14:14:42 -07:00
clone.c Merge branch 'jt/connectivity-check-after-unshallow' 2018-08-15 15:08:28 -07:00
column.c column: fix off-by-one default width 2018-05-13 10:45:05 +09:00
commit-graph.c commit-graph: add free_commit_graph 2018-07-17 15:47:48 -07:00
commit-tree.c commit: add repository argument to lookup_commit 2018-06-29 10:43:39 -07:00
commit.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
config.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
count-objects.c packfile: convert has_sha1_pack to object_id 2018-05-02 13:59:49 +09:00
credential.c
describe.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07: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 diff.c: move read_index() code back to the caller 2018-08-13 14:14:42 -07:00
diff.c tag: add repository argument to deref_tag 2018-06-29 10:43:39 -07:00
difftool.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
fast-export.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
fetch-pack.c Merge branch 'bw/protocol-v2' 2018-05-08 15:59:16 +09:00
fetch.c Merge branch 'jt/connectivity-check-after-unshallow' 2018-08-15 15:08:28 -07:00
fmt-merge-msg.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
for-each-ref.c provide --color option for all ref-filter users 2017-10-04 11:35:29 +09:00
fsck.c Merge branch 'jk/core-use-replace-refs' 2018-08-15 15:08:23 -07:00
gc.c Merge branch 'kg/gc-auto-windows-workaround' 2018-08-02 15:30:43 -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 submodule: support reading .gitmodules when it's not in the working tree 2018-10-31 15:01:30 +09:00
hash-object.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
help.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
index-pack.c Merge branch 'jk/core-use-replace-refs' 2018-08-15 15:08:23 -07:00
init-db.c pass st.st_size as hint for strbuf_readlink() 2018-07-24 10:19:29 -07:00
interpret-trailers.c Merge branch 'jk/trailers-parse' 2017-08-26 22:55:04 -07:00
log.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
ls-files.c ls-files: correct index argument to get_convert_attr_ascii() 2018-08-13 14:14:43 -07:00
ls-remote.c Merge branch 'bw/server-options' 2018-05-23 14:38:15 +09:00
ls-tree.c object-store: move object access functions to object-store.h 2018-05-16 11:42:03 +09:00
mailinfo.c
mailsplit.c
merge-base.c commit: add repository argument to lookup_commit 2018-06-29 10:43:39 -07:00
merge-file.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
merge-index.c
merge-ours.c Merge branch 'bw/diff-opt-impl-to-bitfields' 2017-11-09 14:31:27 +09:00
merge-recursive.c builtin/merge-recursive: make hash independent 2018-07-16 14:27:39 -07:00
merge-tree.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
merge.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
mktag.c object-store: move object access functions to object-store.h 2018-05-16 11:42:03 +09:00
mktree.c object-store: move object access functions to object-store.h 2018-05-16 11:42:03 +09:00
mv.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
name-rev.c tag: add repository argument to deref_tag 2018-06-29 10:43:39 -07:00
notes.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
pack-objects.c Merge branch 'nd/pack-deltify-regression-fix' 2018-08-22 11:17:05 -07:00
pack-redundant.c pack-redundant: convert linked lists to use struct object_id 2018-05-02 13:59:50 +09:00
pack-refs.c refs: add repository argument to get_main_ref_store 2018-04-12 11:38:56 +09:00
patch-id.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
prune-packed.c for_each_*_object: move declarations to object-store.h 2018-08-14 12:29:57 -07:00
prune.c Merge branch 'jk/core-use-replace-refs' 2018-08-15 15:08:23 -07:00
pull.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
push.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
range-diff.c range-diff: update stale summary of --no-dual-color 2018-08-27 13:13:59 -07:00
read-tree.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
rebase--helper.c rebase -i: introduce --rebase-merges=[no-]rebase-cousins 2018-04-26 12:28:43 +09:00
receive-pack.c Merge branch 'sb/object-store-lookup' 2018-08-02 15:30:42 -07:00
reflog.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
remote-ext.c consistently use "fallthrough" comments in switches 2017-09-22 12:49:57 +09:00
remote-fd.c
remote.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
repack.c Merge branch 'jt/repack-promisor-packs' 2018-08-20 12:40:31 -07:00
replace.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -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 'jm/cache-entry-from-mem-pool' 2018-08-02 15:30:43 -07:00
rev-list.c Merge branch 'sb/object-store-lookup' 2018-08-02 15:30:42 -07:00
rev-parse.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
revert.c Merge branch 'nd/cherry-pick-quit-fix' 2018-08-20 12:41:34 -07:00
rm.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
send-pack.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
serve.c serve: introduce git-serve 2018-03-15 12:01:08 -07:00
shortlog.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
show-branch.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
show-index.c make show-index a builtin 2018-05-29 00:28:22 +09:00
show-ref.c object-store: move object access functions to object-store.h 2018-05-16 11:42:03 +09:00
stripspace.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
submodule--helper.c submodule: support reading .gitmodules when it's not in the working tree 2018-10-31 15:01:30 +09: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 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
unpack-file.c object-store: move object access functions to object-store.h 2018-05-16 11:42:03 +09:00
unpack-objects.c Merge branch 'jk/core-use-replace-refs' 2018-08-15 15:08:23 -07:00
update-index.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
update-ref.c update-ref --stdin: use skip_prefix() 2018-06-04 12:26:01 +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 archive.c: avoid access to the_index 2018-08-13 14:14:43 -07:00
upload-pack.c check_replace_refs: rename to read_replace_refs 2018-07-18 15:45:14 -07:00
var.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
verify-commit.c commit: add repository argument to lookup_commit 2018-06-29 10:43:39 -07:00
verify-pack.c config: don't include config.h by default 2017-06-15 12:56:22 -07:00
verify-tag.c ref-filter: use "struct object_id" consistently 2018-04-09 06:14:45 +09:00
worktree.c worktree: add --quiet option 2018-08-17 15:18:01 -07:00
write-tree.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00