Merge branch 'dk/blame-el' into pu
[git] / rev-cache.h
1 #ifndef REV_CACHE_H
2 #define REV_CACHE_H
3
4 #define SUPPORTED_REVCACHE_VERSION              1
5 #define SUPPORTED_REVINDEX_VERSION              1
6 #define SUPPORTED_REVCOPTR_VERSION              1
7
8 #define RC_PATH_SIZE(x) (sizeof(uint16_t) * (x))
9
10 #define RC_OBTAIN_OBJECT_ENTRY(p)                       from_disked_rc_object_entry((struct rc_object_entry_ondisk *)(p), 0)
11 #define RC_OBTAIN_INDEX_ENTRY(p)                        from_disked_rc_index_entry((struct rc_index_entry_ondisk *)(p), 0)
12
13 #define RC_ACTUAL_OBJECT_ENTRY_SIZE(e)  (\
14         sizeof(struct rc_object_entry_ondisk) + \
15         RC_PATH_SIZE((e)->merge_nr + (e)->split_nr) + \
16         (e)->size_size + \
17         (e)->name_size\
18 )
19 #define RC_ENTRY_SIZE_OFFSET(e)                 (RC_ACTUAL_OBJECT_ENTRY_SIZE(e) - (e)->name_size - (e)->size_size)
20 #define RC_ENTRY_NAME_OFFSET(e)                 (RC_ACTUAL_OBJECT_ENTRY_SIZE(e) - (e)->name_size)
21
22 /* single index maps objects to cache files */
23 struct rc_index_header {
24         char signature[8]; /* REVINDEX */
25         unsigned char version;
26         uint32_t ofs_objects;
27
28         uint32_t object_nr;
29         unsigned char cache_nr;
30
31         uint32_t max_date;
32 };
33
34 struct rc_index_entry_ondisk {
35         unsigned char sha1[20];
36         unsigned char flags;
37         uint32_t pos;
38 };
39
40 struct rc_index_entry {
41         unsigned char *sha1;
42         unsigned is_start : 1;
43         unsigned cache_index : 7;
44         uint32_t pos;
45 };
46
47
48 /* structure for actual cache file */
49 struct rc_slice_header {
50         char signature[8]; /* REVCACHE */
51         unsigned char version;
52         uint32_t ofs_objects;
53
54         uint32_t object_nr;
55         uint16_t path_nr;
56         uint32_t size;
57
58         unsigned char sha1[20];
59
60         uint32_t name_size;
61 };
62
63 struct rc_object_entry_ondisk {
64         unsigned char flags;
65         unsigned char sha1[20];
66
67         unsigned char merge_nr;
68         unsigned char split_nr;
69         unsigned char sizes;
70
71         uint32_t date;
72         uint16_t path;
73 };
74
75 struct rc_object_entry {
76         unsigned type : 3;
77         unsigned is_end : 1;
78         unsigned is_start : 1;
79         unsigned uninteresting : 1;
80         unsigned include : 1;
81         unsigned flag : 1; /* unused */
82         unsigned char *sha1; /* 20 byte */
83
84         unsigned char merge_nr; /* : 7 */
85         unsigned char split_nr; /* : 7 */
86         unsigned size_size : 3;
87         unsigned name_size : 3;
88         unsigned padding : 2;
89
90         uint32_t date;
91         uint16_t path;
92
93         /* merge paths */
94         /* split paths */
95         /* size */
96         /* name id */
97 };
98
99 struct rc_index_entry *from_disked_rc_index_entry(struct rc_index_entry_ondisk *src, struct rc_index_entry *dst);
100 struct rc_index_entry_ondisk *to_disked_rc_index_entry(struct rc_index_entry *src, struct rc_index_entry_ondisk *dst);
101 struct rc_object_entry *from_disked_rc_object_entry(struct rc_object_entry_ondisk *src, struct rc_object_entry *dst);
102 struct rc_object_entry_ondisk *to_disked_rc_object_entry(struct rc_object_entry *src, struct rc_object_entry_ondisk *dst);
103
104 extern unsigned char *get_cache_slice(struct commit *commit);
105 extern int open_cache_slice(unsigned char *sha1, int flags);
106 extern int traverse_cache_slice(struct rev_info *revs,
107         unsigned char *cache_sha1, struct commit *commit,
108         unsigned long *date_so_far, int *slop_so_far,
109         struct commit_list ***queue, struct commit_list **work);
110
111 extern void init_rev_cache_info(struct rev_cache_info *rci);
112 extern int make_cache_slice(struct rev_cache_info *rci,
113         struct rev_info *revs, struct commit_list **starts, struct commit_list **ends,
114         unsigned char *cache_sha1);
115 extern int make_cache_index(struct rev_cache_info *rci, unsigned char *cache_sha1,
116         int fd, unsigned int size);
117
118 extern void starts_from_slices(struct rev_info *revs, unsigned int flags, unsigned char *which, int n);
119 extern int fuse_cache_slices(struct rev_cache_info *rci, struct rev_info *revs);
120 extern int regenerate_cache_index(struct rev_cache_info *rci);
121 extern int make_cache_slice_pointer(struct rev_cache_info *rci, const char *slice_path);
122
123 #endif
124