diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2008-01-04 13:43:40 +0100 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2008-01-04 13:43:40 +0100 | 
| commit | f80ff37a1706e6774ca21a3ce1fceeb17f89a37a (patch) | |
| tree | 49558c7d594c054a9523f332de33112853e2c125 | |
| parent | 620bb3e5e4ff87da740fe7232ba74330b5f862d4 (diff) | |
| download | cgit-f80ff37a1706e6774ca21a3ce1fceeb17f89a37a.tar.gz cgit-f80ff37a1706e6774ca21a3ce1fceeb17f89a37a.tar.bz2 | |
Handle missing default branch and error out on invalid branch names
When no branch is specified and the repository does not have a default branch,
use the first branch.
Also, print sensible errormessages when the repository does not contain any
branches and when invalid branchnames are specified.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
| -rw-r--r-- | cgit.c | 62 | 
1 files changed, 58 insertions, 4 deletions
| @@ -45,13 +45,44 @@ static int cgit_prepare_cache(struct cacheitem *item)  	return 1;  } +struct refmatch { +	char *req_ref; +	char *first_ref; +	int match; +}; + +int find_current_ref(const char *refname, const unsigned char *sha1, +		     int flags, void *cb_data) +{ +	struct refmatch *info; + +	info = (struct refmatch *)cb_data; +	if (!strcmp(refname, info->req_ref)) +		info->match = 1; +	if (!info->first_ref) +		info->first_ref = xstrdup(refname); +	return info->match; +} + +char *find_default_branch(struct repoinfo *repo) +{ +	struct refmatch info; + +	info.req_ref = repo->defbranch; +	info.first_ref = NULL; +	info.match = 0; +	for_each_branch_ref(find_current_ref, &info); +	if (info.match) +		return info.req_ref; +	else +		return info.first_ref; +} +  static void cgit_print_repo_page(struct cacheitem *item)  { -	char *title; +	char *title, *tmp;  	int show_search; - -	if (!cgit_query_head) -		cgit_query_head = cgit_repo->defbranch; +	unsigned char sha1[20];  	if (chdir(cgit_repo->path)) {  		title = fmt("%s - %s", cgit_root_title, "Bad request"); @@ -67,6 +98,29 @@ static void cgit_print_repo_page(struct cacheitem *item)  	show_search = 0;  	setenv("GIT_DIR", cgit_repo->path, 1); +	if (!cgit_query_head) { +		cgit_query_head = xstrdup(find_default_branch(cgit_repo)); +		cgit_repo->defbranch = cgit_query_head; +	} + +	if (!cgit_query_head) { +		cgit_print_docstart(title, item); +		cgit_print_pageheader(title, 0); +		cgit_print_error("Repository seems to be empty"); +		cgit_print_docend(); +		return; +	} + +	if (get_sha1(cgit_query_head, sha1)) { +		tmp = xstrdup(cgit_query_head); +		cgit_query_head = cgit_repo->defbranch; +		cgit_print_docstart(title, item); +		cgit_print_pageheader(title, 0); +		cgit_print_error(fmt("Invalid branch: %s", tmp)); +		cgit_print_docend(); +		return; +	} +  	if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) {  		cgit_print_snapshot(item, cgit_query_head, cgit_query_sha1,  				    cgit_repobasename(cgit_repo->url), | 
