Commit f23c4a66bde5738a574416db4617ca749ca34f7d

Carlos Martín Nieto 2011-07-07T19:08:45

Start the runner Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>

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);