about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJulius Plenz2011-04-07 12:59:24 +0200
committerLars Hjemli2011-06-20 20:42:19 +0200
commitd711de55280c3c9c10cfda4e24c8f3b3015217b2 (patch)
tree2e4a7d8dcaeefb4259756a16be04c40dee7ed49c
parentMerge branch 'stable' (diff)
downloadcgit-d711de55280c3c9c10cfda4e24c8f3b3015217b2.tar.gz
cgit-d711de55280c3c9c10cfda4e24c8f3b3015217b2.zip
guess default branch from HEAD
This is a saner alternative than hardcoding the default branch to be
"master". The add_repo() function will now check for a symbolic ref in
repo_path/HEAD. If there is a suitable one, overwrite repo->defbranch
with it. Note that you'll need to strip the newline from the file (->
len-17).

If HEAD is a symbolic link pointing directly to a branch below
refs/heads/, do a readlink() instead to find the ref name.

Signed-off-by: Julius Plenz <plenz@cis.fu-berlin.de>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-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",