author | Lars Hjemli <hjemli@gmail.com> | 2008-09-14 22:07:12 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2008-09-15 21:35:27 (UTC) |
commit | 93397a765b9d9af11b7d10c114406e303ea4fb1c (patch) (unidiff) | |
tree | fa40c0c8df7549525123359bf817598ae7e9f43d /cgit.c | |
parent | e154edd8078020d6eba41b448afade0a68617f35 (diff) | |
download | cgit-93397a765b9d9af11b7d10c114406e303ea4fb1c.zip cgit-93397a765b9d9af11b7d10c114406e303ea4fb1c.tar.gz cgit-93397a765b9d9af11b7d10c114406e303ea4fb1c.tar.bz2 |
Add support for --scan-tree=<path> option to cgit
This option makes cgit scan a directory tree looking for git repositories,
generating suitable definitions for a cgitrc file on stdout.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | cgit.c | 47 |
1 files changed, 44 insertions, 3 deletions
@@ -9,12 +9,13 @@ | |||
9 | #include "cgit.h" | 9 | #include "cgit.h" |
10 | #include "cache.h" | 10 | #include "cache.h" |
11 | #include "cmd.h" | 11 | #include "cmd.h" |
12 | #include "configfile.h" | 12 | #include "configfile.h" |
13 | #include "html.h" | 13 | #include "html.h" |
14 | #include "ui-shared.h" | 14 | #include "ui-shared.h" |
15 | #include "scan-tree.h" | ||
15 | 16 | ||
16 | const char *cgit_version = CGIT_VERSION; | 17 | const char *cgit_version = CGIT_VERSION; |
17 | 18 | ||
18 | void config_cb(const char *name, const char *value) | 19 | void config_cb(const char *name, const char *value) |
19 | { | 20 | { |
20 | if (!strcmp(name, "root-title")) | 21 | if (!strcmp(name, "root-title")) |
@@ -317,15 +318,45 @@ static void process_request(void *cbdata) | |||
317 | cmd->fn(ctx); | 318 | cmd->fn(ctx); |
318 | 319 | ||
319 | if (cmd->want_layout) | 320 | if (cmd->want_layout) |
320 | cgit_print_docend(); | 321 | cgit_print_docend(); |
321 | } | 322 | } |
322 | 323 | ||
324 | int cmp_repos(const void *a, const void *b) | ||
325 | { | ||
326 | const struct cgit_repo *ra = a, *rb = b; | ||
327 | return strcmp(ra->url, rb->url); | ||
328 | } | ||
329 | |||
330 | void print_repo(struct cgit_repo *repo) | ||
331 | { | ||
332 | printf("repo.url=%s\n", repo->url); | ||
333 | printf("repo.name=%s\n", repo->name); | ||
334 | printf("repo.path=%s\n", repo->path); | ||
335 | if (repo->owner) | ||
336 | printf("repo.owner=%s\n", repo->owner); | ||
337 | if (repo->desc) | ||
338 | printf("repo.desc=%s\n", repo->desc); | ||
339 | if (repo->readme) | ||
340 | printf("repo.readme=%s\n", repo->readme); | ||
341 | printf("\n"); | ||
342 | } | ||
343 | |||
344 | void print_repolist(struct cgit_repolist *list) | ||
345 | { | ||
346 | int i; | ||
347 | |||
348 | for(i = 0; i < list->count; i++) | ||
349 | print_repo(&list->repos[i]); | ||
350 | } | ||
351 | |||
352 | |||
323 | static void cgit_parse_args(int argc, const char **argv) | 353 | static void cgit_parse_args(int argc, const char **argv) |
324 | { | 354 | { |
325 | int i; | 355 | int i; |
356 | int scan = 0; | ||
326 | 357 | ||
327 | for (i = 1; i < argc; i++) { | 358 | for (i = 1; i < argc; i++) { |
328 | if (!strncmp(argv[i], "--cache=", 8)) { | 359 | if (!strncmp(argv[i], "--cache=", 8)) { |
329 | ctx.cfg.cache_root = xstrdup(argv[i]+8); | 360 | ctx.cfg.cache_root = xstrdup(argv[i]+8); |
330 | } | 361 | } |
331 | if (!strcmp(argv[i], "--nocache")) { | 362 | if (!strcmp(argv[i], "--nocache")) { |
@@ -348,12 +379,22 @@ static void cgit_parse_args(int argc, const char **argv) | |||
348 | ctx.qry.sha1 = xstrdup(argv[i]+7); | 379 | ctx.qry.sha1 = xstrdup(argv[i]+7); |
349 | ctx.qry.has_sha1 = 1; | 380 | ctx.qry.has_sha1 = 1; |
350 | } | 381 | } |
351 | if (!strncmp(argv[i], "--ofs=", 6)) { | 382 | if (!strncmp(argv[i], "--ofs=", 6)) { |
352 | ctx.qry.ofs = atoi(argv[i]+6); | 383 | ctx.qry.ofs = atoi(argv[i]+6); |
353 | } | 384 | } |
385 | if (!strncmp(argv[i], "--scan-tree=", 12)) { | ||
386 | scan++; | ||
387 | scan_tree(argv[i] + 12); | ||
388 | } | ||
389 | } | ||
390 | if (scan) { | ||
391 | qsort(cgit_repolist.repos, cgit_repolist.count, | ||
392 | sizeof(struct cgit_repo), cmp_repos); | ||
393 | print_repolist(&cgit_repolist); | ||
394 | exit(0); | ||
354 | } | 395 | } |
355 | } | 396 | } |
356 | 397 | ||
357 | static int calc_ttl() | 398 | static int calc_ttl() |
358 | { | 399 | { |
359 | if (!ctx.repo) | 400 | if (!ctx.repo) |
@@ -380,20 +421,20 @@ int main(int argc, const char **argv) | |||
380 | 421 | ||
381 | prepare_context(&ctx); | 422 | prepare_context(&ctx); |
382 | cgit_repolist.length = 0; | 423 | cgit_repolist.length = 0; |
383 | cgit_repolist.count = 0; | 424 | cgit_repolist.count = 0; |
384 | cgit_repolist.repos = NULL; | 425 | cgit_repolist.repos = NULL; |
385 | 426 | ||
386 | parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG, | ||
387 | config_cb); | ||
388 | ctx.repo = NULL; | ||
389 | if (getenv("SCRIPT_NAME")) | 427 | if (getenv("SCRIPT_NAME")) |
390 | ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); | 428 | ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); |
391 | if (getenv("QUERY_STRING")) | 429 | if (getenv("QUERY_STRING")) |
392 | ctx.qry.raw = xstrdup(getenv("QUERY_STRING")); | 430 | ctx.qry.raw = xstrdup(getenv("QUERY_STRING")); |
393 | cgit_parse_args(argc, argv); | 431 | cgit_parse_args(argc, argv); |
432 | parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG, | ||
433 | config_cb); | ||
434 | ctx.repo = NULL; | ||
394 | http_parse_querystring(ctx.qry.raw, querystring_cb); | 435 | http_parse_querystring(ctx.qry.raw, querystring_cb); |
395 | 436 | ||
396 | /* If virtual-root isn't specified in cgitrc and no url | 437 | /* If virtual-root isn't specified in cgitrc and no url |
397 | * parameter is specified on the querystring, lets pretend | 438 | * parameter is specified on the querystring, lets pretend |
398 | * that virtualroot equals SCRIPT_NAME and use PATH_INFO as | 439 | * that virtualroot equals SCRIPT_NAME and use PATH_INFO as |
399 | * url. This allows cgit to work with virtual urls without | 440 | * url. This allows cgit to work with virtual urls without |