Skip to content

Checkout aware of Submodules!

Stefan Beller git 9 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v9 Latest19 patches 1 replyIn review
  2. v8 RFC17 patches 8 repliesSuperseded
  3. v7 RFC0 of 18 patches 0 repliesSuperseded
Earlier versions · 6
VersionPostedPatchesRepliesStatus
v6 RFC18 patches15 repliesSuperseded
v5 RFC0 of 14 patches0 repliesSuperseded
v4 RFC0 of 14 patches4 repliesSuperseded
v3 RFC14 patches16 repliesSuperseded
v2 RFC17 patches12 repliesSuperseded
v1 RFC16 patches33 repliesSuperseded

Changes in v9 from the cover letter

* inderdiff to current origin/sb/checkout-recurse-submodules below
* fixed a '\' that was violating the style guide.
* reordered the patches, such that
-> the first two patches are Valerys series and could go on its own as
a cleanup
-> added a new patch "submodule.c: get_super_prefix_or_empty" to
have cleaner code.
* split up the error conditions in the test lib for readability

Patches in v9 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/19connect_work_tree_and_git_dir: safely create leading directoriesdir.c submodule.c+23 -200 replies
2/19submodule--helper.c: remove duplicate codebuiltin/submodule--helper.c+2 -200 replies
3/19lib-submodule-update.sh: reorder create_lib_submodule_repot/lib-submodule-update.sh+29 -200 replies
4/19lib-submodule-update.sh: do not use ./. as submodule remotet/lib-submodule-update.sh+13 -20 replies
5/19lib-submodule-update: teach test_submodule_content the -C <dir> flagt/lib-submodule-update.sh+5 -00 replies
6/19lib-submodule-update.sh: replace sha1 by hasht/lib-submodule-update.sh+3 -30 replies
7/19lib-submodule-update.sh: define tests for recursing into submodulest/lib-submodule-update.sh+504 -20 replies
8/19make is_submodule_populated gentlybuiltin/grep.c submodule.c submodule.h+10 -70 replies
9/19update submodules: add submodule config parsingsubmodule-config.c submodule-config.h+29 -80 replies
10/19update submodules: add a config option to determine if submodules are updatedsubmodule.c submodule.h+7 -00 replies
11/19submodules: introduce check to see whether to touch a submodulesubmodule.c submodule.h+23 -00 replies
12/19update submodules: move up prepare_submodule_repo_envsubmodule.c+17 -120 replies
13/19submodule.c: get_super_prefix_or_emptysubmodule.c+10 -60 replies
14/19update submodules: add submodule_move_headsubmodule.c submodule.h+144 -00 replies
15/19unpack-trees: pass old oid to verify_clean_submoduleunpack-trees.c+10 -70 replies
16/19unpack-trees: check if we can perform the operation for submodulesunpack-trees.c unpack-trees.h+123 -90 replies
17/19entry.c: create submodules when interestingentry.c+30 -00 replies
18/19builtin/checkout: add --recurse-submodules switchDocumentation/git-checkout.txt builtin/checkout.c t/lib-submodule-update.sh +1 more+62 -50 replies
19/19builtin/read-tree: add --recurse-submodules switchDocumentation/git-read-tree.txt builtin/read-tree.c t/lib-submodule-update.sh +1 more+49 -10 replies

Reviews trailers per patch

1 of 19 patches has a Reviewed-by or Acked-by.

PatchBrandon Williams
1/19
2/19R-b
3/19
4/19
5/19
6/19
7/19
8/19
9/19
10/19
11/19
12/19
13/19
14/19
15/19
16/19
17/19
18/19
19/19

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v9 thread

Cover letter [PATCHv9 00/19] Checkout aware of Submodules!

previous work:
https://public-inbox.org/git/[email protected]/

v9:
* inderdiff to current origin/sb/checkout-recurse-submodules below
* fixed a '\' that was violating the style guide.
* reordered the patches, such that
-> the first two patches are Valerys series and could go on its own as
a cleanup
-> added a new patch "submodule.c: get_super_prefix_or_empty" to
have cleaner code.
* split up the error conditions in the test lib for readability

