diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:47:08 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:47:08 +0000 |
commit | 29b5ab554790bb57337a3b6ab9dcd963cf69d22e (patch) | |
tree | be1456d2bc6c1fb078695fad7bc8f6b212062d3c /examples/index-pack.c | |
parent | Initial commit. (diff) | |
download | libgit2-29b5ab554790bb57337a3b6ab9dcd963cf69d22e.tar.xz libgit2-29b5ab554790bb57337a3b6ab9dcd963cf69d22e.zip |
Adding upstream version 1.7.2+ds.upstream/1.7.2+ds
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | examples/index-pack.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/examples/index-pack.c b/examples/index-pack.c new file mode 100644 index 0000000..0f8234c --- /dev/null +++ b/examples/index-pack.c @@ -0,0 +1,76 @@ +#include "common.h" + +/* + * 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_indexer_progress *stats, void *data) +{ + (void)data; + printf("\rProcessing %u of %u", stats->indexed_objects, stats->total_objects); + + return 0; +} + +int lg2_index_pack(git_repository *repo, int argc, char **argv) +{ + git_indexer *idx; + git_indexer_progress stats = {0, 0}; + int error; + 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; + } + +#ifdef GIT_EXPERIMENTAL_SHA256 + error = git_indexer_new(&idx, ".", git_repository_oid_type(repo), NULL); +#else + error = git_indexer_new(&idx, ".", 0, NULL, NULL); +#endif + + if (error < 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 %u of %u\n", stats.indexed_objects, stats.total_objects); + + puts(git_indexer_name(idx)); + + cleanup: + close(fd); + git_indexer_free(idx); + return error; +} |