summaryrefslogtreecommitdiffabout
path: root/git.h
authorLars Hjemli <hjemli@gmail.com>2006-12-10 21:31:36 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2006-12-10 21:31:36 (UTC)
commit25105d7ecaba474d4b7c364ebb586aac3dfc5abb (patch) (unidiff)
tree8beb08db1399b8efb8c7fbcd936044ae7fc232e6 /git.h
parent856c026e221d8ed82c5b75bc8da4bd65e89ea953 (diff)
downloadcgit-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>
Diffstat (limited to 'git.h') (more/less context) (ignore whitespace changes)
-rw-r--r--git.h60
1 files changed, 55 insertions, 5 deletions
diff --git a/git.h b/git.h
index 443f216..dfa3542 100644
--- a/git.h
+++ b/git.h
@@ -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
53extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
54
55
36static inline char* xstrdup(const char *str) 56static 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
44static inline void *xmalloc(size_t size) 64static 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
57static inline void *xrealloc(void *ptr, size_t size) 77static 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
67static inline void *xcalloc(size_t nmemb, size_t size) 87static 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
77static inline ssize_t xread(int fd, void *buf, size_t len) 97static 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
88static inline ssize_t xwrite(int fd, const void *buf, size_t len) 108static 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
131extern int sha1_object_info(const unsigned char *, char *, unsigned long *);
111 132
112extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size); 133extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size);
113 134
135extern int get_sha1(const char *str, unsigned char *sha1);
136extern 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
121struct object_list { 145struct object_list {
122 struct object *item; 146 struct object *item;
123 struct object_list *next; 147 struct object_list *next;
124}; 148};
125 149
126struct object_refs { 150struct 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
132struct object_array { 156struct 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 */
147struct object { 171struct 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
160struct tree { 184struct 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
171struct commit_list { 195struct commit_list {
172 struct commit *item; 196 struct commit *item;
173 struct commit_list *next; 197 struct commit_list *next;
174}; 198};
175 199
176struct commit { 200struct 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
210struct commit *lookup_commit(const unsigned char *sha1);
211struct commit *lookup_commit_reference(const unsigned char *sha1);
212struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
213 int quiet);
214
215int parse_commit_buffer(struct commit *item, void *buffer, unsigned long size);
216int parse_commit(struct commit *item);
217
218struct commit_list * commit_list_insert(struct commit *item, struct commit_list **list_p);
219struct commit_list * insert_by_date(struct commit *item, struct commit_list **list);
220
221void free_commit_list(struct commit_list *list);
222
223void sort_by_date(struct commit_list **list);
224
186/* Commit formats */ 225/* Commit formats */
187enum cmit_fmt { 226enum 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
239extern 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
202struct commit *lookup_commit(const unsigned char *sha1);
203struct commit *lookup_commit_reference(const unsigned char *sha1);
204struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
205 int quiet);
206
207typedef void (*topo_sort_set_fn_t)(struct commit*, void *data); 242typedef void (*topo_sort_set_fn_t)(struct commit*, void *data);
208typedef void* (*topo_sort_get_fn_t)(struct commit*); 243typedef 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
218struct rev_info; 253struct rev_info;
219struct diff_options; 254struct diff_options;
220struct diff_queue_struct; 255struct diff_queue_struct;
221 256
222typedef void (*change_fn_t)(struct diff_options *options, 257typedef 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
228typedef void (*add_remove_fn_t)(struct diff_options *options, 263typedef 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
233typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, 268typedef 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
254struct diff_options { 289struct 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
295enum color_diff { 330enum 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
348typedef int each_ref_fn(const char *refname, const unsigned char *sha1, int flags, void *cb_data);
349extern int head_ref(each_ref_fn, void *);
350extern int for_each_ref(each_ref_fn, void *);
351extern int for_each_tag_ref(each_ref_fn, void *);
352extern int for_each_branch_ref(each_ref_fn, void *);
353extern 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
316struct rev_info; 361struct rev_info;
317struct log_info; 362struct log_info;
318 363
319typedef void (prune_fn_t)(struct rev_info *revs, struct commit *commit); 364typedef void (prune_fn_t)(struct rev_info *revs, struct commit *commit);
320 365
321struct rev_info { 366struct 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
439extern void init_revisions(struct rev_info *revs, const char *prefix);
440extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def);
441extern int handle_revision_arg(const char *arg, struct rev_info *revs,int flags,int cant_be_filename);
442
443extern void prepare_revision_walk(struct rev_info *revs);
394extern struct commit *get_revision(struct rev_info *revs); 444extern struct commit *get_revision(struct rev_info *revs);
395 445
396 446
397 447
398 448
399#endif /* GIT_H */ 449#endif /* GIT_H */