Skip to content

Commit

Permalink
get rid of num_packed_objects()
Browse files Browse the repository at this point in the history
The coming index format change doesn't allow for the number of objects
to be determined from the size of the index file directly.  Instead, Let's
initialize a field in the packed_git structure with the object count when
the index is validated since the count is always known at that point.

While at it let's reorder some struct packed_git fields to avoid padding
due to needed 64-bit alignment for some of them.

Signed-off-by: Nicolas Pitre <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
Nicolas Pitre authored and Junio C Hamano committed Apr 10, 2007
1 parent 8ff21b1 commit 5705909
Show file tree
Hide file tree
Showing 7 changed files with 17 additions and 22 deletions.
2 changes: 1 addition & 1 deletion builtin-count-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ int cmd_count_objects(int ac, const char **av, const char *prefix)
for (p = packed_git; p; p = p->next) {
if (!p->pack_local)
continue;
packed += num_packed_objects(p);
packed += p->num_objects;
num_pack++;
}
printf("count: %lu\n", loose);
Expand Down
2 changes: 1 addition & 1 deletion builtin-fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
verify_pack(p, 0);

for (p = packed_git; p; p = p->next) {
uint32_t i, num = num_packed_objects(p);
uint32_t i, num = p->num_objects;
for (i = 0; i < num; i++)
fsck_sha1(nth_packed_object_sha1(p, i));
}
Expand Down
4 changes: 2 additions & 2 deletions builtin-pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ static int cmp_offset(const void *a_, const void *b_)
static void prepare_pack_revindex(struct pack_revindex *rix)
{
struct packed_git *p = rix->p;
int num_ent = num_packed_objects(p);
int num_ent = p->num_objects;
int i;
const char *index = p->index_data;

Expand Down Expand Up @@ -198,7 +198,7 @@ static struct revindex_entry * find_packed_object(struct packed_git *p,
prepare_pack_revindex(rix);
revindex = rix->revindex;
lo = 0;
hi = num_packed_objects(p) + 1;
hi = p->num_objects + 1;
do {
int mi = (lo + hi) / 2;
if (revindex[mi].offset == ofs) {
Expand Down
8 changes: 4 additions & 4 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -376,11 +376,12 @@ struct pack_window {
extern struct packed_git {
struct packed_git *next;
struct pack_window *windows;
const void *index_data;
off_t index_size;
off_t pack_size;
time_t mtime;
const void *index_data;
size_t index_size;
uint32_t num_objects;
int index_version;
time_t mtime;
int pack_fd;
int pack_local;
unsigned char sha1[20];
Expand Down Expand Up @@ -431,7 +432,6 @@ extern void pack_report(void);
extern unsigned char* use_pack(struct packed_git *, struct pack_window **, off_t, unsigned int *);
extern void unuse_pack(struct pack_window **);
extern struct packed_git *add_packed_git(const char *, int, int);
extern uint32_t num_packed_objects(const struct packed_git *p);
extern const unsigned char *nth_packed_object_sha1(const struct packed_git *, uint32_t);
extern off_t find_pack_entry_one(const unsigned char *, struct packed_git *);
extern void *unpack_entry(struct packed_git *, off_t, enum object_type *, unsigned long *);
Expand Down
4 changes: 2 additions & 2 deletions pack-check.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ static int verify_packfile(struct packed_git *p,
* have verified that nr_objects matches between idx and pack,
* we do not do scan-streaming check on the pack file.
*/
nr_objects = num_packed_objects(p);
nr_objects = p->num_objects;
for (i = 0, err = 0; i < nr_objects; i++) {
const unsigned char *sha1;
void *data;
Expand Down Expand Up @@ -79,7 +79,7 @@ static void show_pack_info(struct packed_git *p)
{
uint32_t nr_objects, i, chain_histogram[MAX_CHAIN];

nr_objects = num_packed_objects(p);
nr_objects = p->num_objects;
memset(chain_histogram, 0, sizeof(chain_histogram));

for (i = 0; i < nr_objects; i++) {
Expand Down
17 changes: 6 additions & 11 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,7 @@ static int check_packed_git_idx(const char *path, struct packed_git *p)
p->index_version = 1;
p->index_data = idx_map;
p->index_size = idx_size;
p->num_objects = nr;
return 0;
}

Expand Down Expand Up @@ -605,11 +606,11 @@ static int open_packed_git_1(struct packed_git *p)
p->pack_name, ntohl(hdr.hdr_version));

/* Verify the pack matches its index. */
if (num_packed_objects(p) != ntohl(hdr.hdr_entries))
if (p->num_objects != ntohl(hdr.hdr_entries))
return error("packfile %s claims to have %u objects"
" while index size indicates %u objects",
p->pack_name, ntohl(hdr.hdr_entries),
num_packed_objects(p));
" while index indicates %u objects",
p->pack_name, ntohl(hdr.hdr_entries),
p->num_objects);
if (lseek(p->pack_fd, p->pack_size - sizeof(sha1), SEEK_SET) == -1)
return error("end of packfile %s is unavailable", p->pack_name);
if (read_in_full(p->pack_fd, sha1, sizeof(sha1)) != sizeof(sha1))
Expand Down Expand Up @@ -1526,18 +1527,12 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
return data;
}

uint32_t num_packed_objects(const struct packed_git *p)
{
/* See check_packed_git_idx() */
return (uint32_t)((p->index_size - 20 - 20 - 4*256) / 24);
}

const unsigned char *nth_packed_object_sha1(const struct packed_git *p,
uint32_t n)
{
const unsigned char *index = p->index_data;
index += 4 * 256;
if (num_packed_objects(p) <= n)
if (n >= p->num_objects)
return NULL;
return index + 24 * n + 4;
}
Expand Down
2 changes: 1 addition & 1 deletion sha1_name.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne

prepare_packed_git();
for (p = packed_git; p && found < 2; p = p->next) {
uint32_t num = num_packed_objects(p);
uint32_t num = p->num_objects;
uint32_t first = 0, last = num;
while (first < last) {
uint32_t mid = (first + last) / 2;
Expand Down

0 comments on commit 5705909

Please sign in to comment.