diff --git a/Makefile b/Makefile index 37d7192f6c..6518675f6d 100644 --- a/Makefile +++ b/Makefile @@ -86,9 +86,9 @@ git-unpack-file: unpack-file.c git-export: export.c git-diff-cache: diff-cache.c git-convert-cache: convert-cache.c -git-http-pull: http-pull.c +git-http-pull: http-pull.c pull.c git-rpush: rsh.c -git-rpull: rsh.c +git-rpull: rsh.c pull.c git-rev-list: rev-list.c git-mktag: mktag.c git-diff-tree-helper: diff-tree-helper.c diff --git a/http-pull.c b/http-pull.c index 192dcc370d..d877c4abe3 100644 --- a/http-pull.c +++ b/http-pull.c @@ -7,6 +7,8 @@ #include #include +#include "pull.h" + #include #include @@ -14,10 +16,6 @@ static CURL *curl; static char *base; -static int tree = 0; -static int commits = 0; -static int all = 0; - static SHA_CTX c; static z_stream stream; @@ -47,7 +45,7 @@ static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb, return size; } -static int fetch(unsigned char *sha1) +int fetch(unsigned char *sha1) { char *hex = sha1_to_hex(sha1); char *filename = sha1_file_name(sha1); @@ -105,77 +103,21 @@ static int fetch(unsigned char *sha1) return 0; } -static int process_tree(unsigned char *sha1) -{ - struct tree *tree = lookup_tree(sha1); - struct tree_entry_list *entries; - - if (parse_tree(tree)) - return -1; - - for (entries = tree->entries; entries; entries = entries->next) { - if (fetch(entries->item.tree->object.sha1)) - return -1; - if (entries->directory) { - if (process_tree(entries->item.tree->object.sha1)) - return -1; - } - } - return 0; -} - -static int process_commit(unsigned char *sha1) -{ - struct commit *obj = lookup_commit(sha1); - - if (fetch(sha1)) - return -1; - - if (parse_commit(obj)) - return -1; - - if (tree) { - if (fetch(obj->tree->object.sha1)) - return -1; - if (process_tree(obj->tree->object.sha1)) - return -1; - if (!all) - tree = 0; - } - if (commits) { - struct commit_list *parents = obj->parents; - for (; parents; parents = parents->next) { - if (has_sha1_file(parents->item->object.sha1)) - continue; - if (fetch(parents->item->object.sha1)) { - /* The server might not have it, and - * we don't mind. - */ - continue; - } - if (process_commit(parents->item->object.sha1)) - return -1; - } - } - return 0; -} - int main(int argc, char **argv) { char *commit_id; char *url; int arg = 1; - unsigned char sha1[20]; while (arg < argc && argv[arg][0] == '-') { if (argv[arg][1] == 't') { - tree = 1; + get_tree = 1; } else if (argv[arg][1] == 'c') { - commits = 1; + get_history = 1; } else if (argv[arg][1] == 'a') { - all = 1; - tree = 1; - commits = 1; + get_all = 1; + get_tree = 1; + get_history = 1; } arg++; } @@ -186,17 +128,13 @@ int main(int argc, char **argv) commit_id = argv[arg]; url = argv[arg + 1]; - get_sha1_hex(commit_id, sha1); - curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); base = url; - if (fetch(sha1)) - return 1; - if (process_commit(sha1)) + if (pull(commit_id)) return 1; curl_global_cleanup(); diff --git a/pull.c b/pull.c new file mode 100644 index 0000000000..86a7b6901f --- /dev/null +++ b/pull.c @@ -0,0 +1,77 @@ +#include "pull.h" + +#include "cache.h" +#include "commit.h" +#include "tree.h" + +int get_tree = 0; +int get_history = 0; +int get_all = 0; + +static int process_tree(unsigned char *sha1) +{ + struct tree *tree = lookup_tree(sha1); + struct tree_entry_list *entries; + + if (parse_tree(tree)) + return -1; + + for (entries = tree->entries; entries; entries = entries->next) { + if (fetch(entries->item.tree->object.sha1)) + return -1; + if (entries->directory) { + if (process_tree(entries->item.tree->object.sha1)) + return -1; + } + } + return 0; +} + +static int process_commit(unsigned char *sha1) +{ + struct commit *obj = lookup_commit(sha1); + + if (fetch(sha1)) + return -1; + + if (parse_commit(obj)) + return -1; + + if (get_tree) { + if (fetch(obj->tree->object.sha1)) + return -1; + if (process_tree(obj->tree->object.sha1)) + return -1; + if (!get_all) + get_tree = 0; + } + if (get_history) { + struct commit_list *parents = obj->parents; + for (; parents; parents = parents->next) { + if (has_sha1_file(parents->item->object.sha1)) + continue; + if (fetch(parents->item->object.sha1)) { + /* The server might not have it, and + * we don't mind. + */ + continue; + } + if (process_commit(parents->item->object.sha1)) + return -1; + } + } + return 0; +} + +int pull(char *target) +{ + int retval; + unsigned char sha1[20]; + retval = get_sha1_hex(target, sha1); + if (retval) + return retval; + retval = fetch(sha1); + if (retval) + return retval; + return process_commit(sha1); +} diff --git a/pull.h b/pull.h new file mode 100644 index 0000000000..314bc7e95a --- /dev/null +++ b/pull.h @@ -0,0 +1,18 @@ +#ifndef PULL_H +#define PULL_H + +/** To be provided by the particular implementation. **/ +extern int fetch(unsigned char *sha1); + +/** Set to fetch the target tree. */ +extern int get_tree; + +/** Set to fetch the commit history. */ +extern int get_history; + +/** Set to fetch the trees in the commit history. **/ +extern int get_all; + +extern int pull(char *target); + +#endif /* PULL_H */ diff --git a/rpull.c b/rpull.c index c27af2c246..6624440d5a 100644 --- a/rpull.c +++ b/rpull.c @@ -7,15 +7,12 @@ #include #include #include "rsh.h" - -static int tree = 0; -static int commits = 0; -static int all = 0; +#include "pull.h" static int fd_in; static int fd_out; -static int fetch(unsigned char *sha1) +int fetch(unsigned char *sha1) { if (has_sha1_file(sha1)) return 0; @@ -23,87 +20,21 @@ static int fetch(unsigned char *sha1) return write_sha1_from_fd(sha1, fd_in); } -static int process_tree(unsigned char *sha1) -{ - struct tree *tree = lookup_tree(sha1); - struct tree_entry_list *entries; - - if (parse_tree(tree)) - return -1; - - for (entries = tree->entries; entries; entries = entries->next) { - /* - fprintf(stderr, "Tree %s ", sha1_to_hex(sha1)); - fprintf(stderr, "needs %s\n", - sha1_to_hex(entries->item.tree->object.sha1)); - */ - if (fetch(entries->item.tree->object.sha1)) { - return error("Missing item %s", - sha1_to_hex(entries->item.tree->object.sha1)); - } - if (entries->directory) { - if (process_tree(entries->item.tree->object.sha1)) - return -1; - } - } - return 0; -} - -static int process_commit(unsigned char *sha1) -{ - struct commit *obj = lookup_commit(sha1); - - if (fetch(sha1)) { - return error("Fetching %s", sha1_to_hex(sha1)); - } - - if (parse_commit(obj)) - return -1; - - if (tree) { - if (fetch(obj->tree->object.sha1)) - return -1; - if (process_tree(obj->tree->object.sha1)) - return -1; - if (!all) - tree = 0; - } - if (commits) { - struct commit_list *parents = obj->parents; - for (; parents; parents = parents->next) { - if (has_sha1_file(parents->item->object.sha1)) - continue; - if (fetch(parents->item->object.sha1)) { - /* The server might not have it, and - * we don't mind. - */ - error("Missing tree %s; continuing", - sha1_to_hex(parents->item->object.sha1)); - continue; - } - if (process_commit(parents->item->object.sha1)) - return -1; - } - } - return 0; -} - int main(int argc, char **argv) { char *commit_id; char *url; int arg = 1; - unsigned char sha1[20]; while (arg < argc && argv[arg][0] == '-') { if (argv[arg][1] == 't') { - tree = 1; + get_tree = 1; } else if (argv[arg][1] == 'c') { - commits = 1; + get_history = 1; } else if (argv[arg][1] == 'a') { - all = 1; - tree = 1; - commits = 1; + get_all = 1; + get_tree = 1; + get_history = 1; } arg++; } @@ -117,11 +48,7 @@ int main(int argc, char **argv) if (setup_connection(&fd_in, &fd_out, "rpush", url, arg, argv + 1)) return 1; - get_sha1_hex(commit_id, sha1); - - if (fetch(sha1)) - return 1; - if (process_commit(sha1)) + if (pull(commit_id)) return 1; return 0;