Commit f23c4a66 by Carlos Martín Nieto

Start the runner

Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
parent 3412391d
#ifndef _INCLUDE_git_indexer_h__ #ifndef _INCLUDE_git_indexer_h__
#define _INCLUDE_git_indexer_h__ #define _INCLUDE_git_indexer_h__
typedef struct git_pack_indexer { #include "git2/common.h"
struct pack_file *pack;
git_vector objects; typedef struct git_indexer_stats {
git_vector deltas; unsigned int total;
struct stat st; unsigned int parsed;
} git_pack_indexer; } 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(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 #endif
...@@ -23,10 +23,21 @@ ...@@ -23,10 +23,21 @@
* Boston, MA 02110-1301, USA. * Boston, MA 02110-1301, USA.
*/ */
#include "git2/indexer.h"
#include "common.h" #include "common.h"
#include "pack.h" #include "pack.h"
#include "mwindow.h"
#include "posix.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) static int parse_header(git_pack_indexer *idx)
{ {
struct pack_header hdr; struct pack_header hdr;
...@@ -59,6 +70,8 @@ static int parse_header(git_pack_indexer *idx) ...@@ -59,6 +70,8 @@ static int parse_header(git_pack_indexer *idx)
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
goto cleanup; goto cleanup;
idx->stats.total = hdr.hdr_entries;
return GIT_SUCCESS; return GIT_SUCCESS;
cleanup: cleanup:
...@@ -123,6 +136,27 @@ cleanup: ...@@ -123,6 +136,27 @@ cleanup:
return error; 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) void git_pack_indexer_free(git_pack_indexer *idx)
{ {
p_close(idx->pack->pack_fd); p_close(idx->pack->pack_fd);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment