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

[PATCH 2/2] push: Use "last one wins" convention for --recurse-submodules

From
Mike Crowe <mac@mcrowe.com>
Date
Dec 3, 2015, 13:10 UTC
Message-ID
<1449148235-29569-2-git-send-email-mac@mcrowe.com>
In-Reply-To
<1449148235-29569-1-git-send-email-mac@mcrowe.com>

Use the "last one wins" convention for --recurse-submodules rather than treating conflicting options as an error.

Also, fix the declaration of the file-scope recurse_submodules global variable to put it on a separate line.

Signed-off-by: Mike Crowe <mac@mcrowe.com>
---
 builtin/push.c                 | 12 +++---------
 t/t5531-deep-submodule-push.sh | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/builtin/push.c b/builtin/push.c
index f9b59b4..cc29277 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -21,7 +21,8 @@ static int thin = 1;
 static int deleterefs;
 static const char *receivepack;
 static int verbosity;
-static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
+static int progress = -1;
+static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
 
 static struct push_cas_option cas;
 
@@ -455,9 +456,6 @@ static int option_parse_recurse_submodules(const struct option *opt,
 {
 	int *recurse_submodules = opt->value;
 
-	if (*recurse_submodules != RECURSE_SUBMODULES_DEFAULT)
-		die("%s can only be used once.", opt->long_name);
-
 	if (unset)
 		*recurse_submodules = RECURSE_SUBMODULES_OFF;
 	else if (arg)
@@ -532,7 +530,6 @@ int cmd_push(int argc, const char **argv, const char *prefix)
 	int flags = 0;
 	int tags = 0;
 	int push_cert = -1;
-	int recurse_submodules_from_cmdline = RECURSE_SUBMODULES_DEFAULT;
 	int rc;
 	const char *repo = NULL;	/* default repository */
 	struct option options[] = {
@@ -550,7 +547,7 @@ int cmd_push(int argc, const char **argv, const char *prefix)
 		  0, CAS_OPT_NAME, &cas, N_("refname>:<expect"),
 		  N_("require old value of ref to be at this value"),
 		  PARSE_OPT_OPTARG, parseopt_push_cas_option },
-		{ OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules_from_cmdline, N_("check|on-demand|no"),
+		{ OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules, N_("check|on-demand|no"),
 			N_("control recursive pushing of submodules"),
 			PARSE_OPT_OPTARG, option_parse_recurse_submodules },
 		OPT_BOOL( 0 , "thin", &thin, N_("use thin pack")),
@@ -581,9 +578,6 @@ int cmd_push(int argc, const char **argv, const char *prefix)
 	if (deleterefs && argc < 2)
 		die(_("--delete doesn't make sense without any refs"));
 
-	if (recurse_submodules_from_cmdline != RECURSE_SUBMODULES_DEFAULT)
-		recurse_submodules = recurse_submodules_from_cmdline;
-
 	if (recurse_submodules == RECURSE_SUBMODULES_CHECK)
 		flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
 	else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh
index 721be32..198ce84 100755
--- a/t/t5531-deep-submodule-push.sh
+++ b/t/t5531-deep-submodule-push.sh
@@ -171,6 +171,47 @@ test_expect_success 'push recurse-submodules on command line overrides config' '
 	)
 '
 
+test_expect_success 'push recurse-submodules last one wins on command line' '
+	(
+		cd work/gar/bage &&
+		>recurse-check-on-command-line-overriding-earlier-command-line &&
+		git add recurse-check-on-command-line-overriding-earlier-command-line &&
+		git commit -m "Recurse on command-line overridiing earlier command-line junk"
+	) &&
+	(
+		cd work &&
+		git add gar/bage &&
+		git commit -m "Recurse on command-line overriding earlier command-line for gar/bage" &&
+
+		# should result in "check"
+		test_must_fail git push --recurse-submodules=on-demand --recurse-submodules=check ../pub.git master &&
+		# Check that the supermodule commit did not get there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master^ &&
+		# Check that the submodule commit did not get there
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# should result in "no"
+		git push --recurse-submodules=on-demand --recurse-submodules=no ../pub.git master &&
+		# Check that the supermodule commit did get there
+		git fetch ../pub.git &&
+		git diff --quiet FETCH_HEAD master &&
+		# Check that the submodule commit did not get there
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# should result in "no"
+		git push --recurse-submodules=on-demand --no-recurse-submodules ../pub.git master &&
+		# Check that the submodule commit did not get there
+		(cd gar/bage && git diff --quiet origin/master master^) &&
+
+		# But the options in the other order should push the submodule
+		git push --recurse-submodules=check --recurse-submodules=on-demand ../pub.git master &&
+		# Check that the submodule commit did get there
+		git fetch ../pub.git &&
+		(cd gar/bage && git diff --quiet origin/master master)
+	)
+'
+
 test_expect_success 'push succeeds if submodule commit not on remote using on-demand from cmdline overriding config' '
 	(
 		cd work/gar/bage &&
-- 
2.1.4
Previous: Mike CroweNext: Junio C Hamano
Message 8 of 16 in “push: add recurseSubmodules config option”
  1. push: add recurseSubmodules config optionMike Crowe, Dec 1, 2015
  2. Jeff KingDec 2, 2015
  3. Mike CroweDec 2, 2015
  4. push: Improve --recurse-submodules supportMike Crowe, Dec 2, 2015
  5. Junio C HamanoDec 2, 2015
  6. Mike CroweDec 3, 2015
  7. 1/2 push: Fully test --recurse-submodules on command line overrides configMike Crowe, Dec 3, 2015
  8. 2/2 push: Use "last one wins" convention for --recurse-submodulesMike Crowe, Dec 3, 2015
  9. Junio C HamanoDec 4, 2015
  10. Stefan BellerDec 10, 2015
  11. Junio C HamanoDec 10, 2015
  12. Stefan BellerDec 10, 2015
  13. Stefan BellerDec 16, 2015
  14. Junio C HamanoDec 16, 2015
  15. Stefan BellerDec 16, 2015
  16. Junio C HamanoDec 17, 2015

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.