summaryrefslogtreecommitdiff
path: root/examples/network/clone.c
diff options
context:
space:
mode:
authorBen Straub <bstraub@github.com>2012-07-30 14:38:32 -0700
committerBen Straub <bstraub@github.com>2012-07-30 14:38:32 -0700
commit84595a30c01d5808ff71fda8ab63603214d665bf (patch)
tree7b188596f6ebeed24a15062d187407534235964e /examples/network/clone.c
parentf1587b97a11e3a7283b32f5af46b7d057b8be4c5 (diff)
downloadlibgit2-84595a30c01d5808ff71fda8ab63603214d665bf.tar.gz
Add clone to the network example.
Diffstat (limited to 'examples/network/clone.c')
-rw-r--r--examples/network/clone.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/examples/network/clone.c b/examples/network/clone.c
new file mode 100644
index 000000000..177a4c246
--- /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;
+}
+