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
This commit is contained in:
Lars Hjemli 2007-06-29 20:32:08 +02:00
commit 16a3d2779c
11 changed files with 145 additions and 53 deletions

10
cgit.c
View File

@ -26,13 +26,15 @@ static int cgit_prepare_cache(struct cacheitem *item)
} }
if (!cgit_cmd) { if (!cgit_cmd) {
item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root, item->name = xstrdup(fmt("%s/%s/index.%s.html", cgit_cache_root,
cache_safe_filename(cgit_repo->url))); cache_safe_filename(cgit_repo->url),
cache_safe_filename(cgit_querystring)));
item->ttl = cgit_cache_repo_ttl; item->ttl = cgit_cache_repo_ttl;
} else { } else {
item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root, 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_repo->url),
cache_safe_filename(cgit_querystring))); cgit_query_page,
cache_safe_filename(cgit_querystring)));
if (cgit_query_has_symref) if (cgit_query_has_symref)
item->ttl = cgit_cache_dynamic_ttl; item->ttl = cgit_cache_dynamic_ttl;
else if (cgit_query_has_sha1) else if (cgit_query_has_sha1)

View File

@ -95,6 +95,14 @@ td#header {
vertical-align: text-bottom; vertical-align: text-bottom;
} }
td#header a {
color: #666;
}
td#header a:hoved {
text-decoration: underline;
}
td#logo { td#logo {
text-align: right; text-align: right;
vertical-align: middle; vertical-align: middle;
@ -116,11 +124,13 @@ td#crumb {
td#crumb a { td#crumb a {
color: #ccc; color: #ccc;
background-color: #666; background-color: #666;
padding: 0em 0.5em 0em 0.5em;
} }
td#crumb a:hover { td#crumb a:hover {
color: #eee; color: #666;
background-color: #666; background-color: #ccc;
text-decoration: none;
} }
td#search { td#search {
@ -361,16 +371,17 @@ table.list td.repogroup {
a.button { a.button {
font-size: 80%; font-size: 80%;
color: #333; color: #aaa;
background-color: #ccc; background-color: #eee;
border: solid 1px #999; border: solid 1px #aaa;
padding: 0em 0.5em; padding: 0em 0.5em;
margin: 0.1em 0.25em; margin: 0.1em 0.25em;
} }
a.button:hover { a.button:hover {
text-decoration: none; text-decoration: none;
background-color: #eee; color: #333;
background-color: #ccc;
} }
a.primary { a.primary {

4
cgit.h
View File

@ -118,6 +118,7 @@ extern char *cgit_repo_group;
extern int cgit_nocache; extern int cgit_nocache;
extern int cgit_snapshots; extern int cgit_snapshots;
extern int cgit_enable_index_links;
extern int cgit_enable_log_filecount; extern int cgit_enable_log_filecount;
extern int cgit_enable_log_linecount; extern int cgit_enable_log_linecount;
extern int cgit_max_lock_attempts; 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 chk_positive(int result, char *msg);
extern int hextoint(char c); extern int hextoint(char c);
extern char *trim_end(const char *str, char c);
extern void *cgit_free_commitinfo(struct commitinfo *info); extern void *cgit_free_commitinfo(struct commitinfo *info);
@ -204,7 +206,7 @@ extern char *cgit_pageurl(const char *reponame, const char *pagename,
extern void cgit_tree_link(char *name, char *title, char *class, char *head, extern void cgit_tree_link(char *name, char *title, char *class, char *head,
char *rev, char *path); char *rev, char *path);
extern void cgit_log_link(char *name, char *title, char *class, char *head, 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, extern void cgit_commit_link(char *name, char *title, char *class, char *head,
char *rev); char *rev);
extern void cgit_diff_link(char *name, char *title, char *class, char *head, extern void cgit_diff_link(char *name, char *title, char *class, char *head,

4
cgitrc
View File

@ -12,6 +12,10 @@
#snapshots=0 #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/disable display of 'number of files changed' in log view
#enable-log-filecount=0 #enable-log-filecount=0

View File

@ -168,7 +168,7 @@ void cgit_parse_url(const char *url)
if (p) { if (p) {
p[0] = '\0'; p[0] = '\0';
if (p[1]) 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_cmd = cgit_get_cmd_index(cmd + 1);
cgit_query_page = xstrdup(cmd + 1); cgit_query_page = xstrdup(cmd + 1);

View File

@ -28,6 +28,7 @@ char *cgit_repo_group = NULL;
int cgit_nocache = 0; int cgit_nocache = 0;
int cgit_snapshots = 0; int cgit_snapshots = 0;
int cgit_enable_index_links = 0;
int cgit_enable_log_filecount = 0; int cgit_enable_log_filecount = 0;
int cgit_enable_log_linecount = 0; int cgit_enable_log_linecount = 0;
int cgit_max_lock_attempts = 5; int cgit_max_lock_attempts = 5;
@ -148,6 +149,8 @@ void cgit_global_config_cb(const char *name, const char *value)
cgit_nocache = atoi(value); cgit_nocache = atoi(value);
else if (!strcmp(name, "snapshots")) else if (!strcmp(name, "snapshots"))
cgit_snapshots = atoi(value); cgit_snapshots = atoi(value);
else if (!strcmp(name, "enable-index-links"))
cgit_enable_index_links = atoi(value);
else if (!strcmp(name, "enable-log-filecount")) else if (!strcmp(name, "enable-log-filecount"))
cgit_enable_log_filecount = atoi(value); cgit_enable_log_filecount = atoi(value);
else if (!strcmp(name, "enable-log-linecount")) else if (!strcmp(name, "enable-log-linecount"))
@ -227,7 +230,7 @@ void cgit_querystring_cb(const char *name, const char *value)
} else if (!strcmp(name, "ofs")) { } else if (!strcmp(name, "ofs")) {
cgit_query_ofs = atoi(value); cgit_query_ofs = atoi(value);
} else if (!strcmp(name, "path")) { } else if (!strcmp(name, "path")) {
cgit_query_path = xstrdup(value); cgit_query_path = trim_end(value, '/');
} else if (!strcmp(name, "name")) { } else if (!strcmp(name, "name")) {
cgit_query_name = xstrdup(value); cgit_query_name = xstrdup(value);
} }
@ -256,6 +259,28 @@ int hextoint(char c)
return -1; 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, void cgit_diff_tree_cb(struct diff_queue_struct *q,
struct diff_options *options, void *data) struct diff_options *options, void *data)
{ {

View File

@ -113,17 +113,15 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path, i
if (pager) { if (pager) {
html("<div class='pager'>"); html("<div class='pager'>");
if (ofs > 0) { if (ofs > 0) {
html("&nbsp;<a href='"); cgit_log_link("[prev]", NULL, NULL, cgit_query_head,
html(cgit_pageurl(cgit_query_repo, cgit_query_page, cgit_query_sha1, cgit_query_path,
fmt("h=%s&amp;ofs=%d", tip, ofs-cnt))); ofs - cnt);
html("'>[prev]</a>&nbsp;"); html("&nbsp;");
} }
if ((commit = get_revision(&rev)) != NULL) { if ((commit = get_revision(&rev)) != NULL) {
html("&nbsp;<a href='"); cgit_log_link("[next]", NULL, NULL, cgit_query_head,
html(cgit_pageurl(cgit_query_repo, "log", cgit_query_sha1, cgit_query_path,
fmt("h=%s&amp;ofs=%d", tip, ofs+cnt))); ofs + cnt);
html("'>[next]</a>&nbsp;");
} }
html("</div>"); html("</div>");
} }

View File

@ -44,15 +44,19 @@ static void print_modtime(struct repoinfo *repo)
void cgit_print_repolist(struct cacheitem *item) void cgit_print_repolist(struct cacheitem *item)
{ {
int i; int i, columns = 4;
char *last_group = NULL; char *last_group = NULL;
if (cgit_enable_index_links)
columns++;
cgit_print_docstart(cgit_root_title, item); cgit_print_docstart(cgit_root_title, item);
cgit_print_pageheader(cgit_root_title, 0); cgit_print_pageheader(cgit_root_title, 0);
html("<table class='list nowrap'>"); html("<table class='list nowrap'>");
if (cgit_index_header) { 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_include(cgit_index_header);
html("</td></tr>"); html("</td></tr>");
} }
@ -60,8 +64,10 @@ void cgit_print_repolist(struct cacheitem *item)
"<th class='left'>Name</th>" "<th class='left'>Name</th>"
"<th class='left'>Description</th>" "<th class='left'>Description</th>"
"<th class='left'>Owner</th>" "<th class='left'>Owner</th>"
"<th class='left'>Idle</th>" "<th class='left'>Idle</th>");
"<th>Links</th></tr>\n"); if (cgit_enable_index_links)
html("<th>Links</th>");
html("</tr>\n");
for (i=0; i<cgit_repolist.count; i++) { for (i=0; i<cgit_repolist.count; i++) {
cgit_repo = &cgit_repolist.repos[i]; cgit_repo = &cgit_repolist.repos[i];
@ -69,7 +75,8 @@ void cgit_print_repolist(struct cacheitem *item)
(last_group != NULL && cgit_repo->group == NULL) || (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))) { 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_txt(cgit_repo->group);
html("</td></tr>"); html("</td></tr>");
last_group = cgit_repo->group; last_group = cgit_repo->group;
@ -85,13 +92,17 @@ void cgit_print_repolist(struct cacheitem *item)
html_txt(cgit_repo->owner); html_txt(cgit_repo->owner);
html("</td><td>"); html("</td><td>");
print_modtime(cgit_repo); print_modtime(cgit_repo);
html("</td><td>"); html("</td>");
html_link_open(cgit_repourl(cgit_repo->url), if (cgit_enable_index_links) {
"Summary", "button"); html("<td>");
html("S</a>"); html_link_open(cgit_repourl(cgit_repo->url),
cgit_log_link("L", "Log", "button", NULL, NULL, NULL); NULL, "button");
cgit_tree_link("F", "Files", "button", NULL, NULL, NULL); html("summary</a>");
html("</td></tr>\n"); 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>"); html("</table>");
cgit_print_docend(); cgit_print_docend();

View File

@ -111,20 +111,24 @@ static char *repolink(char *title, char *class, char *page, char *head,
html_attr(cgit_repo->url); html_attr(cgit_repo->url);
if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
html("/"); html("/");
html(page); if (page) {
html("/"); html(page);
if (path) html("/");
html_attr(path); if (path)
html_attr(path);
}
} else { } else {
html(cgit_script_name); html(cgit_script_name);
html("?url="); html("?url=");
html_attr(cgit_repo->url); html_attr(cgit_repo->url);
if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
html("/"); html("/");
html(page); if (page) {
html("/"); html(page);
if (path) html("/");
html_attr(path); if (path)
html_attr(path);
}
delim = "&amp;"; delim = "&amp;";
} }
if (head && strcmp(head, cgit_repo->defbranch)) { if (head && strcmp(head, cgit_repo->defbranch)) {
@ -159,9 +163,25 @@ void cgit_tree_link(char *name, char *title, char *class, char *head,
} }
void cgit_log_link(char *name, char *title, char *class, char *head, 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, void cgit_commit_link(char *name, char *title, char *class, char *head,
@ -279,19 +299,38 @@ void cgit_print_docend()
void cgit_print_pageheader(char *title, int show_search) void cgit_print_pageheader(char *title, int show_search)
{ {
html("<table id='layout'>"); html("<table id='layout'>");
html("<tr><td id='header'>"); html("<tr><td id='header'><a href='");
html(cgit_root_title); html_attr(cgit_rooturl());
html("</td><td id='logo'>"); html("'>");
html_txt(cgit_root_title);
html("</a></td><td id='logo'>");
html("<a href='"); html("<a href='");
html_attr(cgit_logo_link); html_attr(cgit_logo_link);
htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo); htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo);
html("</td></tr>"); html("</td></tr>");
html("<tr><td id='crumb'>"); html("<tr><td id='crumb'>");
htmlf("<a href='%s'>root</a>", cgit_rooturl());
if (cgit_query_repo) { if (cgit_query_repo) {
htmlf(" : <a href='%s'>", cgit_repourl(cgit_repo->url));
html_txt(cgit_repo->name); 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>");
html("<td id='search'>"); html("<td id='search'>");

View File

@ -27,7 +27,7 @@ static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,
if (commit && !parse_commit(commit)){ if (commit && !parse_commit(commit)){
info = cgit_parse_commit(commit); info = cgit_parse_commit(commit);
html("<tr><td>"); 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>"); html("</td><td>");
cgit_print_age(commit->date, -1, NULL); cgit_print_age(commit->date, -1, NULL);
html("</td><td>"); html("</td><td>");

View File

@ -92,8 +92,8 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen,
htmlf("</td><td class='ls-size'>%li</td>", size); htmlf("</td><td class='ls-size'>%li</td>", size);
html("<td>"); html("<td>");
cgit_log_link("L", "Log", "button", cgit_query_head, curr_rev, cgit_log_link("log", NULL, "button", cgit_query_head, curr_rev,
fullpath); fullpath, 0);
html("</td></tr>\n"); html("</td></tr>\n");
free(name); free(name);
return 0; return 0;