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:
commit
16a3d2779c
10
cgit.c
10
cgit.c
@ -26,13 +26,15 @@ static int cgit_prepare_cache(struct cacheitem *item)
|
||||
}
|
||||
|
||||
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)
|
||||
|
23
cgit.css
23
cgit.css
@ -95,6 +95,14 @@ td#header {
|
||||
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 {
|
||||
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 @@ table.list td.repogroup {
|
||||
|
||||
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 {
|
||||
|
4
cgit.h
4
cgit.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 char *cgit_pageurl(const char *reponame, const char *pagename,
|
||||
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,
|
||||
|
4
cgitrc
4
cgitrc
@ -12,6 +12,10 @@
|
||||
#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
|
||||
|
||||
|
@ -168,7 +168,7 @@ void cgit_parse_url(const char *url)
|
||||
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);
|
||||
|
27
shared.c
27
shared.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 @@ void cgit_global_config_cb(const char *name, const char *value)
|
||||
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 @@ void cgit_querystring_cb(const char *name, const char *value)
|
||||
} 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);
|
||||
}
|
||||
@ -256,6 +259,28 @@ int hextoint(char c)
|
||||
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,
|
||||
struct diff_options *options, void *data)
|
||||
{
|
||||
|
16
ui-log.c
16
ui-log.c
@ -113,17 +113,15 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path, i
|
||||
if (pager) {
|
||||
html("<div class='pager'>");
|
||||
if (ofs > 0) {
|
||||
html(" <a href='");
|
||||
html(cgit_pageurl(cgit_query_repo, cgit_query_page,
|
||||
fmt("h=%s&ofs=%d", tip, ofs-cnt)));
|
||||
html("'>[prev]</a> ");
|
||||
cgit_log_link("[prev]", NULL, NULL, cgit_query_head,
|
||||
cgit_query_sha1, cgit_query_path,
|
||||
ofs - cnt);
|
||||
html(" ");
|
||||
}
|
||||
|
||||
if ((commit = get_revision(&rev)) != NULL) {
|
||||
html(" <a href='");
|
||||
html(cgit_pageurl(cgit_query_repo, "log",
|
||||
fmt("h=%s&ofs=%d", tip, ofs+cnt)));
|
||||
html("'>[next]</a> ");
|
||||
cgit_log_link("[next]", NULL, NULL, cgit_query_head,
|
||||
cgit_query_sha1, cgit_query_path,
|
||||
ofs + cnt);
|
||||
}
|
||||
html("</div>");
|
||||
}
|
||||
|
@ -44,15 +44,19 @@ static void print_modtime(struct repoinfo *repo)
|
||||
|
||||
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 @@ void cgit_print_repolist(struct cacheitem *item)
|
||||
"<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 @@ void cgit_print_repolist(struct cacheitem *item)
|
||||
(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 @@ void cgit_print_repolist(struct cacheitem *item)
|
||||
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();
|
||||
|
71
ui-shared.c
71
ui-shared.c
@ -111,20 +111,24 @@ static char *repolink(char *title, char *class, char *page, char *head,
|
||||
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 = "&";
|
||||
}
|
||||
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,
|
||||
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_docend()
|
||||
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(") : ");
|
||||
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'>");
|
||||
|
@ -27,7 +27,7 @@ static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,
|
||||
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>");
|
||||
|
@ -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);
|
||||
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user