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

[PATCH 3/6] revisions: parse_revisions refactor.

From
Pierre Habouzit <madcoder@debian.org>
Date
Jul 8, 2008, 09:56 UTC
Message-ID
<1215510964-16664-4-git-send-email-madcoder@debian.org>
In-Reply-To
<1215510964-16664-3-git-send-email-madcoder@debian.org>

Reorder parse_revisions so that it works more like a parse-opt based parser would: use two pass, the first filtering out options that the revision parser understands, and remember if we saw a "--", and then parse revision arguments.

Once everyone is using a parse-opt parser, it will be possible to simplify parse_revisions further. The first pass is a NOOP for incremental parse-opt based parsers.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
---
 revision.c |   63 ++++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 38 insertions(+), 25 deletions(-)
diff --git a/revision.c b/revision.c
index a3792c9..87f89a2 100644
--- a/revision.c
+++ b/revision.c
@@ -1250,30 +1250,44 @@ int handle_revision_opt(struct rev_info *revs, int argc, const char **argv,
  */
 int parse_revisions(int argc, const char **argv, struct rev_info *revs)
 {
-	int i, flags, seen_dashdash;
-	const char **unrecognized = argv + 1;
-	int left = 1;
+	int i, left, flags;
+	int seen_dashdash = 0;
 
-	/* First, search for "--" */
-	seen_dashdash = 0;
-	for (i = 1; i < argc; i++) {
+	/* First, filter out revision options and look for "--" */
+	for (left = i = 1; i < argc; i++) {
 		const char *arg = argv[i];
-		if (strcmp(arg, "--"))
+		int opts;
+
+		if (arg[0] != '-') {
+			argv[left++] = arg;
 			continue;
-		argv[i] = NULL;
-		argc = i;
-		if (argv[i + 1])
-			revs->prune_data = get_pathspec(revs->prefix, argv + i + 1);
-		seen_dashdash = 1;
-		break;
+		}
+
+		if (!strcmp(arg, "--")) {
+			seen_dashdash = left;
+			memcpy(argv + left, argv + i, sizeof(*argv) * (argc - i));
+			left += argc - i;
+			break;
+		}
+
+		opts = handle_revision_opt(revs, argc - i, argv + i, &left, argv);
+		if (opts > 0) {
+			i += opts - 1;
+			continue;
+		}
+		if (opts < 0)
+			exit(128);
+		argv[left++] = arg;
 	}
+	argv[left] = NULL;
+	argc = left;
 
+	/* Second, parse revisions arguments */
 	flags = 0;
-	for (i = 1; i < argc; i++) {
+	for (left = i = 1; i < argc; i++) {
 		const char *arg = argv[i];
-		if (*arg == '-') {
-			int opts;
 
+		if (*arg == '-') {
 			if (!strcmp(arg, "--all")) {
 				handle_refs(revs, flags, for_each_ref);
 				continue;
@@ -1306,16 +1320,15 @@ int parse_revisions(int argc, const char **argv, struct rev_info *revs)
 				revs->no_walk = 0;
 				continue;
 			}
-
-			opts = handle_revision_opt(revs, argc - i, argv + i, NULL, NULL);
-			if (opts > 0) {
-				i += opts - 1;
-				continue;
+			if (i == seen_dashdash) {
+				argv[i] = NULL;
+				argc = i;
+				if (argv[i + 1])
+					revs->prune_data = get_pathspec(revs->prefix, argv + i + 1);
+				break;
 			}
-			if (opts < 0)
-				exit(128);
-			*unrecognized++ = arg;
-			left++;
+
+			argv[left++] = arg;
 			continue;
 		}
 
-- 
1.5.6.2.352.g416a6
Previous: Pierre HabouzitNext: Pierre Habouzit
Message 4 of 15 in “Migration of builtin-blame to parse-option”
  1. Pierre HabouzitJul 8, 2008
  2. 1/6 revisions: refactor init_revisions and setup_revisions.Pierre Habouzit, Jul 8, 2008
  3. 2/6 revisions: split the pure option parsing out from parse_revisions.Pierre Habouzit, Jul 8, 2008
  4. 3/6 revisions: parse_revisions refactor.Pierre Habouzit, Jul 8, 2008
  5. 4/6 revisions: split handle_revision_args from parse_revisions.Pierre Habouzit, Jul 8, 2008
  6. 5/6 git-blame: migrate to incremental parse-option [1/2]Pierre Habouzit, Jul 8, 2008
  7. 6/6 git-blame: migrate to incremental parse-option [2/2]Pierre Habouzit, Jul 8, 2008
  8. Johannes SixtJul 8, 2008
  9. Pierre HabouzitJul 8, 2008
  10. Pierre HabouzitJul 8, 2008
  11. Johannes SchindelinJul 8, 2008
  12. Pierre HabouzitJul 8, 2008
  13. Johannes SchindelinJul 8, 2008
  14. Pierre HabouzitJul 8, 2008
  15. Pierre HabouzitJul 8, 2008

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.