aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--cgit.c35
-rw-r--r--scan-tree.c36
-rw-r--r--shared.c1
3 files changed, 34 insertions, 38 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) {
diff --git a/scan-tree.c b/scan-tree.c
index a429a9f..378d795 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -68,39 +68,6 @@ static char *xstrrchr(char *s, char *from, int c)
68 return from < s ? NULL : from; 68 return from < s ? NULL : from;
69} 69}
70 70
71static char *guess_defbranch(const char *repo_path)
72{
73 int fd, len;
74 char buffer[256];
75 char *ref_start;
76 char *head;
77
78 head = fmt("%s/HEAD", repo_path);
79 fd = open(head, O_RDONLY);
80 if (fd == -1)
81 return xstrdup("master");
82
83 memset(buffer, 0, sizeof(buffer));
84 len = read_in_full(fd, buffer, sizeof(buffer)-1);
85 close(fd);
86
87 if(!memcmp(buffer, "ref: refs/heads/", 16))
88 return xstrndup(buffer+16, len-17);
89
90 if(strlen(buffer) == 41) {
91 /* probably contains a SHA1 sum */
92 memset(buffer, 0, sizeof(buffer));
93 if(readlink(head, buffer, sizeof(buffer)-1)) {
94 ref_start = memmem(buffer, sizeof(buffer)-1, "refs/heads/", 11);
95 if(ref_start)
96 return xstrdup(ref_start+11);
97 }
98 }
99
100 return xstrdup("master");
101}
102
103
104static void add_repo(const char *base, const char *path, repo_config_fn fn) 71static void add_repo(const char *base, const char *path, repo_config_fn fn)
105{ 72{
106 struct stat st; 73 struct stat st;
@@ -138,9 +105,6 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
138 *p = '\0'; 105 *p = '\0';
139 repo->name = repo->url; 106 repo->name = repo->url;
140 repo->path = xstrdup(path); 107 repo->path = xstrdup(path);
141
142 repo->defbranch = guess_defbranch(repo->path);
143
144 while (!owner) { 108 while (!owner) {
145 if ((pwd = getpwuid(st.st_uid)) == NULL) { 109 if ((pwd = getpwuid(st.st_uid)) == NULL) {
146 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", 110 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n",
diff --git a/shared.c b/shared.c
index 699c362..9c839a9 100644
--- a/shared.c
+++ b/shared.c
@@ -56,7 +56,6 @@ struct cgit_repo *cgit_add_repo(const char *url)
56 ret->desc = "[no description]"; 56 ret->desc = "[no description]";
57 ret->owner = NULL; 57 ret->owner = NULL;
58 ret->section = ctx.cfg.section; 58 ret->section = ctx.cfg.section;
59 ret->defbranch = "master";
60 ret->snapshots = ctx.cfg.snapshots; 59 ret->snapshots = ctx.cfg.snapshots;
61 ret->enable_commit_graph = ctx.cfg.enable_commit_graph; 60 ret->enable_commit_graph = ctx.cfg.enable_commit_graph;
62 ret->enable_log_filecount = ctx.cfg.enable_log_filecount; 61 ret->enable_log_filecount = ctx.cfg.enable_log_filecount;