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

Re: [PATCHv3 1/3] merge: Add '--continue' option as a synonym for 'git commit'

From
Jeff King <peff@peff.net>
Date
Dec 14, 2016, 15:20 UTC
Message-ID
<20161214152039.swtll7xrmcdwz7bc@sigill.intra.peff.net>
In-Reply-To
<20161214083757.26412-1-judge.packham@gmail.com>
On Wed, Dec 14, 2016 at 09:37:55PM +1300, Chris Packham wrote:
Show 7 quoted lines
> +	if (continue_current_merge) {
> +		int nargc = 1;
> +		const char *nargv[] = {"commit", NULL};
> +
> +		if (orig_argc != 2)
> +			usage_msg_opt("--continue expects no arguments",
> +			      builtin_merge_usage, builtin_merge_options);
This message should probably be inside a _() for translation.
I noticed when running it that the output looks funny:
  $ git merge --continue foo
  --continue expects no arguments
  usage: [...]

I was going to suggest adding something like "fatal:" here, but I actually think it should be the responsibility of usage_msg_opt(). Looking at its other callers, they would all benefit. I posted a patch:

  http://public-inbox.org/git/20161214151009.4wdzjb44f6aki5ug@sigill.intra.peff.net/

I also wondered what it would look like to support "--quiet" on top of this. I don't care that much about it in particular, but I just want to make sure we're not painting ourselves into a corner.

Here's what I came up with;
diff --git a/builtin/merge.c b/builtin/merge.c
index 668aaffb8..b13523ce9 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -1160,10 +1160,16 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 		show_progress = 0;
 
 	if (abort_current_merge) {
-		int nargc = 2;
-		const char *nargv[] = {"reset", "--merge", NULL};
+		int acceptable_arguments = 2; /* argv[0] plus --abort */
+		struct argv_array nargv = ARGV_ARRAY_INIT;
 
-		if (orig_argc != 2)
+		argv_array_pushl(&nargv, "reset", "--merge", NULL);
+		if (verbosity < 0) {
+			acceptable_arguments++;
+			argv_array_push(&nargv, "--quiet");
+		}
+
+		if (orig_argc != acceptable_arguments)
 			usage_msg_opt("--abort expects no arguments",
 			      builtin_merge_usage, builtin_merge_options);
 
@@ -1171,15 +1177,22 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 			die(_("There is no merge to abort (MERGE_HEAD missing)."));
 
 		/* Invoke 'git reset --merge' */
-		ret = cmd_reset(nargc, nargv, prefix);
+		ret = cmd_reset(nargv.argc, nargv.argv, prefix);
+		argv_array_clear(&nargv);
 		goto done;
 	}
 
 	if (continue_current_merge) {
-		int nargc = 1;
-		const char *nargv[] = {"commit", NULL};
+		int acceptable_arguments = 2; /* argv[0] plus --abort */
+		struct argv_array nargv = ARGV_ARRAY_INIT;
+
+		argv_array_push(&nargv, "commit");
+		if (verbosity < 0) {
+			acceptable_arguments++;
+			argv_array_push(&nargv, "--quiet");
+		}
 
-		if (orig_argc != 2)
+		if (orig_argc != acceptable_arguments)
 			usage_msg_opt("--continue expects no arguments",
 			      builtin_merge_usage, builtin_merge_options);
 
@@ -1187,7 +1200,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 			die(_("There is no merge in progress (MERGE_HEAD missing)."));
 
 		/* Invoke 'git commit' */
-		ret = cmd_commit(nargc, nargv, prefix);
+		ret = cmd_commit(nargv.argc, nargv.argv, prefix);
+		argv_array_clear(&nargv);
 		goto done;
 	}
 

So not too bad (and you could probably refactor it to avoid some of the
duplication). Though it does get some obscure cases wrong, like:

  git merge --continue --verbose --quiet

I dunno. Maybe I am leading you down a rabbit hole, and we should just
live with silently ignoring useless options. I looked at what
cherry-pick does for this case, and its verify_opt_compatible is
somewhat scary from a maintenance standpoint. It's a whitelist, not a
blacklist, so it's easy to forget options (and it looks like "git
cherry-pick --abort -Sfoo" is missed, for example).

-Peff
Previous: Chris PackhamNext: Junio C Hamano
Message 19 of 26 in “Any interest in 'git merge --continue' as a command”
  1. Chris PackhamDec 9, 2016
  2. Jeff KingDec 9, 2016
  3. Jacob KellerDec 9, 2016
  4. Junio C HamanoDec 9, 2016
  5. Chris PackhamDec 10, 2016
  6. Jeff KingDec 10, 2016
  7. Jacob KellerDec 10, 2016
  8. merge: Add '--continue' option as a synonym for 'git commit'Chris Packham, Dec 12, 2016
  9. Markus HitterDec 12, 2016
  10. Chris PackhamDec 13, 2016
  11. Jeff KingDec 12, 2016
  12. 1/2 merge: Add '--continue' option as a synonym for 'git commit'Chris Packham, Dec 13, 2016
  13. 2/2 completion: add --continue option for mergeChris Packham, Dec 13, 2016
  14. Jeff KingDec 13, 2016
  15. Junio C HamanoDec 13, 2016
  16. 1/3 merge: Add '--continue' option as a synonym for 'git commit'Chris Packham, Dec 14, 2016
  17. 2/3 completion: add --continue option for mergeChris Packham, Dec 14, 2016
  18. 3/3 merge: Ensure '--abort' option takes no argumentsChris Packham, Dec 14, 2016
  19. Jeff KingDec 14, 2016
  20. Junio C HamanoDec 14, 2016
  21. Junio C HamanoDec 14, 2016
  22. Chris PackhamDec 15, 2016
  23. Junio C HamanoDec 15, 2016
  24. Jeff KingDec 15, 2016
  25. Jeff KingDec 10, 2016
  26. Junio C HamanoDec 10, 2016

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.