git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 07/10] submodule init: initialize active submodules

From
BWBrandon Williams <bmwill@google.com>
Date
Mar 17, 2017, 22:38 UTC
Message-ID
<20170317223805.95271-8-bmwill@google.com>
In-Reply-To
<20170317223805.95271-1-bmwill@google.com>

Teach `submodule init` to initialize submodules which have been configured to be active by setting 'submodule.active' with a pathspec.

Now if no path arguments are given and 'submodule.active' is configured, `init` will initialize all submodules which have been configured to be active. If no path arguments are given and 'submodule.active' is not configured, then `init` will retain the old behavior of initializing all submodules.

This allows users to record more complex patterns as it saves retyping them whenever you invoke update.

Signed-off-by: Brandon Williams <bmwill@google.com>
---
 Documentation/git-submodule.txt |  4 ++-
 builtin/submodule--helper.c     | 30 ++++++++++++++++++++++
 t/t7400-submodule-basic.sh      | 57 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index e05d0cdde..74bc6200d 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -129,7 +129,9 @@ init [--] [<path>...]::
 	repository will be assumed to be upstream.
 +
 Optional <path> arguments limit which submodules will be initialized.
-If no path is specified, all submodules are initialized.
+If no path is specified and submodule.active has been configured, submodules
+configured to be active will be initialized, otherwise all submodules are
+initialized.
 +
 When present, it will also copy the value of `submodule.$name.update`.
 This command does not alter existing information in .git/config.
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index f38e332c5..65208faa7 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -270,6 +270,29 @@ static int module_list_compute(int argc, const char **argv,
 	return result;
 }
 
