aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2005-04-30 16:53:56 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-30 16:53:56 -0700
commit4250a5e5b1755e45153248217fe1d5550c972c8d (patch)
treeec4e77e64d8db8f075c5e0a5023c243587b22a66
parent5e7921e7c1a844974469a5f865ebf0001ff06311 (diff)
downloadgit-4250a5e5b1755e45153248217fe1d5550c972c8d.tar.gz
git-4250a5e5b1755e45153248217fe1d5550c972c8d.tar.xz
[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 <barkalow@iabervon.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--Makefile4
-rw-r--r--http-pull.c80
-rw-r--r--pull.c77
-rw-r--r--pull.h18
-rw-r--r--rpull.c89
5 files changed, 114 insertions, 154 deletions
diff --git a/Makefile b/Makefile
index 37d7192f6..6518675f6 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 192dcc370..d877c4abe 100644
--- a/http-pull.c
+++ b/http-pull.c
@@ -7,6 +7,8 @@
#include <errno.h>
#include <stdio.h>
+#include "pull.h"
+
#include <curl/curl.h>
#include <curl/easy.h>
@@ -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 000000000..86a7b6901
--- /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 000000000..314bc7e95
--- /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 c27af2c24..6624440d5 100644
--- a/rpull.c
+++ b/rpull.c
@@ -7,15 +7,12 @@
#include <errno.h>
#include <stdio.h>
#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;