Skip to content

Commit

Permalink
[PATCH] Expose packed_git and alt_odb.
Browse files Browse the repository at this point in the history
The commands git-fsck-cache and probably git-*-pull needs to have a way
to enumerate objects contained in packed GIT archives and alternate
object pools.  This commit exposes the data structure used to keep track
of them from sha1_file.c, and adds a couple of accessor interface
functions for use by the enhanced git-fsck-cache command.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Junio C Hamano authored and Linus Torvalds committed Jun 28, 2005
1 parent d22b929 commit 9a217f2
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 19 deletions.
19 changes: 19 additions & 0 deletions cache.h
Expand Up @@ -233,4 +233,23 @@ struct checkout {

extern int checkout_entry(struct cache_entry *ce, struct checkout *state);

extern struct alternate_object_database {
char *base;
char *name;
} *alt_odb;
extern void prepare_alt_odb(void);

extern struct packed_git {
struct packed_git *next;
unsigned long index_size;
unsigned long pack_size;
unsigned int *index_base;
void *pack_base;
unsigned int pack_last_used;
char pack_name[0]; /* something like ".git/objects/pack/xxxxx.pack" */
} *packed_git;
extern void prepare_packed_git(void);
extern int num_packed_objects(const struct packed_git *p);
extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*);

#endif /* CACHE_H */
43 changes: 24 additions & 19 deletions sha1_file.c
Expand Up @@ -184,10 +184,7 @@ char *sha1_file_name(const unsigned char *sha1)
return base;
}

static struct alternate_object_database {
char *base;
char *name;
} *alt_odb;
struct alternate_object_database *alt_odb;

/*
* Prepare alternate object database registry.
Expand All @@ -205,13 +202,15 @@ static struct alternate_object_database {
* pointed by base fields of the array elements with one xmalloc();
* the string pool immediately follows the array.
*/
static void prepare_alt_odb(void)
void prepare_alt_odb(void)
{
int pass, totlen, i;
const char *cp, *last;
char *op = NULL;
const char *alt = gitenv(ALTERNATE_DB_ENVIRONMENT) ? : "";

if (alt_odb)
return;
/* The first pass counts how large an area to allocate to
* hold the entire alt_odb structure, including array of
* structs and path buffers for them. The second pass fills
Expand Down Expand Up @@ -258,8 +257,7 @@ static char *find_sha1_file(const unsigned char *sha1, struct stat *st)

if (!stat(name, st))
return name;
if (!alt_odb)
prepare_alt_odb();
prepare_alt_odb();
for (i = 0; (name = alt_odb[i].name) != NULL; i++) {
fill_sha1_path(name, sha1);
if (!stat(alt_odb[i].base, st))
Expand All @@ -271,15 +269,7 @@ static char *find_sha1_file(const unsigned char *sha1, struct stat *st)
#define PACK_MAX_SZ (1<<26)
static int pack_used_ctr;
static unsigned long pack_mapped;
static struct packed_git {
struct packed_git *next;
unsigned long index_size;
unsigned long pack_size;
unsigned int *index_base;
void *pack_base;
unsigned int pack_last_used;
char pack_name[0]; /* something like ".git/objects/pack/xxxxx.pack" */
} *packed_git;
struct packed_git *packed_git;

struct pack_entry {
unsigned int offset;
Expand Down Expand Up @@ -429,7 +419,7 @@ static void prepare_packed_git_one(char *objdir)
}
}

static void prepare_packed_git(void)
void prepare_packed_git(void)
{
int i;
static int run_once = 0;
Expand All @@ -438,8 +428,7 @@ static void prepare_packed_git(void)
return;

prepare_packed_git_one(get_object_directory());
if (!alt_odb)
prepare_alt_odb();
prepare_alt_odb();
for (i = 0; alt_odb[i].base != NULL; i++) {
alt_odb[i].name[0] = 0;
prepare_packed_git_one(alt_odb[i].base);
Expand Down Expand Up @@ -820,6 +809,22 @@ static void *unpack_entry(struct pack_entry *entry,
return unpack_non_delta_entry(pack+5, size, left);
}

int num_packed_objects(const struct packed_git *p)
{
/* See check_packed_git_idx and pack-objects.c */
return (p->index_size - 20 - 20 - 4*256) / 24;
}

int nth_packed_object_sha1(const struct packed_git *p, int n,
unsigned char* sha1)
{
void *index = p->index_base + 256;
if (n < 0 || num_packed_objects(p) <= n)
return -1;
memcpy(sha1, (index + 24 * n + 4), 20);
return 0;
}

static int find_pack_entry_1(const unsigned char *sha1,
struct pack_entry *e, struct packed_git *p)
{
Expand Down

0 comments on commit 9a217f2

Please sign in to comment.