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

[PATCH 10/21] diff.c: convert --stat*

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Feb 7, 2019, 10:33 UTC
Message-ID
<20190207103326.10693-11-pclouds@gmail.com>
In-Reply-To
<20190207103326.10693-1-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 diff.c | 118 +++++++++++++++++++++++++--------------------------------
 1 file changed, 52 insertions(+), 66 deletions(-)
diff --git a/diff.c b/diff.c
index 9c8f5336bc..1feb13deb3 100644
--- a/diff.c
+++ b/diff.c
@@ -104,11 +104,6 @@ static const char *color_diff_slots[] = {
 	[DIFF_FILE_NEW_BOLD]	      = "newBold",
 };
 
-static NORETURN void die_want_option(const char *option_name)
-{
-	die(_("option '%s' requires a value"), option_name);
-}
-
 define_list_config_array_extra(color_diff_slots, {"plain"});
 
 static int parse_diff_color_slot(const char *var)
@@ -4661,77 +4656,56 @@ int parse_long_opt(const char *opt, const char **argv,
 	return 2;
 }
 
-static int stat_opt(struct diff_options *options, const char **av)
+static int diff_opt_stat(const struct option *opt, const char *value, int unset)
 {
-	const char *arg = av[0];
-	char *end;
+	struct diff_options *options = opt->value;
 	int width = options->stat_width;
 	int name_width = options->stat_name_width;
 	int graph_width = options->stat_graph_width;
 	int count = options->stat_count;
-	int argcount = 1;
+	char *end;
 
-	if (!skip_prefix(arg, "--stat", &arg))
-		BUG("stat option does not begin with --stat: %s", arg);
-	end = (char *)arg;
+	BUG_ON_OPT_NEG(unset);
 
-	switch (*arg) {
-	case '-':
-		if (skip_prefix(arg, "-width", &arg)) {
-			if (*arg == '=')
-				width = strtoul(arg + 1, &end, 10);
-			else if (!*arg && !av[1])
-				die_want_option("--stat-width");
-			else if (!*arg) {
-				width = strtoul(av[1], &end, 10);
-				argcount = 2;
-			}
-		} else if (skip_prefix(arg, "-name-width", &arg)) {
-			if (*arg == '=')
-				name_width = strtoul(arg + 1, &end, 10);
-			else if (!*arg && !av[1])
-				die_want_option("--stat-name-width");
-			else if (!*arg) {
-				name_width = strtoul(av[1], &end, 10);
-				argcount = 2;
-			}
-		} else if (skip_prefix(arg, "-graph-width", &arg)) {
-			if (*arg == '=')
-				graph_width = strtoul(arg + 1, &end, 10);
-			else if (!*arg && !av[1])
-				die_want_option("--stat-graph-width");
-			else if (!*arg) {
-				graph_width = strtoul(av[1], &end, 10);
-				argcount = 2;
-			}
-		} else if (skip_prefix(arg, "-count", &arg)) {
-			if (*arg == '=')
-				count = strtoul(arg + 1, &end, 10);
-			else if (!*arg && !av[1])
-				die_want_option("--stat-count");
-			else if (!*arg) {
-				count = strtoul(av[1], &end, 10);
-				argcount = 2;
-			}
+	if (!strcmp(opt->long_name, "stat")) {
+		if (value) {
+			width = strtoul(value, &end, 10);
+			if (*end == ',')
+				name_width = strtoul(end+1, &end, 10);
+			if (*end == ',')
+				count = strtoul(end+1, &end, 10);
+			if (*end)
+				return error(_("invalid --stat value: %s"), value);
 		}
-		break;
-	case '=':
-		width = strtoul(arg+1, &end, 10);
-		if (*end == ',')
-			name_width = strtoul(end+1, &end, 10);
-		if (*end == ',')
-			count = strtoul(end+1, &end, 10);
-	}
+	} else if (!strcmp(opt->long_name, "stat-width")) {
+		width = strtoul(value, &end, 10);
+		if (*end)
+			return error(_("%s expects a numerical value"),
+				     opt->long_name);
+	} else if (!strcmp(opt->long_name, "stat-name-width")) {
+		name_width = strtoul(value, &end, 10);
+		if (*end)
+			return error(_("%s expects a numerical value"),
+				     opt->long_name);
+	} else if (!strcmp(opt->long_name, "stat-graph-width")) {
+		graph_width = strtoul(value, &end, 10);
+		if (*end)
+			return error(_("%s expects a numerical value"),
+				     opt->long_name);
+	} else if (!strcmp(opt->long_name, "stat-count")) {
+		count = strtoul(value, &end, 10);
+		if (*end)
+			return error(_("%s expects a numerical value"),
+				     opt->long_name);
+	} else
+		BUG("%s should not get here", opt->long_name);
 
-	/* Important! This checks all the error cases! */
-	if (*end)
-		return 0;
 	options->output_format |= DIFF_FORMAT_DIFFSTAT;
 	options->stat_name_width = name_width;
 	options->stat_graph_width = graph_width;
 	options->stat_width = width;
 	options->stat_count = count;
-	return argcount;
+	return 0;
 }
 
 static int parse_dirstat_opt(struct diff_options *options, const char *params)
@@ -4958,6 +4932,21 @@ static void prep_parse_options(struct diff_options *options)
 		OPT_BIT_F(0, "name-status", &options->output_format,
 			  N_("show only names and status of changed files"),
 			  DIFF_FORMAT_NAME_STATUS, PARSE_OPT_NONEG),
+		OPT_CALLBACK_F(0, "stat", options, N_("<width>[,<name-width>[,<count>]]"),
+			       N_("generate diffstat"),
+			       PARSE_OPT_NONEG | PARSE_OPT_OPTARG, diff_opt_stat),
+		OPT_CALLBACK_F(0, "stat-width", options, N_("<width>"),
+			       N_("generate diffstat with a given width"),
+			       PARSE_OPT_NONEG, diff_opt_stat),
+		OPT_CALLBACK_F(0, "stat-name-width", options, N_("<width>"),
+			       N_("generate diffstat with a given name width"),
+			       PARSE_OPT_NONEG, diff_opt_stat),
+		OPT_CALLBACK_F(0, "stat-graph-width", options, N_("<width>"),
+			       N_("generate diffstat with a given graph width"),
+			       PARSE_OPT_NONEG, diff_opt_stat),
+		OPT_CALLBACK_F(0, "stat-count", options, N_("<count>"),
+			       N_("generate diffstat with limited lines"),
+			       PARSE_OPT_NONEG, diff_opt_stat),
 		OPT_END()
 	};
 
