2013-10-25 02:01:06 +08:00
|
|
|
#ifndef PACK_OBJECTS_H
|
|
|
|
#define PACK_OBJECTS_H
|
|
|
|
|
|
|
|
struct object_entry {
|
|
|
|
struct pack_idx_entry idx;
|
|
|
|
unsigned long size; /* uncompressed size */
|
|
|
|
struct packed_git *in_pack; /* already in pack */
|
|
|
|
off_t in_pack_offset;
|
|
|
|
struct object_entry *delta; /* delta base object */
|
|
|
|
struct object_entry *delta_child; /* deltified objects who bases me */
|
|
|
|
struct object_entry *delta_sibling; /* other deltified objects who
|
|
|
|
* uses the same base as me
|
|
|
|
*/
|
|
|
|
void *delta_data; /* cached delta (uncompressed) */
|
|
|
|
unsigned long delta_size; /* delta data size (uncompressed) */
|
|
|
|
unsigned long z_delta_size; /* delta data size (compressed) */
|
|
|
|
enum object_type type;
|
|
|
|
enum object_type in_pack_type; /* could be delta */
|
|
|
|
uint32_t hash; /* name hint hash */
|
|
|
|
unsigned char in_pack_header_size;
|
|
|
|
unsigned preferred_base:1; /*
|
|
|
|
* we do not pack this, but is available
|
|
|
|
* to be used as the base object to delta
|
|
|
|
* objects against.
|
|
|
|
*/
|
|
|
|
unsigned no_try_delta:1;
|
|
|
|
unsigned tagged:1; /* near the very tip of refs */
|
|
|
|
unsigned filled:1; /* assigned write-order */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct packing_data {
|
|
|
|
struct object_entry *objects;
|
|
|
|
uint32_t nr_objects, nr_alloc;
|
|
|
|
|
|
|
|
int32_t *index;
|
|
|
|
uint32_t index_size;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct object_entry *packlist_alloc(struct packing_data *pdata,
|
|
|
|
const unsigned char *sha1,
|
|
|
|
uint32_t index_pos);
|
|
|
|
|
|
|
|
struct object_entry *packlist_find(struct packing_data *pdata,
|
|
|
|
const unsigned char *sha1,
|
|
|
|
uint32_t *index_pos);
|
|
|
|
|
2013-10-25 02:01:29 +08:00
|
|
|
static inline uint32_t pack_name_hash(const char *name)
|
|
|
|
{
|
|
|
|
uint32_t c, hash = 0;
|
|
|
|
|
|
|
|
if (!name)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This effectively just creates a sortable number from the
|
|
|
|
* last sixteen non-whitespace characters. Last characters
|
|
|
|
* count "most", so things that end in ".c" sort together.
|
|
|
|
*/
|
|
|
|
while ((c = *name++) != 0) {
|
|
|
|
if (isspace(c))
|
|
|
|
continue;
|
|
|
|
hash = (hash >> 2) + (c << 24);
|
|
|
|
}
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
2013-10-25 02:01:06 +08:00
|
|
|
#endif
|