From 2d4177c01c238071777db5b1fbd8a14efb62ce02 Mon Sep 17 00:00:00 2001 From: Daniel Barkalow Date: Mon, 10 Sep 2007 23:03:00 -0400 Subject: [PATCH] Make fetch-pack a builtin with an internal API Signed-off-by: Daniel Barkalow Signed-off-by: Junio C Hamano --- Makefile | 1 + fetch-pack.c => builtin-fetch-pack.c | 84 ++++++++++++++++++++++++++---------- builtin.h | 1 + fetch-pack.h | 21 +++++++++ git.c | 1 + 5 files changed, 86 insertions(+), 22 deletions(-) rename fetch-pack.c => builtin-fetch-pack.c (93%) create mode 100644 fetch-pack.h diff --git a/Makefile b/Makefile index 3436a2326a..9ce6a9ba31 100644 --- a/Makefile +++ b/Makefile @@ -331,6 +331,7 @@ BUILTIN_OBJS = \ builtin-diff-files.o \ builtin-diff-index.o \ builtin-diff-tree.o \ + builtin-fetch-pack.o \ builtin-fetch--tool.o \ builtin-fmt-merge-msg.o \ builtin-for-each-ref.o \ diff --git a/fetch-pack.c b/builtin-fetch-pack.c similarity index 93% rename from fetch-pack.c rename to builtin-fetch-pack.c index 9c81305be5..3b217d96f0 100644 --- a/fetch-pack.c +++ b/builtin-fetch-pack.c @@ -6,6 +6,7 @@ #include "exec_cmd.h" #include "pack.h" #include "sideband.h" +#include "fetch-pack.h" static int keep_pack; static int transfer_unpack_limit = -1; @@ -573,7 +574,7 @@ static int get_pack(int xd[2]) die("%s died of unnatural causes %d", argv[0], status); } -static int fetch_pack(int fd[2], int nr_match, char **match) +static struct ref *do_fetch_pack(int fd[2], int nr_match, char **match) { struct ref *ref; unsigned char sha1[20]; @@ -615,12 +616,7 @@ static int fetch_pack(int fd[2], int nr_match, char **match) die("git-fetch-pack: fetch failed."); all_done: - while (ref) { - printf("%s %s\n", - sha1_to_hex(ref->old_sha1), ref->name); - ref = ref->next; - } - return 0; + return ref; } static int remove_duplicates(int nr_heads, char **heads) @@ -663,15 +659,28 @@ static int fetch_pack_config(const char *var, const char *value) static struct lock_file lock; -int main(int argc, char **argv) +void setup_fetch_pack(struct fetch_pack_args *args) +{ + uploadpack = args->uploadpack; + quiet = args->quiet; + keep_pack = args->keep_pack; + if (args->unpacklimit >= 0) + unpack_limit = args->unpacklimit; + if (args->keep_pack) + unpack_limit = 0; + use_thin_pack = args->use_thin_pack; + fetch_all = args->fetch_all; + verbose = args->verbose; + depth = args->depth; + no_progress = args->no_progress; +} + +int cmd_fetch_pack(int argc, const char **argv, const char *prefix) { int i, ret, nr_heads; + struct ref *ref; char *dest = NULL, **heads; - int fd[2]; - pid_t pid; - struct stat st; - setup_git_directory(); git_config(fetch_pack_config); if (0 <= transfer_unpack_limit) @@ -682,7 +691,7 @@ int main(int argc, char **argv) nr_heads = 0; heads = NULL; for (i = 1; i < argc; i++) { - char *arg = argv[i]; + const char *arg = argv[i]; if (*arg == '-') { if (!prefixcmp(arg, "--upload-pack=")) { @@ -716,8 +725,6 @@ int main(int argc, char **argv) } if (!prefixcmp(arg, "--depth=")) { depth = strtol(arg + 8, NULL, 0); - if (stat(git_path("shallow"), &st)) - st.st_mtime = 0; continue; } if (!strcmp("--no-progress", arg)) { @@ -726,22 +733,52 @@ int main(int argc, char **argv) } usage(fetch_pack_usage); } - dest = arg; - heads = argv + i + 1; + dest = (char *)arg; + heads = (char **)(argv + i + 1); nr_heads = argc - i - 1; break; } if (!dest) usage(fetch_pack_usage); - pid = git_connect(fd, dest, uploadpack, verbose ? CONNECT_VERBOSE : 0); + + ref = fetch_pack(dest, nr_heads, heads); + + ret = !ref; + + while (ref) { + printf("%s %s\n", + sha1_to_hex(ref->old_sha1), ref->name); + ref = ref->next; + } + + return ret; +} + +struct ref *fetch_pack(const char *dest, int nr_heads, char **heads) +{ + int i, ret; + int fd[2]; + pid_t pid; + struct ref *ref; + struct stat st; + + if (depth > 0) { + if (stat(git_path("shallow"), &st)) + st.st_mtime = 0; + } + + printf("connect to %s\n", dest); + + pid = git_connect(fd, (char *)dest, uploadpack, + verbose ? CONNECT_VERBOSE : 0); if (pid < 0) - return 1; + return NULL; if (heads && nr_heads) nr_heads = remove_duplicates(nr_heads, heads); - ret = fetch_pack(fd, nr_heads, heads); + ref = do_fetch_pack(fd, nr_heads, heads); close(fd[0]); close(fd[1]); - ret |= finish_connect(pid); + ret = finish_connect(pid); if (!ret && nr_heads) { /* If the heads to pull were given, we should have @@ -785,5 +822,8 @@ int main(int argc, char **argv) } } - return !!ret; + if (ret) + ref = NULL; + + return ref; } diff --git a/builtin.h b/builtin.h index 1fa1444e33..d424bfdeb1 100644 --- a/builtin.h +++ b/builtin.h @@ -31,6 +31,7 @@ extern int cmd_diff_files(int argc, const char **argv, const char *prefix); extern int cmd_diff_index(int argc, const char **argv, const char *prefix); extern int cmd_diff(int argc, const char **argv, const char *prefix); extern int cmd_diff_tree(int argc, const char **argv, const char *prefix); +extern int cmd_fetch_pack(int argc, const char **argv, const char *prefix); extern int cmd_fetch__tool(int argc, const char **argv, const char *prefix); extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix); extern int cmd_for_each_ref(int argc, const char **argv, const char *prefix); diff --git a/fetch-pack.h b/fetch-pack.h new file mode 100644 index 0000000000..e06bf5b5c4 --- /dev/null +++ b/fetch-pack.h @@ -0,0 +1,21 @@ +#ifndef FETCH_PACK_H +#define FETCH_PACK_H + +struct fetch_pack_args +{ + const char *uploadpack; + int quiet; + int keep_pack; + int unpacklimit; + int use_thin_pack; + int fetch_all; + int verbose; + int depth; + int no_progress; +}; + +void setup_fetch_pack(struct fetch_pack_args *args); + +struct ref *fetch_pack(const char *dest, int nr_heads, char **heads); + +#endif diff --git a/git.c b/git.c index 41fe73eff9..6ca36c0265 100644 --- a/git.c +++ b/git.c @@ -334,6 +334,7 @@ static void handle_internal_command(int argc, const char **argv) { "diff-files", cmd_diff_files }, { "diff-index", cmd_diff_index, RUN_SETUP }, { "diff-tree", cmd_diff_tree, RUN_SETUP }, + { "fetch-pack", cmd_fetch_pack, RUN_SETUP }, { "fetch--tool", cmd_fetch__tool, RUN_SETUP }, { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP }, { "for-each-ref", cmd_for_each_ref, RUN_SETUP }, -- 2.11.4.GIT