{"thread":{"id":"1889","subject":"[PATCH] Make the git-fsck-objects diagnostics more useful","startedAt":"2005-09-20T18:56:05Z","lastAt":"2005-09-20T18:56:05Z","messageCount":1,"participants":["Petr Baudis"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"9008","messageId":"20050920185605.GA28621@pasky.or.cz","threadId":"1889","inReplyTo":null,"subject":"[PATCH] Make the git-fsck-objects diagnostics more useful","fromName":"Petr Baudis","fromEmail":"pasky@ucw.cz","sentAt":"2005-09-20T18:56:05Z","receivedAt":"2005-09-20T18:56:05Z","isPatch":true,"sender":{"key":"pasky@ucw.cz","avatar":"https://avatars.githubusercontent.com/u/18439?v=4"},"body":"Actually report what exactly is wrong with the object, instead of an\nambiguous 'bad sha1 file' or such. In places where we already do, unify\nthe format and clean the messages up.\n\nSigned-off-by: Petr Baudis <pasky@suse.cz>\n\n---\ncommit ff0b3368b45a07ac080574eb721a607892413b99\ntree c5e730edddb7679bee63a7d76fb088a7378a9d8b\nparent 12913234050c07785b7fc5929e4c8b5f80606609\nauthor Petr Baudis <pasky@suse.cz> Tue, 20 Sep 2005 20:54:33 +0200\ncommitter Petr Baudis <xpasky@machine.(none)> Tue, 20 Sep 2005 20:54:33 +0200\n\n fsck-objects.c |   82 +++++++++++++++++++++++++++++++++-----------------------\n 1 files changed, 48 insertions(+), 34 deletions(-)\n\ndiff --git a/fsck-objects.c b/fsck-objects.c\n--- a/fsck-objects.c\n+++ b/fsck-objects.c\n@@ -20,6 +20,35 @@ static int check_strict = 0;\n static int keep_cache_objects = 0; \n static unsigned char head_sha1[20];\n \n+\n+static void objreport(struct object *obj, const char *severity,\n+                      const char *err, va_list params)\n+{\n+\tfprintf(stderr, \"%s in %s %s: \",\n+\t        severity, obj->type, sha1_to_hex(obj->sha1));\n+\tvfprintf(stderr, err, params);\n+\tfputs(\"\\n\", stderr);\n+}\n+\n+int objerror(struct object *obj, const char *err, ...)\n+{\n+\tva_list params;\n+\tva_start(params, err);\n+\tobjreport(obj, \"error\", err, params);\n+\tva_end(params);\n+\treturn -1;\n+}\n+\n+int objwarning(struct object *obj, const char *err, ...)\n+{\n+\tva_list params;\n+\tva_start(params, err);\n+\tobjreport(obj, \"warning\", err, params);\n+\tva_end(params);\n+\treturn -1;\n+}\n+\n+\n static void check_connectivity(void)\n {\n \tint i;\n@@ -162,31 +191,19 @@ static int fsck_tree(struct tree *item)\n \n \tretval = 0;\n \tif (has_full_path) {\n-\t\tfprintf(stderr, \"warning: git-fsck-objects: tree %s \"\n-\t\t\t\"has full pathnames in it\\n\", \n-\t\t\tsha1_to_hex(item->object.sha1));\n+\t\tobjwarning(&item->object, \"contains full pathnames\");\n \t}\n \tif (has_zero_pad) {\n-\t\tfprintf(stderr, \"warning: git-fsck-objects: tree %s \"\n-\t\t\t\"has zero-padded file modes in it\\n\",\n-\t\t\tsha1_to_hex(item->object.sha1));\n+\t\tobjwarning(&item->object, \"contains zero-padded file modes\");\n \t}\n \tif (has_bad_modes) {\n-\t\tfprintf(stderr, \"warning: git-fsck-objects: tree %s \"\n-\t\t\t\"has bad file modes in it\\n\",\n-\t\t\tsha1_to_hex(item->object.sha1));\n+\t\tobjwarning(&item->object, \"contains bad file modes\");\n \t}\n \tif (has_dup_entries) {\n-\t\tfprintf(stderr, \"error: git-fsck-objects: tree %s \"\n-\t\t\t\"has duplicate file entries\\n\",\n-\t\t\tsha1_to_hex(item->object.sha1));\n-\t\tretval = -1;\n+\t\tretval = objerror(&item->object, \"contains duplicate file entries\");\n \t}\n \tif (not_properly_sorted) {\n-\t\tfprintf(stderr, \"error: git-fsck-objects: tree %s \"\n-\t\t\t\"is not properly sorted\\n\",\n-\t\t\tsha1_to_hex(item->object.sha1));\n-\t\tretval = -1;\n+\t\tretval = objerror(&item->object, \"not properly sorted\");\n \t}\n \treturn retval;\n }\n@@ -194,24 +211,24 @@ static int fsck_tree(struct tree *item)\n static int fsck_commit(struct commit *commit)\n {\n \tchar *buffer = commit->buffer;\n-\tunsigned char sha1[20];\n+\tunsigned char tree_sha1[20], sha1[20];\n \n \tif (memcmp(buffer, \"tree \", 5))\n-\t\treturn -1;\n-\tif (get_sha1_hex(buffer+5, sha1) || buffer[45] != '\\n')\n-\t\treturn -1;\n+\t\treturn objerror(&commit->object, \"invalid format - expected 'tree' line\");\n+\tif (get_sha1_hex(buffer+5, tree_sha1) || buffer[45] != '\\n')\n+\t\treturn objerror(&commit->object, \"invalid 'tree' line format - bad sha1\");\n \tbuffer += 46;\n \twhile (!memcmp(buffer, \"parent \", 7)) {\n \t\tif (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\\n')\n-\t\t\treturn -1;\n+\t\t\treturn objerror(&commit->object, \"invalid 'parent' line format - bad sha1\");\n \t\tbuffer += 48;\n \t}\n \tif (memcmp(buffer, \"author \", 7))\n-\t\treturn -1;\n+\t\treturn objerror(&commit->object, \"invalid format - expected 'author' line\");\n \tfree(commit->buffer);\n \tcommit->buffer = NULL;\n \tif (!commit->tree)\n-\t\treturn -1;\n+\t\treturn objerror(&commit->object, \"could not load commit's tree %s\", tree_sha1);\n \tif (!commit->parents && show_root)\n \t\tprintf(\"root %s\\n\", sha1_to_hex(commit->object.sha1));\n \tif (!commit->date)\n@@ -225,8 +242,7 @@ static int fsck_tag(struct tag *tag)\n \tstruct object *tagged = tag->tagged;\n \n \tif (!tagged) {\n-\t\tprintf(\"bad object in tag %s\\n\", sha1_to_hex(tag->object.sha1));\n-\t\treturn -1;\n+\t\treturn objerror(&tag->object, \"could not load tagged object\");\n \t}\n \tif (!show_tags)\n \t\treturn 0;\n@@ -240,7 +256,7 @@ static int fsck_sha1(unsigned char *sha1\n {\n \tstruct object *obj = parse_object(sha1);\n \tif (!obj)\n-\t\treturn -1;\n+\t\treturn error(\"%s: object not found\", sha1_to_hex(sha1));\n \tif (obj->type == blob_type)\n \t\treturn 0;\n \tif (obj->type == tree_type)\n@@ -249,7 +265,8 @@ static int fsck_sha1(unsigned char *sha1\n \t\treturn fsck_commit((struct commit *) obj);\n \tif (obj->type == tag_type)\n \t\treturn fsck_tag((struct tag *) obj);\n-\treturn -1;\n+\t/* By now, parse_object() would've returned NULL instead. */\n+\treturn objerror(obj, \"unknown type '%s' (internal fsck error)\", obj->type);\n }\n \n /*\n@@ -285,8 +302,7 @@ static void fsck_sha1_list(void)\n \t\tunsigned char *sha1 = entry->sha1;\n \n \t\tsha1_list.entry[i] = NULL;\n-\t\tif (fsck_sha1(sha1) < 0)\n-\t\t\tfprintf(stderr, \"bad sha1 entry '%s'\\n\", sha1_to_hex(sha1));\n+\t\tfsck_sha1(sha1);\n \t\tfree(entry);\n \t}\n \tsha1_list.nr = 0;\n@@ -479,9 +495,7 @@ int main(int argc, char **argv)\n \t\t\tfor (i = 0; i < num; i++) {\n \t\t\t\tunsigned char sha1[20];\n \t\t\t\tnth_packed_object_sha1(p, i, sha1);\n-\t\t\t\tif (fsck_sha1(sha1) < 0)\n-\t\t\t\t\tfprintf(stderr, \"bad sha1 entry '%s'\\n\", sha1_to_hex(sha1));\n-\n+\t\t\t\tfsck_sha1(sha1);\n \t\t\t}\n \t\t}\n \t}\n@@ -505,7 +519,7 @@ int main(int argc, char **argv)\n \t\t\theads++;\n \t\t\tcontinue;\n \t\t}\n-\t\terror(\"expected sha1, got %s\", arg);\n+\t\terror(\"invalid parameter: expected sha1, got '%s'\", arg);\n \t}\n \n \t/*\n\n\n-- \n\t\t\t\tPetr \"Pasky\" Baudis\nStuff: http://pasky.or.cz/\nVI has two modes: the one in which it beeps and the one in which\nit doesn't.\n"}]}