all repos — cgit @ 16a3d2779ccd56bf7954d98da547247d8796544b

a hyperfast web frontend for git written in c

Merge branch 'lh/menu'

* lh/menu:
  Add ofs argument to cgit_log_link and use it in ui-log.c
  Add trim_end() and use it to remove trailing slashes from repo paths
  Do not include current path in the "tree" menu link
  Add setting to enable/disable extra links on index page
  Change S/L/T to summary/log/tree
  Change "files" to "tree"
  Include querystring as part of cached filename for repo summary page
  Add more menuitems on repo pages
Lars Hjemli hjemli@gmail.com
Fri, 29 Jun 2007 20:32:08 +0200
commit

16a3d2779ccd56bf7954d98da547247d8796544b

parent

f69250358a74efa5d7d9c562b2cdd80fad1430f1

11 files changed, 145 insertions(+), 53 deletions(-)

jump to
M cgit.ccgit.c

@@ -26,13 +26,15 @@ return 1;

} if (!cgit_cmd) { - item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root, - cache_safe_filename(cgit_repo->url))); + 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))); + 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)
M cgit.csscgit.css

@@ -95,6 +95,14 @@ padding: 0.2em 0.5em;

vertical-align: text-bottom; } +td#header a { + color: #666; +} + +td#header a:hoved { + text-decoration: underline; +} + td#logo { text-align: right; vertical-align: middle;

@@ -116,11 +124,13 @@

td#crumb a { color: #ccc; background-color: #666; + padding: 0em 0.5em 0em 0.5em; } td#crumb a:hover { - color: #eee; - background-color: #666; + color: #666; + background-color: #ccc; + text-decoration: none; } td#search {

@@ -361,16 +371,17 @@ }

a.button { font-size: 80%; - color: #333; - background-color: #ccc; - border: solid 1px #999; + color: #aaa; + background-color: #eee; + border: solid 1px #aaa; padding: 0em 0.5em; margin: 0.1em 0.25em; } a.button:hover { text-decoration: none; - background-color: #eee; + color: #333; + background-color: #ccc; } a.primary {
M cgit.hcgit.h

@@ -118,6 +118,7 @@ extern char *cgit_repo_group;

extern int cgit_nocache; extern int cgit_snapshots; +extern int cgit_enable_index_links; extern int cgit_enable_log_filecount; extern int cgit_enable_log_linecount; extern int cgit_max_lock_attempts;

@@ -158,6 +159,7 @@ extern int chk_zero(int result, char *msg);

extern int chk_positive(int result, char *msg); extern int hextoint(char c); +extern char *trim_end(const char *str, char c); extern void *cgit_free_commitinfo(struct commitinfo *info);

@@ -204,7 +206,7 @@

extern void cgit_tree_link(char *name, char *title, char *class, char *head, char *rev, char *path); extern void cgit_log_link(char *name, char *title, char *class, char *head, - char *rev, char *path); + char *rev, char *path, int ofs); extern void cgit_commit_link(char *name, char *title, char *class, char *head, char *rev); extern void cgit_diff_link(char *name, char *title, char *class, char *head,
M cgitrccgitrc

@@ -12,6 +12,10 @@ ## Enable/disable snapshots by default. This can be overridden per repo

#snapshots=0 +## Enable/disable extra links to summary/log/tree per repo on index page +#enable-index-links=0 + + ## Enable/disable display of 'number of files changed' in log view #enable-log-filecount=0
M parsing.cparsing.c

@@ -168,7 +168,7 @@ p = strchr(cmd + 1, '/');

if (p) { p[0] = '\0'; if (p[1]) - cgit_query_path = xstrdup(p + 1); + cgit_query_path = trim_end(p + 1, '/'); } cgit_cmd = cgit_get_cmd_index(cmd + 1); cgit_query_page = xstrdup(cmd + 1);
M shared.cshared.c

@@ -28,6 +28,7 @@ char *cgit_repo_group = NULL;

int cgit_nocache = 0; int cgit_snapshots = 0; +int cgit_enable_index_links = 0; int cgit_enable_log_filecount = 0; int cgit_enable_log_linecount = 0; int cgit_max_lock_attempts = 5;

@@ -148,6 +149,8 @@ else if (!strcmp(name, "nocache"))

cgit_nocache = atoi(value); else if (!strcmp(name, "snapshots")) cgit_snapshots = atoi(value); + else if (!strcmp(name, "enable-index-links")) + cgit_enable_index_links = atoi(value); else if (!strcmp(name, "enable-log-filecount")) cgit_enable_log_filecount = atoi(value); else if (!strcmp(name, "enable-log-linecount"))

@@ -227,7 +230,7 @@ cgit_query_has_sha1 = 1;

} else if (!strcmp(name, "ofs")) { cgit_query_ofs = atoi(value); } else if (!strcmp(name, "path")) { - cgit_query_path = xstrdup(value); + cgit_query_path = trim_end(value, '/'); } else if (!strcmp(name, "name")) { cgit_query_name = xstrdup(value); }

