diff options
| -rw-r--r-- | cgit.css | 190 | ||||
| -rw-r--r-- | cgit.h | 7 | ||||
| -rw-r--r-- | cgit.png | bin | 5406 -> 1840 bytes | |||
| -rw-r--r-- | ui-commit.c | 14 | ||||
| -rw-r--r-- | ui-repolist.c | 51 | ||||
| -rw-r--r-- | ui-shared.c | 154 | ||||
| -rw-r--r-- | ui-shared.h | 2 | 
7 files changed, 238 insertions, 180 deletions
| @@ -11,142 +11,141 @@ body {  	padding: 4px;  } +a { +	color: blue; +	text-decoration: none; +} + +a:hover { +	text-decoration: underline; +} +  table {        border-collapse: collapse;  } -h2 { -	font-size: 120%; -	font-weight: bold; -	margin-top: 0em; -	margin-bottom: 0.25em; +table#header { +	width: 100%; +	margin-bottom: 1em;  } -h3 { -	margin-top: 0em; -	font-size: 100%; -	font-weight: normal; +table#header td.logo { +	width: 96px;  } -h4 { -	margin-top: 1.5em; -	margin-bottom: 0.1em; -	font-size: 100%; -	font-weight: bold; +table#header td.main { +	font-size: 250%; +	padding-left: 10px;  } -a { -	color: #600; -	text-decoration: none; +table#header td.main a { +	color: #000;  } -a:hover { -	background-color: #ddd; -	text-decoration: none; +table#header td.form { +	text-align: right; +	vertical-align: bottom; +	padding-right: 1em; +	padding-bottom: 2px;  } -table.list { -	border: none; -	border-collapse: collapse; +table#header td.form form, +table#header td.form input, +table#header td.form select { +	font-size: 90%;  } -table.list tr { -	background: white; +table#header td.sub { +	color: #777; +	border-top: solid 1px #ccc; +	padding-left: 10px;  } -table.list tr:hover { -	background: #f8f8f8; +table.tabs { +	/* border-bottom: solid 2px #ccc; */ +	border-collapse: collapse; +	margin-top: 2em; +	margin-bottom: 0px; +	width: 100%;  } -table.list tr.nohover:hover { -	background: white; +table.tabs td { +	padding: 0px 1em; +	vertical-align: bottom;  } -table.list th { -	font-weight: bold; -	border-bottom: solid 1px #777; -	padding: 0.1em 0.5em 0.1em 0.5em; -	vertical-align: baseline; +table.tabs td a { +	padding: 2px 0.75em; +	color: #777; +	font-size: 110%;  } -table.list td { -	border: none; -	padding: 0.1em 0.5em 0.1em 0.5em; +table.tabs td a.active { +	color: #000; +	background-color: #ccc;  } -img { -	border: none; +table.tabs td.form { +	text-align: right;  } -table#layout { -	border-collapse: collapse; -	border: none; -	margin: 0px; +table.tabs td.form form { +	padding-bottom: 2px; +	font-size: 90%;  } -td#sidebar { -	vertical-align: top; -	width: 162px; -	padding: 0px 0px 0px 0px; -	margin: 0px; +table.tabs td.form input, +table.tabs td.form select { +	font-size: 90%;  } -td#sidebar table { -	border-collapse: separate; -	border-spacing: 0px; +div.content {  	margin: 0px; -	padding: 0px; -	background-color: #ccc; +	padding: 2em; +	border-top: solid 3px #ccc; +	border-bottom: solid 3px #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; + +table.list { +	width: 100%; +	border: none; +	border-collapse: collapse;  } -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; -	border-right: solid 1px #aaa; -	border-bottom: solid 1px #aaa; +table.list tr { +	background: white;  } -td#sidebar h1 { -	font-size: 10pt; -	font-weight: bold; -	margin: 8px 0px 0px 0px; +table.list tr:hover { +	background: #eee;  } -td#sidebar h1.first { -	margin-top: 0px; +table.list tr.nohover:hover { +	background: white;  } -td#sidebar a.menu { -	display: block; -	background-color: #ccc; -	padding: 0.1em 0.5em; -	text-decoration: none; +table.list th { +	font-weight: bold; +	/* color: #888; +	border-top: dashed 1px #888; +	border-bottom: dashed 1px #888; +	*/ +	padding: 0.1em 0.5em 0.05em 0.5em; +	vertical-align: baseline;  } -td#sidebar a.menu:hover { -	background-color: #bbb; -	text-decoration: none; +table.list td { +	border: none; +	padding: 0.1em 0.5em 0.1em 0.5em;  } -td#sidebar select { -	width: 100%; -	margin: 2px 0px 0px 0px; +table.list td a { +	color: black;  } -td#sidebar form { -	text-align: right; +img { +	border: none;  }  input#switch-btn { @@ -201,14 +200,13 @@ a.ls-blob, a.ls-dir, a.ls-mod {  td.ls-size {  	text-align: right; -} - -td.ls-size {  	font-family: monospace; +	width: 10em;  }  td.ls-mode {  	font-family: monospace; +	width: 10em;  }  table.blob { @@ -357,7 +355,7 @@ table.diff td {  table.diff td div.head {  	font-weight: bold;  	margin-top: 1em; -	background-color: #eee; +	color: black;  }  table.diff td div.hunk { @@ -392,17 +390,17 @@ table.list td.repogroup {  a.button {  	font-size: 80%; -	color: #aaa; +	color: #33c; +/*  	background-color: #eee;  	border: solid 1px #aaa; -	padding: 0em 0.5em;  	margin: 0.1em 0.25em; +*/ +	padding: 0em 0.5em;  }  a.button:hover { -	text-decoration: none; -	color: #333; -	background-color: #ccc; +	text-decoration: underline;  }  a.primary { @@ -221,4 +221,11 @@ extern const char *cgit_repobasename(const char *reponame);  extern int cgit_parse_snapshots_mask(const char *str); +/* libgit.a either links against or compiles its own implementation of + * strcasestr(), and we'd like to reuse it. Simply re-declaring it + * seems to do the trick. + */ +extern char *strcasestr(const char *haystack, const char *needle); + +  #endif /* CGIT_H */Binary files differ diff --git a/ui-commit.c b/ui-commit.c index 8019e36..dd36cc0 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -9,6 +9,7 @@  #include "cgit.h"  #include "html.h"  #include "ui-shared.h" +#include "ui-diff.h"  static int files, slots;  static int total_adds, total_rems, max_changes; @@ -174,6 +175,12 @@ void cgit_print_commit(char *hex)  	html("</td><td class='right'>");  	cgit_print_date(info->committer_date, FMT_LONGDATE);  	html("</td></tr>\n"); +	html("<tr><th>commit</th><td colspan='2' class='sha1'>"); +	tmp = sha1_to_hex(commit->object.sha1); +	cgit_commit_link(tmp, NULL, NULL, ctx.qry.head, tmp); +	html(" ("); +	cgit_patch_link("patch", NULL, NULL, NULL, tmp); +	html(")</td></tr>\n");  	html("<tr><th>tree</th><td colspan='2' class='sha1'>");  	tmp = xstrdup(hex);  	cgit_tree_link(sha1_to_hex(commit->tree->object.sha1), NULL, NULL, @@ -218,10 +225,11 @@ void cgit_print_commit(char *hex)  			print_fileinfo(&items[i]);  		html("</table>");  		html("<div class='diffstat-summary'>"); -		htmlf("%d files changed, %d insertions, %d deletions (", +		htmlf("%d files changed, %d insertions, %d deletions",  		      files, total_adds, total_rems); -		cgit_diff_link("show diff", NULL, NULL, ctx.qry.head, hex, -			       NULL, NULL); +		cgit_print_diff(ctx.qry.sha1, +				sha1_to_hex(commit->parents->item->object.sha1), +				NULL);  		html(")</div>");  	}  	cgit_free_commitinfo(info); diff --git a/ui-repolist.c b/ui-repolist.c index eeeaf3d..7a7e95a 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -44,20 +44,23 @@ static void print_modtime(struct cgit_repo *repo)  	cgit_print_age(s.st_mtime, -1, NULL);  } -void cgit_print_repolist() +int is_match(struct cgit_repo *repo)  { -	int i, columns = 4; -	char *last_group = NULL; - -	if (ctx.cfg.enable_index_links) -		columns++; - -	ctx.page.title = ctx.cfg.root_title; -	cgit_print_http_headers(&ctx); -	cgit_print_docstart(&ctx); -	cgit_print_pageheader(&ctx); +	if (!ctx.qry.search) +		return 1; +	if (repo->url && strcasestr(repo->url, ctx.qry.search)) +		return 1; +	if (repo->name && strcasestr(repo->name, ctx.qry.search)) +		return 1; +	if (repo->desc && strcasestr(repo->desc, ctx.qry.search)) +		return 1; +	if (repo->owner && strcasestr(repo->owner, ctx.qry.search)) +		return 1; +	return 0; +} -	html("<table summary='repository list' class='list nowrap'>"); +void print_header(int columns) +{  	if (ctx.cfg.index_header) {  		htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>",  		      columns); @@ -70,11 +73,31 @@ void cgit_print_repolist()  	     "<th class='left'>Owner</th>"  	     "<th class='left'>Idle</th>");  	if (ctx.cfg.enable_index_links) -		html("<th>Links</th>"); +		html("<th class='left'>Links</th>");  	html("</tr>\n"); +} +void cgit_print_repolist() +{ +	int i, columns = 4, hits = 0, header = 0; +	char *last_group = NULL; + +	if (ctx.cfg.enable_index_links) +		columns++; + +	ctx.page.title = ctx.cfg.root_title; +	cgit_print_http_headers(&ctx); +	cgit_print_docstart(&ctx); +	cgit_print_pageheader(&ctx); + +	html("<table summary='repository list' class='list nowrap'>");  	for (i=0; i<cgit_repolist.count; i++) {  		ctx.repo = &cgit_repolist.repos[i]; +		if (!is_match(ctx.repo)) +			continue; +		if (!header++) +			print_header(columns); +		hits++;  		if ((last_group == NULL && ctx.repo->group != NULL) ||  		    (last_group != NULL && ctx.repo->group == NULL) ||  		    (last_group != NULL && ctx.repo->group != NULL && @@ -110,5 +133,7 @@ void cgit_print_repolist()  		html("</tr>\n");  	}  	html("</table>"); +	if (!hits) +		cgit_print_error("No repositories found");  	cgit_print_docend();  } diff --git a/ui-shared.c b/ui-shared.c index aa65988..bb08c4a 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -7,6 +7,7 @@   */  #include "cgit.h" +#include "cmd.h"  #include "html.h"  const char cgit_doctype[] = @@ -388,7 +389,7 @@ void cgit_print_docstart(struct cgit_context *ctx)  void cgit_print_docend()  { -	html("</td>\n</tr>\n</table>\n</body>\n</html>\n"); +	html("</div>\n</body>\n</html>\n");  }  int print_branch_option(const char *refname, const unsigned char *sha1, @@ -465,75 +466,83 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page)  	}  } +char *hc(struct cgit_cmd *cmd, const char *page) +{ +	return (strcmp(cmd->name, page) ? NULL : "active"); +} +  void cgit_print_pageheader(struct cgit_context *ctx)  { -	static const char *default_info = "This is cgit, a fast webinterface for git repositories"; -	int header = 0; -	char *url; +	struct cgit_cmd *cmd = cgit_get_cmd(ctx); -	html("<table id='layout' summary=''>\n"); -	html("<tr><td id='sidebar'>\n"); -	html("<table class='sidebar' cellspacing='0' summary=''>\n"); -	html("<tr><td class='sidebar'>\n<a href='"); -	html_attr(cgit_rooturl()); -	htmlf("'><img src='%s' alt='cgit'/></a>\n", -	      ctx->cfg.logo); -	html("</td></tr>\n<tr><td class='sidebar'>\n"); -	if (ctx->repo) { -		html("<h1 class='first'>"); -		html_txt(strrpart(ctx->repo->name, 20)); -		html("</h1>\n"); -		html_txt(ctx->repo->desc); -		if (ctx->repo->owner) { -			html("<h1>owner</h1>\n"); -			html_txt(ctx->repo->owner); -		} -		html("<h1>navigate</h1>\n"); -		reporevlink(NULL, "summary", NULL, "menu", ctx->qry.head, -			    NULL, NULL); -		cgit_log_link("log", NULL, "menu", ctx->qry.head, NULL, NULL, -			      0, NULL, NULL); -		cgit_tree_link("tree", NULL, "menu", ctx->qry.head, -			       ctx->qry.sha1, NULL); -		cgit_commit_link("commit", NULL, "menu", ctx->qry.head, -			      ctx->qry.sha1); -		cgit_diff_link("diff", NULL, "menu", ctx->qry.head, -			       ctx->qry.sha1, ctx->qry.sha2, NULL); -		cgit_patch_link("patch", NULL, "menu", ctx->qry.head, -				ctx->qry.sha1); - -		for_each_ref(print_archive_ref, &header); - -		if (ctx->repo->clone_url || ctx->cfg.clone_prefix) { -			html("<h1>clone</h1>\n"); -			if (ctx->repo->clone_url) -				url = ctx->repo->clone_url; -			else -				url = fmt("%s%s", ctx->cfg.clone_prefix, -					  ctx->repo->url); -			html("<a class='menu' href='"); -			html_attr(url); -			html("' title='"); -			html_attr(url); -			html("'>\n"); -			html_txt(strrpart(url, 20)); -			html("</a>\n"); -		} +	html("<table id='header'>\n"); +	html("<tr>\n"); +	html("<td class='logo' rowspan='2'><a href='"); +	if (ctx->cfg.logo_link) +		html_attr(ctx->cfg.logo_link); +	else +		html_attr(cgit_rooturl()); +	html("'><img src='"); +	html_attr(ctx->cfg.logo); +	html("'/></a></td>\n"); -		html("<h1>branch</h1>\n"); +	html("<td class='main'>"); +	if (ctx->repo) { +/* +		html("<a href='"); +		html_attr(cgit_rooturl()); +		html("'>index</a> : "); +*/ +		reporevlink(NULL, ctx->repo->name, NULL, hc(cmd, "summary"), +			    ctx->qry.head, NULL, NULL); +		html(" : "); +		html_txt(ctx->qry.page); +		html("</td><td class='form'>");  		html("<form method='get' action=''>\n");  		add_hidden_formfields(0, 1, ctx->qry.page); -//		html("<table summary='branch selector' class='grid'><tr><td id='branch-dropdown-cell'>");  		html("<select name='h' onchange='this.form.submit();'>\n");  		for_each_branch_ref(print_branch_option, ctx->qry.head); -		html("</select>\n"); -//		html("</td><td>"); -		html("<noscript><input type='submit' id='switch-btn' value='switch'/></noscript>\n"); -//		html("</td></tr></table>"); -		html("</form>\n"); +		html("</select> "); +		html("<input type='submit' name='' value='switch'/>"); +		html("</form>"); +	} else +		html_txt(ctx->cfg.root_title); +	html("</td>\n"); + +	html("<tr><td class='sub'"); +	if (ctx->repo) { +		html(" colspan='2'>"); +		html_txt(ctx->repo->desc); +	} +/* +	else if (ctx->cfg.root_subtitle) +		html_txt(ctx->cfg.root_subtitle); +*/ +	else { +		html(">"); +		html_txt("a fast webinterface for the git dscm"); +	} +	html("</td></tr>\n"); -		html("<h1>search</h1>\n"); -		html("<form method='get' action='"); +	html("</tr>\n"); +	html("</table>\n"); + +	html("<table class='tabs'><tr><td>\n"); +	if (ctx->repo) { +		reporevlink(NULL, "summary", NULL, hc(cmd, "summary"), +			    ctx->qry.head, NULL, NULL); +		cgit_refs_link("refs", NULL, hc(cmd, "refs"), ctx->qry.head, +			       ctx->qry.sha1, NULL); +		cgit_log_link("log", NULL, hc(cmd, "log"), ctx->qry.head, +			      NULL, NULL, 0, NULL, NULL); +		cgit_tree_link("tree", NULL, hc(cmd, "tree"), ctx->qry.head, +			       ctx->qry.sha1, NULL); +		cgit_commit_link("commit", NULL, hc(cmd, "commit"), +				 ctx->qry.head, ctx->qry.sha1); +		cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, +			       ctx->qry.sha1, ctx->qry.sha2, NULL); +		html("</td><td class='form'>"); +		html("<form class='right' method='get' action='");  		if (ctx->cfg.virtual_root)  			html_attr(cgit_fileurl(ctx->qry.repo, "log",  					       ctx->qry.path, NULL)); @@ -544,18 +553,27 @@ void cgit_print_pageheader(struct cgit_context *ctx)  		html_option("author", "author", ctx->qry.grep);  		html_option("committer", "committer", ctx->qry.grep);  		html("</select>\n"); -		html("<input class='txt' type='text' name='q' value='"); +		html("<input class='txt' type='text' size='10' name='q' value='");  		html_attr(ctx->qry.search);  		html("'/>\n"); +		html("<input type='submit' value='search'/>\n");  		html("</form>\n");  	} else { -		if (!ctx->cfg.index_info || html_include(ctx->cfg.index_info)) -			html(default_info); +		html("<a class='active' href='"); +		html_attr(cgit_rooturl()); +		html("'>index</a>\n"); +		html("</td><td class='form'>"); +		html("<form method='get' action='"); +		html_attr(cgit_rooturl()); +		html("'>\n"); +		html("<input type='text' name='q' size='10' value='"); +		html_attr(ctx->qry.search); +		html("'/>\n"); +		html("<input type='submit' value='search'/>\n"); +		html("</form>");  	} - -	html("</td></tr></table></td>\n"); - -	html("<td id='content'>\n"); +	html("</td></tr></table>\n"); +	html("<div class='content'>");  }  void cgit_print_filemode(unsigned short mode) diff --git a/ui-shared.h b/ui-shared.h index 94de884..76c2b1f 100644 --- a/ui-shared.h +++ b/ui-shared.h @@ -14,6 +14,8 @@ extern void cgit_log_link(char *name, char *title, char *class, char *head,  			  char *pattern);  extern void cgit_commit_link(char *name, char *title, char *class, char *head,  			     char *rev); +extern void cgit_patch_link(char *name, char *title, char *class, char *head, +			    char *rev);  extern void cgit_refs_link(char *name, char *title, char *class, char *head,  			   char *rev, char *path);  extern void cgit_snapshot_link(char *name, char *title, char *class, | 
