pack-objects.hon commit Merge tag 'gitgui-0.21.0' of git://repo.or.cz/git-gui (3eae308)
   1#ifndef PACK_OBJECTS_H
   2#define PACK_OBJECTS_H
   3
   4struct 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        enum {
  35                DFS_NONE = 0,
  36                DFS_ACTIVE,
  37                DFS_DONE
  38        } dfs_state;
  39};
  40
  41struct packing_data {
  42        struct object_entry *objects;
  43        uint32_t nr_objects, nr_alloc;
  44
  45        int32_t *index;
  46        uint32_t index_size;
  47};
  48
  49struct object_entry *packlist_alloc(struct packing_data *pdata,
  50                                    const unsigned char *sha1,
  51                                    uint32_t index_pos);
  52
  53struct object_entry *packlist_find(struct packing_data *pdata,
  54                                   const unsigned char *sha1,
  55                                   uint32_t *index_pos);
  56
  57static inline uint32_t pack_name_hash(const char *name)
  58{
  59        uint32_t c, hash = 0;
  60
  61        if (!name)
  62                return 0;
  63
  64        /*
  65         * This effectively just creates a sortable number from the
  66         * last sixteen non-whitespace characters. Last characters
  67         * count "most", so things that end in ".c" sort together.
  68         */
  69        while ((c = *name++) != 0) {
  70                if (isspace(c))
  71                        continue;
  72                hash = (hash >> 2) + (c << 24);
  73        }
  74        return hash;
  75}
  76
  77#endif