[PATCH] Expose packed_git and alt_odb.
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>
This commit is contained in:
parent
d22b9290ab
commit
9a217f2a72
19
cache.h
19
cache.h
@ -233,4 +233,23 @@ struct checkout {
|
|||||||
|
|
||||||
extern int checkout_entry(struct cache_entry *ce, struct checkout *state);
|
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 */
|
#endif /* CACHE_H */
|
||||||
|
39
sha1_file.c
39
sha1_file.c
@ -184,10 +184,7 @@ char *sha1_file_name(const unsigned char *sha1)
|
|||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct alternate_object_database {
|
struct alternate_object_database *alt_odb;
|
||||||
char *base;
|
|
||||||
char *name;
|
|
||||||
} *alt_odb;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prepare alternate object database registry.
|
* Prepare alternate object database registry.
|
||||||
@ -205,13 +202,15 @@ static struct alternate_object_database {
|
|||||||
* pointed by base fields of the array elements with one xmalloc();
|
* pointed by base fields of the array elements with one xmalloc();
|
||||||
* the string pool immediately follows the array.
|
* the string pool immediately follows the array.
|
||||||
*/
|
*/
|
||||||
static void prepare_alt_odb(void)
|
void prepare_alt_odb(void)
|
||||||
{
|
{
|
||||||
int pass, totlen, i;
|
int pass, totlen, i;
|
||||||
const char *cp, *last;
|
const char *cp, *last;
|
||||||
char *op = NULL;
|
char *op = NULL;
|
||||||
const char *alt = gitenv(ALTERNATE_DB_ENVIRONMENT) ? : "";
|
const char *alt = gitenv(ALTERNATE_DB_ENVIRONMENT) ? : "";
|
||||||
|
|
||||||
|
if (alt_odb)
|
||||||
|
return;
|
||||||
/* The first pass counts how large an area to allocate to
|
/* The first pass counts how large an area to allocate to
|
||||||
* hold the entire alt_odb structure, including array of
|
* hold the entire alt_odb structure, including array of
|
||||||
* structs and path buffers for them. The second pass fills
|
* structs and path buffers for them. The second pass fills
|
||||||
@ -258,7 +257,6 @@ static char *find_sha1_file(const unsigned char *sha1, struct stat *st)
|
|||||||
|
|
||||||
if (!stat(name, st))
|
if (!stat(name, st))
|
||||||
return name;
|
return name;
|
||||||
if (!alt_odb)
|
|
||||||
prepare_alt_odb();
|
prepare_alt_odb();
|
||||||
for (i = 0; (name = alt_odb[i].name) != NULL; i++) {
|
for (i = 0; (name = alt_odb[i].name) != NULL; i++) {
|
||||||
fill_sha1_path(name, sha1);
|
fill_sha1_path(name, sha1);
|
||||||
@ -271,15 +269,7 @@ static char *find_sha1_file(const unsigned char *sha1, struct stat *st)
|
|||||||
#define PACK_MAX_SZ (1<<26)
|
#define PACK_MAX_SZ (1<<26)
|
||||||
static int pack_used_ctr;
|
static int pack_used_ctr;
|
||||||
static unsigned long pack_mapped;
|
static unsigned long pack_mapped;
|
||||||
static struct packed_git {
|
struct packed_git *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 pack_entry {
|
struct pack_entry {
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
@ -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;
|
int i;
|
||||||
static int run_once = 0;
|
static int run_once = 0;
|
||||||
@ -438,7 +428,6 @@ static void prepare_packed_git(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
prepare_packed_git_one(get_object_directory());
|
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++) {
|
for (i = 0; alt_odb[i].base != NULL; i++) {
|
||||||
alt_odb[i].name[0] = 0;
|
alt_odb[i].name[0] = 0;
|
||||||
@ -820,6 +809,22 @@ static void *unpack_entry(struct pack_entry *entry,
|
|||||||
return unpack_non_delta_entry(pack+5, size, left);
|
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,
|
static int find_pack_entry_1(const unsigned char *sha1,
|
||||||
struct pack_entry *e, struct packed_git *p)
|
struct pack_entry *e, struct packed_git *p)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user