aboutsummaryrefslogtreecommitdiffstats
path: root/shared.c
diff options
context:
space:
mode:
Diffstat (limited to 'shared.c')
-rw-r--r--shared.c64
1 files changed, 61 insertions, 3 deletions
diff --git a/shared.c b/shared.c
index 0fe513f..7eb2b0e 100644
--- a/shared.c
+++ b/shared.c
@@ -38,6 +38,9 @@ int cgit_cache_dynamic_ttl = 5;
38int cgit_cache_static_ttl = -1; 38int cgit_cache_static_ttl = -1;
39int cgit_cache_max_create_time = 5; 39int cgit_cache_max_create_time = 5;
40int cgit_summary_log = 0; 40int cgit_summary_log = 0;
41int cgit_summary_tags = 0;
42int cgit_summary_branches = 0;
43int cgit_renamelimit = -1;
41 44
42int cgit_max_msg_len = 60; 45int cgit_max_msg_len = 60;
43int cgit_max_repodesc_len = 60; 46int cgit_max_repodesc_len = 60;
@@ -63,7 +66,7 @@ int htmlfd = 0;
63int cgit_get_cmd_index(const char *cmd) 66int cgit_get_cmd_index(const char *cmd)
64{ 67{
65 static char *cmds[] = {"log", "commit", "diff", "tree", "blob", 68 static char *cmds[] = {"log", "commit", "diff", "tree", "blob",
66 "snapshot", "tag", NULL}; 69 "snapshot", "tag", "refs", NULL};
67 int i; 70 int i;
68 71
69 for(i = 0; cmds[i]; i++) 72 for(i = 0; cmds[i]; i++)
@@ -180,8 +183,14 @@ void cgit_global_config_cb(const char *name, const char *value)
180 cgit_max_commit_count = atoi(value); 183 cgit_max_commit_count = atoi(value);
181 else if (!strcmp(name, "summary-log")) 184 else if (!strcmp(name, "summary-log"))
182 cgit_summary_log = atoi(value); 185 cgit_summary_log = atoi(value);
186 else if (!strcmp(name, "summary-branches"))
187 cgit_summary_branches = atoi(value);
188 else if (!strcmp(name, "summary-tags"))
189 cgit_summary_tags = atoi(value);
183 else if (!strcmp(name, "agefile")) 190 else if (!strcmp(name, "agefile"))
184 cgit_agefile = xstrdup(value); 191 cgit_agefile = xstrdup(value);
192 else if (!strcmp(name, "renamelimit"))
193 cgit_renamelimit = atoi(value);
185 else if (!strcmp(name, "repo.group")) 194 else if (!strcmp(name, "repo.group"))
186 cgit_repo_group = xstrdup(value); 195 cgit_repo_group = xstrdup(value);
187 else if (!strcmp(name, "repo.url")) 196 else if (!strcmp(name, "repo.url"))
@@ -288,6 +297,47 @@ char *trim_end(const char *str, char c)
288 return s; 297 return s;
289} 298}
290 299
300void cgit_add_ref(struct reflist *list, struct refinfo *ref)
301{
302 size_t size;
303
304 if (list->count >= list->alloc) {
305 list->alloc += (list->alloc ? list->alloc : 4);
306 size = list->alloc * sizeof(struct refinfo *);
307 list->refs = xrealloc(list->refs, size);
308 }
309 list->refs[list->count++] = ref;
310}
311
312struct refinfo *cgit_mk_refinfo(const char *refname, const unsigned char *sha1)
313{
314 struct refinfo *ref;
315
316 ref = xmalloc(sizeof (struct refinfo));
317 ref->refname = xstrdup(refname);
318 ref->object = parse_object(sha1);
319 switch (ref->object->type) {
320 case OBJ_TAG:
321 ref->tag = cgit_parse_tag((struct tag *)ref->object);
322 break;
323 case OBJ_COMMIT:
324 ref->commit = cgit_parse_commit((struct commit *)ref->object);
325 break;
326 }
327 return ref;
328}
329
330int cgit_refs_cb(const char *refname, const unsigned char *sha1, int flags,
331 void *cb_data)
332{
333 struct reflist *list = (struct reflist *)cb_data;
334 struct refinfo *info = cgit_mk_refinfo(refname, sha1);
335
336 if (info)
337 cgit_add_ref(list, info);
338 return 0;
339}
340
291void cgit_diff_tree_cb(struct diff_queue_struct *q, 341void cgit_diff_tree_cb(struct diff_queue_struct *q,
292 struct diff_options *options, void *data) 342 struct diff_options *options, void *data)
293{ 343{
@@ -383,17 +433,25 @@ int cgit_diff_files(const unsigned char *old_sha1,
383 433
384void cgit_diff_tree(const unsigned char *old_sha1, 434void cgit_diff_tree(const unsigned char *old_sha1,
385 const unsigned char *new_sha1, 435 const unsigned char *new_sha1,
386 filepair_fn fn) 436 filepair_fn fn, const char *prefix)
387{ 437{
388 struct diff_options opt; 438 struct diff_options opt;
389 int ret; 439 int ret;
440 int prefixlen;
390 441
391 diff_setup(&opt); 442 diff_setup(&opt);
392 opt.output_format = DIFF_FORMAT_CALLBACK; 443 opt.output_format = DIFF_FORMAT_CALLBACK;
393 opt.detect_rename = 1; 444 opt.detect_rename = 1;
445 opt.rename_limit = cgit_renamelimit;
394 opt.recursive = 1; 446 opt.recursive = 1;
395 opt.format_callback = cgit_diff_tree_cb; 447 opt.format_callback = cgit_diff_tree_cb;
396 opt.format_callback_data = fn; 448 opt.format_callback_data = fn;
449 if (prefix) {
450 opt.nr_paths = 1;
451 opt.paths = &prefix;
452 prefixlen = strlen(prefix);
453 opt.pathlens = &prefixlen;
454 }
397 diff_setup_done(&opt); 455 diff_setup_done(&opt);
398 456
399 if (old_sha1 && !is_null_sha1(old_sha1)) 457 if (old_sha1 && !is_null_sha1(old_sha1))
@@ -410,5 +468,5 @@ void cgit_diff_commit(struct commit *commit, filepair_fn fn)
410 468
411 if (commit->parents) 469 if (commit->parents)
412 old_sha1 = commit->parents->item->object.sha1; 470 old_sha1 = commit->parents->item->object.sha1;
413 cgit_diff_tree(old_sha1, commit->object.sha1, fn); 471 cgit_diff_tree(old_sha1, commit->object.sha1, fn, NULL);
414} 472}