Commit bf4ef0c5 by Carlos Martín Nieto

examples: run fetch in a background thread

This allows us to give updates on how it's doing
parent dee5515a
......@@ -3,33 +3,76 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
struct dl_data {
git_remote *remote;
git_off_t *bytes;
git_indexer_stats *stats;
int ret;
int finished;
};
static void *download(void *ptr)
{
struct dl_data *data = (struct dl_data *)ptr;
// Connect to the remote end specifying that we want to fetch
// information from it.
if (git_remote_connect(data->remote, GIT_DIR_FETCH) < 0) {
data->ret = -1;
goto exit;
}
// Download the packfile and index it. This function updates the
// amount of received data and the indexer stats which lets you
// inform the user about progress.
if (git_remote_download(data->remote, data->bytes, data->stats) < 0) {
data->ret = -1;
goto exit;
}
data->ret = 0;
exit:
data->finished = 1;
pthread_exit(&data->ret);
}
int fetch(git_repository *repo, int argc, char **argv)
{
git_remote *remote = NULL;
git_off_t bytes = 0;
git_indexer_stats stats;
char *packname = NULL;
pthread_t worker;
struct dl_data data;
// Get the remote and connect to it
// Figure out whether it's a named remote or a URL
printf("Fetching %s\n", argv[1]);
if (git_remote_load(&remote, repo, argv[1]) == GIT_ENOTFOUND) {
if (git_remote_load(&remote, repo, argv[1]) < 0) {
if (git_remote_new(&remote, repo, argv[1], NULL) < 0)
return -1;
}
if (git_remote_connect(remote, GIT_DIR_FETCH) < 0)
return -1;
// Set up the information for the background worker thread
data.remote = remote;
data.bytes = &bytes;
data.stats = &stats;
data.ret = 0;
data.finished = 0;
memset(&stats, 0, sizeof(stats));
// Download the packfile and index it
// Doing this in a background thread and printing out what bytes
// and stats.{processed,total} say would make the UI friendlier
if (git_remote_download(remote, &bytes, &stats) < 0) {
git_remote_free(remote);
return -1;
}
pthread_create(&worker, NULL, download, &data);
printf("Received %d objects in %d bytes\n", stats.total, bytes);
// Loop while the worker thread is still running. Here we show processed
// and total objects in the pack and the amount of received
// data. Most frontends will probably want to show a percentage and
// the download rate.
do {
usleep(10000);
printf("\rReceived %d/%d objects in %d bytes", stats.processed, stats.total, bytes);
} while (!data.finished);
printf("\rReceived %d/%d objects in %d bytes\n", stats.processed, stats.total, bytes);
// Update the references in the remote's namespace to point to the
// right commits. This may be needed even if there was no packfile
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment