summaryrefslogtreecommitdiff
path: root/examples/network
diff options
context:
space:
mode:
authorVicent Martí <vicent@github.com>2012-08-19 01:26:06 -0700
committerVicent Martí <vicent@github.com>2012-08-19 01:26:06 -0700
commitf98c32f3fea0d5532db2d5733418aa62648b9e93 (patch)
tree5b53901f1848d73a72765ec014e2ad5188316eb4 /examples/network
parent1a10fded40875f986164b80c6efd414cd1507cb8 (diff)
parenteb87800ab631d19a7655f01ece130455b1cc976a (diff)
downloadlibgit2-f98c32f3fea0d5532db2d5733418aa62648b9e93.tar.gz
Merge pull request #778 from ben/clone
Clone
Diffstat (limited to 'examples/network')
-rw-r--r--examples/network/Makefile1
-rw-r--r--examples/network/clone.c68
-rw-r--r--examples/network/common.h1
-rw-r--r--examples/network/git2.c1
4 files changed, 71 insertions, 0 deletions
diff --git a/examples/network/Makefile b/examples/network/Makefile
index 9afd49e5d..835be24cc 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 000000000..fb571bd3a
--- /dev/null
+++ b/examples/network/clone.c
@@ -0,0 +1,68 @@
+#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 do_clone(git_repository *repo, int argc, char **argv)
+{
+ struct dl_data data = {0};
+ pthread_t worker;
+
+ // Validate args
+ 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 29460bb36..c82eaa1c8 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 do_clone(git_repository *repo, int argc, char **argv);
#endif /* __COMMON_H__ */
diff --git a/examples/network/git2.c b/examples/network/git2.c
index 1bfb13c9e..ecb16630b 100644
--- a/examples/network/git2.c
+++ b/examples/network/git2.c
@@ -13,6 +13,7 @@ struct {
} commands[] = {
{"ls-remote", ls_remote},
{"fetch", fetch},
+ {"clone", do_clone},
{"index-pack", index_pack},
{ NULL, NULL}
};