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

[RFC] git-fsck-cache argument processing

From
Sean <seanlkml@sympatico.ca>
Date
May 21, 2005, 03:38 UTC
Message-ID
<4870.10.10.10.24.1116646732.squirrel@linux1>

Here is a first crack at using argp as suggested by Jeff Garzik to implement argument processing as requested by Junio and Linus. Each of the long arguments have been given a single character equivalent as well.

This patch only converts fsck-cache to use argp in case anyone has objections to the basic format or style. The patch includes a version number inside of fsck-cache.c; this should really be in a separate include file so you can run any command with --version and get the same answer.

With this change you have:
$ git-fsck-cache -?
Usage: git-fsck-cache [OPTION...] [HEAD-SHA1...]
git-fsck-cache - repository consistency check
 -c, --cache            Mark all objects referenced by cache as reachable
 -d, --delta-depth      Show the maximum length of delta chains
 -r, --root             Show root objects, ie. those without parents
 -t, --tags             Show revision tags
 -u, --unreachable      Show missing objects or deltas
 -?, --help             Give this help list
     --usage            Give a short usage message
 -V, --version          Print program version
And the following should work as expected:
$ git-fsck-cache -crudt

fsck-cache.c | 64 +++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 39 insertions(+), 25 deletions(-)

Sean
fsck-cache.c: needs update
Index: fsck-cache.c
===================================================================
--- 58741c69570705801db4b785681790d636475695/fsck-cache.c  (mode:100644)
+++ uncommitted/fsck-cache.c  (mode:100644)
@@ -1,5 +1,7 @@
 #include <sys/types.h>
 #include <dirent.h>
+#include <argp.h>
+const char *argp_program_version = "git 1.0";
 
 #include "cache.h"
 #include "commit.h"
@@ -407,36 +409,48 @@
 	find_file_objects(git_dir, "refs");
 }
 
+#define O_UNREACH 'u'
+#define O_TAGS 't'
+#define O_ROOT 'r'
+#define O_DELTA 'd'
+#define O_CACHE 'c'
+
+static const char doc[] = "Perform repository consistency check";
+
+static struct argp_option options[] = {
+ {"unreachable", O_UNREACH, 0, 0, "Show missing objects or deltas"},
+ {"tags", O_TAGS, 0, 0, "Show revision tags"},
+ {"root", O_ROOT, 0, 0, "Show root objects, ie. those without parents"},
+ {"delta-depth", O_DELTA, 0, 0, "Show the maximum length of delta chains"},
+ {"cache", O_CACHE, 0, 0, "Mark all objects referenced by cache as reachable"},
+ { }
+};
+
+static error_t parse_opt (int key, char *arg, struct argp_state *state)
+{
+	switch (key) {
+	case O_UNREACH:		show_unreachable = 1; break;
+	case O_TAGS:		show_tags = 1; break;
+	case O_ROOT:		show_root = 1; break;
+	case O_DELTA:		show_max_delta_depth = 1; break;
+	case O_CACHE:		keep_cache_objects = 1; break;
+	case ARGP_KEY_ARG:	state->next = state->argc; break;
+	default:		return ARGP_ERR_UNKNOWN;
+	}
+	return 0;
+}
+
+static const struct argp argp = { options, parse_opt, "[HEAD-SHA1...]", doc };
+
 int main(int argc, char **argv)
 {
 	int i, heads;
 	char *sha1_dir;
 
-	for (i = 1; i < argc; i++) {
-		const char *arg = argv[i];
-
-		if (!strcmp(arg, "--unreachable")) {
-			show_unreachable = 1;
-			continue;
-		}
-		if (!strcmp(arg, "--tags")) {
-			show_tags = 1;
-			continue;
-		}
-		if (!strcmp(arg, "--root")) {
-			show_root = 1;
-			continue;
-		}
-		if (!strcmp(arg, "--delta-depth")) {
-			show_max_delta_depth = 1;
-			continue;
-		}
-		if (!strcmp(arg, "--cache")) {
-			keep_cache_objects = 1;
-			continue;
-		}
-		if (*arg == '-')
-			usage("git-fsck-cache [--tags] [[--unreachable] [--cache] <head-sha1>*]");
+	error_t rc = argp_parse(&argp, argc, argv, 0, NULL, NULL);
+	if (rc) {
+		fprintf(stderr, "argument failed: %s\n", strerror(rc));
+		return 1;
 	}
 
 	sha1_dir = get_object_directory();
Next: Jeff Garzik
Message 1 of 18 in “[RFC] git-fsck-cache argument processing”
  1. SeanMay 21, 2005
  2. Jeff GarzikMay 21, 2005
  3. SeanMay 21, 2005
  4. Jeff GarzikMay 21, 2005
  5. Junio C HamanoMay 21, 2005
  6. Jeff GarzikMay 21, 2005
  7. Junio C HamanoMay 21, 2005
  8. Olivier GalibertMay 21, 2005
  9. Jeff GarzikMay 21, 2005
  10. SeanMay 21, 2005
  11. Olivier GalibertMay 21, 2005
  12. SeanMay 21, 2005
  13. Jeff GarzikMay 21, 2005
  14. Joel BeckerMay 21, 2005
  15. Linus TorvaldsMay 21, 2005
  16. SeanMay 21, 2005
  17. SeanMay 21, 2005
  18. Linus TorvaldsMay 21, 2005

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.