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>
This commit is contained in:
Julius Plenz 2011-04-07 12:59:24 +02:00 committed by Lars Hjemli
parent b0d72da028
commit d711de5528
2 changed files with 38 additions and 1 deletions

View File

@ -377,7 +377,8 @@ repo.commit-filter::
repo.defbranch:: repo.defbranch::
The name of the default branch for this repository. If no such branch The name of the default branch for this repository. If no such branch
exists in the repository, the first branch name (when sorted) is used exists in the repository, the first branch name (when sorted) is used
as default instead. Default value: "master". as default instead. Default value: branch pointed to by HEAD, or
"master" if there is no suitable HEAD.
repo.desc:: repo.desc::
The value to show as repository description. Default value: none. The value to show as repository description. Default value: none.

View File

@ -68,6 +68,39 @@ static char *xstrrchr(char *s, char *from, int c)
return from < s ? NULL : from; return from < s ? NULL : from;
} }
static char *guess_defbranch(const char *repo_path)
{
int fd, len;
char buffer[256];
char *ref_start;
char *head;
head = fmt("%s/HEAD", repo_path);
fd = open(head, O_RDONLY);
if (fd == -1)
return xstrdup("master");
memset(buffer, 0, sizeof(buffer));
len = read_in_full(fd, buffer, sizeof(buffer)-1);
close(fd);
if(!memcmp(buffer, "ref: refs/heads/", 16))
return xstrndup(buffer+16, len-17);
if(strlen(buffer) == 41) {
/* probably contains a SHA1 sum */
memset(buffer, 0, sizeof(buffer));
if(readlink(head, buffer, sizeof(buffer)-1)) {
ref_start = memmem(buffer, sizeof(buffer)-1, "refs/heads/", 11);
if(ref_start)
return xstrdup(ref_start+11);
}
}
return xstrdup("master");
}
static void add_repo(const char *base, const char *path, repo_config_fn fn) static void add_repo(const char *base, const char *path, repo_config_fn fn)
{ {
struct stat st; struct stat st;
@ -105,6 +138,9 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
*p = '\0'; *p = '\0';
repo->name = repo->url; repo->name = repo->url;
repo->path = xstrdup(path); repo->path = xstrdup(path);
repo->defbranch = guess_defbranch(repo->path);
while (!owner) { while (!owner) {
if ((pwd = getpwuid(st.st_uid)) == NULL) { if ((pwd = getpwuid(st.st_uid)) == NULL) {
fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n",