aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cgitrc.5.txt3
-rw-r--r--scan-tree.c36
2 files changed, 38 insertions, 1 deletions
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 4721c1e..c2c5680 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -377,7 +377,8 @@ repo.commit-filter::
377repo.defbranch:: 377repo.defbranch::
378 The name of the default branch for this repository. If no such branch 378 The name of the default branch for this repository. If no such branch
379 exists in the repository, the first branch name (when sorted) is used 379 exists in the repository, the first branch name (when sorted) is used
380 as default instead. Default value: "master". 380 as default instead. Default value: branch pointed to by HEAD, or
381 "master" if there is no suitable HEAD.
381 382
382repo.desc:: 383repo.desc::
383 The value to show as repository description. Default value: none. 384 The value to show as repository description. Default value: none.
diff --git a/scan-tree.c b/scan-tree.c
index 378d795..a429a9f 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -68,6 +68,39 @@ 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
71static void add_repo(const char *base, const char *path, repo_config_fn fn) 104static void add_repo(const char *base, const char *path, repo_config_fn fn)
72{ 105{
73 struct stat st; 106 struct stat st;
@@ -105,6 +138,9 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
105 *p = '\0'; 138 *p = '\0';
106 repo->name = repo->url; 139 repo->name = repo->url;
107 repo->path = xstrdup(path); 140 repo->path = xstrdup(path);
141
142 repo->defbranch = guess_defbranch(repo->path);
143
108 while (!owner) { 144 while (!owner) {
109 if ((pwd = getpwuid(st.st_uid)) == NULL) { 145 if ((pwd = getpwuid(st.st_uid)) == NULL) {
110 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", 146 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n",