commit: rewrite read_graft_line
[git] / pack-objects.h
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 */
20         unsigned int in_pack_pos;
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 */
30
31         /*
32          * State flags for depth-first search used for analyzing delta cycles.
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).
36          */
37         enum {
38                 DFS_NONE = 0,
39                 DFS_ACTIVE,
40                 DFS_DONE
41         } dfs_state;
42         int depth;
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
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
81 #endif