author | Lars Hjemli <hjemli@gmail.com> | 2006-12-10 21:31:36 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2006-12-10 21:31:36 (UTC) |
commit | 25105d7ecaba474d4b7c364ebb586aac3dfc5abb (patch) (unidiff) | |
tree | 8beb08db1399b8efb8c7fbcd936044ae7fc232e6 /git.h | |
parent | 856c026e221d8ed82c5b75bc8da4bd65e89ea953 (diff) | |
download | cgit-25105d7ecaba474d4b7c364ebb586aac3dfc5abb.zip cgit-25105d7ecaba474d4b7c364ebb586aac3dfc5abb.tar.gz cgit-25105d7ecaba474d4b7c364ebb586aac3dfc5abb.tar.bz2 |
Add caching infrastructure
This enables internal caching of page output.
Page requests are split into four groups:
1) repo listing (front page)
2) repo summary
3) repo pages w/symbolic references in query string
4) repo pages w/constant sha1's in query string
Each group has a TTL specified in minutes. When a page is requested, a cached
filename is stat(2)'ed and st_mtime is compared to time(2). If TTL has expired
(or the file didn't exist), the cached file is regenerated.
When generating a cached file, locking is used to avoid parallell processing
of the request. If multiple processes tries to aquire the same lock, the ones
who fail to get the lock serves the (expired) cached file. If the cached file
don't exist, the process instead calls sched_yield(2) before restarting the
request processing.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | git.h | 60 |
1 files changed, 55 insertions, 5 deletions
@@ -1,399 +1,449 @@ | |||
1 | #ifndef GIT_H | 1 | #ifndef GIT_H |
2 | #define GIT_H | 2 | #define GIT_H |
3 | 3 | ||
4 | 4 | ||
5 | /* | 5 | /* |
6 | * from git:git-compat-util.h | 6 | * from git:git-compat-util.h |
7 | */ | 7 | */ |
8 | 8 | ||
9 | 9 | ||
10 | #ifndef FLEX_ARRAY | 10 | #ifndef FLEX_ARRAY |
11 | #if defined(__GNUC__) && (__GNUC__ < 3) | 11 | #if defined(__GNUC__) && (__GNUC__ < 3) |
12 | #define FLEX_ARRAY 0 | 12 | #define FLEX_ARRAY 0 |
13 | #else | 13 | #else |
14 | #define FLEX_ARRAY /* empty */ | 14 | #define FLEX_ARRAY /* empty */ |
15 | #endif | 15 | #endif |
16 | #endif | 16 | #endif |
17 | 17 | ||
18 | 18 | ||
19 | #include <unistd.h> | 19 | #include <unistd.h> |
20 | #include <stdio.h> | 20 | #include <stdio.h> |
21 | #include <sys/stat.h> | 21 | #include <sys/stat.h> |
22 | #include <fcntl.h> | 22 | #include <fcntl.h> |
23 | #include <stddef.h> | 23 | #include <stddef.h> |
24 | #include <stdlib.h> | 24 | #include <stdlib.h> |
25 | #include <stdarg.h> | 25 | #include <stdarg.h> |
26 | #include <string.h> | 26 | #include <string.h> |
27 | #include <errno.h> | 27 | #include <errno.h> |
28 | #include <limits.h> | 28 | #include <limits.h> |
29 | #include <sys/param.h> | 29 | #include <sys/param.h> |
30 | #include <netinet/in.h> | 30 | #include <netinet/in.h> |
31 | #include <sys/types.h> | 31 | #include <sys/types.h> |
32 | #include <dirent.h> | 32 | #include <dirent.h> |
33 | #include <time.h> | 33 | #include <time.h> |
34 | 34 | ||
35 | 35 | ||
36 | /* On most systems <limits.h> would have given us this, but | ||
37 | * not on some systems (e.g. GNU/Hurd). | ||
38 | */ | ||
39 | #ifndef PATH_MAX | ||
40 | #define PATH_MAX 4096 | ||
41 | #endif | ||
42 | |||
43 | #ifdef __GNUC__ | ||
44 | #define NORETURN __attribute__((__noreturn__)) | ||
45 | #else | ||
46 | #define NORETURN | ||
47 | #ifndef __attribute__ | ||
48 | #define __attribute__(x) | ||
49 | #endif | ||
50 | #endif | ||
51 | |||
52 | |||
53 | extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2))); | ||
54 | |||
55 | |||
36 | static inline char* xstrdup(const char *str) | 56 | static inline char* xstrdup(const char *str) |
37 | { | 57 | { |
38 | char *ret = strdup(str); | 58 | char *ret = strdup(str); |
39 | if (!ret) | 59 | if (!ret) |
40 | die("Out of memory, strdup failed"); | 60 | die("Out of memory, strdup failed"); |
41 | return ret; | 61 | return ret; |
42 | } | 62 | } |
43 | 63 | ||
44 | static inline void *xmalloc(size_t size) | 64 | static inline void *xmalloc(size_t size) |
45 | { | 65 | { |
46 | void *ret = malloc(size); | 66 | void *ret = malloc(size); |
47 | if (!ret && !size) | 67 | if (!ret && !size) |
48 | ret = malloc(1); | 68 | ret = malloc(1); |
49 | if (!ret) | 69 | if (!ret) |
50 | die("Out of memory, malloc failed"); | 70 | die("Out of memory, malloc failed"); |
51 | #ifdef XMALLOC_POISON | 71 | #ifdef XMALLOC_POISON |
52 | memset(ret, 0xA5, size); | 72 | memset(ret, 0xA5, size); |
53 | #endif | 73 | #endif |
54 | return ret; | 74 | return ret; |
55 | } | 75 | } |
56 | 76 | ||
57 | static inline void *xrealloc(void *ptr, size_t size) | 77 | static inline void *xrealloc(void *ptr, size_t size) |
58 | { | 78 | { |
59 | void *ret = realloc(ptr, size); | 79 | void *ret = realloc(ptr, size); |
60 | if (!ret && !size) | 80 | if (!ret && !size) |
61 | ret = realloc(ptr, 1); | 81 | ret = realloc(ptr, 1); |
62 | if (!ret) | 82 | if (!ret) |
63 | die("Out of memory, realloc failed"); | 83 | die("Out of memory, realloc failed"); |
64 | return ret; | 84 | return ret; |
65 | } | 85 | } |
66 | 86 | ||
67 | static inline void *xcalloc(size_t nmemb, size_t size) | 87 | static inline void *xcalloc(size_t nmemb, size_t size) |
68 | { | 88 | { |
69 | void *ret = calloc(nmemb, size); | 89 | void *ret = calloc(nmemb, size); |
70 | if (!ret && (!nmemb || !size)) | 90 | if (!ret && (!nmemb || !size)) |
71 | ret = calloc(1, 1); | 91 | ret = calloc(1, 1); |
72 | if (!ret) | 92 | if (!ret) |
73 | die("Out of memory, calloc failed"); | 93 | die("Out of memory, calloc failed"); |
74 | return ret; | 94 | return ret; |
75 | } | 95 | } |
76 | 96 | ||
77 | static inline ssize_t xread(int fd, void *buf, size_t len) | 97 | static inline ssize_t xread(int fd, void *buf, size_t len) |
78 | { | 98 | { |
79 | ssize_t nr; | 99 | ssize_t nr; |
80 | while (1) { | 100 | while (1) { |
81 | nr = read(fd, buf, len); | 101 | nr = read(fd, buf, len); |
82 | if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) | 102 | if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) |
83 | continue; | 103 | continue; |
84 | return nr; | 104 | return nr; |
85 | } | 105 | } |
86 | } | 106 | } |
87 | 107 | ||
88 | static inline ssize_t xwrite(int fd, const void *buf, size_t len) | 108 | static inline ssize_t xwrite(int fd, const void *buf, size_t len) |
89 | { | 109 | { |
90 | ssize_t nr; | 110 | ssize_t nr; |
91 | while (1) { | 111 | while (1) { |
92 | nr = write(fd, buf, len); | 112 | nr = write(fd, buf, len); |
93 | if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) | 113 | if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) |
94 | continue; | 114 | continue; |
95 | return nr; | 115 | return nr; |
96 | } | 116 | } |
97 | } | 117 | } |
98 | 118 | ||
99 | 119 | ||
100 | 120 | ||
101 | 121 | ||
102 | /* | 122 | /* |
103 | * from git:cache.h | 123 | * from git:cache.h |
104 | */ | 124 | */ |
105 | 125 | ||
106 | 126 | ||
107 | /* Convert to/from hex/sha1 representation */ | 127 | /* Convert to/from hex/sha1 representation */ |
108 | #define MINIMUM_ABBREV 4 | 128 | #define MINIMUM_ABBREV 4 |
109 | #define DEFAULT_ABBREV 7 | 129 | #define DEFAULT_ABBREV 7 |
110 | 130 | ||
131 | extern int sha1_object_info(const unsigned char *, char *, unsigned long *); | ||
111 | 132 | ||
112 | extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size); | 133 | extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size); |
113 | 134 | ||
135 | extern int get_sha1(const char *str, unsigned char *sha1); | ||
136 | extern int get_sha1_hex(const char *hex, unsigned char *sha1); | ||
137 | extern char *sha1_to_hex(const unsigned char *sha1);/* static buffer result! */ | ||
114 | 138 | ||
115 | 139 | ||
116 | 140 | ||
117 | /* | 141 | /* |
118 | * from git:object.h | 142 | * from git:object.h |
119 | */ | 143 | */ |
120 | 144 | ||
121 | struct object_list { | 145 | struct object_list { |
122 | struct object *item; | 146 | struct object *item; |
123 | struct object_list *next; | 147 | struct object_list *next; |
124 | }; | 148 | }; |
125 | 149 | ||
126 | struct object_refs { | 150 | struct object_refs { |
127 | unsigned count; | 151 | unsigned count; |
128 | struct object *base; | 152 | struct object *base; |
129 | struct object *ref[FLEX_ARRAY]; /* more */ | 153 | struct object *ref[FLEX_ARRAY]; /* more */ |
130 | }; | 154 | }; |
131 | 155 | ||
132 | struct object_array { | 156 | struct object_array { |
133 | unsigned int nr; | 157 | unsigned int nr; |
134 | unsigned int alloc; | 158 | unsigned int alloc; |
135 | struct object_array_entry { | 159 | struct object_array_entry { |
136 | struct object *item; | 160 | struct object *item; |
137 | const char *name; | 161 | const char *name; |
138 | } *objects; | 162 | } *objects; |
139 | }; | 163 | }; |
140 | 164 | ||
141 | #define TYPE_BITS 3 | 165 | #define TYPE_BITS 3 |
142 | #define FLAG_BITS 27 | 166 | #define FLAG_BITS 27 |
143 | 167 | ||
144 | /* | 168 | /* |
145 | * The object type is stored in 3 bits. | 169 | * The object type is stored in 3 bits. |
146 | */ | 170 | */ |
147 | struct object { | 171 | struct object { |
148 | unsigned parsed : 1; | 172 | unsigned parsed : 1; |
149 | unsigned used : 1; | 173 | unsigned used : 1; |
150 | unsigned type : TYPE_BITS; | 174 | unsigned type : TYPE_BITS; |
151 | unsigned flags : FLAG_BITS; | 175 | unsigned flags : FLAG_BITS; |
152 | unsigned char sha1[20]; | 176 | unsigned char sha1[20]; |
153 | }; | 177 | }; |
154 | 178 | ||
155 | 179 | ||
156 | /* | 180 | /* |
157 | * from git:tree.h | 181 | * from git:tree.h |
158 | */ | 182 | */ |
159 | 183 | ||
160 | struct tree { | 184 | struct tree { |
161 | struct object object; | 185 | struct object object; |
162 | void *buffer; | 186 | void *buffer; |
163 | unsigned long size; | 187 | unsigned long size; |
164 | }; | 188 | }; |
165 | 189 | ||
166 | 190 | ||
167 | 191 | ||
168 | 192 | ||
169 | /* from git:commit.h */ | 193 | /* from git:commit.h */ |
170 | 194 | ||
171 | struct commit_list { | 195 | struct commit_list { |
172 | struct commit *item; | 196 | struct commit *item; |
173 | struct commit_list *next; | 197 | struct commit_list *next; |
174 | }; | 198 | }; |
175 | 199 | ||
176 | struct commit { | 200 | struct commit { |
177 | struct object object; | 201 | struct object object; |
178 | void *util; | 202 | void *util; |
179 | unsigned long date; | 203 | unsigned long date; |
180 | struct commit_list *parents; | 204 | struct commit_list *parents; |
181 | struct tree *tree; | 205 | struct tree *tree; |
182 | char *buffer; | 206 | char *buffer; |
183 | }; | 207 | }; |
184 | 208 | ||
185 | 209 | ||
210 | struct commit *lookup_commit(const unsigned char *sha1); | ||
211 | struct commit *lookup_commit_reference(const unsigned char *sha1); | ||
212 | struct commit *lookup_commit_reference_gently(const unsigned char *sha1, | ||
213 | int quiet); | ||
214 | |||
215 | int parse_commit_buffer(struct commit *item, void *buffer, unsigned long size); | ||
216 | int parse_commit(struct commit *item); | ||
217 | |||
218 | struct commit_list * commit_list_insert(struct commit *item, struct commit_list **list_p); | ||
219 | struct commit_list * insert_by_date(struct commit *item, struct commit_list **list); | ||
220 | |||
221 | void free_commit_list(struct commit_list *list); | ||
222 | |||
223 | void sort_by_date(struct commit_list **list); | ||
224 | |||
186 | /* Commit formats */ | 225 | /* Commit formats */ |
187 | enum cmit_fmt { | 226 | enum cmit_fmt { |
188 | CMIT_FMT_RAW, | 227 | CMIT_FMT_RAW, |
189 | CMIT_FMT_MEDIUM, | 228 | CMIT_FMT_MEDIUM, |
190 | CMIT_FMT_DEFAULT = CMIT_FMT_MEDIUM, | 229 | CMIT_FMT_DEFAULT = CMIT_FMT_MEDIUM, |
191 | CMIT_FMT_SHORT, | 230 | CMIT_FMT_SHORT, |
192 | CMIT_FMT_FULL, | 231 | CMIT_FMT_FULL, |
193 | CMIT_FMT_FULLER, | 232 | CMIT_FMT_FULLER, |
194 | CMIT_FMT_ONELINE, | 233 | CMIT_FMT_ONELINE, |
195 | CMIT_FMT_EMAIL, | 234 | CMIT_FMT_EMAIL, |
196 | 235 | ||
197 | CMIT_FMT_UNSPECIFIED, | 236 | CMIT_FMT_UNSPECIFIED, |
198 | }; | 237 | }; |
199 | 238 | ||
239 | extern unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *, unsigned long len, char *buf, unsigned long space, int abbrev, const char *subject, const char *after_subject, int relative_date); | ||
200 | 240 | ||
201 | 241 | ||
202 | struct commit *lookup_commit(const unsigned char *sha1); | ||
203 | struct commit *lookup_commit_reference(const unsigned char *sha1); | ||
204 | struct commit *lookup_commit_reference_gently(const unsigned char *sha1, | ||
205 | int quiet); | ||
206 | |||
207 | typedef void (*topo_sort_set_fn_t)(struct commit*, void *data); | 242 | typedef void (*topo_sort_set_fn_t)(struct commit*, void *data); |
208 | typedef void* (*topo_sort_get_fn_t)(struct commit*); | 243 | typedef void* (*topo_sort_get_fn_t)(struct commit*); |
209 | 244 | ||
210 | 245 | ||
211 | 246 | ||
212 | 247 | ||
213 | /* | 248 | /* |
214 | * from git:diff.h | 249 | * from git:diff.h |
215 | */ | 250 | */ |
216 | 251 | ||
217 | 252 | ||
218 | struct rev_info; | 253 | struct rev_info; |
219 | struct diff_options; | 254 | struct diff_options; |
220 | struct diff_queue_struct; | 255 | struct diff_queue_struct; |
221 | 256 | ||
222 | typedef void (*change_fn_t)(struct diff_options *options, | 257 | typedef void (*change_fn_t)(struct diff_options *options, |
223 | unsigned old_mode, unsigned new_mode, | 258 | unsigned old_mode, unsigned new_mode, |
224 | const unsigned char *old_sha1, | 259 | const unsigned char *old_sha1, |
225 | const unsigned char *new_sha1, | 260 | const unsigned char *new_sha1, |
226 | const char *base, const char *path); | 261 | const char *base, const char *path); |
227 | 262 | ||
228 | typedef void (*add_remove_fn_t)(struct diff_options *options, | 263 | typedef void (*add_remove_fn_t)(struct diff_options *options, |
229 | int addremove, unsigned mode, | 264 | int addremove, unsigned mode, |
230 | const unsigned char *sha1, | 265 | const unsigned char *sha1, |
231 | const char *base, const char *path); | 266 | const char *base, const char *path); |
232 | 267 | ||
233 | typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, | 268 | typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, |
234 | struct diff_options *options, void *data); | 269 | struct diff_options *options, void *data); |
235 | 270 | ||
236 | #define DIFF_FORMAT_RAW 0x0001 | 271 | #define DIFF_FORMAT_RAW 0x0001 |
237 | #define DIFF_FORMAT_DIFFSTAT0x0002 | 272 | #define DIFF_FORMAT_DIFFSTAT0x0002 |
238 | #define DIFF_FORMAT_NUMSTAT0x0004 | 273 | #define DIFF_FORMAT_NUMSTAT0x0004 |
239 | #define DIFF_FORMAT_SUMMARY0x0008 | 274 | #define DIFF_FORMAT_SUMMARY0x0008 |
240 | #define DIFF_FORMAT_PATCH0x0010 | 275 | #define DIFF_FORMAT_PATCH0x0010 |
241 | 276 | ||
242 | /* These override all above */ | 277 | /* These override all above */ |
243 | #define DIFF_FORMAT_NAME0x0100 | 278 | #define DIFF_FORMAT_NAME0x0100 |
244 | #define DIFF_FORMAT_NAME_STATUS0x0200 | 279 | #define DIFF_FORMAT_NAME_STATUS0x0200 |
245 | #define DIFF_FORMAT_CHECKDIFF0x0400 | 280 | #define DIFF_FORMAT_CHECKDIFF0x0400 |
246 | 281 | ||
247 | /* Same as output_format = 0 but we know that -s flag was given | 282 | /* Same as output_format = 0 but we know that -s flag was given |
248 | * and we should not give default value to output_format. | 283 | * and we should not give default value to output_format. |
249 | */ | 284 | */ |
250 | #define DIFF_FORMAT_NO_OUTPUT0x0800 | 285 | #define DIFF_FORMAT_NO_OUTPUT0x0800 |
251 | 286 | ||
252 | #define DIFF_FORMAT_CALLBACK0x1000 | 287 | #define DIFF_FORMAT_CALLBACK0x1000 |
253 | 288 | ||
254 | struct diff_options { | 289 | struct diff_options { |
255 | const char *filter; | 290 | const char *filter; |
256 | const char *orderfile; | 291 | const char *orderfile; |
257 | const char *pickaxe; | 292 | const char *pickaxe; |
258 | const char *single_follow; | 293 | const char *single_follow; |
259 | unsigned recursive:1, | 294 | unsigned recursive:1, |
260 | tree_in_recursive:1, | 295 | tree_in_recursive:1, |
261 | binary:1, | 296 | binary:1, |
262 | text:1, | 297 | text:1, |
263 | full_index:1, | 298 | full_index:1, |
264 | silent_on_remove:1, | 299 | silent_on_remove:1, |
265 | find_copies_harder:1, | 300 | find_copies_harder:1, |
266 | color_diff:1, | 301 | color_diff:1, |
267 | color_diff_words:1; | 302 | color_diff_words:1; |
268 | int context; | 303 | int context; |
269 | int break_opt; | 304 | int break_opt; |
270 | int detect_rename; | 305 | int detect_rename; |
271 | int line_termination; | 306 | int line_termination; |
272 | int output_format; | 307 | int output_format; |
273 | int pickaxe_opts; | 308 | int pickaxe_opts; |
274 | int rename_score; | 309 | int rename_score; |
275 | int reverse_diff; | 310 | int reverse_diff; |
276 | int rename_limit; | 311 | int rename_limit; |
277 | int setup; | 312 | int setup; |
278 | int abbrev; | 313 | int abbrev; |
279 | const char *msg_sep; | 314 | const char *msg_sep; |
280 | const char *stat_sep; | 315 | const char *stat_sep; |
281 | long xdl_opts; | 316 | long xdl_opts; |
282 | 317 | ||
283 | int stat_width; | 318 | int stat_width; |
284 | int stat_name_width; | 319 | int stat_name_width; |
285 | 320 | ||
286 | int nr_paths; | 321 | int nr_paths; |
287 | const char **paths; | 322 | const char **paths; |
288 | int *pathlens; | 323 | int *pathlens; |
289 | change_fn_t change; | 324 | change_fn_t change; |
290 | add_remove_fn_t add_remove; | 325 | add_remove_fn_t add_remove; |
291 | diff_format_fn_t format_callback; | 326 | diff_format_fn_t format_callback; |
292 | void *format_callback_data; | 327 | void *format_callback_data; |
293 | }; | 328 | }; |
294 | 329 | ||
295 | enum color_diff { | 330 | enum color_diff { |
296 | DIFF_RESET = 0, | 331 | DIFF_RESET = 0, |
297 | DIFF_PLAIN = 1, | 332 | DIFF_PLAIN = 1, |
298 | DIFF_METAINFO = 2, | 333 | DIFF_METAINFO = 2, |
299 | DIFF_FRAGINFO = 3, | 334 | DIFF_FRAGINFO = 3, |
300 | DIFF_FILE_OLD = 4, | 335 | DIFF_FILE_OLD = 4, |
301 | DIFF_FILE_NEW = 5, | 336 | DIFF_FILE_NEW = 5, |
302 | DIFF_COMMIT = 6, | 337 | DIFF_COMMIT = 6, |
303 | DIFF_WHITESPACE = 7, | 338 | DIFF_WHITESPACE = 7, |
304 | }; | 339 | }; |
305 | 340 | ||
306 | 341 | ||
307 | 342 | ||
308 | 343 | ||
344 | /* | ||
345 | * from git:refs.g | ||
346 | */ | ||
347 | |||
348 | typedef int each_ref_fn(const char *refname, const unsigned char *sha1, int flags, void *cb_data); | ||
349 | extern int head_ref(each_ref_fn, void *); | ||
350 | extern int for_each_ref(each_ref_fn, void *); | ||
351 | extern int for_each_tag_ref(each_ref_fn, void *); | ||
352 | extern int for_each_branch_ref(each_ref_fn, void *); | ||
353 | extern int for_each_remote_ref(each_ref_fn, void *); | ||
309 | 354 | ||
310 | 355 | ||
311 | 356 | ||
312 | /* | 357 | /* |
313 | * from git:revision.h | 358 | * from git:revision.h |
314 | */ | 359 | */ |
315 | 360 | ||
316 | struct rev_info; | 361 | struct rev_info; |
317 | struct log_info; | 362 | struct log_info; |
318 | 363 | ||
319 | typedef void (prune_fn_t)(struct rev_info *revs, struct commit *commit); | 364 | typedef void (prune_fn_t)(struct rev_info *revs, struct commit *commit); |
320 | 365 | ||
321 | struct rev_info { | 366 | struct rev_info { |
322 | /* Starting list */ | 367 | /* Starting list */ |
323 | struct commit_list *commits; | 368 | struct commit_list *commits; |
324 | struct object_array pending; | 369 | struct object_array pending; |
325 | 370 | ||
326 | /* Basic information */ | 371 | /* Basic information */ |
327 | const char *prefix; | 372 | const char *prefix; |
328 | void *prune_data; | 373 | void *prune_data; |
329 | prune_fn_t *prune_fn; | 374 | prune_fn_t *prune_fn; |
330 | 375 | ||
331 | /* Traversal flags */ | 376 | /* Traversal flags */ |
332 | unsigned intdense:1, | 377 | unsigned intdense:1, |
333 | no_merges:1, | 378 | no_merges:1, |
334 | no_walk:1, | 379 | no_walk:1, |
335 | remove_empty_trees:1, | 380 | remove_empty_trees:1, |
336 | simplify_history:1, | 381 | simplify_history:1, |
337 | lifo:1, | 382 | lifo:1, |
338 | topo_order:1, | 383 | topo_order:1, |
339 | tag_objects:1, | 384 | tag_objects:1, |
340 | tree_objects:1, | 385 | tree_objects:1, |
341 | blob_objects:1, | 386 | blob_objects:1, |
342 | edge_hint:1, | 387 | edge_hint:1, |
343 | limited:1, | 388 | limited:1, |
344 | unpacked:1, /* see also ignore_packed below */ | 389 | unpacked:1, /* see also ignore_packed below */ |
345 | boundary:1, | 390 | boundary:1, |
346 | parents:1; | 391 | parents:1; |
347 | 392 | ||
348 | /* Diff flags */ | 393 | /* Diff flags */ |
349 | unsigned intdiff:1, | 394 | unsigned intdiff:1, |
350 | full_diff:1, | 395 | full_diff:1, |
351 | show_root_diff:1, | 396 | show_root_diff:1, |
352 | no_commit_id:1, | 397 | no_commit_id:1, |
353 | verbose_header:1, | 398 | verbose_header:1, |
354 | ignore_merges:1, | 399 | ignore_merges:1, |
355 | combine_merges:1, | 400 | combine_merges:1, |
356 | dense_combined_merges:1, | 401 | dense_combined_merges:1, |
357 | always_show_header:1; | 402 | always_show_header:1; |
358 | 403 | ||
359 | /* Format info */ | 404 | /* Format info */ |
360 | unsigned intshown_one:1, | 405 | unsigned intshown_one:1, |
361 | abbrev_commit:1, | 406 | abbrev_commit:1, |
362 | relative_date:1; | 407 | relative_date:1; |
363 | 408 | ||
364 | const char **ignore_packed; /* pretend objects in these are unpacked */ | 409 | const char **ignore_packed; /* pretend objects in these are unpacked */ |
365 | int num_ignore_packed; | 410 | int num_ignore_packed; |
366 | 411 | ||
367 | unsigned intabbrev; | 412 | unsigned intabbrev; |
368 | enum cmit_fmtcommit_format; | 413 | enum cmit_fmtcommit_format; |
369 | struct log_info *loginfo; | 414 | struct log_info *loginfo; |
370 | int nr, total; | 415 | int nr, total; |
371 | const char*mime_boundary; | 416 | const char*mime_boundary; |
372 | const char*message_id; | 417 | const char*message_id; |
373 | const char*ref_message_id; | 418 | const char*ref_message_id; |
374 | const char*add_signoff; | 419 | const char*add_signoff; |
375 | const char*extra_headers; | 420 | const char*extra_headers; |
376 | 421 | ||
377 | /* Filter by commit log message */ | 422 | /* Filter by commit log message */ |
378 | struct grep_opt*grep_filter; | 423 | struct grep_opt*grep_filter; |
379 | 424 | ||
380 | /* special limits */ | 425 | /* special limits */ |
381 | int max_count; | 426 | int max_count; |
382 | unsigned long max_age; | 427 | unsigned long max_age; |
383 | unsigned long min_age; | 428 | unsigned long min_age; |
384 | 429 | ||
385 | /* diff info for patches and for paths limiting */ | 430 | /* diff info for patches and for paths limiting */ |
386 | struct diff_options diffopt; | 431 | struct diff_options diffopt; |
387 | struct diff_options pruning; | 432 | struct diff_options pruning; |
388 | 433 | ||
389 | topo_sort_set_fn_t topo_setter; | 434 | topo_sort_set_fn_t topo_setter; |
390 | topo_sort_get_fn_t topo_getter; | 435 | topo_sort_get_fn_t topo_getter; |
391 | }; | 436 | }; |
392 | 437 | ||
393 | 438 | ||
439 | extern void init_revisions(struct rev_info *revs, const char *prefix); | ||
440 | extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def); | ||
441 | extern int handle_revision_arg(const char *arg, struct rev_info *revs,int flags,int cant_be_filename); | ||
442 | |||
443 | extern void prepare_revision_walk(struct rev_info *revs); | ||
394 | extern struct commit *get_revision(struct rev_info *revs); | 444 | extern struct commit *get_revision(struct rev_info *revs); |
395 | 445 | ||
396 | 446 | ||
397 | 447 | ||
398 | 448 | ||
399 | #endif /* GIT_H */ | 449 | #endif /* GIT_H */ |