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

[PATCH 03/19] revision.c: prepare to convert handle_revision_pseudo_opt()

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
May 8, 2019, 11:12 UTC
Message-ID
<20190508111249.15262-4-pclouds@gmail.com>
In-Reply-To
<20190508111249.15262-1-pclouds@gmail.com>

This patch is essentially no-op. It allows to parse_options() to handle some options. But the new option list remains empty. The option will be moved one by one from the old manual parsing code to this list.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 revision.c | 44 ++++++++++++++++++++++++++++++++++----------
 revision.h |  2 ++
 2 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/revision.c b/revision.c
index d4aaf0ef25..65d40c9255 100644
--- a/revision.c
+++ b/revision.c
@@ -26,6 +26,7 @@
 #include "argv-array.h"
 #include "commit-reach.h"
 #include "commit-graph.h"
+#include "parse-options.h"
 #include "prio-queue.h"
 #include "hashmap.h"
 
@@ -1598,6 +1599,8 @@ static int add_parents_only(struct rev_info *revs, const char *arg_, int flags,
 	return 1;
 }
 
+static void make_pseudo_options(struct rev_info *revs);
+
 void repo_init_revisions(struct repository *r,
 			 struct rev_info *revs,
 			 const char *prefix)
@@ -1638,6 +1641,7 @@ void repo_init_revisions(struct repository *r,
 	}
 
 	revs->notes_opt.use_default_notes = -1;
+	make_pseudo_options(revs);
 }
 
 static void add_pending_commit_list(struct rev_info *revs,
@@ -2355,6 +2359,25 @@ static int for_each_good_bisect_ref(struct ref_store *refs, each_ref_fn fn, void
 	return for_each_bisect_ref(refs, fn, cb_data, term_good);
 }
 
+static void make_pseudo_options(struct rev_info *revs)
+{
+	/*
+	 * NOTE!
+	 *
+	 * Commands like "git shortlog" will not accept the options below
+	 * unless parse_revision_opt queues them (as opposed to erroring
+	 * out).
+	 *
+	 * When implementing your new pseudo-option, remember to
+	 * register it in the list at the top of handle_revision_opt.
+	 */
+	struct option options[] = {
+		OPT_END()
+	};
+	ALLOC_ARRAY(revs->pseudo_options, ARRAY_SIZE(options));
+	memcpy(revs->pseudo_options, options, sizeof(options));
+}
+
 static int handle_revision_pseudo_opt(const char *submodule,
 				struct rev_info *revs,
 				int argc, const char **argv, int *flags)
@@ -2377,16 +2400,16 @@ static int handle_revision_pseudo_opt(const char *submodule,
 	} else
 		refs = get_main_ref_store(revs->repo);
 
-	/*
-	 * NOTE!
-	 *
-	 * Commands like "git shortlog" will not accept the options below
-	 * unless parse_revision_opt queues them (as opposed to erroring
-	 * out).
-	 *
-	 * When implementing your new pseudo-option, remember to
-	 * register it in the list at the top of handle_revision_opt.
-	 */
+	argc = parse_options(argc, argv, revs->prefix,
+			     revs->pseudo_options, NULL,
+			     PARSE_OPT_KEEP_DASHDASH |
+			     PARSE_OPT_KEEP_UNKNOWN |
+			     PARSE_OPT_NO_INTERNAL_HELP |
+			     PARSE_OPT_ONE_SHOT |
+			     PARSE_OPT_STOP_AT_NON_OPTION);
+	if (argc)
+		return argc;
+
 	if (!strcmp(arg, "--all")) {
 		handle_refs(refs, revs, *flags, refs_for_each_ref);
 		handle_refs(refs, revs, *flags, refs_head_ref);
@@ -2685,6 +2708,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
 	if (revs->expand_tabs_in_log < 0)
 		revs->expand_tabs_in_log = revs->expand_tabs_in_log_default;
 
+	FREE_AND_NULL(revs->pseudo_options);
 	return left;
 }
 
diff --git a/revision.h b/revision.h
index 71e724c59c..0769c97dee 100644
--- a/revision.h
+++ b/revision.h
@@ -39,6 +39,7 @@
 #define DECORATE_FULL_REFS	2
 
 struct log_info;
+struct option;
 struct repository;
 struct rev_info;
 struct string_list;
@@ -279,6 +280,7 @@ struct rev_info {
 	struct topo_walk_info *topo_walk_info;
 
 	struct repository *repo;
+	struct option *pseudo_options;
 };
 
 int ref_excluded(struct string_list *, const char *path);
-- 
2.21.0.1141.gd54ac2cb17
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 9 of 25 in “Convert revision.c to parseopt part 1/4”
  1. 00/19 Convert revision.c to parseopt part 1/4Nguyễn Thái Ngọc Duy, May 8, 2019
  2. 01/19 revision.h: avoid bit fields in struct rev_infoNguyễn Thái Ngọc Duy, May 8, 2019
  3. Derrick StoleeMay 8, 2019
  4. Duy NguyenMay 8, 2019
  5. Derrick StoleeMay 8, 2019
  6. Duy NguyenMay 9, 2019
  7. Derrick StoleeMay 9, 2019
  8. 02/19 revision.h: move repo field downNguyễn Thái Ngọc Duy, May 8, 2019
  9. 03/19 revision.c: prepare to convert handle_revision_pseudo_opt()Nguyễn Thái Ngọc Duy, May 8, 2019
  10. 04/19 rev-parseopt: convert --allNguyễn Thái Ngọc Duy, May 8, 2019
  11. 05/19 rev-parseopt: convert --branchesNguyễn Thái Ngọc Duy, May 8, 2019
  12. 06/19 rev-parseopt: convert --bisectNguyễn Thái Ngọc Duy, May 8, 2019
  13. 07/19 rev-parseopt: convert --tagsNguyễn Thái Ngọc Duy, May 8, 2019
  14. 08/19 rev-parseopt: convert --remotesNguyễn Thái Ngọc Duy, May 8, 2019
  15. 09/19 rev-parseopt: convert --globNguyễn Thái Ngọc Duy, May 8, 2019
  16. 10/19 rev-parseopt: convert --excludeNguyễn Thái Ngọc Duy, May 8, 2019
  17. 11/19 rev-parseopt: convert --reflogNguyễn Thái Ngọc Duy, May 8, 2019
  18. 12/19 rev-parseopt: convert --indexed-objectsNguyễn Thái Ngọc Duy, May 8, 2019
  19. 13/19 rev-parseopt: convert --notNguyễn Thái Ngọc Duy, May 8, 2019
  20. 14/19 rev-parseopt: convert --no-walk and --do-walkNguyễn Thái Ngọc Duy, May 8, 2019
  21. 15/19 rev-parseopt: convert --single-worktreeNguyễn Thái Ngọc Duy, May 8, 2019
  22. 16/19 rev-parseopt: prepare to convert handle_revision_opt()Nguyễn Thái Ngọc Duy, May 8, 2019
  23. 17/19 rev-parseopt: convert --max-countNguyễn Thái Ngọc Duy, May 8, 2019
  24. 18/19 rev-parseopt: convert --skipNguyễn Thái Ngọc Duy, May 8, 2019
  25. 19/19 rev-parseopt: convert --min-age and --max-ageNguyễn Thái Ngọc Duy, May 8, 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.