Start the runner Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
diff --git a/include/git2/indexer.h b/include/git2/indexer.h
index be17520..34f25b9 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 b63efc0..97f08da 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);