+static void module_list_active(struct module_list *list)
+{
+	int i;
+	struct module_list active_modules = MODULE_LIST_INIT;
+
+	gitmodules_config();
+
+	for (i = 0; i < list->nr; i++) {
+		const struct cache_entry *ce = list->entries[i];
+
+		if (!is_submodule_initialized(ce->name))
+			continue;
+
+		ALLOC_GROW(active_modules.entries,
+			   active_modules.nr + 1,
+			   active_modules.alloc);
+		active_modules.entries[active_modules.nr++] = ce;
+	}
+
+	free(list->entries);
+	*list = active_modules;
+}
+
 static int module_list(int argc, const char **argv, const char *prefix)
 {
 	int i;
@@ -420,6 +443,13 @@ static int module_init(int argc, const char **argv, const char *prefix)
 	if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
 		return 1;
 
+	/*
+	 * If there are no path args and submodule.active is set then,
+	 * by default, only initialize 'active' modules.
+	 */
+	if (!argc && git_config_get_value_multi("submodule.active"))
+		module_list_active(&list);
+
 	for (i = 0; i < list.nr; i++)
 		init_submodule(list.entries[i]->name, prefix, quiet);
 
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index c09ce0d4c..fbbe932d1 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -1130,5 +1130,62 @@ test_expect_success 'submodule helper list is not confused by common prefixes' '
 	test_cmp expect actual
 '
 
+test_expect_success 'setup superproject with submodules' '
+	git init sub1 &&
+	test_commit -C sub1 test &&
+	test_commit -C sub1 test2 &&
+	git init multisuper &&
+	git -C multisuper submodule add ../sub1 sub0 &&
+	git -C multisuper submodule add ../sub1 sub1 &&
+	git -C multisuper submodule add ../sub1 sub2 &&
+	git -C multisuper submodule add ../sub1 sub3 &&
+	git -C multisuper commit -m "add some submodules"
+'
+
+cat >expect <<-EOF
+-sub0
+ sub1 (test2)
+ sub2 (test2)
+ sub3 (test2)
+EOF
+
+test_expect_success 'submodule update --init with a specification' '
+	test_when_finished "rm -rf multisuper_clone" &&
+	pwd=$(pwd) &&
+	git clone file://"$pwd"/multisuper multisuper_clone &&
+	git -C multisuper_clone submodule update --init . ":(exclude)sub0" &&
+	git -C multisuper_clone submodule status |cut -c 1,43- >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'submodule update --init with submodule.active set' '
+	test_when_finished "rm -rf multisuper_clone" &&
+	pwd=$(pwd) &&
+	git clone file://"$pwd"/multisuper multisuper_clone &&
+	git -C multisuper_clone config submodule.active "." &&
+	git -C multisuper_clone config --add submodule.active ":(exclude)sub0" &&
+	git -C multisuper_clone submodule update --init &&
+	git -C multisuper_clone submodule status |cut -c 1,43- >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'submodule update and setting submodule.<name>.active' '
+	test_when_finished "rm -rf multisuper_clone" &&
+	pwd=$(pwd) &&
+	git clone file://"$pwd"/multisuper multisuper_clone &&
+	git -C multisuper_clone config --bool submodule.sub0.active "true" &&
+	git -C multisuper_clone config --bool submodule.sub1.active "false" &&
+	git -C multisuper_clone config --bool submodule.sub2.active "true" &&
+
+	cat >expect <<-\EOF &&
+	 sub0 (test2)
+	-sub1
+	 sub2 (test2)
+	-sub3
+	EOF
+	git -C multisuper_clone submodule update &&
+	git -C multisuper_clone submodule status |cut -c 1,43- >actual &&
+	test_cmp expect actual
+'
 
 test_done
-- 
2.12.0.367.g23dc2f6d3c-goog
Previous: Brandon WilliamsNext: Brandon Williams
Message 120 of 123 in “decoupling a submodule's existence and its url”
  1. 00/10 decoupling a submodule's existence and its urlBrandon Williams, Feb 23, 2017
  2. 06/10 submodule add: respect submodule.activeBrandon Williams, Feb 23, 2017
  3. 09/10 submodule sync: use submodule--helper is-activeBrandon Williams, Feb 23, 2017
  4. 04/10 completion: clone can initialize specific submodulesBrandon Williams, Feb 23, 2017
  5. 01/10 submodule: decouple url and submodule existenceBrandon Williams, Feb 23, 2017
  6. Junio C HamanoFeb 24, 2017
  7. Brandon WilliamsMar 1, 2017
  8. Stefan BellerMar 1, 2017
  9. Brandon WilliamsMar 6, 2017
  10. Junio C HamanoMar 2, 2017
  11. 03/10 clone: add --submodule-spec=<pathspec> switchBrandon Williams, Feb 23, 2017
  12. 07/10 submodule status: use submodule--helper is-activeBrandon Williams, Feb 23, 2017
  13. 08/10 submodule deinit: use most reliable urlBrandon Williams, Feb 23, 2017
  14. 10/10 submodule--helper clone: check for configured submodules using helperBrandon Williams, Feb 23, 2017
  15. Stefan BellerFeb 24, 2017
  16. Brandon WilliamsFeb 27, 2017
  17. 02/10 submodule update: add `--init-active` switchBrandon Williams, Feb 23, 2017
  18. 05/10 submodule--helper: add is_active commandBrandon Williams, Feb 23, 2017
  19. Stefan BellerFeb 24, 2017
  20. Brandon WilliamsFeb 27, 2017
  21. Stefan BellerFeb 23, 2017
  22. 00/11 decoupling a submodule's existence and its urlBrandon Williams, Mar 9, 2017
  23. 05/11 submodule--helper clone: check for configured submodules using helperBrandon Williams, Mar 9, 2017
  24. 02/11 submodule status: use submodule--helper is-activeBrandon Williams, Mar 9, 2017
  25. 04/11 submodule sync: use submodule--helper is-activeBrandon Williams, Mar 9, 2017
  26. 01/11 submodule--helper: add is_active commandBrandon Williams, Mar 9, 2017
  27. 11/11 submodule add: respect submodule.active and submodule.<name>.activeBrandon Williams, Mar 9, 2017
  28. 06/11 submodule: decouple url and submodule existenceBrandon Williams, Mar 9, 2017
  29. 09/11 completion: clone can initialize specific submodulesBrandon Williams, Mar 9, 2017
  30. 07/11 submodule update: add `--init-active` switchBrandon Williams, Mar 9, 2017
  31. Stefan BellerMar 9, 2017
  32. Brandon WilliamsMar 9, 2017
  33. 08/11 clone: add --submodule-spec=<pathspec> switchBrandon Williams, Mar 9, 2017
  34. 10/11 submodule--helper init: set submodule.<name>.activeBrandon Williams, Mar 9, 2017
  35. Stefan BellerMar 9, 2017
  36. Brandon WilliamsMar 9, 2017
  37. 03/11 submodule deinit: use most reliable urlBrandon Williams, Mar 9, 2017
  38. Stefan BellerMar 9, 2017
  39. Brandon WilliamsMar 9, 2017
  40. 00/10 decoupling a submodule's existence and its urlBrandon Williams, Mar 13, 2017
  41. 01/10 submodule--helper: add is_active commandBrandon Williams, Mar 13, 2017
  42. Stefan BellerMar 13, 2017
  43. Junio C HamanoMar 14, 2017
  44. Brandon WilliamsMar 14, 2017
  45. 02/10 submodule status: use submodule--helper is-activeBrandon Williams, Mar 13, 2017
  46. Junio C HamanoMar 14, 2017
  47. Stefan BellerMar 14, 2017
  48. Junio C HamanoMar 14, 2017
  49. Junio C HamanoMar 14, 2017
  50. Brandon WilliamsMar 14, 2017
  51. Brandon WilliamsMar 14, 2017
  52. 03/10 submodule sync: use submodule--helper is-activeBrandon Williams, Mar 13, 2017
  53. Junio C HamanoMar 14, 2017
  54. Brandon WilliamsMar 14, 2017
  55. 05/10 submodule: decouple url and submodule existenceBrandon Williams, Mar 13, 2017
  56. Stefan BellerMar 13, 2017
  57. Brandon WilliamsMar 15, 2017
  58. Junio C HamanoMar 14, 2017
  59. Junio C HamanoMar 14, 2017
  60. Brandon WilliamsMar 15, 2017
  61. 07/10 clone: add --submodule-spec=<pathspec> switchBrandon Williams, Mar 13, 2017
  62. Junio C HamanoMar 14, 2017
  63. Brandon WilliamsMar 15, 2017
  64. Stefan BellerMar 15, 2017
  65. 08/10 completion: clone can initialize specific submodulesBrandon Williams, Mar 13, 2017
  66. 09/10 submodule--helper init: set submodule.<name>.activeBrandon Williams, Mar 13, 2017
  67. Junio C HamanoMar 14, 2017
  68. Brandon WilliamsMar 15, 2017
  69. Junio C HamanoMar 16, 2017
  70. 04/10 submodule--helper clone: check for configured submodules using helperBrandon Williams, Mar 13, 2017
  71. Junio C HamanoMar 14, 2017
  72. Stefan BellerMar 14, 2017
  73. Junio C HamanoMar 14, 2017
  74. Brandon WilliamsMar 15, 2017
  75. 10/10 submodule add: respect submodule.active and submodule.<name>.activeBrandon Williams, Mar 13, 2017
  76. Junio C HamanoMar 14, 2017
  77. Brandon WilliamsMar 15, 2017
  78. 06/10 submodule update: add `--init-active` switchBrandon Williams, Mar 13, 2017
  79. Junio C HamanoMar 14, 2017
  80. Brandon WilliamsMar 15, 2017
  81. Junio C HamanoMar 14, 2017
  82. Brandon WilliamsMar 15, 2017
  83. Stefan BellerMar 13, 2017
  84. Junio C HamanoMar 14, 2017
  85. Brandon WilliamsMar 14, 2017
  86. 00/10 decoupling url and submodule interestBrandon Williams, Mar 16, 2017
  87. 06/10 submodule: decouple url and submodule interestBrandon Williams, Mar 16, 2017
  88. Stefan BellerMar 16, 2017
  89. 03/10 submodule sync: skip work for inactive submodulesBrandon Williams, Mar 16, 2017
  90. Stefan BellerMar 16, 2017
  91. Brandon WilliamsMar 16, 2017
  92. Stefan BellerMar 16, 2017
  93. Junio C HamanoMar 17, 2017
  94. Brandon WilliamsMar 17, 2017
  95. Junio C HamanoMar 17, 2017
  96. 05/10 submodule--helper clone: check for configured submodules using helperBrandon Williams, Mar 16, 2017
  97. 02/10 submodule status: use submodule--helper is-activeBrandon Williams, Mar 16, 2017
  98. 08/10 clone: teach --recurse-submodules to optionally take a pathspecBrandon Williams, Mar 16, 2017
  99. Stefan BellerMar 17, 2017
  100. Brandon WilliamsMar 17, 2017
  101. 04/10 submodule sync: use submodule--helper is-activeBrandon Williams, Mar 16, 2017
  102. 07/10 submodule init: initialize active submodulesBrandon Williams, Mar 16, 2017
  103. Stefan BellerMar 17, 2017
  104. Brandon WilliamsMar 17, 2017
  105. Stefan BellerMar 17, 2017
  106. 01/10 submodule--helper: add is-active subcommandBrandon Williams, Mar 16, 2017
  107. 10/10 submodule add: respect submodule.active and submodule.<name>.activeBrandon Williams, Mar 16, 2017
  108. 09/10 submodule--helper init: set submodule.<name>.activeBrandon Williams, Mar 16, 2017
  109. Stefan BellerMar 17, 2017
  110. Brandon WilliamsMar 17, 2017
  111. 00/10 decoupling url and submodule interestBrandon Williams, Mar 17, 2017
  112. 06/10 submodule: decouple url and submodule interestBrandon Williams, Mar 17, 2017
  113. 09/10 submodule--helper init: set submodule.<name>.activeBrandon Williams, Mar 17, 2017
  114. 05/10 submodule--helper clone: check for configured submodules using helperBrandon Williams, Mar 17, 2017
  115. 03/10 submodule sync: skip work for inactive submodulesBrandon Williams, Mar 17, 2017
  116. 02/10 submodule status: use submodule--helper is-activeBrandon Williams, Mar 17, 2017
  117. Stefan BellerMar 17, 2017
  118. 08/10 clone: teach --recurse-submodules to optionally take a pathspecBrandon Williams, Mar 17, 2017
  119. 01/10 submodule--helper: add is-active subcommandBrandon Williams, Mar 17, 2017
  120. 07/10 submodule init: initialize active submodulesBrandon Williams, Mar 17, 2017
  121. 04/10 submodule sync: use submodule--helper is-activeBrandon Williams, Mar 17, 2017
  122. 10/10 submodule add: respect submodule.active and submodule.<name>.activeBrandon Williams, Mar 17, 2017
  123. Junio C HamanoMar 18, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.