#include "cgit.h"
-const char cgit_version[] = CGIT_VERSION;
-
-
static int cgit_prepare_cache(struct cacheitem *item)
{
if (!cgit_repo && cgit_query_repo) {
}
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)
char *msg;
};
-extern const char cgit_version[];
+extern const char *cgit_version;
extern struct repolist cgit_repolist;
extern struct repoinfo *cgit_repo;
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;
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);
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,
struct repoinfo *cgit_repo;
int cgit_cmd;
+const char *cgit_version = CGIT_VERSION;
+
char *cgit_root_title = "Git repository browser";
char *cgit_css = "/cgit.css";
char *cgit_logo = "/git-logo.png";
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;
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"))
} 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);
}
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)
{
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)) {
}
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,
html("<title>");
html_txt(title);
html("</title>\n");
- htmlf("<meta name='generator' content='cgit v%s'/>\n", cgit_version);
+ htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version);
html("<link rel='stylesheet' type='text/css' href='");
html_attr(cgit_css);
html("'/>\n");
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'>");