aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Julius Plenz <plenz@cis.fu-berlin.de>2011-04-07 19:59:24 (JST)
committerGravatar Lars Hjemli <hjemli@gmail.com>2011-06-21 03:42:19 (JST)
commitd711de55280c3c9c10cfda4e24c8f3b3015217b2 (patch)
tree2e4a7d8dcaeefb4259756a16be04c40dee7ed49c
parentb0d72da02850abaf4be65ff220774a457c214651 (diff)
downloadcgit-d711de55280c3c9c10cfda4e24c8f3b3015217b2.zip
cgit-d711de55280c3c9c10cfda4e24c8f3b3015217b2.tar.gz
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",