Thread (38 messages) flat view 38 messages, 6 authors, 2021-10-14

Re: [PATCH v3 2/4] introduce submodule.superprojectGitDir record

From: Derrick Stolee <hidden>
Date: 2021-08-20 00:38:25

On 8/19/2021 4:09 PM, Emily Shaffer wrote:
...
+submodule.superprojectGitDir::
+	The relative path from the submodule's worktree to its superproject's
+	gitdir. When Git is run in a repository, it usually makes no difference
+	whether this repository is standalone or a submodule, but if this
+	configuration variable is present, additional behavior may be possible,
+	such as "git status" printing additional information about this
+	submodule's status with respect to its superproject. This config should
+	only be present in projects which are submodules, but is not guaranteed
+	to be present in every submodule, so only optional value-added behavior
+	should be linked to it. It is set automatically during
+	submodule creation.
++
+	Because of this configuration variable, it is forbidden to use the
+	same submodule worktree shared by multiple superprojects.
nit: this paragraph linked with the "+" line should have no tabbing.

Also, could we use the same submodule worktree for multiple superprojects
_before_ this configuration variable? That seems wild to me. Or, is that
not a new requirement?

Perhaps you mean something like this instead:

	It is forbidden to use the same submodule worktree for multiple
	superprojects, so this configuration variable stores the unique
	superproject and is not multi-valued.
quoted hunk ↗ jump to hunk
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index d55f6262e9..d60fcd2c7d 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -1910,6 +1910,10 @@ static int module_clone(int argc, const char **argv, const char *prefix)
 		git_config_set_in_file(p, "submodule.alternateErrorStrategy",
 					   error_strategy);
 
+	git_config_set_in_file(p, "submodule.superprojectGitdir",
+			       relative_path(absolute_path(get_git_dir()),
+					     path, &sb));
+
I see that all new submodules will have this configuration set. But we will
also live in a world where some existing submodules do not have this variable
set. I'll look elsewhere for compatibility checks.
 inspect() {
-	dir=$1 &&
-
-	git -C "$dir" for-each-ref --format='%(refname)' 'refs/heads/*' >heads &&
-	{ git -C "$dir" symbolic-ref HEAD || :; } >head &&
-	git -C "$dir" rev-parse HEAD >head-sha1 &&
-	git -C "$dir" update-index --refresh &&
-	git -C "$dir" diff-files --exit-code &&
-	git -C "$dir" clean -n -d -x >untracked
+	sub_dir=$1 &&
+	super_dir=$2 &&
+
+	git -C "$sub_dir" for-each-ref --format='%(refname)' 'refs/heads/*' >heads &&
+	{ git -C "$sub_dir" symbolic-ref HEAD || :; } >head &&
+	git -C "$sub_dir" rev-parse HEAD >head-sha1 &&
+	git -C "$sub_dir" update-index --refresh &&
+	git -C "$sub_dir" diff-files --exit-code &&
+	cached_super_dir="$(git -C "$sub_dir" config --get submodule.superprojectGitDir)" &&
+	[ "$(git -C "$super_dir" rev-parse --absolute-git-dir)" \
+		-ef "$sub_dir/$cached_super_dir" ] &&
+	git -C "$sub_dir" clean -n -d -x >untracked
You rewrote this test in the previous patch, and now every line is changed
because you renamed 'dir' to 'sub_dir'. Could the previous patch use
'sub_dir' from the start so this change only shows the new lines instead of
many edited lines?
quoted hunk ↗ jump to hunk
 }
 
 test_expect_success 'submodule add' '
@@ -138,7 +142,7 @@ test_expect_success 'submodule add' '
 	) &&
 
 	rm -f heads head untracked &&
-	inspect addtest/submod &&
+	inspect addtest/submod addtest &&
Similarly, I would not be upset to see these lines be changed just the
once, even if the second argument is ignored for a single commit. But
this nitpick is definitely less important since I could see taste
swaying things either way.

Thanks,
-Stolee
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help