{"thread":{"id":"18213","subject":"[PATCH 1/2] fast-import: no longer compute the SHA1 data in store_object(). Instead, do it in the caller through the new sha1_object() and parse_object_data() functions.","startedAt":"2009-03-08T18:35:34Z","lastAt":"2009-03-08T18:35:34Z","messageCount":1,"participants":["Sam Hocevar"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"107390","messageId":"20090308183533.GA9585@zoy.org","threadId":"18213","inReplyTo":null,"subject":"[PATCH 1/2] fast-import: no longer compute the SHA1 data in store_object(). Instead, do it in the caller through the new sha1_object() and parse_object_data() functions.","fromName":"Sam Hocevar","fromEmail":"sam@zoy.org","sentAt":"2009-03-08T18:35:34Z","receivedAt":"2009-03-08T18:35:34Z","isPatch":true,"sender":{"key":"sam@zoy.org","avatar":"https://gravatar.com/avatar/1fc1e5d8c3a8d737f14572135671adfbc0e61ffba5c3bc1d1b8a6f4aac764470?d=mp&s=160"},"body":"This is necessary if we want to send deflated data to store_object() without\nkeeping the original data in memory.\n\nSigned-off-by: Sam Hocevar <sam@zoy.org>\n---\n fast-import.c |   58 +++++++++++++++++++++++++++++++++++++++++---------------\n 1 files changed, 42 insertions(+), 16 deletions(-)\n\ndiff --git a/fast-import.c b/fast-import.c\nindex 3748ddf..6419d00 100644\n--- a/fast-import.c\n+++ b/fast-import.c\n@@ -1022,29 +1022,35 @@ static size_t encode_header(\n \treturn n;\n }\n \n-static int store_object(\n+static void sha1_object(\n \tenum object_type type,\n \tstruct strbuf *dat,\n-\tstruct last_object *last,\n-\tunsigned char *sha1out,\n-\tuintmax_t mark)\n+\tunsigned char *sha1out)\n {\n-\tvoid *out, *delta;\n-\tstruct object_entry *e;\n \tunsigned char hdr[96];\n-\tunsigned char sha1[20];\n-\tunsigned long hdrlen, deltalen;\n+\tunsigned long hdrlen;\n \tgit_SHA_CTX c;\n-\tz_stream s;\n \n \thdrlen = sprintf((char*)hdr,\"%s %lu\", typename(type),\n \t\t(unsigned long)dat->len) + 1;\n \tgit_SHA1_Init(&c);\n \tgit_SHA1_Update(&c, hdr, hdrlen);\n \tgit_SHA1_Update(&c, dat->buf, dat->len);\n-\tgit_SHA1_Final(sha1, &c);\n-\tif (sha1out)\n-\t\thashcpy(sha1out, sha1);\n+\tgit_SHA1_Final(sha1out, &c);\n+}\n+\n+static int store_object(\n+\tenum object_type type,\n+\tstruct strbuf *dat,\n+\tstruct last_object *last,\n+\tunsigned char *sha1,\n+\tuintmax_t mark)\n+{\n+\tvoid *out, *delta;\n+\tstruct object_entry *e;\n+\tunsigned char hdr[96];\n+\tunsigned long hdrlen, deltalen;\n+\tz_stream s;\n \n \te = insert_object(sha1);\n \tif (mark)\n@@ -1336,6 +1342,7 @@ static void store_tree(struct tree_entry *root)\n \t}\n \n \tmktree(t, 1, &new_tree);\n+\tsha1_object(OBJ_TREE, &new_tree, root->versions[1].sha1);\n \tstore_object(OBJ_TREE, &new_tree, &lo, root->versions[1].sha1, 0);\n \n \tt->delta_depth = lo.depth;\n@@ -1702,7 +1709,12 @@ static void parse_mark(void)\n \t\tnext_mark = 0;\n }\n \n-static void parse_data(struct strbuf *sb)\n+/* This actually parses a \"data\" command, with the addition that if sha1out\n+ * is not NULL, it will also compute the sha1 on the fly. */\n+static void parse_object_data(\n+\tenum object_type type,\n+\tstruct strbuf *sb,\n+\tunsigned char *sha1out)\n {\n \tstrbuf_reset(sb);\n \n@@ -1724,6 +1736,9 @@ static void parse_data(struct strbuf *sb)\n \t\t\tstrbuf_addch(sb, '\\n');\n \t\t}\n \t\tfree(term);\n+\n+\t\tif(sha1out)\n+\t\t\tsha1_object(type, sb, sha1out);\n \t}\n \telse {\n \t\tsize_t n = 0, length;\n@@ -1737,11 +1752,19 @@ static void parse_data(struct strbuf *sb)\n \t\t\t\t\t(unsigned long)(length - n));\n \t\t\tn += s;\n \t\t}\n+\n+\t\tif(sha1out)\n+\t\t\tsha1_object(type, sb, sha1out);\n \t}\n \n \tskip_optional_lf();\n }\n \n+static void parse_data(struct strbuf *sb)\n+{\n+\tparse_object_data(OBJ_NONE, sb, NULL);\n+}\n+\n static int validate_raw_date(const char *src, char *result, int maxlen)\n {\n \tconst char *orig_src = src;\n@@ -1805,12 +1828,13 @@ static char *parse_ident(const char *buf)\n \n static void parse_new_blob(void)\n {\n+\tunsigned char sha1[20];\n \tstatic struct strbuf buf = STRBUF_INIT;\n \n \tread_next_command();\n \tparse_mark();\n-\tparse_data(&buf);\n-\tstore_object(OBJ_BLOB, &buf, &last_blob, NULL, next_mark);\n+\tparse_object_data(OBJ_BLOB, &buf, sha1);\n+\tstore_object(OBJ_BLOB, &buf, &last_blob, sha1, next_mark);\n }\n \n static void unload_one_branch(void)\n@@ -1928,7 +1952,7 @@ static void file_change_m(struct branch *b)\n \t\t\tp = uq.buf;\n \t\t}\n \t\tread_next_command();\n-\t\tparse_data(&buf);\n+\t\tparse_object_data(OBJ_BLOB, &buf, sha1);\n \t\tstore_object(OBJ_BLOB, &buf, &last_blob, sha1, 0);\n \t} else if (oe) {\n \t\tif (oe->type != OBJ_BLOB)\n@@ -2211,6 +2235,7 @@ static void parse_new_commit(void)\n \tfree(author);\n \tfree(committer);\n \n+\tsha1_object(OBJ_COMMIT, &new_data, b->sha1);\n \tif (!store_object(OBJ_COMMIT, &new_data, NULL, b->sha1, next_mark))\n \t\tb->pack_id = pack_id;\n \tb->last_commit = object_count_by_type[OBJ_COMMIT];\n@@ -2291,6 +2316,7 @@ static void parse_new_tag(void)\n \tstrbuf_addbuf(&new_data, &msg);\n \tfree(tagger);\n \n+\tsha1_object(OBJ_TAG, &new_data, t->sha1);\n \tif (store_object(OBJ_TAG, &new_data, NULL, t->sha1, 0))\n \t\tt->pack_id = MAX_PACK_ID;\n \telse\n-- \n1.6.2\n"}]}