From 4250a5e5b1755e45153248217fe1d5550c972c8d Mon Sep 17 00:00:00 2001 From: Daniel Barkalow Date: Sat, 30 Apr 2005 16:53:56 -0700 Subject: [PATCH] Split out "pull" from particular methods The method for deciding what to pull is useful separately from any of the ways of actually fetching the objects. So split out "pull" functionality from http-pull and rpull Signed-off-by: Daniel Barkalow Signed-off-by: Linus Torvalds --- pull.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 pull.c (limited to 'pull.c') 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); +} -- cgit v1.2.3