Start the runner

Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
This commit is contained in:
Carlos Martín Nieto 2011-07-07 19:08:45 +02:00
parent 3412391d4c
commit f23c4a66bd
2 changed files with 45 additions and 7 deletions

View File

@ -1,15 +1,19 @@
#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

View File

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