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

[RFC/PATCH 2/4] replace: use OPT_CMDMODE to handle modes

From
Jeff King <peff@peff.net>
Date
Mar 6, 2014, 17:49 UTC
Message-ID
<20140306174921.GB30691@sigill.intra.peff.net>
In-Reply-To
<20140306174803.GA30486@sigill.intra.peff.net>

By using OPT_CMDMODE, the mutual exclusion between modes is taken care of for us. It also makes it easy for us to maintain a single variable with the mode, which makes its intent more clear. We can use a single switch() to make sure we have covered all of the modes.

This ends up breaking even in code size, but the win will be much bigger when we start adding more modes.

Signed-off-by: Jeff King <peff@peff.net>
---
 builtin/replace.c | 49 +++++++++++++++++++++++++------------------------
 1 file changed, 25 insertions(+), 24 deletions(-)
diff --git a/builtin/replace.c b/builtin/replace.c
index 6a0e8bd..0b5cb17 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -168,11 +168,17 @@ static int replace_object(const char *object_ref, const char *replace_ref,
 
 int cmd_replace(int argc, const char **argv, const char *prefix)
 {
-	int list = 0, delete = 0, force = 0;
+	int force = 0;
 	const char *format = NULL;
+	enum {
+		MODE_UNSPECIFIED = 0,
+		MODE_LIST,
+		MODE_DELETE,
+		MODE_REPLACE
+	} cmdmode = MODE_UNSPECIFIED;
 	struct option options[] = {
-		OPT_BOOL('l', "list", &list, N_("list replace refs")),
-		OPT_BOOL('d', "delete", &delete, N_("delete replace refs")),
+		OPT_CMDMODE('l', "list", &cmdmode, N_("list replace refs"), MODE_LIST),
+		OPT_CMDMODE('d', "delete", &cmdmode, N_("delete replace refs"), MODE_DELETE),
 		OPT_BOOL('f', "force", &force, N_("replace the ref if it exists")),
 		OPT_STRING(0, "format", &format, N_("format"), N_("use this format")),
 		OPT_END()
@@ -182,42 +188,37 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
 
 	argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0);
 
-	if (!list && !delete)
-		if (!argc)
-			list = 1;
+	if (!cmdmode)
+		cmdmode = argc ? MODE_REPLACE : MODE_DELETE;
 
-	if (list && delete)
-		usage_msg_opt("-l and -d cannot be used together",
-			      git_replace_usage, options);
-
-	if (format && !list)
+	if (format && cmdmode != MODE_LIST)
 		usage_msg_opt("--format cannot be used when not listing",
 			      git_replace_usage, options);
 
-	if (force && (list || delete))
-		usage_msg_opt("-f cannot be used with -d or -l",
+	if (force && cmdmode != MODE_REPLACE)
+		usage_msg_opt("-f only makes sense when writing a replacement",
 			      git_replace_usage, options);
 
-	/* Delete refs */
-	if (delete) {
+	switch (cmdmode) {
+	case MODE_DELETE:
 		if (argc < 1)
 			usage_msg_opt("-d needs at least one argument",
 				      git_replace_usage, options);
 		return for_each_replace_name(argv, delete_replace_ref);
-	}
 
-	/* Replace object */
-	if (!list && argc) {
+	case MODE_REPLACE:
 		if (argc != 2)
 			usage_msg_opt("bad number of arguments",
 				      git_replace_usage, options);
 		return replace_object(argv[0], argv[1], force);
-	}
 
-	/* List refs, even if "list" is not set */
-	if (argc > 1)
-		usage_msg_opt("only one pattern can be given with -l",
-			      git_replace_usage, options);
+	case MODE_LIST:
+		if (argc > 1)
+			usage_msg_opt("only one pattern can be given with -l",
+				      git_replace_usage, options);
+		return list_replace_refs(argv[0], format);
 
-	return list_replace_refs(argv[0], format);
+	default:
+		die("BUG: invalid cmdmode %d", (int)cmdmode);
+	}
 }
-- 
1.8.5.2.500.g8060133
Previous: Jeff KingNext: Jeff King
Message 15 of 35 in “disable grafts during fetch/push/bundle”
  1. disable grafts during fetch/push/bundleJeff King, Mar 4, 2014
  2. Junio C HamanoMar 4, 2014
  3. Jeff KingMar 5, 2014
  4. Junio C HamanoMar 5, 2014
  5. Jeff KingMar 5, 2014
  6. Junio C HamanoMar 5, 2014
  7. Jeff KingMar 5, 2014
  8. Junio C HamanoMar 5, 2014
  9. Michael HaggertyMar 6, 2014
  10. Christian CouderMar 6, 2014
  11. Jeff KingMar 6, 2014
  12. Michael HaggertyMar 6, 2014
  13. Jeff KingMar 6, 2014
  14. 1/4 replace: refactor command-mode determinationJeff King, Mar 6, 2014
  15. 2/4 replace: use OPT_CMDMODE to handle modesJeff King, Mar 6, 2014
  16. 3/4 replace: factor object resolution out of replace_objectJeff King, Mar 6, 2014
  17. 4/4 replace: add --edit optionJeff King, Mar 6, 2014
  18. Eric SunshineMar 7, 2014
  19. Jeff KingMar 7, 2014
  20. Junio C HamanoMar 6, 2014
  21. Jeff KingMar 6, 2014
  22. Philip OakleyMar 6, 2014
  23. Michael HaggertyMar 6, 2014
  24. Junio C HamanoMar 6, 2014
  25. Christian CouderMar 7, 2014
  26. Jeff KingMar 7, 2014
  27. Junio C HamanoMar 19, 2014
  28. Jeff KingMar 21, 2014
  29. Philip OakleyMar 6, 2014
  30. Eric SunshineMar 4, 2014
  31. Jeff KingMar 5, 2014
  32. Eric SunshineMar 5, 2014
  33. Jeff KingMar 5, 2014
  34. Eric SunshineMar 5, 2014
  35. Jeff KingMar 6, 2014

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.