wires

about summary refs log tree commit diff
path: root/cgit.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cgit.c67
-rw-r--r--cgit.css64
2 files changed, 97 insertions, 34 deletions
diff --git a/cgit.c b/cgit.c
index 142e416..e8acc03 100644
--- a/cgit.c
+++ b/cgit.c
@@ -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),
@@ -75,6 +129,11 @@ static void cgit_print_repo_page(struct cacheitem *item)
 		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;
diff --git a/cgit.css b/cgit.css
index 1b2e9d6..17c2712 100644
--- a/cgit.css
+++ b/cgit.css
@@ -8,7 +8,7 @@ body {
 	font-size: 10pt;
 	color: #333;
 	background: white;
-	padding-left: 4px;
+	padding: 4px;
 }
 
 table {
@@ -78,29 +78,39 @@ img {
 	border: none;
 }
 
-div#sidebar {
+table#layout {
+	border-collapse: collapse;
+	border: none;
+	margin: 0px;
+}
+
+td#sidebar {
 	vertical-align: top;
 	width: 162px;
 	padding: 0px 0px 0px 0px;
-	margin: 4px;
-	float: left;
+	margin: 0px;
 }
 
-div#logo {
+td#sidebar table {
+	border-collapse: separate;
+	border-spacing: 0px;
 	margin: 0px;
-	padding: 4px 0px 4px 0px;
-	text-align: center;
+	padding: 0px;
 	background-color: #ccc;
+}
+
+td#sidebar table.sidebar td.sidebar {
+	padding: 4px;
 	border-top: solid 1px #eee;
 	border-left: solid 1px #eee;
 	border-right: solid 1px #aaa;
 	border-bottom: solid 1px #aaa;
 }
 
-div#sidebar div.infobox {
-	margin: 0px 0px 0px 0px;
-	padding: 0.5em;
-	text-align: left;
+div#logo {
+	margin: 0px;
+	padding: 4px 0px 4px 0px;
+	text-align: center;
 	background-color: #ccc;
 	border-top: solid 1px #eee;
 	border-left: solid 1px #eee;
@@ -108,50 +118,44 @@ div#sidebar div.infobox {
 	border-bottom: solid 1px #aaa;
 }
 
-div#sidebar div.infobox h1 {
-	font-size: 11pt;
+td#sidebar h1 {
+	font-size: 10pt;
 	font-weight: bold;
-	margin: 0px;
+	margin: 8px 0px 0px 0px;
 }
 
-div#sidebar div.infobox a.menu {
+td#sidebar h1.first {
+	margin-top: 0px;
+}
+
+td#sidebar a.menu {
 	display: block;
 	background-color: #ccc;
 	padding: 0.1em 0.5em;
 	text-decoration: none;
 }
 
-div#sidebar div.infobox a.menu:hover {
+td#sidebar a.menu:hover {
 	background-color: #bbb;
 	text-decoration: none;
 }
 
-div#sidebar div.infobox select {
+td#sidebar select {
 	width: 100%;
-	border: solid 1px #aaa;
-	background-color: #bbb;
 	margin: 2px 0px 0px 0px;
-	padding: 0px;
 }
 
-td#branch-dropdown-cell {
-	width: 99%;
+td#sidebar form {
+	text-align: right;
 }
 
 input#switch-btn {
-	width: 20px;
-	border: solid 1px #aaa;
-	background-color: #bbb;
 	margin: 2px 0px 0px 0px;
-	padding: 0px;
 }
 
-div#sidebar div.infobox input.txt {
+td#sidebar input.txt {
 	width: 100%;
-	border: solid 1px #aaa;
-	background-color: #bbb;
 	margin: 2px 0px 0px 0px;
-	padding: 0;
 }
 
 table#grid {