@@ -254,6 +257,28 @@ else if (c >= '0' && c <= '9')

return c - '0'; else return -1; +} + +char *trim_end(const char *str, char c) +{ + int len; + char *s, *t; + + if (str == NULL) + return NULL; + t = (char *)str; + len = strlen(t); + while(len > 0 && t[len - 1] == c) + len--; + + if (len == 0) + return NULL; + + c = t[len]; + t[len] = '\0'; + s = xstrdup(t); + t[len] = c; + return s; } void cgit_diff_tree_cb(struct diff_queue_struct *q,
M ui-log.cui-log.c

@@ -113,17 +113,15 @@

if (pager) { html("<div class='pager'>"); if (ofs > 0) { - html("&nbsp;<a href='"); - html(cgit_pageurl(cgit_query_repo, cgit_query_page, - fmt("h=%s&amp;ofs=%d", tip, ofs-cnt))); - html("'>[prev]</a>&nbsp;"); + cgit_log_link("[prev]", NULL, NULL, cgit_query_head, + cgit_query_sha1, cgit_query_path, + ofs - cnt); + html("&nbsp;"); } - if ((commit = get_revision(&rev)) != NULL) { - html("&nbsp;<a href='"); - html(cgit_pageurl(cgit_query_repo, "log", - fmt("h=%s&amp;ofs=%d", tip, ofs+cnt))); - html("'>[next]</a>&nbsp;"); + cgit_log_link("[next]", NULL, NULL, cgit_query_head, + cgit_query_sha1, cgit_query_path, + ofs + cnt); } html("</div>"); }
M ui-repolist.cui-repolist.c

@@ -44,15 +44,19 @@ }

