summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2005-06-22 00:45:49 (GMT)
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-22 01:29:13 (GMT)
commitfa3e0655a45f53bbc1b48edc8f931426b183cba1 (patch)
treeda9361a75c236627b3dcfafdadd9d54c4908ba8a
parent3173bd49690b02c756e32d2c9c3ed13e451806d2 (diff)
downloadgit-fa3e0655a45f53bbc1b48edc8f931426b183cba1.zip
git-fa3e0655a45f53bbc1b48edc8f931426b183cba1.tar.gz
git-fa3e0655a45f53bbc1b48edc8f931426b183cba1.tar.bz2
[PATCH] Pull refs by HTTP
This adds support for refs to http-pull, both the -w option and reading the target from a served file. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--http-pull.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/http-pull.c b/http-pull.c
index f49525c..ec53dad 100644
--- a/http-pull.c
+++ b/http-pull.c
@@ -16,6 +16,23 @@ static z_stream stream;
static int local;
static int zret;
+struct buffer
+{
+ size_t posn;
+ size_t size;
+ void *buffer;
+};
+
+static size_t fwrite_buffer(void *ptr, size_t eltsize, size_t nmemb,
+ struct buffer *buffer) {
+ size_t size = eltsize * nmemb;
+ if (size > buffer->size - buffer->posn)
+ size = buffer->size - buffer->posn;
+ memcpy(buffer->buffer + buffer->posn, ptr, size);
+ buffer->posn += size;
+ return size;
+}
+
static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb,
void *data) {
unsigned char expn[4096];
@@ -94,7 +111,32 @@ int fetch(unsigned char *sha1)
int fetch_ref(char *ref, unsigned char *sha1)
{
- return -1;
+ char *url, *posn;
+ char hex[42];
+ struct buffer buffer;
+ buffer.size = 41;
+ buffer.posn = 0;
+ buffer.buffer = hex;
+ hex[41] = '\0';
+
+ curl_easy_setopt(curl, CURLOPT_FILE, &buffer);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
+
+ url = xmalloc(strlen(base) + 6 + strlen(ref));
+ strcpy(url, base);
+ posn = url + strlen(base);
+ strcpy(posn, "refs/");
+ posn += 5;
+ strcpy(posn, ref);
+
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+
+ if (curl_easy_perform(curl))
+ return error("Couldn't get %s for %s\n", url, ref);
+
+ hex[40] = '\0';
+ get_sha1_hex(hex, sha1);
+ return 0;
}
int main(int argc, char **argv)
@@ -118,11 +160,14 @@ int main(int argc, char **argv)
get_history = 1;
} else if (argv[arg][1] == 'v') {
get_verbosely = 1;
+ } else if (argv[arg][1] == 'w') {
+ write_ref = argv[arg + 1];
+ arg++;
}
arg++;
}
if (argc < arg + 2) {
- usage("git-http-pull [-c] [-t] [-a] [-d] [-v] [--recover] commit-id url");
+ usage("git-http-pull [-c] [-t] [-a] [-d] [-v] [--recover] [-w ref] commit-id url");
return 1;
}
commit_id = argv[arg];