v1..v8: see description in link to previous work above.

Thanks,
Stefan

submodule.c +16 -10
index bc5fecf8c5..929fc7bf04 100644
@@ -1239,6 +1239,14 @@ int bad_to_remove_submodule(const char *path, unsigned flags)
 	return ret;
 }
 
+static const char *get_super_prefix_or_empty()
+{
+	const char *s = get_super_prefix();
+	if (!s)
+		s = "";
+	return s;
+}
+
 static int submodule_has_dirty_index(const struct submodule *sub)
 {
 	struct child_process cp = CHILD_PROCESS_INIT;
@@ -1246,8 +1254,8 @@ static int submodule_has_dirty_index(const struct submodule *sub)
 	prepare_submodule_repo_env_no_git_dir(&cp.env_array);
 
 	cp.git_cmd = 1;
-	argv_array_pushl(&cp.args, "diff-index", "--quiet", \
-					"--cached", "HEAD", NULL);
+	argv_array_pushl(&cp.args, "diff-index", "--quiet",
+				   "--cached", "HEAD", NULL);
 	cp.no_stdin = 1;
 	cp.no_stdout = 1;
 	cp.dir = sub->path;
@@ -1266,7 +1274,8 @@ static void submodule_reset_index(const char *path)
 	cp.no_stdin = 1;
 	cp.dir = path;
 
-	argv_array_pushf(&cp.args, "--super-prefix=%s/", path);
+	argv_array_pushf(&cp.args, "--super-prefix=%s%s/",
+				   get_super_prefix_or_empty(), path);
 	argv_array_pushl(&cp.args, "read-tree", "-u", "--reset", NULL);
 
 	argv_array_push(&cp.args, EMPTY_TREE_SHA1_HEX);
@@ -1323,7 +1332,8 @@ int submodule_move_head(const char *path,
 	cp.no_stdin = 1;
 	cp.dir = path;
 
-	argv_array_pushf(&cp.args, "--super-prefix=%s/", path);
+	argv_array_pushf(&cp.args, "--super-prefix=%s%s/",
+			get_super_prefix_or_empty(), path);
 	argv_array_pushl(&cp.args, "read-tree", NULL);
 
 	if (flags & SUBMODULE_MOVE_HEAD_DRY_RUN)
@@ -1573,11 +1583,8 @@ static void relocate_single_git_dir_into_superproject(const char *prefix,
 		die(_("could not create directory '%s'"), new_git_dir);
 	real_new_git_dir = real_pathdup(new_git_dir);
 
-	if (!prefix)
-		prefix = get_super_prefix();
-
 	fprintf(stderr, _("Migrating git directory of '%s%s' from\n'%s' to\n'%s'\n"),
-		prefix ? prefix : "", path,
+		get_super_prefix_or_empty(), path,
 		real_old_git_dir, real_new_git_dir);
 
 	relocate_gitdir(path, real_old_git_dir, real_new_git_dir);
@@ -1648,8 +1655,7 @@ void absorb_git_dir_into_superproject(const char *prefix,
 		if (flags & ~ABSORB_GITDIR_RECURSE_SUBMODULES)
 			die("BUG: we don't know how to pass the flags down?");
 
-		if (get_super_prefix())
-			strbuf_addstr(&sb, get_super_prefix());
+		strbuf_addstr(&sb, get_super_prefix_or_empty());
 		strbuf_addstr(&sb, path);
 		strbuf_addch(&sb, '/');
 
t/lib-submodule-update.sh +16 -11
index e195b590a1..fb4f7b014e 100755
@@ -782,15 +782,20 @@ test_submodule_forced_switch () {
 
 test_submodule_switch_recursing () {
 	command="$1"
-	RESULT=success
+	RESULTDS=success
 	if test "$KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS" = 1
 	then
-		RESULT=failure
+		RESULTDS=failure
+	fi
+	RESULTR=success
+	if test "$KNOWN_FAILURE_SUBMODULE_RECURSIVE_NESTED" = 1
+	then
+		RESULTR=failure
 	fi
-	RESULT1=success
+	RESULTOI=success
 	if test "$KNOWN_FAILURE_SUBMODULE_OVERWRITE_IGNORED_UNTRACKED" = 1
 	then
-		RESULT1=failure
+		RESULTOI=failure
 	fi
 	######################### Appearing submodule #########################
 	# Switching to a commit letting a submodule appear checks it out ...
@@ -832,7 +837,7 @@ test_submodule_switch_recursing () {
 		)
 	'
 	# ... but an ignored file is fine.
-	test_expect_$RESULT1 "$command: added submodule removes an untracked ignored file" '
+	test_expect_$RESULTOI "$command: added submodule removes an untracked ignored file" '
 		test_when_finished "rm submodule_update/.git/info/exclude" &&
 		prolog &&
 		reset_work_tree_to_interested no_submodule &&
@@ -901,7 +906,7 @@ test_submodule_switch_recursing () {
 	'
 	# Replacing a submodule with files in a directory must succeeds
 	# when the submodule is clean
-	test_expect_$RESULT "$command: replace submodule with a directory" '
+	test_expect_$RESULTDS "$command: replace submodule with a directory" '
 		prolog &&
 		reset_work_tree_to_interested add_sub1 &&
 		(
@@ -913,7 +918,7 @@ test_submodule_switch_recursing () {
 		)
 	'
 	# ... absorbing a .git directory.
-	test_expect_$RESULT "$command: replace submodule containing a .git directory with a directory must absorb the git dir" '
+	test_expect_$RESULTDS "$command: replace submodule containing a .git directory with a directory must absorb the git dir" '
 		prolog &&
 		reset_work_tree_to_interested add_sub1 &&
 		(
@@ -941,7 +946,7 @@ test_submodule_switch_recursing () {
 	'
 
 	# ... must check its local work tree for untracked files
-	test_expect_$RESULT "$command: replace submodule with a file must fail with untracked files" '
+	test_expect_$RESULTDS "$command: replace submodule with a file must fail with untracked files" '
 		prolog &&
 		reset_work_tree_to_interested add_sub1 &&
 		(
@@ -998,7 +1003,7 @@ test_submodule_switch_recursing () {
 	'
 
 	# recursing deeper than one level doesn't work yet.
-	test_expect_failure "$command: modified submodule updates submodule recursively" '
+	test_expect_$RESULTR "$command: modified submodule updates submodule recursively" '
 		prolog &&
 		reset_work_tree_to_interested add_nested_sub &&
 		(
@@ -1116,13 +1121,13 @@ test_submodule_forced_switch_recursing () {
 		)
 	'
 	# Replacing a submodule with files in a directory ...
-	test_expect_$RESULT "$command: replace submodule with a directory" '
+	test_expect_success "$command: replace submodule with a directory" '
 		prolog &&
 		reset_work_tree_to_interested add_sub1 &&
 		(
 			cd submodule_update &&
 			git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
-			test_must_fail $command replace_sub1_with_directory &&
+			$command replace_sub1_with_directory &&
 			test_superproject_content origin/replace_sub1_with_directory
 		)
 	'
t/t1013-read-tree-submodule.sh +1 -0
index 7019d0a04f..de1ba02dc5 100755
@@ -5,6 +5,7 @@ test_description='read-tree can handle submodules'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-submodule-update.sh
 
+KNOWN_FAILURE_SUBMODULE_RECURSIVE_NESTED=1
 KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS=1
 KNOWN_FAILURE_SUBMODULE_OVERWRITE_IGNORED_UNTRACKED=1
 
t/t2013-checkout-submodule.sh +1 -0
index aa35223369..e8f70b806f 100755
@@ -64,6 +64,7 @@ test_expect_success '"checkout <submodule>" honors submodule.*.ignore from .git/
 '
 
 KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS=1
+KNOWN_FAILURE_SUBMODULE_RECURSIVE_NESTED=1
 test_submodule_switch_recursing "git checkout --recurse-submodules"
 
 test_submodule_forced_switch_recursing "git checkout -f --recurse-submodules"