@@ -4986,10 +4975,7 @@ int diff_opt_parse(struct diff_options *options,
 		return ac;
 
 	/* Output format options */
-	if (starts_with(arg, "--stat"))
-		/* --stat, --stat-width, --stat-name-width, or --stat-count */
-		return stat_opt(options, av);
-	else if (!strcmp(arg, "--compact-summary")) {
+	if (!strcmp(arg, "--compact-summary")) {
 		 options->flags.stat_with_summary = 1;
 		 options->output_format |= DIFF_FORMAT_DIFFSTAT;
 	} else if (!strcmp(arg, "--no-compact-summary"))
-- 
2.20.1.682.gd5861c6d90
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 11 of 80 in “nd/diff-parseopt part 2”
  1. 00/21 nd/diff-parseopt part 2Nguyễn Thái Ngọc Duy, Feb 7, 2019
  2. 01/21 diff.c: convert --patch-with-rawNguyễn Thái Ngọc Duy, Feb 7, 2019
  3. 02/21 diff.c: convert --numstat and --shortstatNguyễn Thái Ngọc Duy, Feb 7, 2019
  4. 03/21 diff.c: convert --dirstat and friendsNguyễn Thái Ngọc Duy, Feb 7, 2019
  5. 04/21 diff.c: convert --checkNguyễn Thái Ngọc Duy, Feb 7, 2019
  6. 05/21 diff.c: convert --summaryNguyễn Thái Ngọc Duy, Feb 7, 2019
  7. 06/21 diff.c: convert --patch-with-statNguyễn Thái Ngọc Duy, Feb 7, 2019
  8. 07/21 diff.c: convert --name-onlyNguyễn Thái Ngọc Duy, Feb 7, 2019
  9. 08/21 diff.c: convert --name-statusNguyễn Thái Ngọc Duy, Feb 7, 2019
  10. 09/21 diff.c: convert -s|--no-patchNguyễn Thái Ngọc Duy, Feb 7, 2019
  11. 10/21 diff.c: convert --stat*Nguyễn Thái Ngọc Duy, Feb 7, 2019
  12. 11/21 diff.c: convert --[no-]compact-summaryNguyễn Thái Ngọc Duy, Feb 7, 2019
  13. 12/21 diff.c: convert --output-*Nguyễn Thái Ngọc Duy, Feb 7, 2019
  14. 13/21 diff.c: convert -B|--break-rewritesNguyễn Thái Ngọc Duy, Feb 7, 2019
  15. 14/21 diff.c: convert -M|--find-renamesNguyễn Thái Ngọc Duy, Feb 7, 2019
  16. 15/21 diff.c: convert -D|--irreversible-deleteNguyễn Thái Ngọc Duy, Feb 7, 2019
  17. 16/21 diff.c: convert -C|--find-copiesNguyễn Thái Ngọc Duy, Feb 7, 2019
  18. 17/21 diff.c: convert --find-copies-harderNguyễn Thái Ngọc Duy, Feb 7, 2019
  19. 18/21 diff.c: convert --no-renames|--[no--rename-emptyNguyễn Thái Ngọc Duy, Feb 7, 2019
  20. 19/21 diff.c: convert --relativeNguyễn Thái Ngọc Duy, Feb 7, 2019
  21. 20/21 diff.c: convert --[no-]minimalNguyễn Thái Ngọc Duy, Feb 7, 2019
  22. 21/21 diff.c: convert --ignore-some-changesNguyễn Thái Ngọc Duy, Feb 7, 2019
  23. SZEDER GáborFeb 7, 2019
  24. Junio C HamanoFeb 11, 2019
  25. Junio C HamanoFeb 11, 2019
  26. 00/21 nd/diff-parseopt part 2Nguyễn Thái Ngọc Duy, Feb 16, 2019
  27. 01/21 diff-parseopt: convert --patch-with-rawNguyễn Thái Ngọc Duy, Feb 16, 2019
  28. 02/21 diff-parseopt: convert --numstat and --shortstatNguyễn Thái Ngọc Duy, Feb 16, 2019
  29. 03/21 diff-parseopt: convert --dirstat and friendsNguyễn Thái Ngọc Duy, Feb 16, 2019
  30. 04/21 diff-parseopt: convert --checkNguyễn Thái Ngọc Duy, Feb 16, 2019
  31. 05/21 diff-parseopt: convert --summaryNguyễn Thái Ngọc Duy, Feb 16, 2019
  32. 06/21 diff-parseopt: convert --patch-with-statNguyễn Thái Ngọc Duy, Feb 16, 2019
  33. Junio C HamanoFeb 20, 2019
  34. 00/21 nd/diff-parseopt part 2Nguyễn Thái Ngọc Duy, Feb 16, 2019
  35. 01/21 diff-parseopt: convert --patch-with-rawNguyễn Thái Ngọc Duy, Feb 16, 2019
  36. Junio C HamanoFeb 20, 2019
  37. 02/21 diff-parseopt: convert --numstat and --shortstatNguyễn Thái Ngọc Duy, Feb 16, 2019
  38. 03/21 diff-parseopt: convert --dirstat and friendsNguyễn Thái Ngọc Duy, Feb 16, 2019
  39. Andrei RybakFeb 17, 2019
  40. 04/21 diff-parseopt: convert --checkNguyễn Thái Ngọc Duy, Feb 16, 2019
  41. 05/21 diff-parseopt: convert --summaryNguyễn Thái Ngọc Duy, Feb 16, 2019
  42. 06/21 diff-parseopt: convert --patch-with-statNguyễn Thái Ngọc Duy, Feb 16, 2019
  43. 07/21 diff-parseopt: convert --name-onlyNguyễn Thái Ngọc Duy, Feb 16, 2019
  44. 08/21 diff-parseopt: convert --name-statusNguyễn Thái Ngọc Duy, Feb 16, 2019
  45. 09/21 diff-parseopt: convert -s|--no-patchNguyễn Thái Ngọc Duy, Feb 16, 2019
  46. 10/21 diff-parseopt: convert --stat*Nguyễn Thái Ngọc Duy, Feb 16, 2019
  47. Junio C HamanoFeb 20, 2019
  48. 11/21 diff-parseopt: convert --[no-]compact-summaryNguyễn Thái Ngọc Duy, Feb 16, 2019
  49. 12/21 diff-parseopt: convert --output-*Nguyễn Thái Ngọc Duy, Feb 16, 2019
  50. 13/21 diff-parseopt: convert -B|--break-rewritesNguyễn Thái Ngọc Duy, Feb 16, 2019
  51. 14/21 diff-parseopt: convert -M|--find-renamesNguyễn Thái Ngọc Duy, Feb 16, 2019
  52. 15/21 diff-parseopt: convert -D|--irreversible-deleteNguyễn Thái Ngọc Duy, Feb 16, 2019
  53. 16/21 diff-parseopt: convert -C|--find-copiesNguyễn Thái Ngọc Duy, Feb 16, 2019
  54. 17/21 diff-parseopt: convert --find-copies-harderNguyễn Thái Ngọc Duy, Feb 16, 2019
  55. 18/21 diff-parseopt: convert --no-renames|--[no--rename-emptyNguyễn Thái Ngọc Duy, Feb 16, 2019
  56. 19/21 diff-parseopt: convert --relativeNguyễn Thái Ngọc Duy, Feb 16, 2019
  57. 20/21 diff-parseopt: convert --[no-]minimalNguyễn Thái Ngọc Duy, Feb 16, 2019
  58. 21/21 diff-parseopt: convert --ignore-some-changesNguyễn Thái Ngọc Duy, Feb 16, 2019
  59. 00/21 nd/diff-parseopt-2 updatesNguyễn Thái Ngọc Duy, Feb 21, 2019
  60. 01/21 diff-parseopt: convert --patch-with-rawNguyễn Thái Ngọc Duy, Feb 21, 2019
  61. 02/21 diff-parseopt: convert --numstat and --shortstatNguyễn Thái Ngọc Duy, Feb 21, 2019
  62. 03/21 diff-parseopt: convert --dirstat and friendsNguyễn Thái Ngọc Duy, Feb 21, 2019
  63. 04/21 diff-parseopt: convert --checkNguyễn Thái Ngọc Duy, Feb 21, 2019
  64. 05/21 diff-parseopt: convert --summaryNguyễn Thái Ngọc Duy, Feb 21, 2019
  65. 06/21 diff-parseopt: convert --patch-with-statNguyễn Thái Ngọc Duy, Feb 21, 2019
  66. 07/21 diff-parseopt: convert --name-onlyNguyễn Thái Ngọc Duy, Feb 21, 2019
  67. 08/21 diff-parseopt: convert --name-statusNguyễn Thái Ngọc Duy, Feb 21, 2019
  68. 09/21 diff-parseopt: convert -s|--no-patchNguyễn Thái Ngọc Duy, Feb 21, 2019
  69. 10/21 diff-parseopt: convert --stat*Nguyễn Thái Ngọc Duy, Feb 21, 2019
  70. 11/21 diff-parseopt: convert --[no-]compact-summaryNguyễn Thái Ngọc Duy, Feb 21, 2019
  71. 12/21 diff-parseopt: convert --output-*Nguyễn Thái Ngọc Duy, Feb 21, 2019
  72. 13/21 diff-parseopt: convert -B|--break-rewritesNguyễn Thái Ngọc Duy, Feb 21, 2019
  73. 14/21 diff-parseopt: convert -M|--find-renamesNguyễn Thái Ngọc Duy, Feb 21, 2019
  74. 15/21 diff-parseopt: convert -D|--irreversible-deleteNguyễn Thái Ngọc Duy, Feb 21, 2019
  75. 16/21 diff-parseopt: convert -C|--find-copiesNguyễn Thái Ngọc Duy, Feb 21, 2019
  76. 17/21 diff-parseopt: convert --find-copies-harderNguyễn Thái Ngọc Duy, Feb 21, 2019
  77. 18/21 diff-parseopt: convert --no-renames|--[no--rename-emptyNguyễn Thái Ngọc Duy, Feb 21, 2019
  78. 19/21 diff-parseopt: convert --relativeNguyễn Thái Ngọc Duy, Feb 21, 2019
  79. 20/21 diff-parseopt: convert --[no-]minimalNguyễn Thái Ngọc Duy, Feb 21, 2019
  80. 21/21 diff-parseopt: convert --ignore-some-changesNguyễn Thái Ngọc Duy, Feb 21, 2019

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.