]>
Commit | Line | Data |
---|---|---|
2834bc27 VM |
1 | #ifndef PACK_OBJECTS_H |
2 | #define PACK_OBJECTS_H | |
3 | ||
4 | struct object_entry { | |
5 | struct pack_idx_entry idx; | |
6 | unsigned long size; /* uncompressed size */ | |
7 | struct packed_git *in_pack; /* already in pack */ | |
8 | off_t in_pack_offset; | |
9 | struct object_entry *delta; /* delta base object */ | |
10 | struct object_entry *delta_child; /* deltified objects who bases me */ | |
11 | struct object_entry *delta_sibling; /* other deltified objects who | |
12 | * uses the same base as me | |
13 | */ | |
14 | void *delta_data; /* cached delta (uncompressed) */ | |
15 | unsigned long delta_size; /* delta data size (uncompressed) */ | |
16 | unsigned long z_delta_size; /* delta data size (compressed) */ | |
17 | enum object_type type; | |
18 | enum object_type in_pack_type; /* could be delta */ | |
19 | uint32_t hash; /* name hint hash */ | |
7cc8f971 | 20 | unsigned int in_pack_pos; |
2834bc27 VM |
21 | unsigned char in_pack_header_size; |
22 | unsigned preferred_base:1; /* | |
23 | * we do not pack this, but is available | |
24 | * to be used as the base object to delta | |
25 | * objects against. | |
26 | */ | |
27 | unsigned no_try_delta:1; | |
28 | unsigned tagged:1; /* near the very tip of refs */ | |
29 | unsigned filled:1; /* assigned write-order */ | |
4cf2143e JK |
30 | |
31 | /* | |
32 | * State flags for depth-first search used for analyzing delta cycles. | |
7dbabbbe JK |
33 | * |
34 | * The depth is measured in delta-links to the base (so if A is a delta | |
35 | * against B, then A has a depth of 1, and B a depth of 0). | |
4cf2143e JK |
36 | */ |
37 | enum { | |
38 | DFS_NONE = 0, | |
39 | DFS_ACTIVE, | |
40 | DFS_DONE | |
41 | } dfs_state; | |
7dbabbbe | 42 | int depth; |
2834bc27 VM |
43 | }; |
44 | ||
45 | struct packing_data { | |
46 | struct object_entry *objects; | |
47 | uint32_t nr_objects, nr_alloc; | |
48 | ||
49 | int32_t *index; | |
50 | uint32_t index_size; | |
51 | }; | |
52 | ||
53 | struct object_entry *packlist_alloc(struct packing_data *pdata, | |
54 | const unsigned char *sha1, | |
55 | uint32_t index_pos); | |
56 | ||
57 | struct object_entry *packlist_find(struct packing_data *pdata, | |
58 | const unsigned char *sha1, | |
59 | uint32_t *index_pos); | |
60 | ||
68fb36eb VM |
61 | static inline uint32_t pack_name_hash(const char *name) |
62 | { | |
63 | uint32_t c, hash = 0; | |
64 | ||
65 | if (!name) | |
66 | return 0; | |
67 | ||
68 | /* | |
69 | * This effectively just creates a sortable number from the | |
70 | * last sixteen non-whitespace characters. Last characters | |
71 | * count "most", so things that end in ".c" sort together. | |
72 | */ | |
73 | while ((c = *name++) != 0) { | |
74 | if (isspace(c)) | |
75 | continue; | |
76 | hash = (hash >> 2) + (c << 24); | |
77 | } | |
78 | return hash; | |
79 | } | |
80 | ||
2834bc27 | 81 | #endif |