Commit 84595a30c01d5808ff71fda8ab63603214d665bf

Ben Straub 2012-07-30T14:38:32

Add clone to the network example.

diff --git a/examples/network/Makefile b/examples/network/Makefile
index 9afd49e..835be24 100644
--- a/examples/network/Makefile
+++ b/examples/network/Makefile
@@ -8,6 +8,7 @@ OBJECTS = \
   git2.o \
   ls-remote.o \
   fetch.o \
+  clone.o \
   index-pack.o
 
 all: $(OBJECTS)
diff --git a/examples/network/clone.c b/examples/network/clone.c
new file mode 100644
index 0000000..177a4c2
--- /dev/null
+++ b/examples/network/clone.c
@@ -0,0 +1,69 @@
+#include "common.h"
+#include <git2.h>
+#include <git2/clone.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <unistd.h>
+
+struct dl_data {
+	git_indexer_stats fetch_stats;
+	git_indexer_stats checkout_stats;
+	git_checkout_opts opts;
+	int ret;
+	int finished;
+	const char *url;
+	const char *path;
+};
+
+static void *clone_thread(void *ptr)
+{
+	struct dl_data *data = (struct dl_data *)ptr;
+	git_repository *repo = NULL;
+
+	// Kick off the clone
+	data->ret = git_clone(&repo, data->url, data->path,
+								 &data->fetch_stats, &data->checkout_stats, 
+								 &data->opts);
+	if (repo) git_repository_free(repo);
+	data->finished = 1;
+
+	pthread_exit(&data->ret);
+}
+
+int clone(git_repository *repo, int argc, char **argv)
+{
+	struct dl_data data = {0};
+	pthread_t worker;
+
+	// Validate args
+	printf("argc %d\n");
+	if (argc < 3) {
+		printf("USAGE: %s <url> <path>\n", argv[0]);
+		return -1;
+	}
+
+	// Data for background thread
+	data.url = argv[1];
+	data.path = argv[2];
+	data.opts.disable_filters = 1;
+	printf("Cloning '%s' to '%s'\n", data.url, data.path);
+
+	// Create the worker thread
+	pthread_create(&worker, NULL, clone_thread, &data);
+
+	// Watch for progress information
+	do {
+		usleep(10000);
+		printf("Fetch %d/%d  –  Checkout %d/%d\n",
+				 data.fetch_stats.processed, data.fetch_stats.total,
+				 data.checkout_stats.processed, data.checkout_stats.total);
+	} while (!data.finished);
+	printf("Fetch %d/%d  –  Checkout %d/%d\n",
+			 data.fetch_stats.processed, data.fetch_stats.total,
+			 data.checkout_stats.processed, data.checkout_stats.total);
+
+	return data.ret;
+}
+
diff --git a/examples/network/common.h b/examples/network/common.h
index 29460bb..d4b63e7 100644
--- a/examples/network/common.h
+++ b/examples/network/common.h
@@ -10,5 +10,6 @@ int parse_pkt_line(git_repository *repo, int argc, char **argv);
 int show_remote(git_repository *repo, int argc, char **argv);
 int fetch(git_repository *repo, int argc, char **argv);
 int index_pack(git_repository *repo, int argc, char **argv);
+int clone(git_repository *repo, int argc, char **argv);
 
 #endif /* __COMMON_H__ */
diff --git a/examples/network/git2.c b/examples/network/git2.c
index 7c02305..21c8ec9 100644
--- a/examples/network/git2.c
+++ b/examples/network/git2.c
@@ -12,6 +12,7 @@ struct {
 } commands[] = {
 	{"ls-remote", ls_remote},
 	{"fetch", fetch},
+	{"clone", clone},
 	{"index-pack", index_pack},
 	{ NULL, NULL}
 };