{"thread":{"id":"1065","subject":"[PATCH 2/2] Show more details of packfile with verify-pack -v.","startedAt":"2005-07-01T00:17:20Z","lastAt":"2005-07-01T00:17:20Z","messageCount":1,"participants":["Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"5503","messageId":"7virzvz8fj.fsf@assigned-by-dhcp.cox.net","threadId":"1065","inReplyTo":null,"subject":"[PATCH 2/2] Show more details of packfile with verify-pack -v.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2005-07-01T00:17:20Z","receivedAt":"2005-07-01T00:17:20Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"This implements show_pack_info() function used in verify-pack\ncommand when -v flag is used to obtain something like\nunpack-objects used to give when it was first written.\n\nIt shows the following for each non-deltified object found in\nthe pack:\n\n    SHA1 type size offset\n\nFor deltified objects, it shows this instead:\n\n    SHA1 type size offset depth base_sha1\n\nIn order to get the output in the order that appear in the pack\nfile for debugging purposes, you can do this:\n\n $ git-verify-pack -v packfile | sort -n -k 4,4\n\nSigned-off-by: Junio C Hamano <junkio@cox.net>\n---\n\n cache.h      |    1 +\n pack-check.c |   33 ++++++++++++++++++++++++++++++++-\n sha1_file.c  |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 84 insertions(+), 1 deletions(-)\n\nc45c7e2f7d1718a156cef21630940e6be0e75d18\ndiff --git a/cache.h b/cache.h\n--- a/cache.h\n+++ b/cache.h\n@@ -266,5 +266,6 @@ extern int num_packed_objects(const stru\n extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*);\n extern int find_pack_entry_one(const unsigned char *, struct pack_entry *, struct packed_git *);\n extern void *unpack_entry_gently(struct pack_entry *, char *, unsigned long *);\n+extern void packed_object_info_detail(struct pack_entry *, char *, unsigned long *, unsigned long *, int *, unsigned char *);\n \n #endif /* CACHE_H */\ndiff --git a/pack-check.c b/pack-check.c\n--- a/pack-check.c\n+++ b/pack-check.c\n@@ -72,7 +72,36 @@ static int verify_packfile(struct packed\n \n static void show_pack_info(struct packed_git *p)\n {\n-\t/* Next round */\n+\tstruct pack_header *hdr;\n+\tint nr_objects, i;\n+\n+\thdr = p->pack_base;\n+\tnr_objects = ntohl(hdr->hdr_entries);\n+\n+\tfor (i = 0; i < nr_objects; i++) {\n+\t\tunsigned char sha1[20], base_sha1[20];\n+\t\tstruct pack_entry e;\n+\t\tchar type[20];\n+\t\tunsigned long size;\n+\t\tunsigned long store_size;\n+\t\tint delta_chain_length;\n+\n+\t\tif (nth_packed_object_sha1(p, i, sha1))\n+\t\t\tdie(\"internal error pack-check nth-packed-object\");\n+\t\tif (!find_pack_entry_one(sha1, &e, p))\n+\t\t\tdie(\"internal error pack-check find-pack-entry-one\");\n+\n+\t\tpacked_object_info_detail(&e, type, &size, &store_size,\n+\t\t\t\t\t  &delta_chain_length,\n+\t\t\t\t\t  base_sha1);\n+\t\tprintf(\"%s \", sha1_to_hex(sha1));\n+\t\tif (!delta_chain_length)\n+\t\t\tprintf(\"%-6s %lu %u\\n\", type, size, e.offset);\n+\t\telse\n+\t\t\tprintf(\"%-6s %lu %u %d %s\\n\", type, size, e.offset,\n+\t\t\t       delta_chain_length, sha1_to_hex(base_sha1));\n+\t}\n+\n }\n \n int verify_pack(struct packed_git *p, int verbose)\n@@ -103,7 +132,9 @@ int verify_pack(struct packed_git *p, in\n \t\tif (ret)\n \t\t\tprintf(\"%s: bad\\n\", p->pack_name);\n \t\telse {\n+\t\t\tuse_packed_git(p);\n \t\t\tshow_pack_info(p);\n+\t\t\tunuse_packed_git(p);\n \t\t\tprintf(\"%s: ok\\n\", p->pack_name);\n \t\t}\n \t}\ndiff --git a/sha1_file.c b/sha1_file.c\n--- a/sha1_file.c\n+++ b/sha1_file.c\n@@ -704,6 +704,57 @@ static unsigned long unpack_object_heade\n \treturn offset;\n }\n \n+void packed_object_info_detail(struct pack_entry *e,\n+\t\t\t       char *type,\n+\t\t\t       unsigned long *size,\n+\t\t\t       unsigned long *store_size,\n+\t\t\t       int *delta_chain_length,\n+\t\t\t       unsigned char *base_sha1)\n+{\n+\tstruct packed_git *p = e->p;\n+\tunsigned long offset, left;\n+\tunsigned char *pack;\n+\tenum object_type kind;\n+\n+\toffset = unpack_object_header(p, e->offset, &kind, size);\n+\tpack = p->pack_base + offset;\n+\tleft = p->pack_size - offset;\n+\tif (kind != OBJ_DELTA)\n+\t\t*delta_chain_length = 0;\n+\telse {\n+\t\tint chain_length = 0;\n+\t\tmemcpy(base_sha1, pack, 20);\n+\t\tdo {\n+\t\t\tstruct pack_entry base_ent;\n+\t\t\tunsigned long junk;\n+\n+\t\t\tfind_pack_entry_one(pack, &base_ent, p);\n+\t\t\toffset = unpack_object_header(p, base_ent.offset,\n+\t\t\t\t\t\t      &kind, &junk);\n+\t\t\tpack = p->pack_base + offset;\n+\t\t\tchain_length++;\n+\t\t} while (kind == OBJ_DELTA);\n+\t\t*delta_chain_length = chain_length;\n+\t}\n+\tswitch (kind) {\n+\tcase OBJ_COMMIT:\n+\t\tstrcpy(type, \"commit\");\n+\t\tbreak;\n+\tcase OBJ_TREE:\n+\t\tstrcpy(type, \"tree\");\n+\t\tbreak;\n+\tcase OBJ_BLOB:\n+\t\tstrcpy(type, \"blob\");\n+\t\tbreak;\n+\tcase OBJ_TAG:\n+\t\tstrcpy(type, \"tag\");\n+\t\tbreak;\n+\tdefault:\n+\t\tdie(\"corrupted pack file\");\n+\t}\n+\t*store_size = 0; /* notyet */\n+}\n+\n static int packed_object_info(struct pack_entry *entry,\n \t\t\t      char *type, unsigned long *sizep)\n {\n------------\n"}]}