{"thread":{"id":"384","subject":"[PATCH] Use read_object_with_reference() in tar-tree","startedAt":"2005-04-29T03:21:27Z","lastAt":"2005-04-29T03:21:27Z","messageCount":1,"participants":["Rene Scharfe"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"2116","messageId":"20050429032127.GA12160@lsrfire.ath.cx","threadId":"384","inReplyTo":null,"subject":"[PATCH] Use read_object_with_reference() in tar-tree","fromName":"Rene Scharfe","fromEmail":"rene.scharfe@lsrfire.ath.cx","sentAt":"2005-04-29T03:21:27Z","receivedAt":"2005-04-29T03:21:27Z","isPatch":true,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"This patch replaces the usage of read_tree_with_tree_or_commit_sha1()\nwith read_object_with_reference() in tar-tree.  As a result the code\nthat tries to figure out the commit time doesn't need to open the commit\nobject 'by hand' any more.\n\nSigned-off-by: Rene Scharfe <lsrfire.ath.cx>\n\nIndex: tar-tree.c\n===================================================================\n--- dc0b54b68c90574a689fef23c5ab26d165f3ee2e/tar-tree.c  (mode:100644 sha1:d078cb5a8d4ab5bc2c774b889b602d179bde39b1)\n+++ 1e2168c7d554a4fbd25a09bb591ae0f82dac6513/tar-tree.c  (mode:100644 sha1:5cc7cfef6db1269d81589b82255537fb64ba02fa)\n@@ -291,35 +291,28 @@\n }\n \n /* get commit time from committer line of commit object */\n-time_t commit_time(const unsigned char *sha1)\n+time_t commit_time(void * buffer, unsigned long size)\n {\n-        char type[20];\n-        void *buffer;\n-        unsigned long size;\n \ttime_t result = 0;\n+\tchar *p = buffer;\n \n-        buffer = read_sha1_file(sha1, type, &size);\n-\tif (buffer) {\n-\t\tchar *p = buffer;\n-\t\twhile (size > 0) {\n-\t\t\tchar *endp = memchr(p, '\\n', size);\n-\t\t\tif (!endp || endp == p)\n-\t\t\t\tbreak;\n-\t\t\t*endp = '\\0';\n-\t\t\tif (endp - p > 10 && !memcmp(p, \"committer \", 10)) {\n-\t\t\t\tchar *nump = strrchr(p, '>');\n-\t\t\t\tif (!nump)\n-\t\t\t\t\tbreak;\n-\t\t\t\tnump++;\n-\t\t\t\tresult = strtoul(nump, &endp, 10);\n-\t\t\t\tif (*endp != ' ')\n-\t\t\t\t\tresult = 0;\n+\twhile (size > 0) {\n+\t\tchar *endp = memchr(p, '\\n', size);\n+\t\tif (!endp || endp == p)\n+\t\t\tbreak;\n+\t\t*endp = '\\0';\n+\t\tif (endp - p > 10 && !memcmp(p, \"committer \", 10)) {\n+\t\t\tchar *nump = strrchr(p, '>');\n+\t\t\tif (!nump)\n \t\t\t\tbreak;\n-\t\t\t}\n-\t\t\tsize -= endp - p - 1;\n-\t\t\tp = endp + 1;\n+\t\t\tnump++;\n+\t\t\tresult = strtoul(nump, &endp, 10);\n+\t\t\tif (*endp != ' ')\n+\t\t\t\tresult = 0;\n+\t\t\tbreak;\n \t\t}\n-\t\tfree(buffer);\n+\t\tsize -= endp - p - 1;\n+\t\tp = endp + 1;\n \t}\n \treturn result;\n }\n@@ -329,7 +322,6 @@\n \tunsigned char sha1[20];\n \tvoid *buffer;\n \tunsigned long size;\n-\tunsigned char tree_sha1[20];\n \n \tswitch (argc) {\n \tcase 3:\n@@ -347,11 +339,15 @@\n \tif (!sha1_file_directory)\n \t\tsha1_file_directory = DEFAULT_DB_ENVIRONMENT;\n \n-\tbuffer = read_tree_with_tree_or_commit_sha1(sha1, &size, tree_sha1);\n+\tbuffer = read_object_with_reference(sha1, \"commit\", &size, NULL);\n+\tif (buffer) {\n+\t\tarchive_time = commit_time(buffer, size);\n+\t\tfree(buffer);\n+\t}\n+\tbuffer = read_object_with_reference(sha1, \"tree\", &size, NULL);\n \tif (!buffer)\n-\t\tdie(\"unable to read sha1 file\");\n-\tif (memcmp(sha1, tree_sha1, 20))\t/* is sha1 a commit object? */\n-\t\tarchive_time = commit_time(sha1);\n+\t\tdie(\"not a reference to a tag, commit or tree object: %s\",\n+\t\t    sha1_to_hex(sha1));\n \tif (!archive_time)\n \t\tarchive_time = time(NULL);\n \tif (basedir)\n"}]}