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
کامیت شده توسط Lars Hjemli
والد b0d72da028
کامیت d711de5528
2فایلهای تغییر یافته به همراه38 افزوده شده و 1 حذف شده

مشاهده پرونده

@ -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.

مشاهده پرونده

@ -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",