summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2008-01-04 12:43:40 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-01-04 12:43:40 (UTC)
commitf80ff37a1706e6774ca21a3ce1fceeb17f89a37a (patch) (side-by-side diff)
tree49558c7d594c054a9523f332de33112853e2c125
parent620bb3e5e4ff87da740fe7232ba74330b5f862d4 (diff)
downloadcgit-f80ff37a1706e6774ca21a3ce1fceeb17f89a37a.zip
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>
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--cgit.c62
1 files changed, 58 insertions, 4 deletions
diff --git a/cgit.c b/cgit.c
index 9ca93a7..e8acc03 100644
--- a/cgit.c
+++ b/cgit.c
@@ -1,117 +1,171 @@
/* cgit.c: cgi for the git scm
*
* Copyright (C) 2006 Lars Hjemli
*
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
static int cgit_prepare_cache(struct cacheitem *item)
{
if (!cgit_repo && cgit_query_repo) {
char *title = fmt("%s - %s", cgit_root_title, "Bad request");
cgit_print_docstart(title, item);
cgit_print_pageheader(title, 0);
cgit_print_error(fmt("Unknown repo: %s", cgit_query_repo));
cgit_print_docend();
return 0;
}
if (!cgit_repo) {
item->name = xstrdup(fmt("%s/index.html", cgit_cache_root));
item->ttl = cgit_cache_root_ttl;
return 1;
}
if (!cgit_cmd) {
item->name = xstrdup(fmt("%s/%s/index.%s.html", cgit_cache_root,
cache_safe_filename(cgit_repo->url),
cache_safe_filename(cgit_querystring)));
item->ttl = cgit_cache_repo_ttl;
} else {
item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root,
cache_safe_filename(cgit_repo->url),
cgit_query_page,
cache_safe_filename(cgit_querystring)));
if (cgit_query_has_symref)
item->ttl = cgit_cache_dynamic_ttl;
else if (cgit_query_has_sha1)
item->ttl = cgit_cache_static_ttl;
else
item->ttl = cgit_cache_repo_ttl;
}
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");
cgit_print_docstart(title, item);
cgit_print_pageheader(title, 0);
cgit_print_error(fmt("Unable to scan repository: %s",
strerror(errno)));
cgit_print_docend();
return;
}
title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc);
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),
cgit_query_path,
cgit_repo->snapshots );
return;
}
if (cgit_cmd == CMD_PATCH) {
cgit_print_patch(cgit_query_sha1, item);
return;
}
if (cgit_cmd == CMD_BLOB) {
cgit_print_blob(item, cgit_query_sha1, cgit_query_path);
return;
}
show_search = (cgit_cmd == CMD_LOG);
cgit_print_docstart(title, item);
if (!cgit_cmd) {
cgit_print_pageheader("summary", show_search);
cgit_print_summary();
cgit_print_docend();
return;
}
cgit_print_pageheader(cgit_query_page, show_search);
switch(cgit_cmd) {
case CMD_LOG:
cgit_print_log(cgit_query_sha1, cgit_query_ofs,
cgit_max_commit_count, cgit_query_grep, cgit_query_search,
cgit_query_path, 1);
break;
case CMD_TREE:
cgit_print_tree(cgit_query_sha1, cgit_query_path);
break;
case CMD_COMMIT:
cgit_print_commit(cgit_query_sha1);
break;
case CMD_REFS:
cgit_print_refs();
break;
case CMD_TAG:
cgit_print_tag(cgit_query_sha1);
break;
case CMD_DIFF: