{"thread":{"id":"10518","subject":"[PATCH 3/4 v2] Build-in send-pack, with an API for other programs to call.","startedAt":"2007-10-30T02:03:39Z","lastAt":"2007-10-30T02:03:39Z","messageCount":1,"participants":["Daniel Barkalow"],"isPatch":true,"patchVersion":2,"patchTotal":4},"messages":[{"id":"57510","messageId":"Pine.LNX.4.64.0710292202530.7357@iabervon.org","threadId":"10518","inReplyTo":null,"subject":"[PATCH 3/4 v2] Build-in send-pack, with an API for other programs to call.","fromName":"Daniel Barkalow","fromEmail":"barkalow@iabervon.org","sentAt":"2007-10-30T02:03:39Z","receivedAt":"2007-10-30T02:03:39Z","isPatch":true,"sender":{"key":"barkalow@iabervon.org","avatar":"https://avatars.githubusercontent.com/u/55364219?v=4"},"body":"Also marks some more things as const, as needed.\n\nSigned-off-by: Daniel Barkalow <barkalow@iabervon.org>\n---\n Makefile                           |    1 +\n send-pack.c => builtin-send-pack.c |   81 +++++++++++++++++++----------------\n builtin.h                          |    1 +\n git.c                              |    1 +\n send-pack.h                        |   17 ++++++++\n 5 files changed, 64 insertions(+), 37 deletions(-)\n rename send-pack.c => builtin-send-pack.c (88%)\n create mode 100644 send-pack.h\n\ndiff --git a/Makefile b/Makefile\nindex 64ad297..8b0c8cd 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -359,6 +359,7 @@ BUILTIN_OBJS = \\\n \tbuiltin-push.o \\\n \tbuiltin-read-tree.o \\\n \tbuiltin-reflog.o \\\n+\tbuiltin-send-pack.o \\\n \tbuiltin-config.o \\\n \tbuiltin-rerere.o \\\n \tbuiltin-reset.o \\\ndiff --git a/send-pack.c b/builtin-send-pack.c\nsimilarity index 88%\nrename from send-pack.c\nrename to builtin-send-pack.c\nindex fe56617..60a12f7 100644\n--- a/send-pack.c\n+++ b/builtin-send-pack.c\n@@ -5,16 +5,15 @@\n #include \"pkt-line.h\"\n #include \"run-command.h\"\n #include \"remote.h\"\n+#include \"send-pack.h\"\n \n static const char send_pack_usage[] =\n \"git-send-pack [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...]\\n\"\n \"  --all and explicit <ref> specification are mutually exclusive.\";\n-static const char *receivepack = \"git-receive-pack\";\n-static int verbose;\n-static int send_all;\n-static int force_update;\n-static int use_thin_pack;\n-static int dry_run;\n+\n+static struct send_pack_args args = {\n+\t/* .receivepack = */ \"git-receive-pack\",\n+};\n \n /*\n  * Make a pack stream and spit it out into file descriptor fd\n@@ -26,7 +25,7 @@ static int pack_objects(int fd, struct ref *refs)\n \t * the revision parameters to it via its stdin and\n \t * let its stdout go back to the other end.\n \t */\n-\tconst char *args[] = {\n+\tconst char *argv[] = {\n \t\t\"pack-objects\",\n \t\t\"--all-progress\",\n \t\t\"--revs\",\n@@ -36,10 +35,10 @@ static int pack_objects(int fd, struct ref *refs)\n \t};\n \tstruct child_process po;\n \n-\tif (use_thin_pack)\n-\t\targs[4] = \"--thin\";\n+\tif (args.use_thin_pack)\n+\t\targv[4] = \"--thin\";\n \tmemset(&po, 0, sizeof(po));\n-\tpo.argv = args;\n+\tpo.argv = argv;\n \tpo.in = -1;\n \tpo.out = fd;\n \tpo.git_cmd = 1;\n@@ -178,7 +177,7 @@ static int receive_status(int in)\n \treturn ret;\n }\n \n-static int send_pack(int in, int out, struct remote *remote, int nr_refspec, const char **refspec)\n+static int do_send_pack(int in, int out, struct remote *remote, int nr_refspec, const char **refspec)\n {\n \tstruct ref *ref;\n \tint new_refs;\n@@ -201,7 +200,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, con\n \tif (!remote_tail)\n \t\tremote_tail = &remote_refs;\n \tif (match_refs(local_refs, remote_refs, &remote_tail,\n-\t\t       nr_refspec, refspec, send_all))\n+\t\t       nr_refspec, refspec, args.send_all))\n \t\treturn -1;\n \n \tif (!remote_refs) {\n@@ -230,7 +229,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, con\n \t\t}\n \t\tif (!will_delete_ref &&\n \t\t    !hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) {\n-\t\t\tif (verbose)\n+\t\t\tif (args.verbose)\n \t\t\t\tfprintf(stderr, \"'%s': up-to-date\\n\", ref->name);\n \t\t\tcontinue;\n \t\t}\n@@ -254,7 +253,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, con\n \t\t *     always allowed.\n \t\t */\n \n-\t\tif (!force_update &&\n+\t\tif (!args.force_update &&\n \t\t    !will_delete_ref &&\n \t\t    !is_null_sha1(ref->old_sha1) &&\n \t\t    !ref->force) {\n@@ -284,7 +283,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, con\n \t\tstrcpy(old_hex, sha1_to_hex(ref->old_sha1));\n \t\tnew_hex = sha1_to_hex(ref->new_sha1);\n \n-\t\tif (!dry_run) {\n+\t\tif (!args.dry_run) {\n \t\t\tif (ask_for_status_report) {\n \t\t\t\tpacket_write(out, \"%s %s %s%c%s\",\n \t\t\t\t\told_hex, new_hex, ref->name, 0,\n@@ -306,7 +305,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, con\n \t\t\tfprintf(stderr, \"\\n  from %s\\n  to   %s\\n\",\n \t\t\t\told_hex, new_hex);\n \t\t}\n-\t\tif (remote && !dry_run) {\n+\t\tif (remote && !args.dry_run) {\n \t\t\tstruct refspec rs;\n \t\t\trs.src = ref->name;\n \t\t\trs.dst = NULL;\n@@ -325,7 +324,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, con\n \t}\n \n \tpacket_flush(out);\n-\tif (new_refs && !dry_run)\n+\tif (new_refs && !args.dry_run)\n \t\tret = pack_objects(out, remote_refs);\n \tclose(out);\n \n@@ -360,30 +359,25 @@ static void verify_remote_names(int nr_heads, const char **heads)\n \t}\n }\n \n-int main(int argc, char **argv)\n+int cmd_send_pack(int argc, const char **argv, const char *prefix)\n {\n \tint i, nr_heads = 0;\n-\tchar *dest = NULL;\n \tconst char **heads = NULL;\n-\tint fd[2], ret;\n-\tpid_t pid;\n-\tchar *remote_name = NULL;\n+\tconst char *remote_name = NULL;\n \tstruct remote *remote = NULL;\n-\n-\tsetup_git_directory();\n-\tgit_config(git_default_config);\n+\tconst char *dest = NULL;\n \n \targv++;\n \tfor (i = 1; i < argc; i++, argv++) {\n-\t\tchar *arg = *argv;\n+\t\tconst char *arg = *argv;\n \n \t\tif (*arg == '-') {\n \t\t\tif (!prefixcmp(arg, \"--receive-pack=\")) {\n-\t\t\t\treceivepack = arg + 15;\n+\t\t\t\targs.receivepack = arg + 15;\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tif (!prefixcmp(arg, \"--exec=\")) {\n-\t\t\t\treceivepack = arg + 7;\n+\t\t\t\targs.receivepack = arg + 7;\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tif (!prefixcmp(arg, \"--remote=\")) {\n@@ -391,23 +385,23 @@ int main(int argc, char **argv)\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tif (!strcmp(arg, \"--all\")) {\n-\t\t\t\tsend_all = 1;\n+\t\t\t\targs.send_all = 1;\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tif (!strcmp(arg, \"--dry-run\")) {\n-\t\t\t\tdry_run = 1;\n+\t\t\t\targs.dry_run = 1;\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tif (!strcmp(arg, \"--force\")) {\n-\t\t\t\tforce_update = 1;\n+\t\t\t\targs.force_update = 1;\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tif (!strcmp(arg, \"--verbose\")) {\n-\t\t\t\tverbose = 1;\n+\t\t\t\targs.verbose = 1;\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tif (!strcmp(arg, \"--thin\")) {\n-\t\t\t\tuse_thin_pack = 1;\n+\t\t\t\targs.use_thin_pack = 1;\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tusage(send_pack_usage);\n@@ -422,9 +416,8 @@ int main(int argc, char **argv)\n \t}\n \tif (!dest)\n \t\tusage(send_pack_usage);\n-\tif (heads && send_all)\n+\tif (heads && args.send_all)\n \t\tusage(send_pack_usage);\n-\tverify_remote_names(nr_heads, heads);\n \n \tif (remote_name) {\n \t\tremote = remote_get(remote_name);\n@@ -434,10 +427,24 @@ int main(int argc, char **argv)\n \t\t}\n \t}\n \n-\tpid = git_connect(fd, dest, receivepack, verbose ? CONNECT_VERBOSE : 0);\n+\treturn send_pack(&args, dest, remote, nr_heads, heads);\n+}\n+\n+int send_pack(struct send_pack_args *my_args,\n+\t      const char *dest, struct remote *remote,\n+\t      int nr_heads, const char **heads)\n+{\n+\tint fd[2], ret;\n+\tpid_t pid;\n+\n+\tmemcpy(&args, my_args, sizeof(args));\n+\n+\tverify_remote_names(nr_heads, heads);\n+\n+\tpid = git_connect(fd, dest, args.receivepack, args.verbose ? CONNECT_VERBOSE : 0);\n \tif (pid < 0)\n \t\treturn 1;\n-\tret = send_pack(fd[0], fd[1], remote, nr_heads, heads);\n+\tret = do_send_pack(fd[0], fd[1], remote, nr_heads, heads);\n \tclose(fd[0]);\n \tclose(fd[1]);\n \tret |= finish_connect(pid);\ndiff --git a/builtin.h b/builtin.h\nindex ff84835..51747c7 100644\n--- a/builtin.h\n+++ b/builtin.h\n@@ -69,6 +69,7 @@ extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);\n extern int cmd_revert(int argc, const char **argv, const char *prefix);\n extern int cmd_rm(int argc, const char **argv, const char *prefix);\n extern int cmd_runstatus(int argc, const char **argv, const char *prefix);\n+extern int cmd_send_pack(int argc, const char **argv, const char *prefix);\n extern int cmd_shortlog(int argc, const char **argv, const char *prefix);\n extern int cmd_show(int argc, const char **argv, const char *prefix);\n extern int cmd_show_branch(int argc, const char **argv, const char *prefix);\ndiff --git a/git.c b/git.c\nindex 1b182e2..4893a85 100644\n--- a/git.c\n+++ b/git.c\n@@ -370,6 +370,7 @@ static void handle_internal_command(int argc, const char **argv)\n \t\t{ \"revert\", cmd_revert, RUN_SETUP | NEED_WORK_TREE },\n \t\t{ \"rm\", cmd_rm, RUN_SETUP | NEED_WORK_TREE },\n \t\t{ \"runstatus\", cmd_runstatus, RUN_SETUP | NEED_WORK_TREE },\n+\t\t{ \"send-pack\", cmd_send_pack, RUN_SETUP },\n \t\t{ \"shortlog\", cmd_shortlog, RUN_SETUP | USE_PAGER },\n \t\t{ \"show-branch\", cmd_show_branch, RUN_SETUP },\n \t\t{ \"show\", cmd_show, RUN_SETUP | USE_PAGER },\ndiff --git a/send-pack.h b/send-pack.h\nnew file mode 100644\nindex 0000000..7a24f71\n--- /dev/null\n+++ b/send-pack.h\n@@ -0,0 +1,17 @@\n+#ifndef SEND_PACK_H\n+#define SEND_PACK_H\n+\n+struct send_pack_args {\n+\tconst char *receivepack;\n+\tunsigned verbose:1,\n+\t\tsend_all:1,\n+\t\tforce_update:1,\n+\t\tuse_thin_pack:1,\n+\t\tdry_run:1;\n+};\n+\n+int send_pack(struct send_pack_args *args,\n+\t      const char *dest, struct remote *remote,\n+\t      int nr_heads, const char **heads);\n+\n+#endif\n-- \n1.5.3.4.1206.g5f96\n"}]}