diff options
Diffstat (limited to 'examples/network')
| -rw-r--r-- | examples/network/.gitignore | 1 | ||||
| -rw-r--r-- | examples/network/clone.c | 104 | ||||
| -rw-r--r-- | examples/network/fetch.c | 109 | ||||
| -rw-r--r-- | examples/network/git2.c | 87 | ||||
| -rw-r--r-- | examples/network/index-pack.c | 87 | ||||
| -rw-r--r-- | examples/network/ls-remote.c | 60 |
6 files changed, 0 insertions, 448 deletions
diff --git a/examples/network/.gitignore b/examples/network/.gitignore deleted file mode 100644 index 1b48e66ed..000000000 --- a/examples/network/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/git2 diff --git a/examples/network/clone.c b/examples/network/clone.c deleted file mode 100644 index 970e84ff9..000000000 --- a/examples/network/clone.c +++ /dev/null @@ -1,104 +0,0 @@ -#include "../common.h" - -typedef struct progress_data { - git_transfer_progress fetch_progress; - size_t completed_steps; - size_t total_steps; - const char *path; -} progress_data; - -static void print_progress(const progress_data *pd) -{ - int network_percent = pd->fetch_progress.total_objects > 0 ? - (100*pd->fetch_progress.received_objects) / pd->fetch_progress.total_objects : - 0; - int index_percent = pd->fetch_progress.total_objects > 0 ? - (100*pd->fetch_progress.indexed_objects) / pd->fetch_progress.total_objects : - 0; - - int checkout_percent = pd->total_steps > 0 - ? (100 * pd->completed_steps) / pd->total_steps - : 0; - int kbytes = pd->fetch_progress.received_bytes / 1024; - - if (pd->fetch_progress.total_objects && - pd->fetch_progress.received_objects == pd->fetch_progress.total_objects) { - printf("Resolving deltas %d/%d\r", - pd->fetch_progress.indexed_deltas, - pd->fetch_progress.total_deltas); - } else { - printf("net %3d%% (%4d kb, %5d/%5d) / idx %3d%% (%5d/%5d) / chk %3d%% (%4" PRIuZ "/%4" PRIuZ ") %s\n", - network_percent, kbytes, - pd->fetch_progress.received_objects, pd->fetch_progress.total_objects, - index_percent, pd->fetch_progress.indexed_objects, pd->fetch_progress.total_objects, - checkout_percent, - pd->completed_steps, pd->total_steps, - pd->path); - } -} - -static int sideband_progress(const char *str, int len, void *payload) -{ - (void)payload; /* unused */ - - printf("remote: %.*s", len, str); - fflush(stdout); - return 0; -} - -static int fetch_progress(const git_transfer_progress *stats, void *payload) -{ - progress_data *pd = (progress_data*)payload; - pd->fetch_progress = *stats; - print_progress(pd); - return 0; -} -static void checkout_progress(const char *path, size_t cur, size_t tot, void *payload) -{ - progress_data *pd = (progress_data*)payload; - pd->completed_steps = cur; - pd->total_steps = tot; - pd->path = path; - print_progress(pd); -} - - -int do_clone(git_repository *repo, int argc, char **argv) -{ - progress_data pd = {{0}}; - git_repository *cloned_repo = NULL; - git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT; - git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; - const char *url = argv[1]; - const char *path = argv[2]; - int error; - - (void)repo; /* unused */ - - /* Validate args */ - if (argc < 3) { - printf ("USAGE: %s <url> <path>\n", argv[0]); - return -1; - } - - /* Set up options */ - checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; - checkout_opts.progress_cb = checkout_progress; - checkout_opts.progress_payload = &pd; - clone_opts.checkout_opts = checkout_opts; - clone_opts.fetch_opts.callbacks.sideband_progress = sideband_progress; - clone_opts.fetch_opts.callbacks.transfer_progress = &fetch_progress; - clone_opts.fetch_opts.callbacks.credentials = cred_acquire_cb; - clone_opts.fetch_opts.callbacks.payload = &pd; - - /* Do the clone */ - error = git_clone(&cloned_repo, url, path, &clone_opts); - printf("\n"); - if (error != 0) { - const git_error *err = git_error_last(); - if (err) printf("ERROR %d: %s\n", err->klass, err->message); - else printf("ERROR %d: no detailed info\n", error); - } - else if (cloned_repo) git_repository_free(cloned_repo); - return error; -} diff --git a/examples/network/fetch.c b/examples/network/fetch.c deleted file mode 100644 index bb5f1b189..000000000 --- a/examples/network/fetch.c +++ /dev/null @@ -1,109 +0,0 @@ -#include "../common.h" - -static int progress_cb(const char *str, int len, void *data) -{ - (void)data; - printf("remote: %.*s", len, str); - fflush(stdout); /* We don't have the \n to force the flush */ - return 0; -} - -/** - * This function gets called for each remote-tracking branch that gets - * updated. The message we output depends on whether it's a new one or - * an update. - */ -static int update_cb(const char *refname, const git_oid *a, const git_oid *b, void *data) -{ - char a_str[GIT_OID_HEXSZ+1], b_str[GIT_OID_HEXSZ+1]; - (void)data; - - git_oid_fmt(b_str, b); - b_str[GIT_OID_HEXSZ] = '\0'; - - if (git_oid_iszero(a)) { - printf("[new] %.20s %s\n", b_str, refname); - } else { - git_oid_fmt(a_str, a); - a_str[GIT_OID_HEXSZ] = '\0'; - printf("[updated] %.10s..%.10s %s\n", a_str, b_str, refname); - } - - return 0; -} - -/** - * This gets called during the download and indexing. 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. - */ -static int transfer_progress_cb(const git_transfer_progress *stats, void *payload) -{ - (void)payload; - - if (stats->received_objects == stats->total_objects) { - printf("Resolving deltas %d/%d\r", - stats->indexed_deltas, stats->total_deltas); - } else if (stats->total_objects > 0) { - printf("Received %d/%d objects (%d) in %" PRIuZ " bytes\r", - stats->received_objects, stats->total_objects, - stats->indexed_objects, stats->received_bytes); - } - return 0; -} - -/** Entry point for this command */ -int fetch(git_repository *repo, int argc, char **argv) -{ - git_remote *remote = NULL; - const git_transfer_progress *stats; - git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; - - if (argc < 2) { - fprintf(stderr, "usage: %s fetch <repo>\n", argv[-1]); - return EXIT_FAILURE; - } - - /* Figure out whether it's a named remote or a URL */ - printf("Fetching %s for repo %p\n", argv[1], repo); - if (git_remote_lookup(&remote, repo, argv[1]) < 0) - if (git_remote_create_anonymous(&remote, repo, argv[1]) < 0) - goto on_error; - - /* Set up the callbacks (only update_tips for now) */ - fetch_opts.callbacks.update_tips = &update_cb; - fetch_opts.callbacks.sideband_progress = &progress_cb; - fetch_opts.callbacks.transfer_progress = transfer_progress_cb; - fetch_opts.callbacks.credentials = cred_acquire_cb; - - /** - * Perform the fetch with the configured refspecs from the - * config. Update the reflog for the updated references with - * "fetch". - */ - if (git_remote_fetch(remote, NULL, &fetch_opts, "fetch") < 0) - goto on_error; - - /** - * If there are local objects (we got a thin pack), then tell - * the user how many objects we saved from having to cross the - * network. - */ - stats = git_remote_stats(remote); - if (stats->local_objects > 0) { - printf("\rReceived %d/%d objects in %" PRIuZ " bytes (used %d local objects)\n", - stats->indexed_objects, stats->total_objects, stats->received_bytes, stats->local_objects); - } else{ - printf("\rReceived %d/%d objects in %" PRIuZ "bytes\n", - stats->indexed_objects, stats->total_objects, stats->received_bytes); - } - - git_remote_free(remote); - - return 0; - - on_error: - git_remote_free(remote); - return -1; -} diff --git a/examples/network/git2.c b/examples/network/git2.c deleted file mode 100644 index 4fa28390c..000000000 --- a/examples/network/git2.c +++ /dev/null @@ -1,87 +0,0 @@ -#include "../common.h" - -/* This part is not strictly libgit2-dependent, but you can use this - * as a starting point for a git-like tool */ - -typedef int (*git_cb)(git_repository *, int , char **); - -struct { - char *name; - git_cb fn; -} commands[] = { - {"ls-remote", ls_remote}, - {"fetch", fetch}, - {"clone", do_clone}, - {"index-pack", index_pack}, - { NULL, NULL} -}; - -static int run_command(git_cb fn, git_repository *repo, struct args_info args) -{ - int error; - - /* Run the command. If something goes wrong, print the error message to stderr */ - error = fn(repo, args.argc - args.pos, &args.argv[args.pos]); - if (error < 0) { - if (git_error_last() == NULL) - fprintf(stderr, "Error without message"); - else - fprintf(stderr, "Bad news:\n %s\n", git_error_last()->message); - } - - return !!error; -} - -int main(int argc, char **argv) -{ - int i; - int return_code = 1; - int error; - git_repository *repo; - struct args_info args = ARGS_INFO_INIT; - const char *git_dir = NULL; - - if (argc < 2) { - fprintf(stderr, "usage: %s <cmd> [repo]\n", argv[0]); - exit(EXIT_FAILURE); - } - - git_libgit2_init(); - - for (args.pos = 1; args.pos < args.argc; ++args.pos) { - char *a = args.argv[args.pos]; - - if (a[0] != '-') { - /* non-arg */ - break; - } else if (optional_str_arg(&git_dir, &args, "--git-dir", ".git")) { - continue; - } else if (!strcmp(a, "--")) { - /* arg separator */ - break; - } - } - - /* Before running the actual command, create an instance of the local - * repository and pass it to the function. */ - - error = git_repository_open(&repo, git_dir); - if (error < 0) - repo = NULL; - - for (i = 0; commands[i].name != NULL; ++i) { - if (!strcmp(args.argv[args.pos], commands[i].name)) { - return_code = run_command(commands[i].fn, repo, args); - goto shutdown; - } - } - - fprintf(stderr, "Command not found: %s\n", argv[1]); - -shutdown: - git_repository_free(repo); - - git_libgit2_shutdown(); - - return return_code; -} diff --git a/examples/network/index-pack.c b/examples/network/index-pack.c deleted file mode 100644 index 87445e439..000000000 --- a/examples/network/index-pack.c +++ /dev/null @@ -1,87 +0,0 @@ -#include "../common.h" - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#ifdef _WIN32 -# include <io.h> -# include <Windows.h> - -# define open _open -# define read _read -# define close _close - -#define ssize_t unsigned int -#else -# include <unistd.h> -#endif - -/* - * This could be run in the main loop whilst the application waits for - * the indexing to finish in a worker thread - */ -static int index_cb(const git_transfer_progress *stats, void *data) -{ - (void)data; - printf("\rProcessing %d of %d", stats->indexed_objects, stats->total_objects); - - return 0; -} - -int index_pack(git_repository *repo, int argc, char **argv) -{ - git_indexer *idx; - git_transfer_progress stats = {0, 0}; - int error; - char hash[GIT_OID_HEXSZ + 1] = {0}; - int fd; - ssize_t read_bytes; - char buf[512]; - - (void)repo; - - if (argc < 2) { - fprintf(stderr, "usage: %s index-pack <packfile>\n", argv[-1]); - return EXIT_FAILURE; - } - - if (git_indexer_new(&idx, ".", 0, NULL, NULL) < 0) { - puts("bad idx"); - return -1; - } - - if ((fd = open(argv[1], 0)) < 0) { - perror("open"); - return -1; - } - - do { - read_bytes = read(fd, buf, sizeof(buf)); - if (read_bytes < 0) - break; - - if ((error = git_indexer_append(idx, buf, read_bytes, &stats)) < 0) - goto cleanup; - - index_cb(&stats, NULL); - } while (read_bytes > 0); - - if (read_bytes < 0) { - error = -1; - perror("failed reading"); - goto cleanup; - } - - if ((error = git_indexer_commit(idx, &stats)) < 0) - goto cleanup; - - printf("\rIndexing %d of %d\n", stats.indexed_objects, stats.total_objects); - - git_oid_fmt(hash, git_indexer_hash(idx)); - puts(hash); - - cleanup: - close(fd); - git_indexer_free(idx); - return error; -} diff --git a/examples/network/ls-remote.c b/examples/network/ls-remote.c deleted file mode 100644 index 8181629b9..000000000 --- a/examples/network/ls-remote.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "../common.h" - -static int use_remote(git_repository *repo, char *name) -{ - git_remote *remote = NULL; - int error; - const git_remote_head **refs; - size_t refs_len, i; - git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; - - /* Find the remote by name */ - error = git_remote_lookup(&remote, repo, name); - if (error < 0) { - error = git_remote_create_anonymous(&remote, repo, name); - if (error < 0) - goto cleanup; - } - - /** - * Connect to the remote and call the printing function for - * each of the remote references. - */ - callbacks.credentials = cred_acquire_cb; - - error = git_remote_connect(remote, GIT_DIRECTION_FETCH, &callbacks, NULL, NULL); - if (error < 0) - goto cleanup; - - /** - * Get the list of references on the remote and print out - * their name next to what they point to. - */ - if (git_remote_ls(&refs, &refs_len, remote) < 0) - goto cleanup; - - for (i = 0; i < refs_len; i++) { - char oid[GIT_OID_HEXSZ + 1] = {0}; - git_oid_fmt(oid, &refs[i]->oid); - printf("%s\t%s\n", oid, refs[i]->name); - } - -cleanup: - git_remote_free(remote); - return error; -} - -/** Entry point for this command */ -int ls_remote(git_repository *repo, int argc, char **argv) -{ - int error; - - if (argc < 2) { - fprintf(stderr, "usage: %s ls-remote <remote>\n", argv[-1]); - return EXIT_FAILURE; - } - - error = use_remote(repo, argv[1]); - - return error; -} |
