aboutsummaryrefslogtreecommitdiffstats
path: root/cgit.c
diff options
context:
space:
mode:
authorGravatar Lars Hjemli <hjemli@gmail.com>2011-06-21 03:59:10 (JST)
committerGravatar Lars Hjemli <hjemli@gmail.com>2011-06-21 03:59:10 (JST)
commite95c70d4ea997d1217d5c81cb3b640f3fa025df1 (patch)
tree36bb5cb276494ae1c7b813969f5381bffb06a3d4 /cgit.c
parentd711de55280c3c9c10cfda4e24c8f3b3015217b2 (diff)
downloadcgit-e95c70d4ea997d1217d5c81cb3b640f3fa025df1.zip
cgit-e95c70d4ea997d1217d5c81cb3b640f3fa025df1.tar.gz
Only guess default branch when a repo page is requested
There's no need to invoke guess_defbranch() for each repo during scan-path, since repo.defbranch is only used when repo content is being displayed. Also, some users prefer to register their projects manually in cgitrc but they got no benefit from the new repo.defbranch handling. This patch tries to rectify these issues by only invoking guess_defbranch() when needed, regardless of how the repo was registered. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'cgit.c')
-rw-r--r--cgit.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/cgit.c b/cgit.c
index b7807ad..e3fbbf4 100644
--- a/cgit.c
+++ b/cgit.c
@@ -416,6 +416,37 @@ char *find_default_branch(struct cgit_repo *repo)
416 return ref; 416 return ref;
417} 417}
418 418
419static char *guess_defbranch(const char *repo_path)
420{
421 int fd, len;
422 char buffer[256];
423 char *ref_start;
424 char *head;
425
426 head = fmt("%s/HEAD", repo_path);
427 fd = open(head, O_RDONLY);
428 if (fd == -1)
429 return xstrdup("master");
430
431 memset(buffer, 0, sizeof(buffer));
432 len = read_in_full(fd, buffer, sizeof(buffer) - 1);
433 close(fd);
434
435 if(!memcmp(buffer, "ref: refs/heads/", 16))
436 return xstrndup(buffer + 16, len - 17);
437
438 if(strlen(buffer) == 41) {
439 /* probably contains a SHA1 sum */
440 memset(buffer, 0, sizeof(buffer));
441 if(readlink(head, buffer, sizeof(buffer)-1)) {
442 ref_start = memmem(buffer, sizeof(buffer)-1, "refs/heads/", 11);
443 if(ref_start)
444 return xstrdup(ref_start+11);
445 }
446 }
447 return xstrdup("master");
448}
449
419static int prepare_repo_cmd(struct cgit_context *ctx) 450static int prepare_repo_cmd(struct cgit_context *ctx)
420{ 451{
421 char *tmp; 452 char *tmp;
@@ -442,10 +473,12 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
442 } 473 }
443 ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc); 474 ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc);
444 475
476 if (!ctx->repo->defbranch)
477 ctx->repo->defbranch = guess_defbranch(ctx->repo->path);
478
445 if (!ctx->qry.head) { 479 if (!ctx->qry.head) {
446 ctx->qry.nohead = 1; 480 ctx->qry.nohead = 1;
447 ctx->qry.head = find_default_branch(ctx->repo); 481 ctx->qry.head = find_default_branch(ctx->repo);
448 ctx->repo->defbranch = ctx->qry.head;
449 } 482 }
450 483
451 if (!ctx->qry.head) { 484 if (!ctx->qry.head) {