void cgit_print_repolist(struct cacheitem *item) { - int i; + int i, columns = 4; char *last_group = NULL; + + if (cgit_enable_index_links) + columns++; cgit_print_docstart(cgit_root_title, item); cgit_print_pageheader(cgit_root_title, 0); html("<table class='list nowrap'>"); if (cgit_index_header) { - html("<tr class='nohover'><td colspan='5' class='include-block'>"); + htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>", + columns); html_include(cgit_index_header); html("</td></tr>"); }

@@ -60,8 +64,10 @@ html("<tr class='nohover'>"

"<th class='left'>Name</th>" "<th class='left'>Description</th>" "<th class='left'>Owner</th>" - "<th class='left'>Idle</th>" - "<th>Links</th></tr>\n"); + "<th class='left'>Idle</th>"); + if (cgit_enable_index_links) + html("<th>Links</th>"); + html("</tr>\n"); for (i=0; i<cgit_repolist.count; i++) { cgit_repo = &cgit_repolist.repos[i];

@@ -69,7 +75,8 @@ if ((last_group == NULL && cgit_repo->group != NULL) ||

(last_group != NULL && cgit_repo->group == NULL) || (last_group != NULL && cgit_repo->group != NULL && strcmp(cgit_repo->group, last_group))) { - html("<tr class='nohover'><td colspan='4' class='repogroup'>"); + htmlf("<tr class='nohover'><td colspan='%d' class='repogroup'>", + columns); html_txt(cgit_repo->group); html("</td></tr>"); last_group = cgit_repo->group;

@@ -85,13 +92,17 @@ html("</td><td>");

html_txt(cgit_repo->owner); html("</td><td>"); print_modtime(cgit_repo); - html("</td><td>"); - html_link_open(cgit_repourl(cgit_repo->url), - "Summary", "button"); - html("S</a>"); - cgit_log_link("L", "Log", "button", NULL, NULL, NULL); - cgit_tree_link("F", "Files", "button", NULL, NULL, NULL); - html("</td></tr>\n"); + html("</td>"); + if (cgit_enable_index_links) { + html("<td>"); + html_link_open(cgit_repourl(cgit_repo->url), + NULL, "button"); + html("summary</a>"); + cgit_log_link("log", NULL, "button", NULL, NULL, NULL, 0); + cgit_tree_link("tree", NULL, "button", NULL, NULL, NULL); + html("</td>"); + } + html("</tr>\n"); } html("</table>"); cgit_print_docend();
M ui-shared.cui-shared.c

@@ -111,20 +111,24 @@ html("/");

html_attr(cgit_repo->url); if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') html("/"); - html(page); - html("/"); - if (path) - html_attr(path); + if (page) { + html(page); + html("/"); + if (path) + html_attr(path); + } } else { html(cgit_script_name); html("?url="); html_attr(cgit_repo->url); if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') html("/"); - html(page); - html("/"); - if (path) - html_attr(path); + if (page) { + html(page); + html("/"); + if (path) + html_attr(path); + } delim = "&amp;"; } if (head && strcmp(head, cgit_repo->defbranch)) {

@@ -159,9 +163,25 @@ reporevlink("tree", name, title, class, head, rev, path);

} void cgit_log_link(char *name, char *title, char *class, char *head, - char *rev, char *path) + char *rev, char *path, int ofs) { - reporevlink("log", name, title, class, head, rev, path); + char *delim; + + delim = repolink(title, class, "log", head, path); + if (rev && strcmp(rev, cgit_query_head)) { + html(delim); + html("id="); + html_attr(rev); + delim = "&"; + } + if (ofs > 0) { + html(delim); + html("ofs="); + htmlf("%d", ofs); + } + html("'>"); + html_txt(name); + html("</a>"); } void cgit_commit_link(char *name, char *title, char *class, char *head,

@@ -279,19 +299,38 @@

void cgit_print_pageheader(char *title, int show_search) { html("<table id='layout'>"); - html("<tr><td id='header'>"); - html(cgit_root_title); - html("</td><td id='logo'>"); + html("<tr><td id='header'><a href='"); + html_attr(cgit_rooturl()); + html("'>"); + html_txt(cgit_root_title); + html("</a></td><td id='logo'>"); html("<a href='"); html_attr(cgit_logo_link); htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo); html("</td></tr>"); html("<tr><td id='crumb'>"); - htmlf("<a href='%s'>root</a>", cgit_rooturl()); if (cgit_query_repo) { - htmlf(" : <a href='%s'>", cgit_repourl(cgit_repo->url)); html_txt(cgit_repo->name); - htmlf("</a> : %s", title); + html(" ("); + html_txt(cgit_query_head); + html(") : &nbsp;"); + reporevlink(NULL, "summary", NULL, NULL, cgit_query_head, + NULL, NULL); + html(" "); + cgit_log_link("log", NULL, NULL, cgit_query_head, + cgit_query_sha1, cgit_query_path, 0); + html(" "); + cgit_tree_link("tree", NULL, NULL, cgit_query_head, + cgit_query_sha1, NULL); + html(" "); + cgit_commit_link("commit", NULL, NULL, cgit_query_head, + cgit_query_sha1); + html(" "); + cgit_diff_link("diff", NULL, NULL, cgit_query_head, + cgit_query_sha1, cgit_query_sha2, + cgit_query_path); + } else { + html_txt("Index of repositories"); } html("</td>"); html("<td id='search'>");
M ui-summary.cui-summary.c

@@ -27,7 +27,7 @@ commit->object.parsed = 0;

if (commit && !parse_commit(commit)){ info = cgit_parse_commit(commit); html("<tr><td>"); - cgit_log_link(ref, NULL, NULL, ref, NULL, NULL); + cgit_log_link(ref, NULL, NULL, ref, NULL, NULL, 0); html("</td><td>"); cgit_print_age(commit->date, -1, NULL); html("</td><td>");
M ui-tree.cui-tree.c

@@ -92,8 +92,8 @@ }

htmlf("</td><td class='ls-size'>%li</td>", size); html("<td>"); - cgit_log_link("L", "Log", "button", cgit_query_head, curr_rev, - fullpath); + cgit_log_link("log", NULL, "button", cgit_query_head, curr_rev, + fullpath, 0); html("</td></tr>\n"); free(name); return 0;