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

[PATCH v8 2/4] cat-file: teach cat-file a '--literally' option

From
Karthik Nayak <karthik.188@gmail.com>
Date
Apr 15, 2015, 16:59 UTC
Message-ID
<1429117174-4968-1-git-send-email-karthik.188@gmail.com>
In-Reply-To
<552E9816.6040502@gmail.com>

Currently 'git cat-file' throws an error while trying to print the type or size of a broken/corrupt object. This is because these objects are usually of unknown types.

Teach git cat-file a '--literally' option where it prints the type or size of a broken/corrupt object without throwing an error.

Modify '-t' and '-s' options to call sha1_object_info_extended() directly to support the '--literally' option.

Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
 builtin/cat-file.c | 40 +++++++++++++++++++++++++++-------------
 1 file changed, 27 insertions(+), 13 deletions(-)
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index df99df4..1ec7190 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -9,13 +9,20 @@
 #include "userdiff.h"
 #include "streaming.h"
 
-static int cat_one_file(int opt, const char *exp_type, const char *obj_name)
+static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
+			int literally)
 {
 	unsigned char sha1[20];
 	enum object_type type;
 	char *buf;
 	unsigned long size;
 	struct object_context obj_context;
+	struct object_info oi = {NULL};
+	struct strbuf sb = STRBUF_INIT;
+	unsigned flags = LOOKUP_REPLACE_OBJECT;
+
+	if (literally)
+		flags |= LOOKUP_LITERALLY;
 
 	if (get_sha1_with_context(obj_name, 0, sha1, &obj_context))
 		die("Not a valid object name %s", obj_name);
@@ -23,20 +30,22 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)
 	buf = NULL;
 	switch (opt) {
 	case 't':
-		type = sha1_object_info(sha1, NULL);
-		if (type > 0) {
-			printf("%s\n", typename(type));
+		oi.typename = &sb;
+		if (sha1_object_info_extended(sha1, &oi, flags) < 0)
+			die("git cat-file: could not get object info");
+		if (sb.len) {
+			printf("%s\n", sb.buf);
+			strbuf_release(&sb);
 			return 0;
 		}
 		break;
 
 	case 's':
-		type = sha1_object_info(sha1, &size);
-		if (type > 0) {
-			printf("%lu\n", size);
-			return 0;
-		}
-		break;
+		oi.sizep = &size;
+		if ((type = sha1_object_info_extended(sha1, &oi, flags)) < 0)
+			die("git cat-file: could not get object info");
+		printf("%lu\n", size);
+		return 0;
 
 	case 'e':
 		return !has_sha1_file(sha1);
@@ -323,7 +332,7 @@ static int batch_objects(struct batch_options *opt)
 }
 
 static const char * const cat_file_usage[] = {
-	N_("git cat-file (-t | -s | -e | -p | <type> | --textconv) <object>"),
+	N_("git cat-file (-t [--literally]|-s [--literally]|-e|-p|<type>|--textconv) <object>"),
 	N_("git cat-file (--batch | --batch-check) < <list-of-objects>"),
 	NULL
 };
@@ -359,6 +368,7 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
 	int opt = 0;
 	const char *exp_type = NULL, *obj_name = NULL;
 	struct batch_options batch = {0};
+	int literally = 0;
 
 	const struct option options[] = {
 		OPT_GROUP(N_("<type> can be one of: blob, tree, commit, tag")),
@@ -369,6 +379,8 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
 		OPT_SET_INT('p', NULL, &opt, N_("pretty-print object's content"), 'p'),
 		OPT_SET_INT(0, "textconv", &opt,
 			    N_("for blob objects, run textconv on object's content"), 'c'),
+		OPT_BOOL( 0, "literally", &literally,
+			  N_("allow -s and -t to work with broken/corrupt objects")),
 		{ OPTION_CALLBACK, 0, "batch", &batch, "format",
 			N_("show info and content of objects fed from the standard input"),
 			PARSE_OPT_OPTARG, batch_option_callback },
@@ -380,7 +392,7 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
 
 	git_config(git_cat_file_config, NULL);
 
-	if (argc != 3 && argc != 2)
+	if (argc < 2 || argc > 4)
 		usage_with_options(cat_file_usage, options);
 
 	argc = parse_options(argc, argv, prefix, options, cat_file_usage, 0);
@@ -405,5 +417,7 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
 	if (batch.enabled)
 		return batch_objects(&batch);
 
-	return cat_one_file(opt, exp_type, obj_name);
+	if (literally && opt != 't' && opt != 's')
+		die("git cat-file --literally: use with -s or -t");
+	return cat_one_file(opt, exp_type, obj_name, literally);
 }
-- 
2.4.0.rc1.249.gb598846
Previous: karthik nayakNext: Junio C Hamano
Message 20 of 44 in “cat-file: teach cat-file a '--literally' option”
  1. 0/4 cat-file: teach cat-file a '--literally' optionkarthik nayak, Apr 15, 2015
  2. 1/4 sha1_file.c: support reading from a loose object of unknown typeKarthik Nayak, Apr 15, 2015
  3. Junio C HamanoApr 15, 2015
  4. Jeff KingApr 15, 2015
  5. Jeff KingApr 17, 2015
  6. Junio C HamanoApr 17, 2015
  7. Jeff KingApr 17, 2015
  8. Junio C HamanoApr 17, 2015
  9. karthik nayakApr 20, 2015
  10. Jeff KingApr 20, 2015
  11. karthik nayakApr 21, 2015
  12. Jeff KingApr 21, 2015
  13. karthik nayakApr 17, 2015
  14. Jeff KingApr 17, 2015
  15. karthik nayakApr 18, 2015
  16. Junio C HamanoApr 17, 2015
  17. karthik nayakApr 18, 2015
  18. Eric SunshineApr 17, 2015
  19. karthik nayakApr 18, 2015
  20. 2/4 cat-file: teach cat-file a '--literally' optionKarthik Nayak, Apr 15, 2015
  21. Junio C HamanoApr 15, 2015
  22. Junio C HamanoApr 15, 2015
  23. karthik nayakApr 16, 2015
  24. Junio C HamanoApr 16, 2015
  25. Karthik NayakApr 17, 2015
  26. Junio C HamanoApr 17, 2015
  27. Charles BaileyApr 19, 2015
  28. Junio C HamanoApr 20, 2015
  29. Charles BaileyApr 20, 2015
  30. Karthik NayakApr 20, 2015
  31. Charles BaileyApr 20, 2015
  32. karthik nayakApr 20, 2015
  33. Charles BaileyApr 21, 2015
  34. Eric SunshineApr 21, 2015
  35. Junio C HamanoApr 21, 2015
  36. karthik nayakApr 25, 2015
  37. Junio C HamanoApr 25, 2015
  38. karthik nayakApr 27, 2015
  39. Eric SunshineApr 27, 2015
  40. karthik nayakApr 28, 2015
  41. 3/4 cat-file: add documentation for '--literally' option.Karthik Nayak, Apr 15, 2015
  42. 4/4 t1006: add tests for git cat-file --literallyKarthik Nayak, Apr 15, 2015
  43. Eric SunshineApr 18, 2015
  44. karthik nayakApr 18, 2015

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.