#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
* 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;
if (error < GIT_SUCCESS)
goto cleanup;
+ idx->stats.total = hdr.hdr_entries;
+
return GIT_SUCCESS;
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);