diff --git a/include/git2/indexer.h b/include/git2/indexer.h index be1752027..34f25b97c 100644 --- a/include/git2/indexer.h +++ b/include/git2/indexer.h @@ -1,15 +1,19 @@ #ifndef _INCLUDE_git_indexer_h__ #define _INCLUDE_git_indexer_h__ -typedef struct git_pack_indexer { - struct pack_file *pack; - git_vector objects; - git_vector deltas; - struct stat st; -} git_pack_indexer; +#include "git2/common.h" + +typedef struct git_indexer_stats { + unsigned int total; + unsigned int parsed; +} git_indexer_stats; + + +typedef struct git_pack_indexer git_pack_indexer; GIT_EXTERN(int) git_pack_indexer_new(git_pack_indexer **out, const char *packname); -GIT_EXTERN(void) git_pack_indexer_free(git_pack_indexer *idx) +GIT_EXTERN(int) git_pack_indexer_run(git_pack_indexer *idx, int (*cb)(const git_indexer_stats *, void *), void *data); +GIT_EXTERN(void) git_pack_indexer_free(git_pack_indexer *idx); #endif diff --git a/src/indexer.c b/src/indexer.c index b63efc088..97f08dae1 100644 --- a/src/indexer.c +++ b/src/indexer.c @@ -23,10 +23,21 @@ * Boston, MA 02110-1301, USA. */ +#include "git2/indexer.h" + #include "common.h" #include "pack.h" +#include "mwindow.h" #include "posix.h" +typedef struct git_pack_indexer { + struct pack_file *pack; + git_vector objects; + git_vector deltas; + struct stat st; + git_indexer_stats stats; +} git_pack_indexer; + static int parse_header(git_pack_indexer *idx) { struct pack_header hdr; @@ -59,6 +70,8 @@ static int parse_header(git_pack_indexer *idx) if (error < GIT_SUCCESS) goto cleanup; + idx->stats.total = hdr.hdr_entries; + return GIT_SUCCESS; cleanup: @@ -123,6 +136,27 @@ cleanup: return error; } +/* + * Create the index. Every time something interesting happens + * (something has been parse or resolved), the callback gets called + * with some stats so it can tell the user how hard we're working + */ +int git_pack_indexer_run(git_pack_indexer *idx, int (*cb)(const git_indexer_stats *, void *), void *data) +{ + git_mwindow_file *mwf = &idx->pack->mwf; + int error; + + error = git_mwindow_file_register(mwf); + if (error < GIT_SUCCESS) + return git__rethrow(error, "Failed to register mwindow file"); + + /* notify early */ + if (cb) + cb(&idx->stats, data); + + return error; +} + void git_pack_indexer_free(git_pack_indexer *idx) { p_close(idx->pack->pack_fd);