diff options
| author | 2014-01-16 05:53:15 (JST) | |
|---|---|---|
| committer | 2014-01-17 08:44:54 (JST) | |
| commit | f60ffa143cca61e9729ac71033e1a556cf422871 (patch) | |
| tree | ff9122fef2779ddea8e37806cc66dc67b63df99f | |
| parent | a431326e8fab8153905fbde036dd3c9fb4cc8eaa (diff) | |
| download | cgit-f60ffa143cca61e9729ac71033e1a556cf422871.zip cgit-f60ffa143cca61e9729ac71033e1a556cf422871.tar.gz | |
Switch to exclusively using global ctx
Drop the context parameter from the following functions (and all static
helpers used by them) and use the global context instead:
* cgit_print_http_headers()
* cgit_print_docstart()
* cgit_print_pageheader()
Remove context parameter from all commands
Drop the context parameter from the following functions (and all static
helpers used by them) and use the global context instead:
* cgit_get_cmd()
* All cgit command functions.
* cgit_clone_info()
* cgit_clone_objects()
* cgit_clone_head()
* cgit_print_plain()
* cgit_show_stats()
In initialization routines, use the global context variable instead of
passing a pointer around locally.
Remove callback data parameter for cache slots
This is no longer needed since the context is always read from the
global context variable.
Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de>
| -rw-r--r-- | cache.c | 14 | ||||
| -rw-r--r-- | cache.h | 5 | ||||
| -rw-r--r-- | cgit.c | 322 | ||||
| -rw-r--r-- | cmd.c | 102 | ||||
| -rw-r--r-- | cmd.h | 4 | ||||
| -rw-r--r-- | ui-atom.c | 2 | ||||
| -rw-r--r-- | ui-blob.c | 2 | ||||
| -rw-r--r-- | ui-clone.c | 48 | ||||
| -rw-r--r-- | ui-clone.h | 6 | ||||
| -rw-r--r-- | ui-diff.c | 2 | ||||
| -rw-r--r-- | ui-patch.c | 2 | ||||
| -rw-r--r-- | ui-plain.c | 14 | ||||
| -rw-r--r-- | ui-plain.h | 2 | ||||
| -rw-r--r-- | ui-repolist.c | 6 | ||||
| -rw-r--r-- | ui-shared.c | 303 | ||||
| -rw-r--r-- | ui-shared.h | 6 | ||||
| -rw-r--r-- | ui-snapshot.c | 8 | ||||
| -rw-r--r-- | ui-stats.c | 29 | ||||
| -rw-r--r-- | ui-stats.h | 2 |
19 files changed, 437 insertions, 442 deletions
| @@ -24,7 +24,6 @@ struct cache_slot { | |||
| 24 | int keylen; | 24 | int keylen; |
| 25 | int ttl; | 25 | int ttl; |
| 26 | cache_fill_fn fn; | 26 | cache_fill_fn fn; |
| 27 | void *cbdata; | ||
| 28 | int cache_fd; | 27 | int cache_fd; |
| 29 | int lock_fd; | 28 | int lock_fd; |
| 30 | const char *cache_name; | 29 | const char *cache_name; |
| @@ -187,7 +186,7 @@ static int fill_slot(struct cache_slot *slot) | |||
| 187 | return errno; | 186 | return errno; |
| 188 | 187 | ||
| 189 | /* Generate cache content */ | 188 | /* Generate cache content */ |
| 190 | slot->fn(slot->cbdata); | 189 | slot->fn(); |
| 191 | 190 | ||
| 192 | /* Restore stdout */ | 191 | /* Restore stdout */ |
| 193 | if (dup2(tmp, STDOUT_FILENO) == -1) | 192 | if (dup2(tmp, STDOUT_FILENO) == -1) |
| @@ -277,7 +276,7 @@ static int process_slot(struct cache_slot *slot) | |||
| 277 | if ((err = lock_slot(slot)) != 0) { | 276 | if ((err = lock_slot(slot)) != 0) { |
| 278 | cache_log("[cgit] Unable to lock slot %s: %s (%d)\n", | 277 | cache_log("[cgit] Unable to lock slot %s: %s (%d)\n", |
| 279 | slot->lock_name, strerror(err), err); | 278 | slot->lock_name, strerror(err), err); |
| 280 | slot->fn(slot->cbdata); | 279 | slot->fn(); |
| 281 | return 0; | 280 | return 0; |
| 282 | } | 281 | } |
| 283 | 282 | ||
| @@ -286,7 +285,7 @@ static int process_slot(struct cache_slot *slot) | |||
| 286 | slot->lock_name, strerror(err), err); | 285 | slot->lock_name, strerror(err), err); |
| 287 | unlock_slot(slot, 0); | 286 | unlock_slot(slot, 0); |
| 288 | close_lock(slot); | 287 | close_lock(slot); |
| 289 | slot->fn(slot->cbdata); | 288 | slot->fn(); |
| 290 | return 0; | 289 | return 0; |
| 291 | } | 290 | } |
| 292 | // We've got a valid cache slot in the lock file, which | 291 | // We've got a valid cache slot in the lock file, which |
| @@ -310,7 +309,7 @@ static int process_slot(struct cache_slot *slot) | |||
| 310 | 309 | ||
| 311 | /* Print cached content to stdout, generate the content if necessary. */ | 310 | /* Print cached content to stdout, generate the content if necessary. */ |
| 312 | int cache_process(int size, const char *path, const char *key, int ttl, | 311 | int cache_process(int size, const char *path, const char *key, int ttl, |
| 313 | cache_fill_fn fn, void *cbdata) | 312 | cache_fill_fn fn) |
| 314 | { | 313 | { |
| 315 | unsigned long hash; | 314 | unsigned long hash; |
| 316 | int i; | 315 | int i; |
| @@ -321,14 +320,14 @@ int cache_process(int size, const char *path, const char *key, int ttl, | |||
| 321 | 320 | ||
| 322 | /* If the cache is disabled, just generate the content */ | 321 | /* If the cache is disabled, just generate the content */ |
| 323 | if (size <= 0) { | 322 | if (size <= 0) { |
| 324 | fn(cbdata); | 323 | fn(); |
| 325 | return 0; | 324 | return 0; |
| 326 | } | 325 | } |
| 327 | 326 | ||
| 328 | /* Verify input, calculate filenames */ | 327 | /* Verify input, calculate filenames */ |
| 329 | if (!path) { | 328 | if (!path) { |
| 330 | cache_log("[cgit] Cache path not specified, caching is disabled\n"); | 329 | cache_log("[cgit] Cache path not specified, caching is disabled\n"); |
| 331 | fn(cbdata); | 330 | fn(); |
| 332 | return 0; | 331 | return 0; |
| 333 | } | 332 | } |
| 334 | if (!key) | 333 | if (!key) |
| @@ -343,7 +342,6 @@ int cache_process(int size, const char *path, const char *key, int ttl, | |||
| 343 | strbuf_addbuf(&lockname, &filename); | 342 | strbuf_addbuf(&lockname, &filename); |
| 344 | strbuf_addstr(&lockname, ".lock"); | 343 | strbuf_addstr(&lockname, ".lock"); |
| 345 | slot.fn = fn; | 344 | slot.fn = fn; |
| 346 | slot.cbdata = cbdata; | ||
| 347 | slot.ttl = ttl; | 345 | slot.ttl = ttl; |
| 348 | slot.cache_name = filename.buf; | 346 | slot.cache_name = filename.buf; |
| 349 | slot.lock_name = lockname.buf; | 347 | slot.lock_name = lockname.buf; |
| @@ -6,7 +6,7 @@ | |||
| 6 | #ifndef CGIT_CACHE_H | 6 | #ifndef CGIT_CACHE_H |
| 7 | #define CGIT_CACHE_H | 7 | #define CGIT_CACHE_H |
| 8 | 8 | ||
| 9 | typedef void (*cache_fill_fn)(void *cbdata); | 9 | typedef void (*cache_fill_fn)(void); |
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | /* Print cached content to stdout, generate the content if necessary. | 12 | /* Print cached content to stdout, generate the content if necessary. |
| @@ -17,13 +17,12 @@ typedef void (*cache_fill_fn)(void *cbdata); | |||
| 17 | * key the key used to lookup cache files | 17 | * key the key used to lookup cache files |
| 18 | * ttl max cache time in seconds for this key | 18 | * ttl max cache time in seconds for this key |
| 19 | * fn content generator function for this key | 19 | * fn content generator function for this key |
| 20 | * cbdata user-supplied data to the content generator function | ||
| 21 | * | 20 | * |
| 22 | * Return value | 21 | * Return value |
| 23 | * 0 indicates success, everyting else is an error | 22 | * 0 indicates success, everyting else is an error |
| 24 | */ | 23 | */ |
| 25 | extern int cache_process(int size, const char *path, const char *key, int ttl, | 24 | extern int cache_process(int size, const char *path, const char *key, int ttl, |
| 26 | cache_fill_fn fn, void *cbdata); | 25 | cache_fill_fn fn); |
| 27 | 26 | ||
| 28 | 27 | ||
| 29 | /* List info about all cache entries on stdout */ | 28 | /* List info about all cache entries on stdout */ |
| @@ -322,82 +322,82 @@ static void querystring_cb(const char *name, const char *value) | |||
| 322 | } | 322 | } |
| 323 | } | 323 | } |
| 324 | 324 | ||
| 325 | static void prepare_context(struct cgit_context *ctx) | 325 | static void prepare_context(void) |
| 326 | { | 326 | { |
| 327 | memset(ctx, 0, sizeof(*ctx)); | 327 | memset(&ctx, 0, sizeof(ctx)); |
| 328 | ctx->cfg.agefile = "info/web/last-modified"; | 328 | ctx.cfg.agefile = "info/web/last-modified"; |
| 329 | ctx->cfg.nocache = 0; | 329 | ctx.cfg.nocache = 0; |
| 330 | ctx->cfg.cache_size = 0; | 330 | ctx.cfg.cache_size = 0; |
| 331 | ctx->cfg.cache_max_create_time = 5; | 331 | ctx.cfg.cache_max_create_time = 5; |
| 332 | ctx->cfg.cache_root = CGIT_CACHE_ROOT; | 332 | ctx.cfg.cache_root = CGIT_CACHE_ROOT; |
| 333 | ctx->cfg.cache_about_ttl = 15; | 333 | ctx.cfg.cache_about_ttl = 15; |
| 334 | ctx->cfg.cache_repo_ttl = 5; | 334 | ctx.cfg.cache_repo_ttl = 5; |
| 335 | ctx->cfg.cache_root_ttl = 5; | 335 | ctx.cfg.cache_root_ttl = 5; |
| 336 | ctx->cfg.cache_scanrc_ttl = 15; | 336 | ctx.cfg.cache_scanrc_ttl = 15; |
| 337 | ctx->cfg.cache_dynamic_ttl = 5; | 337 | ctx.cfg.cache_dynamic_ttl = 5; |
| 338 | ctx->cfg.cache_static_ttl = -1; | 338 | ctx.cfg.cache_static_ttl = -1; |
| 339 | ctx->cfg.case_sensitive_sort = 1; | 339 | ctx.cfg.case_sensitive_sort = 1; |
| 340 | ctx->cfg.branch_sort = 0; | 340 | ctx.cfg.branch_sort = 0; |
| 341 | ctx->cfg.commit_sort = 0; | 341 | ctx.cfg.commit_sort = 0; |
| 342 | ctx->cfg.css = "/cgit.css"; | 342 | ctx.cfg.css = "/cgit.css"; |
| 343 | ctx->cfg.logo = "/cgit.png"; | 343 | ctx.cfg.logo = "/cgit.png"; |
| 344 | ctx->cfg.favicon = "/favicon.ico"; | 344 | ctx.cfg.favicon = "/favicon.ico"; |
| 345 | ctx->cfg.local_time = 0; | 345 | ctx.cfg.local_time = 0; |
| 346 | ctx->cfg.enable_http_clone = 1; | 346 | ctx.cfg.enable_http_clone = 1; |
| 347 | ctx->cfg.enable_index_owner = 1; | 347 | ctx.cfg.enable_index_owner = 1; |
| 348 | ctx->cfg.enable_tree_linenumbers = 1; | 348 | ctx.cfg.enable_tree_linenumbers = 1; |
| 349 | ctx->cfg.enable_git_config = 0; | 349 | ctx.cfg.enable_git_config = 0; |
| 350 | ctx->cfg.max_repo_count = 50; | 350 | ctx.cfg.max_repo_count = 50; |
| 351 | ctx->cfg.max_commit_count = 50; | 351 | ctx.cfg.max_commit_count = 50; |
| 352 | ctx->cfg.max_lock_attempts = 5; | 352 | ctx.cfg.max_lock_attempts = 5; |
| 353 | ctx->cfg.max_msg_len = 80; | 353 | ctx.cfg.max_msg_len = 80; |
| 354 | ctx->cfg.max_repodesc_len = 80; | 354 | ctx.cfg.max_repodesc_len = 80; |
| 355 | ctx->cfg.max_blob_size = 0; | 355 | ctx.cfg.max_blob_size = 0; |
| 356 | ctx->cfg.max_stats = 0; | 356 | ctx.cfg.max_stats = 0; |
| 357 | ctx->cfg.project_list = NULL; | 357 | ctx.cfg.project_list = NULL; |
| 358 | ctx->cfg.renamelimit = -1; | 358 | ctx.cfg.renamelimit = -1; |
| 359 | ctx->cfg.remove_suffix = 0; | 359 | ctx.cfg.remove_suffix = 0; |
| 360 | ctx->cfg.robots = "index, nofollow"; | 360 | ctx.cfg.robots = "index, nofollow"; |
| 361 | ctx->cfg.root_title = "Git repository browser"; | 361 | ctx.cfg.root_title = "Git repository browser"; |
| 362 | ctx->cfg.root_desc = "a fast webinterface for the git dscm"; | 362 | ctx.cfg.root_desc = "a fast webinterface for the git dscm"; |
| 363 | ctx->cfg.scan_hidden_path = 0; | 363 | ctx.cfg.scan_hidden_path = 0; |
| 364 | ctx->cfg.script_name = CGIT_SCRIPT_NAME; | 364 | ctx.cfg.script_name = CGIT_SCRIPT_NAME; |
| 365 | ctx->cfg.section = ""; | 365 | ctx.cfg.section = ""; |
| 366 | ctx->cfg.repository_sort = "name"; | 366 | ctx.cfg.repository_sort = "name"; |
| 367 | ctx->cfg.section_sort = 1; | 367 | ctx.cfg.section_sort = 1; |
| 368 | ctx->cfg.summary_branches = 10; | 368 | ctx.cfg.summary_branches = 10; |
| 369 | ctx->cfg.summary_log = 10; | 369 | ctx.cfg.summary_log = 10; |
| 370 | ctx->cfg.summary_tags = 10; | 370 | ctx.cfg.summary_tags = 10; |
| 371 | ctx->cfg.max_atom_items = 10; | 371 | ctx.cfg.max_atom_items = 10; |
| 372 | ctx->cfg.ssdiff = 0; | 372 | ctx.cfg.ssdiff = 0; |
| 373 | ctx->env.cgit_config = getenv("CGIT_CONFIG"); | 373 | ctx.env.cgit_config = getenv("CGIT_CONFIG"); |
| 374 | ctx->env.http_host = getenv("HTTP_HOST"); | 374 | ctx.env.http_host = getenv("HTTP_HOST"); |
| 375 | ctx->env.https = getenv("HTTPS"); | 375 | ctx.env.https = getenv("HTTPS"); |
| 376 | ctx->env.no_http = getenv("NO_HTTP"); | 376 | ctx.env.no_http = getenv("NO_HTTP"); |
| 377 | ctx->env.path_info = getenv("PATH_INFO"); | 377 | ctx.env.path_info = getenv("PATH_INFO"); |
| 378 | ctx->env.query_string = getenv("QUERY_STRING"); | 378 | ctx.env.query_string = getenv("QUERY_STRING"); |
| 379 | ctx->env.request_method = getenv("REQUEST_METHOD"); | 379 | ctx.env.request_method = getenv("REQUEST_METHOD"); |
| 380 | ctx->env.script_name = getenv("SCRIPT_NAME"); | 380 | ctx.env.script_name = getenv("SCRIPT_NAME"); |
| 381 | ctx->env.server_name = getenv("SERVER_NAME"); | 381 | ctx.env.server_name = getenv("SERVER_NAME"); |
| 382 | ctx->env.server_port = getenv("SERVER_PORT"); | 382 | ctx.env.server_port = getenv("SERVER_PORT"); |
| 383 | ctx->env.http_cookie = getenv("HTTP_COOKIE"); | 383 | ctx.env.http_cookie = getenv("HTTP_COOKIE"); |
| 384 | ctx->env.http_referer = getenv("HTTP_REFERER"); | 384 | ctx.env.http_referer = getenv("HTTP_REFERER"); |
| 385 | ctx->env.content_length = getenv("CONTENT_LENGTH") ? strtoul(getenv("CONTENT_LENGTH"), NULL, 10) : 0; | 385 | ctx.env.content_length = getenv("CONTENT_LENGTH") ? strtoul(getenv("CONTENT_LENGTH"), NULL, 10) : 0; |
| 386 | ctx->env.authenticated = 0; | 386 | ctx.env.authenticated = 0; |
| 387 | ctx->page.mimetype = "text/html"; | 387 | ctx.page.mimetype = "text/html"; |
| 388 | ctx->page.charset = PAGE_ENCODING; | 388 | ctx.page.charset = PAGE_ENCODING; |
| 389 | ctx->page.filename = NULL; | 389 | ctx.page.filename = NULL; |
| 390 | ctx->page.size = 0; | 390 | ctx.page.size = 0; |
| 391 | ctx->page.modified = time(NULL); | 391 | ctx.page.modified = time(NULL); |
| 392 | ctx->page.expires = ctx->page.modified; | 392 | ctx.page.expires = ctx.page.modified; |
| 393 | ctx->page.etag = NULL; | 393 | ctx.page.etag = NULL; |
| 394 | memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list)); | 394 | memset(&ctx.cfg.mimetypes, 0, sizeof(struct string_list)); |
| 395 | if (ctx->env.script_name) | 395 | if (ctx.env.script_name) |
| 396 | ctx->cfg.script_name = xstrdup(ctx->env.script_name); | 396 | ctx.cfg.script_name = xstrdup(ctx.env.script_name); |
| 397 | if (ctx->env.query_string) | 397 | if (ctx.env.query_string) |
| 398 | ctx->qry.raw = xstrdup(ctx->env.query_string); | 398 | ctx.qry.raw = xstrdup(ctx.env.query_string); |
| 399 | if (!ctx->env.cgit_config) | 399 | if (!ctx.env.cgit_config) |
| 400 | ctx->env.cgit_config = CGIT_CONFIG; | 400 | ctx.env.cgit_config = CGIT_CONFIG; |
| 401 | } | 401 | } |
| 402 | 402 | ||
| 403 | struct refmatch { | 403 | struct refmatch { |
| @@ -527,14 +527,14 @@ static void choose_readme(struct cgit_repo *repo) | |||
| 527 | string_list_append(&repo->readme, filename)->util = ref; | 527 | string_list_append(&repo->readme, filename)->util = ref; |
| 528 | } | 528 | } |
| 529 | 529 | ||
| 530 | static int prepare_repo_cmd(struct cgit_context *ctx) | 530 | static int prepare_repo_cmd(void) |
| 531 | { | 531 | { |
| 532 | unsigned char sha1[20]; | 532 | unsigned char sha1[20]; |
| 533 | int nongit = 0; | 533 | int nongit = 0; |
| 534 | int rc; | 534 | int rc; |
| 535 | 535 | ||
| 536 | /* The path to the git repository. */ | 536 | /* The path to the git repository. */ |
| 537 | setenv("GIT_DIR", ctx->repo->path, 1); | 537 | setenv("GIT_DIR", ctx.repo->path, 1); |
| 538 | 538 | ||
| 539 | /* Do not look in /etc/ for gitconfig and gitattributes. */ | 539 | /* Do not look in /etc/ for gitconfig and gitattributes. */ |
| 540 | setenv("GIT_CONFIG_NOSYSTEM", "1", 1); | 540 | setenv("GIT_CONFIG_NOSYSTEM", "1", 1); |
| @@ -549,69 +549,69 @@ static int prepare_repo_cmd(struct cgit_context *ctx) | |||
| 549 | init_display_notes(NULL); | 549 | init_display_notes(NULL); |
| 550 | 550 | ||
| 551 | if (nongit) { | 551 | if (nongit) { |
| 552 | const char *name = ctx->repo->name; | 552 | const char *name = ctx.repo->name; |
| 553 | rc = errno; | 553 | rc = errno; |
| 554 | ctx->page.title = fmtalloc("%s - %s", ctx->cfg.root_title, | 554 | ctx.page.title = fmtalloc("%s - %s", ctx.cfg.root_title, |
| 555 | "config error"); | 555 | "config error"); |
| 556 | ctx->repo = NULL; | 556 | ctx.repo = NULL; |
| 557 | cgit_print_http_headers(ctx); | 557 | cgit_print_http_headers(); |
| 558 | cgit_print_docstart(ctx); | 558 | cgit_print_docstart(); |
| 559 | cgit_print_pageheader(ctx); | 559 | cgit_print_pageheader(); |
| 560 | cgit_print_error("Failed to open %s: %s", name, | 560 | cgit_print_error("Failed to open %s: %s", name, |
| 561 | rc ? strerror(rc) : "Not a valid git repository"); | 561 | rc ? strerror(rc) : "Not a valid git repository"); |
| 562 | cgit_print_docend(); | 562 | cgit_print_docend(); |
| 563 | return 1; | 563 | return 1; |
| 564 | } | 564 | } |
| 565 | ctx->page.title = fmtalloc("%s - %s", ctx->repo->name, ctx->repo->desc); | 565 | ctx.page.title = fmtalloc("%s - %s", ctx.repo->name, ctx.repo->desc); |
| 566 | 566 | ||
| 567 | if (!ctx->repo->defbranch) | 567 | if (!ctx.repo->defbranch) |
| 568 | ctx->repo->defbranch = guess_defbranch(); | 568 | ctx.repo->defbranch = guess_defbranch(); |
| 569 | 569 | ||
| 570 | if (!ctx->qry.head) { | 570 | if (!ctx.qry.head) { |
| 571 | ctx->qry.nohead = 1; | 571 | ctx.qry.nohead = 1; |
| 572 | ctx->qry.head = find_default_branch(ctx->repo); | 572 | ctx.qry.head = find_default_branch(ctx.repo); |
| 573 | } | 573 | } |
| 574 | 574 | ||
| 575 | if (!ctx->qry.head) { | 575 | if (!ctx.qry.head) { |
| 576 | cgit_print_http_headers(ctx); | 576 | cgit_print_http_headers(); |
| 577 | cgit_print_docstart(ctx); | 577 | cgit_print_docstart(); |
| 578 | cgit_print_pageheader(ctx); | 578 | cgit_print_pageheader(); |
| 579 | cgit_print_error("Repository seems to be empty"); | 579 | cgit_print_error("Repository seems to be empty"); |
| 580 | cgit_print_docend(); | 580 | cgit_print_docend(); |
| 581 | return 1; | 581 | return 1; |
| 582 | } | 582 | } |
| 583 | 583 | ||
| 584 | if (get_sha1(ctx->qry.head, sha1)) { | 584 | if (get_sha1(ctx.qry.head, sha1)) { |
| 585 | char *tmp = xstrdup(ctx->qry.head); | 585 | char *tmp = xstrdup(ctx.qry.head); |
| 586 | ctx->qry.head = ctx->repo->defbranch; | 586 | ctx.qry.head = ctx.repo->defbranch; |
| 587 | ctx->page.status = 404; | 587 | ctx.page.status = 404; |
| 588 | ctx->page.statusmsg = "Not found"; | 588 | ctx.page.statusmsg = "Not found"; |
| 589 | cgit_print_http_headers(ctx); | 589 | cgit_print_http_headers(); |
| 590 | cgit_print_docstart(ctx); | 590 | cgit_print_docstart(); |
| 591 | cgit_print_pageheader(ctx); | 591 | cgit_print_pageheader(); |
| 592 | cgit_print_error("Invalid branch: %s", tmp); | 592 | cgit_print_error("Invalid branch: %s", tmp); |
| 593 | cgit_print_docend(); | 593 | cgit_print_docend(); |
| 594 | return 1; | 594 | return 1; |
| 595 | } | 595 | } |
| 596 | sort_string_list(&ctx->repo->submodules); | 596 | sort_string_list(&ctx.repo->submodules); |
| 597 | cgit_prepare_repo_env(ctx->repo); | 597 | cgit_prepare_repo_env(ctx.repo); |
| 598 | choose_readme(ctx->repo); | 598 | choose_readme(ctx.repo); |
| 599 | return 0; | 599 | return 0; |
| 600 | } | 600 | } |
| 601 | 601 | ||
| 602 | static inline void open_auth_filter(struct cgit_context *ctx, const char *function) | 602 | static inline void open_auth_filter(const char *function) |
| 603 | { | 603 | { |
| 604 | cgit_open_filter(ctx->cfg.auth_filter, function, | 604 | cgit_open_filter(ctx.cfg.auth_filter, function, |
| 605 | ctx->env.http_cookie ? ctx->env.http_cookie : "", | 605 | ctx.env.http_cookie ? ctx.env.http_cookie : "", |
| 606 | ctx->env.request_method ? ctx->env.request_method : "", | 606 | ctx.env.request_method ? ctx.env.request_method : "", |
| 607 | ctx->env.query_string ? ctx->env.query_string : "", | 607 | ctx.env.query_string ? ctx.env.query_string : "", |
| 608 | ctx->env.http_referer ? ctx->env.http_referer : "", | 608 | ctx.env.http_referer ? ctx.env.http_referer : "", |
| 609 | ctx->env.path_info ? ctx->env.path_info : "", | 609 | ctx.env.path_info ? ctx.env.path_info : "", |
| 610 | ctx->env.http_host ? ctx->env.http_host : "", | 610 | ctx.env.http_host ? ctx.env.http_host : "", |
| 611 | ctx->env.https ? ctx->env.https : "", | 611 | ctx.env.https ? ctx.env.https : "", |
| 612 | ctx->qry.repo ? ctx->qry.repo : "", | 612 | ctx.qry.repo ? ctx.qry.repo : "", |
| 613 | ctx->qry.page ? ctx->qry.page : "", | 613 | ctx.qry.page ? ctx.qry.page : "", |
| 614 | ctx->qry.url ? ctx->qry.url : "", | 614 | ctx.qry.url ? ctx.qry.url : "", |
| 615 | cgit_loginurl()); | 615 | cgit_loginurl()); |
| 616 | } | 616 | } |
| 617 | 617 | ||
| @@ -622,107 +622,106 @@ static inline void open_auth_filter(struct cgit_context *ctx, const char *functi | |||
| 622 | * will complain on the mailing list, and we'll increase it as needed. */ | 622 | * will complain on the mailing list, and we'll increase it as needed. */ |
| 623 | #define MAX_AUTHENTICATION_POST_BYTES 4096 | 623 | #define MAX_AUTHENTICATION_POST_BYTES 4096 |
| 624 | /* The filter is expected to spit out "Status: " and all headers. */ | 624 | /* The filter is expected to spit out "Status: " and all headers. */ |
| 625 | static inline void authenticate_post(struct cgit_context *ctx) | 625 | static inline void authenticate_post(void) |
| 626 | { | 626 | { |
| 627 | char buffer[MAX_AUTHENTICATION_POST_BYTES]; | 627 | char buffer[MAX_AUTHENTICATION_POST_BYTES]; |
| 628 | int len; | 628 | int len; |
| 629 | 629 | ||
| 630 | open_auth_filter(ctx, "authenticate-post"); | 630 | open_auth_filter("authenticate-post"); |
| 631 | len = ctx->env.content_length; | 631 | len = ctx.env.content_length; |
| 632 | if (len > MAX_AUTHENTICATION_POST_BYTES) | 632 | if (len > MAX_AUTHENTICATION_POST_BYTES) |
| 633 | len = MAX_AUTHENTICATION_POST_BYTES; | 633 | len = MAX_AUTHENTICATION_POST_BYTES; |
| 634 | if (read(STDIN_FILENO, buffer, len) < 0) | 634 | if (read(STDIN_FILENO, buffer, len) < 0) |
| 635 | die_errno("Could not read POST from stdin"); | 635 | die_errno("Could not read POST from stdin"); |
| 636 | if (write(STDOUT_FILENO, buffer, len) < 0) | 636 | if (write(STDOUT_FILENO, buffer, len) < 0) |
| 637 | die_errno("Could not write POST to stdout"); | 637 | die_errno("Could not write POST to stdout"); |
| 638 | cgit_close_filter(ctx->cfg.auth_filter); | 638 | cgit_close_filter(ctx.cfg.auth_filter); |
| 639 | exit(0); | 639 | exit(0); |
| 640 | } | 640 | } |
| 641 | 641 | ||
| 642 | static inline void authenticate_cookie(struct cgit_context *ctx) | 642 | static inline void authenticate_cookie(void) |
| 643 | { | 643 | { |
| 644 | /* If we don't have an auth_filter, consider all cookies valid, and thus return early. */ | 644 | /* If we don't have an auth_filter, consider all cookies valid, and thus return early. */ |
| 645 | if (!ctx->cfg.auth_filter) { | 645 | if (!ctx.cfg.auth_filter) { |
| 646 | ctx->env.authenticated = 1; | 646 | ctx.env.authenticated = 1; |
| 647 | return; | 647 | return; |
| 648 | } | 648 | } |
| 649 | 649 | ||
| 650 | /* If we're having something POST'd to /login, we're authenticating POST, | 650 | /* If we're having something POST'd to /login, we're authenticating POST, |
| 651 | * instead of the cookie, so call authenticate_post and bail out early. | 651 | * instead of the cookie, so call authenticate_post and bail out early. |
| 652 | * This pattern here should match /?p=login with POST. */ | 652 | * This pattern here should match /?p=login with POST. */ |
| 653 | if (ctx->env.request_method && ctx->qry.page && !ctx->repo && \ | 653 | if (ctx.env.request_method && ctx.qry.page && !ctx.repo && \ |
| 654 | !strcmp(ctx->env.request_method, "POST") && !strcmp(ctx->qry.page, "login")) { | 654 | !strcmp(ctx.env.request_method, "POST") && !strcmp(ctx.qry.page, "login")) { |
| 655 | authenticate_post(ctx); | 655 | authenticate_post(); |
| 656 | return; | 656 | return; |
| 657 | } | 657 | } |
| 658 | 658 | ||
| 659 | /* If we've made it this far, we're authenticating the cookie for real, so do that. */ | 659 | /* If we've made it this far, we're authenticating the cookie for real, so do that. */ |
| 660 | open_auth_filter(ctx, "authenticate-cookie"); | 660 | open_auth_filter("authenticate-cookie"); |
| 661 | ctx->env.authenticated = cgit_close_filter(ctx->cfg.auth_filter); | 661 | ctx.env.authenticated = cgit_close_filter(ctx.cfg.auth_filter); |
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | static void process_request(void *cbdata) | 664 | static void process_request(void) |
| 665 | { | 665 | { |
| 666 | struct cgit_context *ctx = cbdata; | ||
| 667 | struct cgit_cmd *cmd; | 666 | struct cgit_cmd *cmd; |
| 668 | 667 | ||
| 669 | /* If we're not yet authenticated, no matter what page we're on, | 668 | /* If we're not yet authenticated, no matter what page we're on, |
| 670 | * display the authentication body from the auth_filter. This should | 669 | * display the authentication body from the auth_filter. This should |
| 671 | * never be cached. */ | 670 | * never be cached. */ |
| 672 | if (!ctx->env.authenticated) { | 671 | if (!ctx.env.authenticated) { |
| 673 | ctx->page.title = "Authentication Required"; | 672 | ctx.page.title = "Authentication Required"; |
| 674 | cgit_print_http_headers(ctx); | 673 | cgit_print_http_headers(); |
| 675 | cgit_print_docstart(ctx); | 674 | cgit_print_docstart(); |
| 676 | cgit_print_pageheader(ctx); | 675 | cgit_print_pageheader(); |
| 677 | open_auth_filter(ctx, "body"); | 676 | open_auth_filter("body"); |
| 678 | cgit_close_filter(ctx->cfg.auth_filter); | 677 | cgit_close_filter(ctx.cfg.auth_filter); |
| 679 | cgit_print_docend(); | 678 | cgit_print_docend(); |
| 680 | return; | 679 | return; |
| 681 | } | 680 | } |
| 682 | 681 | ||
| 683 | cmd = cgit_get_cmd(ctx); | 682 | cmd = cgit_get_cmd(); |
| 684 | if (!cmd) { | 683 | if (!cmd) { |
| 685 | ctx->page.title = "cgit error"; | 684 | ctx.page.title = "cgit error"; |
| 686 | ctx->page.status = 404; | 685 | ctx.page.status = 404; |
| 687 | ctx->page.statusmsg = "Not found"; | 686 | ctx.page.statusmsg = "Not found"; |
| 688 | cgit_print_http_headers(ctx); | 687 | cgit_print_http_headers(); |
| 689 | cgit_print_docstart(ctx); | 688 | cgit_print_docstart(); |
| 690 | cgit_print_pageheader(ctx); | 689 | cgit_print_pageheader(); |
| 691 | cgit_print_error("Invalid request"); | 690 | cgit_print_error("Invalid request"); |
| 692 | cgit_print_docend(); | 691 | cgit_print_docend(); |
| 693 | return; | 692 | return; |
| 694 | } | 693 | } |
| 695 | 694 | ||
| 696 | if (!ctx->cfg.enable_http_clone && cmd->is_clone) { | 695 | if (!ctx.cfg.enable_http_clone && cmd->is_clone) { |
| 697 | html_status(404, "Not found", 0); | 696 | html_status(404, "Not found", 0); |
| 698 | return; | 697 | return; |
| 699 | } | 698 | } |
| 700 | 699 | ||
| 701 | /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual" | 700 | /* If cmd->want_vpath is set, assume ctx.qry.path contains a "virtual" |
| 702 | * in-project path limit to be made available at ctx->qry.vpath. | 701 | * in-project path limit to be made available at ctx.qry.vpath. |
| 703 | * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL). | 702 | * Otherwise, no path limit is in effect (ctx.qry.vpath = NULL). |
| 704 | */ | 703 | */ |
| 705 | ctx->qry.vpath = cmd->want_vpath ? ctx->qry.path : NULL; | 704 | ctx.qry.vpath = cmd->want_vpath ? ctx.qry.path : NULL; |
| 706 | 705 | ||
| 707 | if (cmd->want_repo && !ctx->repo) { | 706 | if (cmd->want_repo && !ctx.repo) { |
| 708 | cgit_print_http_headers(ctx); | 707 | cgit_print_http_headers(); |
| 709 | cgit_print_docstart(ctx); | 708 | cgit_print_docstart(); |
| 710 | cgit_print_pageheader(ctx); | 709 | cgit_print_pageheader(); |
| 711 | cgit_print_error("No repository selected"); | 710 | cgit_print_error("No repository selected"); |
| 712 | cgit_print_docend(); | 711 | cgit_print_docend(); |
| 713 | return; | 712 | return; |
| 714 | } | 713 | } |
| 715 | 714 | ||
| 716 | if (ctx->repo && prepare_repo_cmd(ctx)) | 715 | if (ctx.repo && prepare_repo_cmd()) |
| 717 | return; | 716 | return; |
| 718 | 717 | ||
| 719 | if (cmd->want_layout) { | 718 | if (cmd->want_layout) { |
| 720 | cgit_print_http_headers(ctx); | 719 | cgit_print_http_headers(); |
| 721 | cgit_print_docstart(ctx); | 720 | cgit_print_docstart(); |
| 722 | cgit_print_pageheader(ctx); | 721 | cgit_print_pageheader(); |
| 723 | } | 722 | } |
| 724 | 723 | ||
| 725 | cmd->fn(ctx); | 724 | cmd->fn(); |
| 726 | 725 | ||
| 727 | if (cmd->want_layout) | 726 | if (cmd->want_layout) |
| 728 | cgit_print_docend(); | 727 | cgit_print_docend(); |
| @@ -995,7 +994,7 @@ int main(int argc, const char **argv) | |||
| 995 | cgit_init_filters(); | 994 | cgit_init_filters(); |
| 996 | atexit(cgit_cleanup_filters); | 995 | atexit(cgit_cleanup_filters); |
| 997 | 996 | ||
| 998 | prepare_context(&ctx); | 997 | prepare_context(); |
| 999 | cgit_repolist.length = 0; | 998 | cgit_repolist.length = 0; |
| 1000 | cgit_repolist.count = 0; | 999 | cgit_repolist.count = 0; |
| 1001 | cgit_repolist.repos = NULL; | 1000 | cgit_repolist.repos = NULL; |
| @@ -1034,7 +1033,7 @@ int main(int argc, const char **argv) | |||
| 1034 | /* Before we go any further, we set ctx.env.authenticated by checking to see | 1033 | /* Before we go any further, we set ctx.env.authenticated by checking to see |
| 1035 | * if the supplied cookie is valid. All cookies are valid if there is no | 1034 | * if the supplied cookie is valid. All cookies are valid if there is no |
| 1036 | * auth_filter. If there is an auth_filter, the filter decides. */ | 1035 | * auth_filter. If there is an auth_filter, the filter decides. */ |
| 1037 | authenticate_cookie(&ctx); | 1036 | authenticate_cookie(); |
| 1038 | 1037 | ||
| 1039 | ttl = calc_ttl(); | 1038 | ttl = calc_ttl(); |
| 1040 | if (ttl < 0) | 1039 | if (ttl < 0) |
| @@ -1046,7 +1045,8 @@ int main(int argc, const char **argv) | |||
| 1046 | if (ctx.cfg.nocache) | 1045 | if (ctx.cfg.nocache) |
| 1047 | ctx.cfg.cache_size = 0; | 1046 | ctx.cfg.cache_size = 0; |
| 1048 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, | 1047 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, |
| 1049 | ctx.qry.raw, ttl, process_request, &ctx); | 1048 | ctx.qry.raw, ttl, process_request); |
| 1049 | cgit_cleanup_filters(); | ||
| 1050 | if (err) | 1050 | if (err) |
| 1051 | cgit_print_error("Error processing page: %s (%d)", | 1051 | cgit_print_error("Error processing page: %s (%d)", |
| 1052 | strerror(err), err); | 1052 | strerror(err), err); |
| @@ -26,120 +26,120 @@ | |||
| 26 | #include "ui-tag.h" | 26 | #include "ui-tag.h" |
| 27 | #include "ui-tree.h" | 27 | #include "ui-tree.h" |
| 28 | 28 | ||
| 29 | static void HEAD_fn(struct cgit_context *ctx) | 29 | static void HEAD_fn(void) |
| 30 | { | 30 | { |
| 31 | cgit_clone_head(ctx); | 31 | cgit_clone_head(); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | static void atom_fn(struct cgit_context *ctx) | 34 | static void atom_fn(void) |
| 35 | { | 35 | { |
| 36 | cgit_print_atom(ctx->qry.head, ctx->qry.path, ctx->cfg.max_atom_items); | 36 | cgit_print_atom(ctx.qry.head, ctx.qry.path, ctx.cfg.max_atom_items); |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | static void about_fn(struct cgit_context *ctx) | 39 | static void about_fn(void) |
| 40 | { | 40 | { |
| 41 | if (ctx->repo) | 41 | if (ctx.repo) |
| 42 | cgit_print_repo_readme(ctx->qry.path); | 42 | cgit_print_repo_readme(ctx.qry.path); |
| 43 | else | 43 | else |
| 44 | cgit_print_site_readme(); | 44 | cgit_print_site_readme(); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static void blob_fn(struct cgit_context *ctx) | 47 | static void blob_fn(void) |
| 48 | { | 48 | { |
| 49 | cgit_print_blob(ctx->qry.sha1, ctx->qry.path, ctx->qry.head, 0); | 49 | cgit_print_blob(ctx.qry.sha1, ctx.qry.path, ctx.qry.head, 0); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | static void commit_fn(struct cgit_context *ctx) | 52 | static void commit_fn(void) |
| 53 | { | 53 | { |
| 54 | cgit_print_commit(ctx->qry.sha1, ctx->qry.path); | 54 | cgit_print_commit(ctx.qry.sha1, ctx.qry.path); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | static void diff_fn(struct cgit_context *ctx) | 57 | static void diff_fn(void) |
| 58 | { | 58 | { |
| 59 | cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path, 1, 0); | 59 | cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1, 0); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static void rawdiff_fn(struct cgit_context *ctx) | 62 | static void rawdiff_fn(void) |
| 63 | { | 63 | { |
| 64 | cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path, 1, 1); | 64 | cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1, 1); |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | static void info_fn(struct cgit_context *ctx) | 67 | static void info_fn(void) |
| 68 | { | 68 | { |
| 69 | cgit_clone_info(ctx); | 69 | cgit_clone_info(); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | static void log_fn(struct cgit_context *ctx) | 72 | static void log_fn(void) |
| 73 | { | 73 | { |
| 74 | cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count, | 74 | cgit_print_log(ctx.qry.sha1, ctx.qry.ofs, ctx.cfg.max_commit_count, |
| 75 | ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1, | 75 | ctx.qry.grep, ctx.qry.search, ctx.qry.path, 1, |
| 76 | ctx->repo->enable_commit_graph, | 76 | ctx.repo->enable_commit_graph, |
| 77 | ctx->repo->commit_sort); | 77 | ctx.repo->commit_sort); |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | static void ls_cache_fn(struct cgit_context *ctx) | 80 | static void ls_cache_fn(void) |
| 81 | { | 81 | { |
| 82 | ctx->page.mimetype = "text/plain"; | 82 | ctx.page.mimetype = "text/plain"; |
| 83 | ctx->page.filename = "ls-cache.txt"; | 83 | ctx.page.filename = "ls-cache.txt"; |
| 84 | cgit_print_http_headers(ctx); | 84 | cgit_print_http_headers(); |
| 85 | cache_ls(ctx->cfg.cache_root); | 85 | cache_ls(ctx.cfg.cache_root); |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | static void objects_fn(struct cgit_context *ctx) | 88 | static void objects_fn(void) |
| 89 | { | 89 | { |
| 90 | cgit_clone_objects(ctx); | 90 | cgit_clone_objects(); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | static void repolist_fn(struct cgit_context *ctx) | 93 | static void repolist_fn(void) |
| 94 | { | 94 | { |
| 95 | cgit_print_repolist(); | 95 | cgit_print_repolist(); |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | static void patch_fn(struct cgit_context *ctx) | 98 | static void patch_fn(void) |
| 99 | { | 99 | { |
| 100 | cgit_print_patch(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path); | 100 | cgit_print_patch(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | static void plain_fn(struct cgit_context *ctx) | 103 | static void plain_fn(void) |
| 104 | { | 104 | { |
| 105 | cgit_print_plain(ctx); | 105 | cgit_print_plain(); |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | static void refs_fn(struct cgit_context *ctx) | 108 | static void refs_fn(void) |
| 109 | { | 109 | { |
| 110 | cgit_print_refs(); | 110 | cgit_print_refs(); |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | static void snapshot_fn(struct cgit_context *ctx) | 113 | static void snapshot_fn(void) |
| 114 | { | 114 | { |
| 115 | cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, ctx->qry.path, | 115 | cgit_print_snapshot(ctx.qry.head, ctx.qry.sha1, ctx.qry.path, |
| 116 | ctx->repo->snapshots, ctx->qry.nohead); | 116 | ctx.repo->snapshots, ctx.qry.nohead); |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | static void stats_fn(struct cgit_context *ctx) | 119 | static void stats_fn(void) |
| 120 | { | 120 | { |
| 121 | cgit_show_stats(ctx); | 121 | cgit_show_stats(); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static void summary_fn(struct cgit_context *ctx) | 124 | static void summary_fn(void) |
| 125 | { | 125 | { |
| 126 | cgit_print_summary(); | 126 | cgit_print_summary(); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static void tag_fn(struct cgit_context *ctx) | 129 | static void tag_fn(void) |
| 130 | { | 130 | { |
| 131 | cgit_print_tag(ctx->qry.sha1); | 131 | cgit_print_tag(ctx.qry.sha1); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | static void tree_fn(struct cgit_context *ctx) | 134 | static void tree_fn(void) |
| 135 | { | 135 | { |
| 136 | cgit_print_tree(ctx->qry.sha1, ctx->qry.path); | 136 | cgit_print_tree(ctx.qry.sha1, ctx.qry.path); |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | #define def_cmd(name, want_repo, want_layout, want_vpath, is_clone) \ | 139 | #define def_cmd(name, want_repo, want_layout, want_vpath, is_clone) \ |
| 140 | {#name, name##_fn, want_repo, want_layout, want_vpath, is_clone} | 140 | {#name, name##_fn, want_repo, want_layout, want_vpath, is_clone} |
| 141 | 141 | ||
| 142 | struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) | 142 | struct cgit_cmd *cgit_get_cmd(void) |
| 143 | { | 143 | { |
| 144 | static struct cgit_cmd cmds[] = { | 144 | static struct cgit_cmd cmds[] = { |
| 145 | def_cmd(HEAD, 1, 0, 0, 1), | 145 | def_cmd(HEAD, 1, 0, 0, 1), |
| @@ -165,15 +165,15 @@ struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) | |||
| 165 | }; | 165 | }; |
| 166 | int i; | 166 | int i; |
| 167 | 167 | ||
| 168 | if (ctx->qry.page == NULL) { | 168 | if (ctx.qry.page == NULL) { |
| 169 | if (ctx->repo) | 169 | if (ctx.repo) |
| 170 | ctx->qry.page = "summary"; | 170 | ctx.qry.page = "summary"; |
| 171 | else | 171 | else |
| 172 | ctx->qry.page = "repolist"; | 172 | ctx.qry.page = "repolist"; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | for (i = 0; i < sizeof(cmds)/sizeof(*cmds); i++) | 175 | for (i = 0; i < sizeof(cmds)/sizeof(*cmds); i++) |
| 176 | if (!strcmp(ctx->qry.page, cmds[i].name)) | 176 | if (!strcmp(ctx.qry.page, cmds[i].name)) |
| 177 | return &cmds[i]; | 177 | return &cmds[i]; |
| 178 | return NULL; | 178 | return NULL; |
| 179 | } | 179 | } |
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef CMD_H | 1 | #ifndef CMD_H |
| 2 | #define CMD_H | 2 | #define CMD_H |
| 3 | 3 | ||
| 4 | typedef void (*cgit_cmd_fn)(struct cgit_context *ctx); | 4 | typedef void (*cgit_cmd_fn)(void); |
| 5 | 5 | ||
| 6 | struct cgit_cmd { | 6 | struct cgit_cmd { |
| 7 | const char *name; | 7 | const char *name; |
| @@ -12,6 +12,6 @@ struct cgit_cmd { | |||
| 12 | is_clone:1; | 12 | is_clone:1; |
| 13 | }; | 13 | }; |
| 14 | 14 | ||
| 15 | extern struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx); | 15 | extern struct cgit_cmd *cgit_get_cmd(void); |
| 16 | 16 | ||
| 17 | #endif /* CMD_H */ | 17 | #endif /* CMD_H */ |
| @@ -108,7 +108,7 @@ void cgit_print_atom(char *tip, char *path, int max_count) | |||
| 108 | host = cgit_hosturl(); | 108 | host = cgit_hosturl(); |
| 109 | ctx.page.mimetype = "text/xml"; | 109 | ctx.page.mimetype = "text/xml"; |
| 110 | ctx.page.charset = "utf-8"; | 110 | ctx.page.charset = "utf-8"; |
| 111 | cgit_print_http_headers(&ctx); | 111 | cgit_print_http_headers(); |
| 112 | html("<feed xmlns='http://www.w3.org/2005/Atom'>\n"); | 112 | html("<feed xmlns='http://www.w3.org/2005/Atom'>\n"); |
| 113 | html("<title>"); | 113 | html("<title>"); |
| 114 | html_txt(ctx.repo->name); | 114 | html_txt(ctx.repo->name); |
| @@ -164,6 +164,6 @@ void cgit_print_blob(const char *hex, char *path, const char *head, int file_onl | |||
| 164 | ctx.page.mimetype = "text/plain"; | 164 | ctx.page.mimetype = "text/plain"; |
| 165 | } | 165 | } |
| 166 | ctx.page.filename = path; | 166 | ctx.page.filename = path; |
| 167 | cgit_print_http_headers(&ctx); | 167 | cgit_print_http_headers(); |
| 168 | html_raw(buf, size); | 168 | html_raw(buf, size); |
| 169 | } | 169 | } |
| @@ -29,22 +29,22 @@ static int print_ref_info(const char *refname, const unsigned char *sha1, | |||
| 29 | return 0; | 29 | return 0; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | static void print_pack_info(struct cgit_context *ctx) | 32 | static void print_pack_info(void) |
| 33 | { | 33 | { |
| 34 | struct packed_git *pack; | 34 | struct packed_git *pack; |
| 35 | int ofs; | 35 | int ofs; |
| 36 | 36 | ||
| 37 | ctx->page.mimetype = "text/plain"; | 37 | ctx.page.mimetype = "text/plain"; |
| 38 | ctx->page.filename = "objects/info/packs"; | 38 | ctx.page.filename = "objects/info/packs"; |
| 39 | cgit_print_http_headers(ctx); | 39 | cgit_print_http_headers(); |
| 40 | ofs = strlen(ctx->repo->path) + strlen("/objects/pack/"); | 40 | ofs = strlen(ctx.repo->path) + strlen("/objects/pack/"); |
| 41 | prepare_packed_git(); | 41 | prepare_packed_git(); |
| 42 | for (pack = packed_git; pack; pack = pack->next) | 42 | for (pack = packed_git; pack; pack = pack->next) |
| 43 | if (pack->pack_local) | 43 | if (pack->pack_local) |
| 44 | htmlf("P %s\n", pack->pack_name + ofs); | 44 | htmlf("P %s\n", pack->pack_name + ofs); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static void send_file(struct cgit_context *ctx, char *path) | 47 | static void send_file(char *path) |
| 48 | { | 48 | { |
| 49 | struct stat st; | 49 | struct stat st; |
| 50 | 50 | ||
| @@ -61,41 +61,41 @@ static void send_file(struct cgit_context *ctx, char *path) | |||
| 61 | } | 61 | } |
| 62 | return; | 62 | return; |
| 63 | } | 63 | } |
| 64 | ctx->page.mimetype = "application/octet-stream"; | 64 | ctx.page.mimetype = "application/octet-stream"; |
| 65 | ctx->page.filename = path; | 65 | ctx.page.filename = path; |
| 66 | if (prefixcmp(ctx->repo->path, path)) | 66 | if (prefixcmp(ctx.repo->path, path)) |
| 67 | ctx->page.filename += strlen(ctx->repo->path) + 1; | 67 | ctx.page.filename += strlen(ctx.repo->path) + 1; |
| 68 | cgit_print_http_headers(ctx); | 68 | cgit_print_http_headers(); |
| 69 | html_include(path); | 69 | html_include(path); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | void cgit_clone_info(struct cgit_context *ctx) | 72 | void cgit_clone_info(void) |
| 73 | { | 73 | { |
| 74 | if (!ctx->qry.path || strcmp(ctx->qry.path, "refs")) | 74 | if (!ctx.qry.path || strcmp(ctx.qry.path, "refs")) |
| 75 | return; | 75 | return; |
| 76 | 76 | ||
| 77 | ctx->page.mimetype = "text/plain"; | 77 | ctx.page.mimetype = "text/plain"; |
| 78 | ctx->page.filename = "info/refs"; | 78 | ctx.page.filename = "info/refs"; |
| 79 | cgit_print_http_headers(ctx); | 79 | cgit_print_http_headers(); |
| 80 | for_each_ref(print_ref_info, ctx); | 80 | for_each_ref(print_ref_info, NULL); |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | void cgit_clone_objects(struct cgit_context *ctx) | 83 | void cgit_clone_objects(void) |
| 84 | { | 84 | { |
| 85 | if (!ctx->qry.path) { | 85 | if (!ctx.qry.path) { |
| 86 | html_status(400, "Bad request", 0); | 86 | html_status(400, "Bad request", 0); |
| 87 | return; | 87 | return; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | if (!strcmp(ctx->qry.path, "info/packs")) { | 90 | if (!strcmp(ctx.qry.path, "info/packs")) { |
| 91 | print_pack_info(ctx); | 91 | print_pack_info(); |
| 92 | return; | 92 | return; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | send_file(ctx, git_path("objects/%s", ctx->qry.path)); | 95 | send_file(git_path("objects/%s", ctx.qry.path)); |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | void cgit_clone_head(struct cgit_context *ctx) | 98 | void cgit_clone_head(void) |
| 99 | { | 99 | { |
| 100 | send_file(ctx, git_path("%s", "HEAD")); | 100 | send_file(git_path("%s", "HEAD")); |
| 101 | } | 101 | } |
| @@ -1,8 +1,8 @@ | |||
| 1 | #ifndef UI_CLONE_H | 1 | #ifndef UI_CLONE_H |
| 2 | #define UI_CLONE_H | 2 | #define UI_CLONE_H |
| 3 | 3 | ||
| 4 | void cgit_clone_info(struct cgit_context *ctx); | 4 | void cgit_clone_info(void); |
| 5 | void cgit_clone_objects(struct cgit_context *ctx); | 5 | void cgit_clone_objects(void); |
| 6 | void cgit_clone_head(struct cgit_context *ctx); | 6 | void cgit_clone_head(void); |
| 7 | 7 | ||
| 8 | #endif /* UI_CLONE_H */ | 8 | #endif /* UI_CLONE_H */ |
| @@ -407,7 +407,7 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, | |||
| 407 | diff_setup_done(&diffopt); | 407 | diff_setup_done(&diffopt); |
| 408 | 408 | ||
| 409 | ctx.page.mimetype = "text/plain"; | 409 | ctx.page.mimetype = "text/plain"; |
| 410 | cgit_print_http_headers(&ctx); | 410 | cgit_print_http_headers(); |
| 411 | if (old_tree_sha1) { | 411 | if (old_tree_sha1) { |
| 412 | diff_tree_sha1(old_tree_sha1, new_tree_sha1, "", | 412 | diff_tree_sha1(old_tree_sha1, new_tree_sha1, "", |
| 413 | &diffopt); | 413 | &diffopt); |
| @@ -59,7 +59,7 @@ void cgit_print_patch(const char *new_rev, const char *old_rev, | |||
| 59 | patchname = fmt("%s.patch", rev_range); | 59 | patchname = fmt("%s.patch", rev_range); |
| 60 | ctx.page.mimetype = "text/plain"; | 60 | ctx.page.mimetype = "text/plain"; |
| 61 | ctx.page.filename = patchname; | 61 | ctx.page.filename = patchname; |
| 62 | cgit_print_http_headers(&ctx); | 62 | cgit_print_http_headers(); |
| 63 | 63 | ||
| 64 | if (ctx.cfg.noplainemail) { | 64 | if (ctx.cfg.noplainemail) { |
| 65 | rev_argv[2] = "--format=format:From %H Mon Sep 17 00:00:00 " | 65 | rev_argv[2] = "--format=format:From %H Mon Sep 17 00:00:00 " |
| @@ -103,7 +103,7 @@ static int print_object(const unsigned char *sha1, const char *path) | |||
| 103 | ctx.page.filename = path; | 103 | ctx.page.filename = path; |
| 104 | ctx.page.size = size; | 104 | ctx.page.size = size; |
| 105 | ctx.page.etag = sha1_to_hex(sha1); | 105 | ctx.page.etag = sha1_to_hex(sha1); |
| 106 | cgit_print_http_headers(&ctx); | 106 | cgit_print_http_headers(); |
| 107 | html_raw(buf, size); | 107 | html_raw(buf, size); |
| 108 | /* If we allocated this, then casting away const is safe. */ | 108 | /* If we allocated this, then casting away const is safe. */ |
| 109 | if (freemime) | 109 | if (freemime) |
| @@ -128,7 +128,7 @@ static void print_dir(const unsigned char *sha1, const char *base, | |||
| 128 | fullpath = buildpath(base, baselen, path); | 128 | fullpath = buildpath(base, baselen, path); |
| 129 | slash = (fullpath[0] == '/' ? "" : "/"); | 129 | slash = (fullpath[0] == '/' ? "" : "/"); |
| 130 | ctx.page.etag = sha1_to_hex(sha1); | 130 | ctx.page.etag = sha1_to_hex(sha1); |
| 131 | cgit_print_http_headers(&ctx); | 131 | cgit_print_http_headers(); |
| 132 | htmlf("<html><head><title>%s", slash); | 132 | htmlf("<html><head><title>%s", slash); |
| 133 | html_txt(fullpath); | 133 | html_txt(fullpath); |
| 134 | htmlf("</title></head>\n<body>\n<h2>%s", slash); | 134 | htmlf("</title></head>\n<body>\n<h2>%s", slash); |
| @@ -206,14 +206,14 @@ static int basedir_len(const char *path) | |||
| 206 | return 0; | 206 | return 0; |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | void cgit_print_plain(struct cgit_context *ctx) | 209 | void cgit_print_plain(void) |
| 210 | { | 210 | { |
| 211 | const char *rev = ctx->qry.sha1; | 211 | const char *rev = ctx.qry.sha1; |
| 212 | unsigned char sha1[20]; | 212 | unsigned char sha1[20]; |
| 213 | struct commit *commit; | 213 | struct commit *commit; |
| 214 | struct pathspec_item path_items = { | 214 | struct pathspec_item path_items = { |
| 215 | .match = ctx->qry.path, | 215 | .match = ctx.qry.path, |
| 216 | .len = ctx->qry.path ? strlen(ctx->qry.path) : 0 | 216 | .len = ctx.qry.path ? strlen(ctx.qry.path) : 0 |
| 217 | }; | 217 | }; |
| 218 | struct pathspec paths = { | 218 | struct pathspec paths = { |
| 219 | .nr = 1, | 219 | .nr = 1, |
| @@ -224,7 +224,7 @@ void cgit_print_plain(struct cgit_context *ctx) | |||
| 224 | }; | 224 | }; |
| 225 | 225 | ||
| 226 | if (!rev) | 226 | if (!rev) |
| 227 | rev = ctx->qry.head; | 227 | rev = ctx.qry.head; |
| 228 | 228 | ||
| 229 | if (get_sha1(rev, sha1)) { | 229 | if (get_sha1(rev, sha1)) { |
| 230 | html_status(404, "Not found", 0); | 230 | html_status(404, "Not found", 0); |
| @@ -1,6 +1,6 @@ | |||
| 1 | #ifndef UI_PLAIN_H | 1 | #ifndef UI_PLAIN_H |
| 2 | #define UI_PLAIN_H | 2 | #define UI_PLAIN_H |
| 3 | 3 | ||
| 4 | extern void cgit_print_plain(struct cgit_context *ctx); | 4 | extern void cgit_print_plain(void); |
| 5 | 5 | ||
| 6 | #endif /* UI_PLAIN_H */ | 6 | #endif /* UI_PLAIN_H */ |
diff --git a/ui-repolist.c b/ui-repolist.c index f9cb21a..92e80cf 100644 --- a/ui-repolist.c +++ b/ui-repolist.c | |||
| @@ -259,9 +259,9 @@ void cgit_print_repolist() | |||
| 259 | ++columns; | 259 | ++columns; |
| 260 | 260 | ||
| 261 | ctx.page.title = ctx.cfg.root_title; | 261 | ctx.page.title = ctx.cfg.root_title; |
| 262 | cgit_print_http_headers(&ctx); | 262 | cgit_print_http_headers(); |
| 263 | cgit_print_docstart(&ctx); | 263 | cgit_print_docstart(); |
| 264 | cgit_print_pageheader(&ctx); | 264 | cgit_print_pageheader(); |
| 265 | 265 | ||
| 266 | if (ctx.cfg.index_header) | 266 | if (ctx.cfg.index_header) |
| 267 | html_include(ctx.cfg.index_header); | 267 | html_include(ctx.cfg.index_header); |
diff --git a/ui-shared.c b/ui-shared.c index 0838e18..070971f 100644 --- a/ui-shared.c +++ b/ui-shared.c | |||
| @@ -436,59 +436,58 @@ void cgit_stats_link(const char *name, const char *title, const char *class, | |||
| 436 | reporevlink("stats", name, title, class, head, NULL, path); | 436 | reporevlink("stats", name, title, class, head, NULL, path); |
| 437 | } | 437 | } |
| 438 | 438 | ||
| 439 | static void cgit_self_link(char *name, const char *title, const char *class, | 439 | static void cgit_self_link(char *name, const char *title, const char *class) |
| 440 | struct cgit_context *ctx) | 440 | { |
| 441 | { | 441 | if (!strcmp(ctx.qry.page, "repolist")) |
| 442 | if (!strcmp(ctx->qry.page, "repolist")) | 442 | cgit_index_link(name, title, class, ctx.qry.search, ctx.qry.sort, |
| 443 | cgit_index_link(name, title, class, ctx->qry.search, ctx->qry.sort, | 443 | ctx.qry.ofs); |
| 444 | ctx->qry.ofs); | 444 | else if (!strcmp(ctx.qry.page, "summary")) |
| 445 | else if (!strcmp(ctx->qry.page, "summary")) | 445 | cgit_summary_link(name, title, class, ctx.qry.head); |
| 446 | cgit_summary_link(name, title, class, ctx->qry.head); | 446 | else if (!strcmp(ctx.qry.page, "tag")) |
| 447 | else if (!strcmp(ctx->qry.page, "tag")) | 447 | cgit_tag_link(name, title, class, ctx.qry.head, |
| 448 | cgit_tag_link(name, title, class, ctx->qry.head, | 448 | ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL); |
| 449 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL); | 449 | else if (!strcmp(ctx.qry.page, "tree")) |
| 450 | else if (!strcmp(ctx->qry.page, "tree")) | 450 | cgit_tree_link(name, title, class, ctx.qry.head, |
| 451 | cgit_tree_link(name, title, class, ctx->qry.head, | 451 | ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL, |
| 452 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 452 | ctx.qry.path); |
| 453 | ctx->qry.path); | 453 | else if (!strcmp(ctx.qry.page, "plain")) |
| 454 | else if (!strcmp(ctx->qry.page, "plain")) | 454 | cgit_plain_link(name, title, class, ctx.qry.head, |
| 455 | cgit_plain_link(name, title, class, ctx->qry.head, | 455 | ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL, |
| 456 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 456 | ctx.qry.path); |
| 457 | ctx->qry.path); | 457 | else if (!strcmp(ctx.qry.page, "log")) |
| 458 | else if (!strcmp(ctx->qry.page, "log")) | 458 | cgit_log_link(name, title, class, ctx.qry.head, |
| 459 | cgit_log_link(name, title, class, ctx->qry.head, | 459 | ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL, |
| 460 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 460 | ctx.qry.path, ctx.qry.ofs, |
| 461 | ctx->qry.path, ctx->qry.ofs, | 461 | ctx.qry.grep, ctx.qry.search, |
| 462 | ctx->qry.grep, ctx->qry.search, | 462 | ctx.qry.showmsg); |
| 463 | ctx->qry.showmsg); | 463 | else if (!strcmp(ctx.qry.page, "commit")) |
| 464 | else if (!strcmp(ctx->qry.page, "commit")) | 464 | cgit_commit_link(name, title, class, ctx.qry.head, |
| 465 | cgit_commit_link(name, title, class, ctx->qry.head, | 465 | ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL, |
| 466 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 466 | ctx.qry.path, 0); |
| 467 | ctx->qry.path, 0); | 467 | else if (!strcmp(ctx.qry.page, "patch")) |
| 468 | else if (!strcmp(ctx->qry.page, "patch")) | 468 | cgit_patch_link(name, title, class, ctx.qry.head, |
| 469 | cgit_patch_link(name, title, class, ctx->qry.head, | 469 | ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL, |
| 470 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 470 | ctx.qry.path); |
| 471 | ctx->qry.path); | 471 | else if (!strcmp(ctx.qry.page, "refs")) |
| 472 | else if (!strcmp(ctx->qry.page, "refs")) | 472 | cgit_refs_link(name, title, class, ctx.qry.head, |
| 473 | cgit_refs_link(name, title, class, ctx->qry.head, | 473 | ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL, |
| 474 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 474 | ctx.qry.path); |
| 475 | ctx->qry.path); | 475 | else if (!strcmp(ctx.qry.page, "snapshot")) |
| 476 | else if (!strcmp(ctx->qry.page, "snapshot")) | 476 | cgit_snapshot_link(name, title, class, ctx.qry.head, |
| 477 | cgit_snapshot_link(name, title, class, ctx->qry.head, | 477 | ctx.qry.has_sha1 ? ctx.qry.sha1 : NULL, |
| 478 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 478 | ctx.qry.path); |
| 479 | ctx->qry.path); | 479 | else if (!strcmp(ctx.qry.page, "diff")) |
| 480 | else if (!strcmp(ctx->qry.page, "diff")) | 480 | cgit_diff_link(name, title, class, ctx.qry.head, |
| 481 | cgit_diff_link(name, title, class, ctx->qry.head, | 481 | ctx.qry.sha1, ctx.qry.sha2, |
| 482 | ctx->qry.sha1, ctx->qry.sha2, | 482 | ctx.qry.path, 0); |
| 483 | ctx->qry.path, 0); | 483 | else if (!strcmp(ctx.qry.page, "stats")) |
| 484 | else if (!strcmp(ctx->qry.page, "stats")) | 484 | cgit_stats_link(name, title, class, ctx.qry.head, |
| 485 | cgit_stats_link(name, title, class, ctx->qry.head, | 485 | ctx.qry.path); |
| 486 | ctx->qry.path); | ||
| 487 | else { | 486 | else { |
| 488 | /* Don't known how to make link for this page */ | 487 | /* Don't known how to make link for this page */ |
| 489 | repolink(title, class, ctx->qry.page, ctx->qry.head, ctx->qry.path); | 488 | repolink(title, class, ctx.qry.page, ctx.qry.head, ctx.qry.path); |
| 490 | html("><!-- cgit_self_link() doesn't know how to make link for page '"); | 489 | html("><!-- cgit_self_link() doesn't know how to make link for page '"); |
| 491 | html_txt(ctx->qry.page); | 490 | html_txt(ctx.qry.page); |
| 492 | html("' -->"); | 491 | html("' -->"); |
| 493 | html_txt(name); | 492 | html_txt(name); |
| 494 | html("</a>"); | 493 | html("</a>"); |
| @@ -632,39 +631,39 @@ void cgit_print_age(time_t t, time_t max_relative, const char *format) | |||
| 632 | secs * 1.0 / TM_YEAR); | 631 | secs * 1.0 / TM_YEAR); |
| 633 | } | 632 | } |
| 634 | 633 | ||
| 635 | void cgit_print_http_headers(struct cgit_context *ctx) | 634 | void cgit_print_http_headers(void) |
| 636 | { | 635 | { |
| 637 | if (ctx->env.no_http && !strcmp(ctx->env.no_http, "1")) | 636 | if (ctx.env.no_http && !strcmp(ctx.env.no_http, "1")) |
| 638 | return; | 637 | return; |
| 639 | 638 | ||
| 640 | if (ctx->page.status) | 639 | if (ctx.page.status) |
| 641 | htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg); | 640 | htmlf("Status: %d %s\n", ctx.page.status, ctx.page.statusmsg); |
| 642 | if (ctx->page.mimetype && ctx->page.charset) | 641 | if (ctx.page.mimetype && ctx.page.charset) |
| 643 | htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, | 642 | htmlf("Content-Type: %s; charset=%s\n", ctx.page.mimetype, |
| 644 | ctx->page.charset); | 643 | ctx.page.charset); |
| 645 | else if (ctx->page.mimetype) | 644 | else if (ctx.page.mimetype) |
| 646 | htmlf("Content-Type: %s\n", ctx->page.mimetype); | 645 | htmlf("Content-Type: %s\n", ctx.page.mimetype); |
| 647 | if (ctx->page.size) | 646 | if (ctx.page.size) |
| 648 | htmlf("Content-Length: %zd\n", ctx->page.size); | 647 | htmlf("Content-Length: %zd\n", ctx.page.size); |
| 649 | if (ctx->page.filename) | 648 | if (ctx.page.filename) |
| 650 | htmlf("Content-Disposition: inline; filename=\"%s\"\n", | 649 | htmlf("Content-Disposition: inline; filename=\"%s\"\n", |
| 651 | ctx->page.filename); | 650 | ctx.page.filename); |
| 652 | if (!ctx->env.authenticated) | 651 | if (!ctx.env.authenticated) |
| 653 | html("Cache-Control: no-cache, no-store\n"); | 652 | html("Cache-Control: no-cache, no-store\n"); |
| 654 | htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); | 653 | htmlf("Last-Modified: %s\n", http_date(ctx.page.modified)); |
| 655 | htmlf("Expires: %s\n", http_date(ctx->page.expires)); | 654 | htmlf("Expires: %s\n", http_date(ctx.page.expires)); |
| 656 | if (ctx->page.etag) | 655 | if (ctx.page.etag) |
| 657 | htmlf("ETag: \"%s\"\n", ctx->page.etag); | 656 | htmlf("ETag: \"%s\"\n", ctx.page.etag); |
| 658 | html("\n"); | 657 | html("\n"); |
| 659 | if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD")) | 658 | if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")) |
| 660 | exit(0); | 659 | exit(0); |
| 661 | } | 660 | } |
| 662 | 661 | ||
| 663 | void cgit_print_docstart(struct cgit_context *ctx) | 662 | void cgit_print_docstart(void) |
| 664 | { | 663 | { |
| 665 | if (ctx->cfg.embedded) { | 664 | if (ctx.cfg.embedded) { |
| 666 | if (ctx->cfg.header) | 665 | if (ctx.cfg.header) |
| 667 | html_include(ctx->cfg.header); | 666 | html_include(ctx.cfg.header); |
| 668 | return; | 667 | return; |
| 669 | } | 668 | } |
| 670 | 669 | ||
| @@ -673,37 +672,37 @@ void cgit_print_docstart(struct cgit_context *ctx) | |||
| 673 | html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); | 672 | html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); |
| 674 | html("<head>\n"); | 673 | html("<head>\n"); |
| 675 | html("<title>"); | 674 | html("<title>"); |
| 676 | html_txt(ctx->page.title); | 675 | html_txt(ctx.page.title); |
| 677 | html("</title>\n"); | 676 | html("</title>\n"); |
| 678 | htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version); | 677 | htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version); |
| 679 | if (ctx->cfg.robots && *ctx->cfg.robots) | 678 | if (ctx.cfg.robots && *ctx.cfg.robots) |
| 680 | htmlf("<meta name='robots' content='%s'/>\n", ctx->cfg.robots); | 679 | htmlf("<meta name='robots' content='%s'/>\n", ctx.cfg.robots); |
| 681 | html("<link rel='stylesheet' type='text/css' href='"); | 680 | html("<link rel='stylesheet' type='text/css' href='"); |
| 682 | html_attr(ctx->cfg.css); | 681 | html_attr(ctx.cfg.css); |
| 683 | html("'/>\n"); | 682 | html("'/>\n"); |
| 684 | if (ctx->cfg.favicon) { | 683 | if (ctx.cfg.favicon) { |
| 685 | html("<link rel='shortcut icon' href='"); | 684 | html("<link rel='shortcut icon' href='"); |
| 686 | html_attr(ctx->cfg.favicon); | 685 | html_attr(ctx.cfg.favicon); |
| 687 | html("'/>\n"); | 686 | html("'/>\n"); |
| 688 | } | 687 | } |
| 689 | if (host && ctx->repo && ctx->qry.head) { | 688 | if (host && ctx.repo && ctx.qry.head) { |
| 690 | struct strbuf sb = STRBUF_INIT; | 689 | struct strbuf sb = STRBUF_INIT; |
| 691 | strbuf_addf(&sb, "h=%s", ctx->qry.head); | 690 | strbuf_addf(&sb, "h=%s", ctx.qry.head); |
| 692 | 691 | ||
| 693 | html("<link rel='alternate' title='Atom feed' href='"); | 692 | html("<link rel='alternate' title='Atom feed' href='"); |
| 694 | html(cgit_httpscheme()); | 693 | html(cgit_httpscheme()); |
| 695 | html_attr(cgit_hosturl()); | 694 | html_attr(cgit_hosturl()); |
| 696 | html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.vpath, | 695 | html_attr(cgit_fileurl(ctx.repo->url, "atom", ctx.qry.vpath, |
| 697 | sb.buf)); | 696 | sb.buf)); |
| 698 | html("' type='application/atom+xml'/>\n"); | 697 | html("' type='application/atom+xml'/>\n"); |
| 699 | strbuf_release(&sb); | 698 | strbuf_release(&sb); |
| 700 | } | 699 | } |
| 701 | if (ctx->cfg.head_include) | 700 | if (ctx.cfg.head_include) |
| 702 | html_include(ctx->cfg.head_include); | 701 | html_include(ctx.cfg.head_include); |
| 703 | html("</head>\n"); | 702 | html("</head>\n"); |
| 704 | html("<body>\n"); | 703 | html("<body>\n"); |
| 705 | if (ctx->cfg.header) | 704 | if (ctx.cfg.header) |
| 706 | html_include(ctx->cfg.header); | 705 | html_include(ctx.cfg.header); |
| 707 | } | 706 | } |
| 708 | 707 | ||
| 709 | void cgit_print_docend() | 708 | void cgit_print_docend() |
| @@ -767,47 +766,47 @@ void cgit_add_hidden_formfields(int incl_head, int incl_search, | |||
| 767 | } | 766 | } |
| 768 | } | 767 | } |
| 769 | 768 | ||
| 770 | static const char *hc(struct cgit_context *ctx, const char *page) | 769 | static const char *hc(const char *page) |
| 771 | { | 770 | { |
| 772 | return strcmp(ctx->qry.page, page) ? NULL : "active"; | 771 | return strcmp(ctx.qry.page, page) ? NULL : "active"; |
| 773 | } | 772 | } |
| 774 | 773 | ||
| 775 | static void cgit_print_path_crumbs(struct cgit_context *ctx, char *path) | 774 | static void cgit_print_path_crumbs(char *path) |
| 776 | { | 775 | { |
| 777 | char *old_path = ctx->qry.path; | 776 | char *old_path = ctx.qry.path; |
| 778 | char *p = path, *q, *end = path + strlen(path); | 777 | char *p = path, *q, *end = path + strlen(path); |
| 779 | 778 | ||
| 780 | ctx->qry.path = NULL; | 779 | ctx.qry.path = NULL; |
| 781 | cgit_self_link("root", NULL, NULL, ctx); | 780 | cgit_self_link("root", NULL, NULL); |
| 782 | ctx->qry.path = p = path; | 781 | ctx.qry.path = p = path; |
| 783 | while (p < end) { | 782 | while (p < end) { |
| 784 | if (!(q = strchr(p, '/'))) | 783 | if (!(q = strchr(p, '/'))) |
| 785 | q = end; | 784 | q = end; |
| 786 | *q = '\0'; | 785 | *q = '\0'; |
| 787 | html_txt("/"); | 786 | html_txt("/"); |
| 788 | cgit_self_link(p, NULL, NULL, ctx); | 787 | cgit_self_link(p, NULL, NULL); |
| 789 | if (q < end) | 788 | if (q < end) |
| 790 | *q = '/'; | 789 | *q = '/'; |
| 791 | p = q + 1; | 790 | p = q + 1; |
| 792 | } | 791 | } |
| 793 | ctx->qry.path = old_path; | 792 | ctx.qry.path = old_path; |
| 794 | } | 793 | } |
| 795 | 794 | ||
| 796 | static void print_header(struct cgit_context *ctx) | 795 | static void print_header(void) |
| 797 | { | 796 | { |
| 798 | char *logo = NULL, *logo_link = NULL; | 797 | char *logo = NULL, *logo_link = NULL; |
| 799 | 798 | ||
| 800 | html("<table id='header'>\n"); | 799 | html("<table id='header'>\n"); |
| 801 | html("<tr>\n"); | 800 | html("<tr>\n"); |
| 802 | 801 | ||
| 803 | if (ctx->repo && ctx->repo->logo && *ctx->repo->logo) | 802 | if (ctx.repo && ctx.repo->logo && *ctx.repo->logo) |
| 804 | logo = ctx->repo->logo; | 803 | logo = ctx.repo->logo; |
| 805 | else | 804 | else |
| 806 | logo = ctx->cfg.logo; | 805 | logo = ctx.cfg.logo; |
| 807 | if (ctx->repo && ctx->repo->logo_link && *ctx->repo->logo_link) | 806 | if (ctx.repo && ctx.repo->logo_link && *ctx.repo->logo_link) |
| 808 | logo_link = ctx->repo->logo_link; | 807 | logo_link = ctx.repo->logo_link; |
| 809 | else | 808 | else |
| 810 | logo_link = ctx->cfg.logo_link; | 809 | logo_link = ctx.cfg.logo_link; |
| 811 | if (logo && *logo) { | 810 | if (logo && *logo) { |
| 812 | html("<td class='logo' rowspan='2'><a href='"); | 811 | html("<td class='logo' rowspan='2'><a href='"); |
| 813 | if (logo_link && *logo_link) | 812 | if (logo_link && *logo_link) |
| @@ -820,104 +819,104 @@ static void print_header(struct cgit_context *ctx) | |||
| 820 | } | 819 | } |
| 821 | 820 | ||
| 822 | html("<td class='main'>"); | 821 | html("<td class='main'>"); |
| 823 | if (ctx->repo) { | 822 | if (ctx.repo) { |
| 824 | cgit_index_link("index", NULL, NULL, NULL, NULL, 0); | 823 | cgit_index_link("index", NULL, NULL, NULL, NULL, 0); |
| 825 | html(" : "); | 824 | html(" : "); |
| 826 | cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL); | 825 | cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL); |
| 827 | if (ctx->env.authenticated) { | 826 | if (ctx.env.authenticated) { |
| 828 | html("</td><td class='form'>"); | 827 | html("</td><td class='form'>"); |
| 829 | html("<form method='get' action=''>\n"); | 828 | html("<form method='get' action=''>\n"); |
| 830 | cgit_add_hidden_formfields(0, 1, ctx->qry.page); | 829 | cgit_add_hidden_formfields(0, 1, ctx.qry.page); |
| 831 | html("<select name='h' onchange='this.form.submit();'>\n"); | 830 | html("<select name='h' onchange='this.form.submit();'>\n"); |
| 832 | for_each_branch_ref(print_branch_option, ctx->qry.head); | 831 | for_each_branch_ref(print_branch_option, ctx.qry.head); |
| 833 | html("</select> "); | 832 | html("</select> "); |
| 834 | html("<input type='submit' name='' value='switch'/>"); | 833 | html("<input type='submit' name='' value='switch'/>"); |
| 835 | html("</form>"); | 834 | html("</form>"); |
| 836 | } | 835 | } |
| 837 | } else | 836 | } else |
| 838 | html_txt(ctx->cfg.root_title); | 837 | html_txt(ctx.cfg.root_title); |
| 839 | html("</td></tr>\n"); | 838 | html("</td></tr>\n"); |
| 840 | 839 | ||
| 841 | html("<tr><td class='sub'>"); | 840 | html("<tr><td class='sub'>"); |
| 842 | if (ctx->repo) { | 841 | if (ctx.repo) { |
| 843 | html_txt(ctx->repo->desc); | 842 | html_txt(ctx.repo->desc); |
| 844 | html("</td><td class='sub right'>"); | 843 | html("</td><td class='sub right'>"); |
| 845 | html_txt(ctx->repo->owner); | 844 | html_txt(ctx.repo->owner); |
| 846 | } else { | 845 | } else { |
| 847 | if (ctx->cfg.root_desc) | 846 | if (ctx.cfg.root_desc) |
| 848 | html_txt(ctx->cfg.root_desc); | 847 | html_txt(ctx.cfg.root_desc); |
| 849 | else if (ctx->cfg.index_info) | 848 | else if (ctx.cfg.index_info) |
| 850 | html_include(ctx->cfg.index_info); | 849 | html_include(ctx.cfg.index_info); |
| 851 | } | 850 | } |
| 852 | html("</td></tr></table>\n"); | 851 | html("</td></tr></table>\n"); |
| 853 | } | 852 | } |
| 854 | 853 | ||
| 855 | void cgit_print_pageheader(struct cgit_context *ctx) | 854 | void cgit_print_pageheader(void) |
| 856 | { | 855 | { |
| 857 | html("<div id='cgit'>"); | 856 | html("<div id='cgit'>"); |
| 858 | if (!ctx->env.authenticated || !ctx->cfg.noheader) | 857 | if (!ctx.env.authenticated || !ctx.cfg.noheader) |
| 859 | print_header(ctx); | 858 | print_header(); |
| 860 | 859 | ||
| 861 | html("<table class='tabs'><tr><td>\n"); | 860 | html("<table class='tabs'><tr><td>\n"); |
| 862 | if (ctx->env.authenticated && ctx->repo) { | 861 | if (ctx.env.authenticated && ctx.repo) { |
| 863 | cgit_summary_link("summary", NULL, hc(ctx, "summary"), | 862 | cgit_summary_link("summary", NULL, hc("summary"), |
| 864 | ctx->qry.head); | 863 | ctx.qry.head); |
| 865 | cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head, | 864 | cgit_refs_link("refs", NULL, hc("refs"), ctx.qry.head, |
| 866 | ctx->qry.sha1, NULL); | 865 | ctx.qry.sha1, NULL); |
| 867 | cgit_log_link("log", NULL, hc(ctx, "log"), ctx->qry.head, | 866 | cgit_log_link("log", NULL, hc("log"), ctx.qry.head, |
| 868 | NULL, ctx->qry.vpath, 0, NULL, NULL, | 867 | NULL, ctx.qry.vpath, 0, NULL, NULL, |
| 869 | ctx->qry.showmsg); | 868 | ctx.qry.showmsg); |
| 870 | cgit_tree_link("tree", NULL, hc(ctx, "tree"), ctx->qry.head, | 869 | cgit_tree_link("tree", NULL, hc("tree"), ctx.qry.head, |
| 871 | ctx->qry.sha1, ctx->qry.vpath); | 870 | ctx.qry.sha1, ctx.qry.vpath); |
| 872 | cgit_commit_link("commit", NULL, hc(ctx, "commit"), | 871 | cgit_commit_link("commit", NULL, hc("commit"), |
| 873 | ctx->qry.head, ctx->qry.sha1, ctx->qry.vpath, 0); | 872 | ctx.qry.head, ctx.qry.sha1, ctx.qry.vpath, 0); |
| 874 | cgit_diff_link("diff", NULL, hc(ctx, "diff"), ctx->qry.head, | 873 | cgit_diff_link("diff", NULL, hc("diff"), ctx.qry.head, |
| 875 | ctx->qry.sha1, ctx->qry.sha2, ctx->qry.vpath, 0); | 874 | ctx.qry.sha1, ctx.qry.sha2, ctx.qry.vpath, 0); |
| 876 | if (ctx->repo->max_stats) | 875 | if (ctx.repo->max_stats) |
| 877 | cgit_stats_link("stats", NULL, hc(ctx, "stats"), | 876 | cgit_stats_link("stats", NULL, hc("stats"), |
| 878 | ctx->qry.head, ctx->qry.vpath); | 877 | ctx.qry.head, ctx.qry.vpath); |
| 879 | if (ctx->repo->readme.nr) | 878 | if (ctx.repo->readme.nr) |
| 880 | reporevlink("about", "about", NULL, | 879 | reporevlink("about", "about", NULL, |
| 881 | hc(ctx, "about"), ctx->qry.head, NULL, | 880 | hc("about"), ctx.qry.head, NULL, |
| 882 | NULL); | 881 | NULL); |
| 883 | html("</td><td class='form'>"); | 882 | html("</td><td class='form'>"); |
| 884 | html("<form class='right' method='get' action='"); | 883 | html("<form class='right' method='get' action='"); |
| 885 | if (ctx->cfg.virtual_root) | 884 | if (ctx.cfg.virtual_root) |
| 886 | html_url_path(cgit_fileurl(ctx->qry.repo, "log", | 885 | html_url_path(cgit_fileurl(ctx.qry.repo, "log", |
| 887 | ctx->qry.vpath, NULL)); | 886 | ctx.qry.vpath, NULL)); |
| 888 | html("'>\n"); | 887 | html("'>\n"); |
| 889 | cgit_add_hidden_formfields(1, 0, "log"); | 888 | cgit_add_hidden_formfields(1, 0, "log"); |
| 890 | html("<select name='qt'>\n"); | 889 | html("<select name='qt'>\n"); |
| 891 | html_option("grep", "log msg", ctx->qry.grep); | 890 | html_option("grep", "log msg", ctx.qry.grep); |
| 892 | html_option("author", "author", ctx->qry.grep); | 891 | html_option("author", "author", ctx.qry.grep); |
| 893 | html_option("committer", "committer", ctx->qry.grep); | 892 | html_option("committer", "committer", ctx.qry.grep); |
| 894 | html_option("range", "range", ctx->qry.grep); | 893 | html_option("range", "range", ctx.qry.grep); |
| 895 | html("</select>\n"); | 894 | html("</select>\n"); |
| 896 | html("<input class='txt' type='text' size='10' name='q' value='"); | 895 | html("<input class='txt' type='text' size='10' name='q' value='"); |
| 897 | html_attr(ctx->qry.search); | 896 | html_attr(ctx.qry.search); |
| 898 | html("'/>\n"); | 897 | html("'/>\n"); |
| 899 | html("<input type='submit' value='search'/>\n"); | 898 | html("<input type='submit' value='search'/>\n"); |
| 900 | html("</form>\n"); | 899 | html("</form>\n"); |
| 901 | } else if (ctx->env.authenticated) { | 900 | } else if (ctx.env.authenticated) { |
| 902 | site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, NULL, 0); | 901 | site_link(NULL, "index", NULL, hc("repolist"), NULL, NULL, 0); |
| 903 | if (ctx->cfg.root_readme) | 902 | if (ctx.cfg.root_readme) |
| 904 | site_link("about", "about", NULL, hc(ctx, "about"), | 903 | site_link("about", "about", NULL, hc("about"), |
| 905 | NULL, NULL, 0); | 904 | NULL, NULL, 0); |
| 906 | html("</td><td class='form'>"); | 905 | html("</td><td class='form'>"); |
| 907 | html("<form method='get' action='"); | 906 | html("<form method='get' action='"); |
| 908 | html_attr(cgit_rooturl()); | 907 | html_attr(cgit_rooturl()); |
| 909 | html("'>\n"); | 908 | html("'>\n"); |
| 910 | html("<input type='text' name='q' size='10' value='"); | 909 | html("<input type='text' name='q' size='10' value='"); |
| 911 | html_attr(ctx->qry.search); | 910 | html_attr(ctx.qry.search); |
| 912 | html("'/>\n"); | 911 | html("'/>\n"); |
| 913 | html("<input type='submit' value='search'/>\n"); | 912 | html("<input type='submit' value='search'/>\n"); |
| 914 | html("</form>"); | 913 | html("</form>"); |
| 915 | } | 914 | } |
| 916 | html("</td></tr></table>\n"); | 915 | html("</td></tr></table>\n"); |
| 917 | if (ctx->env.authenticated && ctx->qry.vpath) { | 916 | if (ctx.env.authenticated && ctx.qry.vpath) { |
| 918 | html("<div class='path'>"); | 917 | html("<div class='path'>"); |
| 919 | html("path: "); | 918 | html("path: "); |
| 920 | cgit_print_path_crumbs(ctx, ctx->qry.vpath); | 919 | cgit_print_path_crumbs(ctx.qry.vpath); |
| 921 | html("</div>"); | 920 | html("</div>"); |
| 922 | } | 921 | } |
| 923 | html("<div class='content'>"); | 922 | html("<div class='content'>"); |
diff --git a/ui-shared.h b/ui-shared.h index 889c28f..3e7a91b 100644 --- a/ui-shared.h +++ b/ui-shared.h | |||
| @@ -59,10 +59,10 @@ __attribute__((format (printf,1,0))) | |||
| 59 | extern void cgit_vprint_error(const char *fmt, va_list ap); | 59 | extern void cgit_vprint_error(const char *fmt, va_list ap); |
| 60 | extern void cgit_print_date(time_t secs, const char *format, int local_time); | 60 | extern void cgit_print_date(time_t secs, const char *format, int local_time); |
| 61 | extern void cgit_print_age(time_t t, time_t max_relative, const char *format); | 61 | extern void cgit_print_age(time_t t, time_t max_relative, const char *format); |
| 62 | extern void cgit_print_http_headers(struct cgit_context *ctx); | 62 | extern void cgit_print_http_headers(void); |
| 63 | extern void cgit_print_docstart(struct cgit_context *ctx); | 63 | extern void cgit_print_docstart(void); |
| 64 | extern void cgit_print_docend(); | 64 | extern void cgit_print_docend(); |
| 65 | extern void cgit_print_pageheader(struct cgit_context *ctx); | 65 | extern void cgit_print_pageheader(void); |
| 66 | extern void cgit_print_filemode(unsigned short mode); | 66 | extern void cgit_print_filemode(unsigned short mode); |
| 67 | extern void cgit_print_snapshot_links(const char *repo, const char *head, | 67 | extern void cgit_print_snapshot_links(const char *repo, const char *head, |
| 68 | const char *hex, int snapshots); | 68 | const char *hex, int snapshots); |
diff --git a/ui-snapshot.c b/ui-snapshot.c index 7115ec4..582dc31 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c | |||
| @@ -121,7 +121,7 @@ static int make_snapshot(const struct cgit_snapshot_format *format, | |||
| 121 | } | 121 | } |
| 122 | ctx.page.mimetype = xstrdup(format->mimetype); | 122 | ctx.page.mimetype = xstrdup(format->mimetype); |
| 123 | ctx.page.filename = xstrdup(filename); | 123 | ctx.page.filename = xstrdup(filename); |
| 124 | cgit_print_http_headers(&ctx); | 124 | cgit_print_http_headers(); |
| 125 | format->write_func(hex, prefix); | 125 | format->write_func(hex, prefix); |
| 126 | return 0; | 126 | return 0; |
| 127 | } | 127 | } |
| @@ -183,9 +183,9 @@ static void show_error(char *fmt, ...) | |||
| 183 | va_list ap; | 183 | va_list ap; |
| 184 | 184 | ||
| 185 | ctx.page.mimetype = "text/html"; | 185 | ctx.page.mimetype = "text/html"; |
| 186 | cgit_print_http_headers(&ctx); | 186 | cgit_print_http_headers(); |
| 187 | cgit_print_docstart(&ctx); | 187 | cgit_print_docstart(); |
| 188 | cgit_print_pageheader(&ctx); | 188 | cgit_print_pageheader(); |
| 189 | va_start(ap, fmt); | 189 | va_start(ap, fmt); |
| 190 | cgit_vprint_error(fmt, ap); | 190 | cgit_vprint_error(fmt, ap); |
| 191 | va_end(ap); | 191 | va_end(ap); |
| @@ -209,13 +209,12 @@ static int cmp_total_commits(const void *a1, const void *a2) | |||
| 209 | /* Walk the commit DAG and collect number of commits per author per | 209 | /* Walk the commit DAG and collect number of commits per author per |
| 210 | * timeperiod into a nested string_list collection. | 210 | * timeperiod into a nested string_list collection. |
| 211 | */ | 211 | */ |
| 212 | static struct string_list collect_stats(struct cgit_context *ctx, | 212 | static struct string_list collect_stats(struct cgit_period *period) |
| 213 | struct cgit_period *period) | ||
| 214 | { | 213 | { |
| 215 | struct string_list authors; | 214 | struct string_list authors; |
| 216 | struct rev_info rev; | 215 | struct rev_info rev; |
| 217 | struct commit *commit; | 216 | struct commit *commit; |
| 218 | const char *argv[] = {NULL, ctx->qry.head, NULL, NULL, NULL, NULL}; | 217 | const char *argv[] = {NULL, ctx.qry.head, NULL, NULL, NULL, NULL}; |
| 219 | int argc = 3; | 218 | int argc = 3; |
| 220 | time_t now; | 219 | time_t now; |
| 221 | long i; | 220 | long i; |
| @@ -229,9 +228,9 @@ static struct string_list collect_stats(struct cgit_context *ctx, | |||
| 229 | period->dec(tm); | 228 | period->dec(tm); |
| 230 | strftime(tmp, sizeof(tmp), "%Y-%m-%d", tm); | 229 | strftime(tmp, sizeof(tmp), "%Y-%m-%d", tm); |
| 231 | argv[2] = xstrdup(fmt("--since=%s", tmp)); | 230 | argv[2] = xstrdup(fmt("--since=%s", tmp)); |
| 232 | if (ctx->qry.path) { | 231 | if (ctx.qry.path) { |
| 233 | argv[3] = "--"; | 232 | argv[3] = "--"; |
| 234 | argv[4] = ctx->qry.path; | 233 | argv[4] = ctx.qry.path; |
| 235 | argc += 2; | 234 | argc += 2; |
| 236 | } | 235 | } |
| 237 | init_revisions(&rev, NULL); | 236 | init_revisions(&rev, NULL); |
| @@ -360,30 +359,30 @@ static void print_authors(struct string_list *authors, int top, | |||
| 360 | * for each author is another string_list which is used to calculate the | 359 | * for each author is another string_list which is used to calculate the |
| 361 | * number of commits per time-interval. | 360 | * number of commits per time-interval. |
| 362 | */ | 361 | */ |
| 363 | void cgit_show_stats(struct cgit_context *ctx) | 362 | void cgit_show_stats(void) |
| 364 | { | 363 | { |
| 365 | struct string_list authors; | 364 | struct string_list authors; |
| 366 | struct cgit_period *period; | 365 | struct cgit_period *period; |
| 367 | int top, i; | 366 | int top, i; |
| 368 | const char *code = "w"; | 367 | const char *code = "w"; |
| 369 | 368 | ||
| 370 | if (ctx->qry.period) | 369 | if (ctx.qry.period) |
| 371 | code = ctx->qry.period; | 370 | code = ctx.qry.period; |
| 372 | 371 | ||
| 373 | i = cgit_find_stats_period(code, &period); | 372 | i = cgit_find_stats_period(code, &period); |
| 374 | if (!i) { | 373 | if (!i) { |
| 375 | cgit_print_error("Unknown statistics type: %c", code[0]); | 374 | cgit_print_error("Unknown statistics type: %c", code[0]); |
| 376 | return; | 375 | return; |
| 377 | } | 376 | } |
| 378 | if (i > ctx->repo->max_stats) { | 377 | if (i > ctx.repo->max_stats) { |
| 379 | cgit_print_error("Statistics type disabled: %s", period->name); | 378 | cgit_print_error("Statistics type disabled: %s", period->name); |
| 380 | return; | 379 | return; |
| 381 | } | 380 | } |
| 382 | authors = collect_stats(ctx, period); | 381 | authors = collect_stats(period); |
| 383 | qsort(authors.items, authors.nr, sizeof(struct string_list_item), | 382 | qsort(authors.items, authors.nr, sizeof(struct string_list_item), |
| 384 | cmp_total_commits); | 383 | cmp_total_commits); |
| 385 | 384 | ||
| 386 | top = ctx->qry.ofs; | 385 | top = ctx.qry.ofs; |
| 387 | if (!top) | 386 | if (!top) |
| 388 | top = 10; | 387 | top = 10; |
| 389 | 388 | ||
| @@ -392,10 +391,10 @@ void cgit_show_stats(struct cgit_context *ctx) | |||
| 392 | html("<form method='get' action=''>"); | 391 | html("<form method='get' action=''>"); |
| 393 | cgit_add_hidden_formfields(1, 0, "stats"); | 392 | cgit_add_hidden_formfields(1, 0, "stats"); |
| 394 | html("<table><tr><td colspan='2'/></tr>"); | 393 | html("<table><tr><td colspan='2'/></tr>"); |
| 395 | if (ctx->repo->max_stats > 1) { | 394 | if (ctx.repo->max_stats > 1) { |
| 396 | html("<tr><td class='label'>Period:</td>"); | 395 | html("<tr><td class='label'>Period:</td>"); |
| 397 | html("<td class='ctrl'><select name='period' onchange='this.form.submit();'>"); | 396 | html("<td class='ctrl'><select name='period' onchange='this.form.submit();'>"); |
| 398 | for (i = 0; i < ctx->repo->max_stats; i++) | 397 | for (i = 0; i < ctx.repo->max_stats; i++) |
| 399 | html_option(fmt("%c", periods[i].code), | 398 | html_option(fmt("%c", periods[i].code), |
| 400 | periods[i].name, fmt("%c", period->code)); | 399 | periods[i].name, fmt("%c", period->code)); |
| 401 | html("</select></td></tr>"); | 400 | html("</select></td></tr>"); |
| @@ -414,9 +413,9 @@ void cgit_show_stats(struct cgit_context *ctx) | |||
| 414 | html("</form>"); | 413 | html("</form>"); |
| 415 | html("</div>"); | 414 | html("</div>"); |
| 416 | htmlf("<h2>Commits per author per %s", period->name); | 415 | htmlf("<h2>Commits per author per %s", period->name); |
| 417 | if (ctx->qry.path) { | 416 | if (ctx.qry.path) { |
| 418 | html(" (path '"); | 417 | html(" (path '"); |
| 419 | html_txt(ctx->qry.path); | 418 | html_txt(ctx.qry.path); |
| 420 | html("')"); | 419 | html("')"); |
| 421 | } | 420 | } |
| 422 | html("</h2>"); | 421 | html("</h2>"); |
| @@ -23,6 +23,6 @@ struct cgit_period { | |||
| 23 | extern int cgit_find_stats_period(const char *expr, struct cgit_period **period); | 23 | extern int cgit_find_stats_period(const char *expr, struct cgit_period **period); |
| 24 | extern const char *cgit_find_stats_periodname(int idx); | 24 | extern const char *cgit_find_stats_periodname(int idx); |
| 25 | 25 | ||
| 26 | extern void cgit_show_stats(struct cgit_context *ctx); | 26 | extern void cgit_show_stats(void); |
| 27 | 27 | ||
| 28 | #endif /* UI_STATS_H */ | 28 | #endif /* UI_STATS_H */ |
