From f135569b2be3fb1816f802f9a162b3743b735d1c Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sat, 12 Apr 2008 15:53:31 +0200 Subject: Replace sidebar/logo This replaces the sidebar with a more 'common' header layout and also updates the logo. Not quite finished yet, though. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.css | 147 ++++++++++++++++++++++-------------------------------------- cgit.png | Bin 5406 -> 1840 bytes ui-shared.c | 125 ++++++++++++++++++--------------------------------- 3 files changed, 97 insertions(+), 175 deletions(-) diff --git a/cgit.css b/cgit.css index 17c2712..67cf48e 100644 --- a/cgit.css +++ b/cgit.css @@ -11,41 +11,67 @@ 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: 200%; } -a { - color: #600; - text-decoration: none; +table#header td.sub { + color: #777; + border-top: solid 1px #ccc; } -a:hover { - background-color: #ddd; - text-decoration: none; +table.tabs { + border-bottom: solid 2px #ccc; + border-collapse: collapse; + margin-top: 2em; + margin-bottom: 1em; + width: 100%; +} + +table.tabs td { + padding: 0px 0.5em; +} + +table.tabs td a { + padding: 2px 1em; + color: #007; +} + +table.tabs td a.active { + color: #000; + background-color: #ccc; } +div.content { + margin: 0px; + padding: 1em; +} + + table.list { + width: 100%; border: none; border-collapse: collapse; } @@ -55,7 +81,7 @@ table.list tr { } table.list tr:hover { - background: #f8f8f8; + background: #eee; } table.list tr.nohover:hover { @@ -63,8 +89,8 @@ table.list tr.nohover:hover { } table.list th { - font-weight: bold; - border-bottom: solid 1px #777; + font-weight: normal; + border-bottom: solid 1px #ccc; padding: 0.1em 0.5em 0.1em 0.5em; vertical-align: baseline; } @@ -74,79 +100,12 @@ table.list td { padding: 0.1em 0.5em 0.1em 0.5em; } -img { - border: none; +table.list td a { + color: black; } -table#layout { - border-collapse: collapse; +img { border: none; - margin: 0px; -} - -td#sidebar { - vertical-align: top; - width: 162px; - padding: 0px 0px 0px 0px; - margin: 0px; -} - -td#sidebar table { - border-collapse: separate; - border-spacing: 0px; - margin: 0px; - 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#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; -} - -td#sidebar h1 { - font-size: 10pt; - font-weight: bold; - margin: 8px 0px 0px 0px; -} - -td#sidebar h1.first { - margin-top: 0px; -} - -td#sidebar a.menu { - display: block; - background-color: #ccc; - padding: 0.1em 0.5em; - text-decoration: none; -} - -td#sidebar a.menu:hover { - background-color: #bbb; - text-decoration: none; -} - -td#sidebar select { - width: 100%; - margin: 2px 0px 0px 0px; -} - -td#sidebar form { - text-align: right; } input#switch-btn { @@ -357,7 +316,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 { diff --git a/cgit.png b/cgit.png index 22f7e95..d7f70bc 100644 Binary files a/cgit.png and b/cgit.png differ diff --git a/ui-shared.c b/ui-shared.c index aa65988..7287956 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[] = @@ -465,97 +466,59 @@ 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("<table id='header'>\n"); + html("<tr>\n"); + html("<td class='logo' rowspan='2'><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("'><img src='"); + html_attr(ctx->cfg.logo); + html("'/></a></td>\n"); + html("<td class='main'>"); + if (ctx->repo) + html_txt(ctx->repo->name); + else + html_txt(ctx->cfg.root_title); + html("</td></tr>\n"); + html("<tr><td class='sub'>"); + if (ctx->repo) 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, + else + html_txt(ctx->cfg.index_info); + html("</td></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_commit_link("commit", NULL, "menu", ctx->qry.head, - ctx->qry.sha1); - cgit_diff_link("diff", NULL, "menu", ctx->qry.head, + 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); - cgit_patch_link("patch", NULL, "menu", ctx->qry.head, + cgit_patch_link("patch", NULL, hc(cmd, "patch"), 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("<h1>branch</h1>\n"); - 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("<h1>search</h1>\n"); - html("<form method='get' action='"); - if (ctx->cfg.virtual_root) - html_attr(cgit_fileurl(ctx->qry.repo, "log", - ctx->qry.path, NULL)); - html("'>\n"); - add_hidden_formfields(1, 0, "log"); - html("<select name='qt'>\n"); - html_option("grep", "log msg", ctx->qry.grep); - 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_attr(ctx->qry.search); - html("'/>\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></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) -- cgit 1.4.1 From 89aa3c0d0a4c6d9885272602005975b763ea1604 Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sat, 12 Apr 2008 15:53:53 +0200 Subject: Include diff in commit view Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- ui-commit.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ui-commit.c b/ui-commit.c index 8019e36..c2fafd7 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; @@ -218,10 +219,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); -- cgit 1.4.1 From 7c0d2d9fbd3a29d295c8067f7798507853759eae Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sat, 12 Apr 2008 19:59:41 +0200 Subject: Add fixed link to index page from repo header This makes it easier to get back to the index page, and also re-enables the usage of logo-link in cgitrc. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- ui-shared.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ui-shared.c b/ui-shared.c index 7287956..03d147f 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -478,14 +478,20 @@ void cgit_print_pageheader(struct cgit_context *ctx) html("<table id='header'>\n"); html("<tr>\n"); html("<td class='logo' rowspan='2'><a href='"); - html_attr(cgit_rooturl()); + 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("<td class='main'>"); - if (ctx->repo) + if (ctx->repo) { + html("<a href='"); + html_attr(cgit_rooturl()); + html("'>index</a> / "); html_txt(ctx->repo->name); - else + } else html_txt(ctx->cfg.root_title); html("</td></tr>\n"); html("<tr><td class='sub'>"); -- cgit 1.4.1 From 68cb84839f8fbc20688b22202489f4c2a54d3f55 Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sat, 12 Apr 2008 20:11:49 +0200 Subject: Reintroduce the branch switcher Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.css | 10 ++++++++++ ui-shared.c | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/cgit.css b/cgit.css index 67cf48e..80680c9 100644 --- a/cgit.css +++ b/cgit.css @@ -52,6 +52,7 @@ table.tabs { table.tabs td { padding: 0px 0.5em; + vertical-align: bottom; } table.tabs td a { @@ -64,6 +65,15 @@ table.tabs td a.active { background-color: #ccc; } +table.tabs td.branch { + text-align: right; +} + +table.tabs td.branch form { + padding-bottom: 2px; + font-size: 90%; +} + div.content { margin: 0px; padding: 1em; diff --git a/ui-shared.c b/ui-shared.c index 03d147f..73e3d4c 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -518,6 +518,13 @@ void cgit_print_pageheader(struct cgit_context *ctx) ctx->qry.sha1, ctx->qry.sha2, NULL); cgit_patch_link("patch", NULL, hc(cmd, "patch"), ctx->qry.head, ctx->qry.sha1); + html("</td><td class='branch'>"); + html("<form method='get' action=''>\n"); + add_hidden_formfields(0, 1, ctx->qry.page); + html("<select name='h' onchange='this.form.submit();'>\n"); + for_each_branch_ref(print_branch_option, ctx->qry.head); + html("</select> "); + html("<input type='submit' name='' value='switch'/>"); } else { html("<a class='active' href='"); html_attr(cgit_rooturl()); -- cgit 1.4.1 From 72a69b77e7bf10cc3674e61e1ddd4d81618ee533 Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sat, 12 Apr 2008 20:18:16 +0200 Subject: Minor fixup in tree-view css Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cgit.css b/cgit.css index 80680c9..e06fdea 100644 --- a/cgit.css +++ b/cgit.css @@ -170,14 +170,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 { -- cgit 1.4.1 From 931fc6d1e4986a4566647dda16af09bf69a28b89 Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sun, 13 Apr 2008 10:57:11 +0200 Subject: More layout fixes Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.css | 64 ++++++++++++++++++++++++++++++++++++++++++---------------- ui-repolist.c | 2 +- ui-shared.c | 65 +++++++++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 98 insertions(+), 33 deletions(-) diff --git a/cgit.css b/cgit.css index e06fdea..8f3d00c 100644 --- a/cgit.css +++ b/cgit.css @@ -34,30 +34,50 @@ table#header td.logo { } table#header td.main { - font-size: 200%; + font-size: 250%; + padding-left: 10px; +} + +table#header td.main a { + color: #000; +} + +table#header td.form { + text-align: right; + vertical-align: bottom; + padding-right: 1em; + padding-bottom: 2px; +} + +table#header td.form form, +table#header td.form input, +table#header td.form select { + font-size: 90%; } table#header td.sub { color: #777; border-top: solid 1px #ccc; + padding-left: 10px; } table.tabs { - border-bottom: solid 2px #ccc; + /* border-bottom: solid 2px #ccc; */ border-collapse: collapse; margin-top: 2em; - margin-bottom: 1em; + margin-bottom: 0px; width: 100%; } table.tabs td { - padding: 0px 0.5em; + padding: 0px 1em; vertical-align: bottom; } table.tabs td a { - padding: 2px 1em; - color: #007; + padding: 2px 0.75em; + color: #777; + font-size: 110%; } table.tabs td a.active { @@ -65,18 +85,25 @@ table.tabs td a.active { background-color: #ccc; } -table.tabs td.branch { +table.tabs td.form { text-align: right; } -table.tabs td.branch form { +table.tabs td.form form { padding-bottom: 2px; font-size: 90%; } +table.tabs td.form input, +table.tabs td.form select { + font-size: 90%; +} + div.content { margin: 0px; - padding: 1em; + padding: 2em; + border-top: solid 3px #ccc; + border-bottom: solid 3px #ccc; } @@ -99,9 +126,12 @@ table.list tr.nohover:hover { } table.list th { - font-weight: normal; - border-bottom: solid 1px #ccc; - padding: 0.1em 0.5em 0.1em 0.5em; + 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; } @@ -360,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 { diff --git a/ui-repolist.c b/ui-repolist.c index eeeaf3d..9eba222 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -70,7 +70,7 @@ 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"); for (i=0; i<cgit_repolist.count; i++) { diff --git a/ui-shared.c b/ui-shared.c index 73e3d4c..782caa7 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -389,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, @@ -485,21 +485,46 @@ void cgit_print_pageheader(struct cgit_context *ctx) html("'><img src='"); html_attr(ctx->cfg.logo); html("'/></a></td>\n"); + html("<td class='main'>"); if (ctx->repo) { +/* html("<a href='"); html_attr(cgit_rooturl()); - html("'>index</a> / "); - html_txt(ctx->repo->name); + 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("<select name='h' onchange='this.form.submit();'>\n"); + for_each_branch_ref(print_branch_option, ctx->qry.head); + html("</select> "); + html("<input type='submit' name='' value='switch'/>"); + html("</form>"); } else html_txt(ctx->cfg.root_title); - html("</td></tr>\n"); - html("<tr><td class='sub'>"); - if (ctx->repo) + html("</td>\n"); + + html("<tr><td class='sub'"); + if (ctx->repo) { + html(" colspan='2'>"); html_txt(ctx->repo->desc); - else - html_txt(ctx->cfg.index_info); + } +/* + 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("</tr>\n"); html("</table>\n"); html("<table class='tabs'><tr><td>\n"); @@ -518,13 +543,23 @@ void cgit_print_pageheader(struct cgit_context *ctx) ctx->qry.sha1, ctx->qry.sha2, NULL); cgit_patch_link("patch", NULL, hc(cmd, "patch"), ctx->qry.head, ctx->qry.sha1); - html("</td><td class='branch'>"); - html("<form method='get' action=''>\n"); - add_hidden_formfields(0, 1, ctx->qry.page); - html("<select name='h' onchange='this.form.submit();'>\n"); - for_each_branch_ref(print_branch_option, ctx->qry.head); - html("</select> "); - html("<input type='submit' name='' value='switch'/>"); + 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)); + html("'>\n"); + add_hidden_formfields(1, 0, "log"); + html("<select name='qt'>\n"); + html_option("grep", "log msg", ctx->qry.grep); + html_option("author", "author", ctx->qry.grep); + html_option("committer", "committer", ctx->qry.grep); + html("</select>\n"); + html("<input class='txt' type='text' size='8' name='q' value='"); + html_attr(ctx->qry.search); + html("'/>\n"); + html("<input type='submit' value='search'/>\n"); + html("</form>\n"); } else { html("<a class='active' href='"); html_attr(cgit_rooturl()); -- cgit 1.4.1 From 536b0541fcfea2169e4df33043cd9ff14c657bce Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sun, 13 Apr 2008 11:57:10 +0200 Subject: Implement minimal freetext search in the repolist This makes the repolist much more usable when there's a lot of repositories registered in cgitrc. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- ui-repolist.c | 49 +++++++++++++++++++++++++++++++++++++------------ ui-shared.c | 11 ++++++++++- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/ui-repolist.c b/ui-repolist.c index 9eba222..a7de453 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 && strstr(repo->url, ctx.qry.search)) + return 1; + if (repo->name && strstr(repo->name, ctx.qry.search)) + return 1; + if (repo->desc && strstr(repo->desc, ctx.qry.search)) + return 1; + if (repo->owner && strstr(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); @@ -72,9 +75,29 @@ void cgit_print_repolist() if (ctx.cfg.enable_index_links) 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 782caa7..6253a90 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -555,7 +555,7 @@ 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' size='8' 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"); @@ -564,6 +564,15 @@ void cgit_print_pageheader(struct cgit_context *ctx) 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>\n"); html("<div class='content'>"); -- cgit 1.4.1 From 39912a24edf45497e668ebda25636aa6f6db0c9b Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sun, 13 Apr 2008 12:20:00 +0200 Subject: Remove 'patch' link from tab, add to commit view It's a bit confusing to enter the patch view from the tab, since it has no layout. And the commit view has always lacked showing the commit id. Both of these warts are fixed by this commit, which adds a new header line in the commit view which shows the commit id as a 'permalink' to the current commit and also adds a link to the patch view of the current commit. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- ui-commit.c | 6 ++++++ ui-shared.c | 2 -- ui-shared.h | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ui-commit.c b/ui-commit.c index c2fafd7..dd36cc0 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -175,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, diff --git a/ui-shared.c b/ui-shared.c index 6253a90..bb08c4a 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -541,8 +541,6 @@ void cgit_print_pageheader(struct cgit_context *ctx) ctx->qry.head, ctx->qry.sha1); cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, ctx->qry.sha1, ctx->qry.sha2, NULL); - cgit_patch_link("patch", NULL, hc(cmd, "patch"), ctx->qry.head, - ctx->qry.sha1); html("</td><td class='form'>"); html("<form class='right' method='get' action='"); if (ctx->cfg.virtual_root) 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, -- cgit 1.4.1 From 28d781f34b2c2d4c2b994ef3953d1cf37d8f28f0 Mon Sep 17 00:00:00 2001 From: Lars Hjemli <hjemli@gmail.com> Date: Sun, 13 Apr 2008 12:42:27 +0200 Subject: Make repository search case insensitive This reuses the strcasestr() compiled or linked by libgit.a to implement a case insensitive variation of the repository search. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.h | 7 +++++++ ui-repolist.c | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/cgit.h b/cgit.h index ee8c716..a3b6535 100644 --- a/cgit.h +++ b/cgit.h @@ -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 */ diff --git a/ui-repolist.c b/ui-repolist.c index a7de453..7a7e95a 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -48,13 +48,13 @@ int is_match(struct cgit_repo *repo) { if (!ctx.qry.search) return 1; - if (repo->url && strstr(repo->url, ctx.qry.search)) + if (repo->url && strcasestr(repo->url, ctx.qry.search)) return 1; - if (repo->name && strstr(repo->name, ctx.qry.search)) + if (repo->name && strcasestr(repo->name, ctx.qry.search)) return 1; - if (repo->desc && strstr(repo->desc, ctx.qry.search)) + if (repo->desc && strcasestr(repo->desc, ctx.qry.search)) return 1; - if (repo->owner && strstr(repo->owner, ctx.qry.search)) + if (repo->owner && strcasestr(repo->owner, ctx.qry.search)) return 1; return 0; } -- cgit 1.4.1