{"thread":{"id":"43137","subject":"Re: [PATCH 1/5] upload-pack: no longer call rev-list","startedAt":"2006-10-30T19:08:43Z","lastAt":"2006-10-31T10:02:16Z","messageCount":4,"participants":["Johannes Schindelin","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":5},"messages":[{"id":"298378","messageId":"Pine.LNX.4.63.0610302008320.26682@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"43137","inReplyTo":null,"subject":"[PATCH 1/5] upload-pack: no longer call rev-list","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2006-10-30T19:08:43Z","receivedAt":"2006-10-30T19:08:43Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nIt is trivial to do now, and it is needed for the upcoming shallow\nclone stuff.\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n upload-pack.c |   93 ++++++++++++++++++++++++++++++++++++--------------------\n 1 files changed, 60 insertions(+), 33 deletions(-)\n\ndiff --git a/upload-pack.c b/upload-pack.c\nindex 4572fff..7f7df2a 100644\n--- a/upload-pack.c\n+++ b/upload-pack.c\n@@ -9,6 +9,9 @@\n #include \"object.h\"\n #include \"commit.h\"\n #include \"exec_cmd.h\"\n+#include \"diff.h\"\n+#include \"revision.h\"\n+#include \"list-objects.h\"\n \n static const char upload_pack_usage[] = \"git-upload-pack [--strict] [--timeout=nn] <dir>\";\n \n@@ -57,6 +60,40 @@ static ssize_t send_client_data(int fd,\n \treturn safe_write(fd, data, sz);\n }\n \n+FILE *pack_pipe = NULL;\n+static void show_commit(struct commit *commit)\n+{\n+\tif (commit->object.flags & BOUNDARY)\n+\t\tfputc('-', pack_pipe);\n+\tif (fputs(sha1_to_hex(commit->object.sha1), pack_pipe) < 0)\n+\t\tdie(\"broken output pipe\");\n+\tfputc('\\n', pack_pipe);\n+\tfflush(pack_pipe);\n+\tfree(commit->buffer);\n+\tcommit->buffer = NULL;\n+}\n+\n+static void show_object(struct object_array_entry *p)\n+{\n+\t/* An object with name \"foo\\n0000000...\" can be used to\n+\t * confuse downstream git-pack-objects very badly.\n+\t */\n+\tconst char *ep = strchr(p->name, '\\n');\n+\tif (ep) {\n+\t\tfprintf(pack_pipe, \"%s %.*s\\n\", sha1_to_hex(p->item->sha1),\n+\t\t       (int) (ep - p->name),\n+\t\t       p->name);\n+\t}\n+\telse\n+\t\tfprintf(pack_pipe, \"%s %s\\n\",\n+\t\t\t\tsha1_to_hex(p->item->sha1), p->name);\n+}\n+\n+static void show_edge(struct commit *commit)\n+{\n+\tfprintf(pack_pipe, \"-%s\\n\", sha1_to_hex(commit->object.sha1));\n+}\n+\n static void create_pack_file(void)\n {\n \t/* Pipes between rev-list to pack-objects, pack-objects to us\n@@ -78,48 +115,38 @@ static void create_pack_file(void)\n \n \tif (!pid_rev_list) {\n \t\tint i;\n-\t\tint args;\n-\t\tconst char **argv;\n-\t\tconst char **p;\n-\t\tchar *buf;\n+\t\tstruct rev_info revs;\n \n-\t\tif (create_full_pack) {\n-\t\t\targs = 10;\n-\t\t\tuse_thin_pack = 0; /* no point doing it */\n-\t\t}\n-\t\telse\n-\t\t\targs = have_obj.nr + want_obj.nr + 5;\n-\t\tp = xmalloc(args * sizeof(char *));\n-\t\targv = (const char **) p;\n-\t\tbuf = xmalloc(args * 45);\n+\t\tpack_pipe = fdopen(lp_pipe[1], \"w\");\n \n-\t\tdup2(lp_pipe[1], 1);\n-\t\tclose(0);\n-\t\tclose(lp_pipe[0]);\n-\t\tclose(lp_pipe[1]);\n-\t\t*p++ = \"rev-list\";\n-\t\t*p++ = use_thin_pack ? \"--objects-edge\" : \"--objects\";\n \t\tif (create_full_pack)\n-\t\t\t*p++ = \"--all\";\n-\t\telse {\n+\t\t\tuse_thin_pack = 0; /* no point doing it */\n+\t\tinit_revisions(&revs, NULL);\n+\t\trevs.tag_objects = 1;\n+\t\trevs.tree_objects = 1;\n+\t\trevs.blob_objects = 1;\n+\t\tif (use_thin_pack)\n+\t\t\trevs.edge_hint = 1;\n+\n+\t\tif (create_full_pack) {\n+\t\t\tconst char *args[] = {\"rev-list\", \"--all\", NULL};\n+\t\t\tsetup_revisions(2, args, &revs, NULL);\n+\t\t} else {\n \t\t\tfor (i = 0; i < want_obj.nr; i++) {\n \t\t\t\tstruct object *o = want_obj.objects[i].item;\n-\t\t\t\t*p++ = buf;\n-\t\t\t\tmemcpy(buf, sha1_to_hex(o->sha1), 41);\n-\t\t\t\tbuf += 41;\n+\t\t\t\tadd_pending_object(&revs, o, NULL);\n \t\t\t}\n-\t\t}\n-\t\tif (!create_full_pack)\n \t\t\tfor (i = 0; i < have_obj.nr; i++) {\n \t\t\t\tstruct object *o = have_obj.objects[i].item;\n-\t\t\t\t*p++ = buf;\n-\t\t\t\t*buf++ = '^';\n-\t\t\t\tmemcpy(buf, sha1_to_hex(o->sha1), 41);\n-\t\t\t\tbuf += 41;\n+\t\t\t\to->flags |= UNINTERESTING;\n+\t\t\t\tadd_pending_object(&revs, o, NULL);\n \t\t\t}\n-\t\t*p++ = NULL;\n-\t\texecv_git_cmd(argv);\n-\t\tdie(\"git-upload-pack: unable to exec git-rev-list\");\n+\t\t\tsetup_revisions(0, NULL, &revs, NULL);\n+\t\t}\n+\t\tprepare_revision_walk(&revs);\n+\t\tmark_edges_uninteresting(revs.commits, &revs, show_edge);\n+\t\ttraverse_commit_list(&revs, show_commit, show_object);\n+\t\texit(0);\n \t}\n \n \tif (pipe(pu_pipe) < 0)\n-- \n1.4.3.3.gca42\n"},{"id":"297534","messageId":"7v1woprrwi.fsf@assigned-by-dhcp.cox.net","threadId":"43137","inReplyTo":"Pine.LNX.4.63.0610302008320.26682@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH 1/5] upload-pack: no longer call rev-list","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-10-31T05:11:25Z","receivedAt":"2006-10-31T05:11:25Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n\n> It is trivial to do now,...\n\nMay be, but can we do something about these duplicated code?\n\n> @@ -57,6 +60,40 @@ static ssize_t send_client_data(int fd,\n>  \treturn safe_write(fd, data, sz);\n>  }\n>  \n> +FILE *pack_pipe = NULL;\n> +static void show_commit(struct commit *commit)\n> +{\n> +\tif (commit->object.flags & BOUNDARY)\n> +\t\tfputc('-', pack_pipe);\n> +\tif (fputs(sha1_to_hex(commit->object.sha1), pack_pipe) < 0)\n> +\t\tdie(\"broken output pipe\");\n> +\tfputc('\\n', pack_pipe);\n> +\tfflush(pack_pipe);\n> +\tfree(commit->buffer);\n> +\tcommit->buffer = NULL;\n> +}\n> +\n> +static void show_object(struct object_array_entry *p)\n> +{\n> +\t/* An object with name \"foo\\n0000000...\" can be used to\n> +\t * confuse downstream git-pack-objects very badly.\n> +\t */\n> +\tconst char *ep = strchr(p->name, '\\n');\n> +\tif (ep) {\n> +\t\tfprintf(pack_pipe, \"%s %.*s\\n\", sha1_to_hex(p->item->sha1),\n> +\t\t       (int) (ep - p->name),\n> +\t\t       p->name);\n> +\t}\n> +\telse\n> +\t\tfprintf(pack_pipe, \"%s %s\\n\",\n> +\t\t\t\tsha1_to_hex(p->item->sha1), p->name);\n> +}\n> +\n> +static void show_edge(struct commit *commit)\n> +{\n> +\tfprintf(pack_pipe, \"-%s\\n\", sha1_to_hex(commit->object.sha1));\n> +}\n> +\n\n"},{"id":"297395","messageId":"Pine.LNX.4.63.0610311054500.26682@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"43137","inReplyTo":"7v1woprrwi.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH 1/5] upload-pack: no longer call rev-list","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2006-10-31T09:56:29Z","receivedAt":"2006-10-31T09:56:29Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\n\nOn Mon, 30 Oct 2006, Junio C Hamano wrote:\n\n> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n> \n> > It is trivial to do now,...\n> \n> May be, but can we do something about these duplicated code?\n> \n> > @@ -57,6 +60,40 @@ static ssize_t send_client_data(int fd,\n> >  \treturn safe_write(fd, data, sz);\n> >  }\n> >  \n> > +FILE *pack_pipe = NULL;\n> > +static void show_commit(struct commit *commit)\n> > [...]\n\nYes, we could make mark_edges_uninteresting() and traverse_commit_list() \ntake a FILE * parameter, which is then passed to the functions. Hmmm?\n\nExcept show_commit() should not show \"commit \" in front of each line. So, \nanother parameter?\n\nCiao,\nDscho\n"},{"id":"293901","messageId":"Pine.LNX.4.63.0610311100170.26682@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"43137","inReplyTo":"Pine.LNX.4.63.0610311054500.26682@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH 1/5] upload-pack: no longer call rev-list","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2006-10-31T10:02:16Z","receivedAt":"2006-10-31T10:02:16Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Tue, 31 Oct 2006, Johannes Schindelin wrote:\n\n> Except show_commit() should not show \"commit \" in front of each line. \n> So, another parameter?\n\nSorry, that was not clear. When using traverse_commit_list() from \nupload-pack, the \"commit \" prefix is _not_ shown. With every other \nuser of travsere_commit_list(), it is.\n\nCiao,\nDscho\n"}]}