diff options
author | Carlos Martín Nieto <carlos@cmartin.tk> | 2011-07-07 19:08:45 +0200 |
---|---|---|
committer | Carlos Martín Nieto <carlos@cmartin.tk> | 2011-08-02 21:41:05 +0200 |
commit | f23c4a66bde5738a574416db4617ca749ca34f7d (patch) | |
tree | 5f3a84e5fbe14e02b6b85aa9900b482921e85d40 | |
parent | 3412391d4ccf6435b981c46e796cc6988a676fad (diff) | |
download | libgit2-f23c4a66bde5738a574416db4617ca749ca34f7d.tar.gz |
Start the runner
Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
-rw-r--r-- | include/git2/indexer.h | 18 | ||||
-rw-r--r-- | src/indexer.c | 34 |
2 files changed, 45 insertions, 7 deletions
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); |