char *cgit_currenturl(void)
{
const char *root = cgit_rooturl();
- size_t len = strlen(root);
if (!ctx.qry.url)
return xstrdup(root);
- if (len && root[len - 1] == '/')
+ if (root[0] && root[strlen(root) - 1] == '/')
return fmtalloc("%s%s", root, ctx.qry.url);
return fmtalloc("%s/%s", root, ctx.qry.url);
}
+char *cgit_currentfullurl(void)
+{
+ const char *root = cgit_rooturl();
+ const char *orig_query = ctx.env.query_string ? ctx.env.query_string : "";
+ size_t len = strlen(orig_query);
+ char *query = xmalloc(len + 2), *start_url, *ret;
+
+ /* Remove all url=... parts from query string */
+ memcpy(query + 1, orig_query, len + 1);
+ query[0] = '?';
+ start_url = query;
+ while ((start_url = strstr(start_url, "url=")) != NULL) {
+ if (start_url[-1] == '?' || start_url[-1] == '&') {
+ const char *end_url = strchr(start_url, '&');
+ if (end_url)
+ memmove(start_url, end_url + 1, strlen(end_url));
+ else
+ start_url[0] = '\0';
+ } else
+ ++start_url;
+ }
+ if (!query[1])
+ query[0] = '\0';
+
+ if (!ctx.qry.url)
+ ret = fmtalloc("%s%s", root, query);
+ else if (root[0] && root[strlen(root) - 1] == '/')
+ ret = fmtalloc("%s%s%s", root, ctx.qry.url, query);
+ else
+ ret = fmtalloc("%s/%s%s", root, ctx.qry.url, query);
+ free(query);
+ return ret;
+}
+
const char *cgit_rooturl(void)
{
if (ctx.cfg.virtual_root)
static char rvbuf[1024];
int p;
const char *rv;
- strncpy(rvbuf, reponame, sizeof(rvbuf));
- if (rvbuf[sizeof(rvbuf)-1])
+ size_t len;
+
+ len = strlcpy(rvbuf, reponame, sizeof(rvbuf));
+ if (len >= sizeof(rvbuf))
die("cgit_repobasename: truncated repository name '%s'", reponame);
- p = strlen(rvbuf)-1;
+ p = len - 1;
/* strip trailing slashes */
- while (p && rvbuf[p] == '/') rvbuf[p--] = 0;
+ while (p && rvbuf[p] == '/')
+ rvbuf[p--] = '\0';
/* strip trailing .git */
if (p >= 3 && starts_with(&rvbuf[p-3], ".git")) {
- p -= 3; rvbuf[p--] = 0;
+ p -= 3;
+ rvbuf[p--] = '\0';
}
/* strip more trailing slashes if any */
- while ( p && rvbuf[p] == '/') rvbuf[p--] = 0;
+ while (p && rvbuf[p] == '/')
+ rvbuf[p--] = '\0';
/* find last slash in the remaining string */
- rv = strrchr(rvbuf,'/');
+ rv = strrchr(rvbuf, '/');
if (rv)
return ++rv;
return rvbuf;
cgit_add_clone_urls(print_rel_vcs_link);
if (ctx.cfg.head_include)
html_include(ctx.cfg.head_include);
+ if (ctx.repo && ctx.repo->extra_head_content)
+ html(ctx.repo->extra_head_content);
html("</head>\n");
html("<body>\n");
if (ctx.cfg.header)
{
char *old_path = ctx.qry.path;
char *p = path, *q, *end = path + strlen(path);
+ int levels = 0;
ctx.qry.path = NULL;
cgit_self_link("root", NULL, NULL);
ctx.qry.path = p = path;
while (p < end) {
- if (!(q = strchr(p, '/')))
+ if (!(q = strchr(p, '/')) || levels > 15)
q = end;
*q = '\0';
html_txt("/");
if (q < end)
*q = '/';
p = q + 1;
+ ++levels;
}
ctx.qry.path = old_path;
}
} else {
if (ctx.cfg.root_desc)
html_txt(ctx.cfg.root_desc);
- else if (ctx.cfg.index_info)
- html_include(ctx.cfg.index_info);
}
html("</td></tr></table>\n");
}
strbuf_addf(filename, "%s-%s", base, ref);
}
-void cgit_print_snapshot_links(const struct cgit_repo *repo, const char *ref)
+void cgit_print_snapshot_links(const struct cgit_repo *repo, const char *ref,
+ const char *separator)
{
- const struct cgit_snapshot_format* f;
+ const struct cgit_snapshot_format *f;
struct strbuf filename = STRBUF_INIT;
const char *basename;
size_t prefixlen;
prefixlen = filename.len;
for (f = cgit_snapshot_formats; f->suffix; f++) {
- if (!(repo->snapshots & f->bit))
+ if (!(repo->snapshots & cgit_snapshot_format_bit(f)))
continue;
strbuf_setlen(&filename, prefixlen);
strbuf_addstr(&filename, f->suffix);
cgit_snapshot_link(filename.buf, NULL, NULL, NULL, NULL,
filename.buf);
- html("<br/>");
+ if (cgit_snapshot_get_sig(ref, f)) {
+ strbuf_addstr(&filename, ".asc");
+ html(" (");
+ cgit_snapshot_link("sig", NULL, NULL, NULL, NULL,
+ filename.buf);
+ html(")");
+ } else if (starts_with(f->suffix, ".tar") && cgit_snapshot_get_sig(ref, &cgit_snapshot_formats[0])) {
+ strbuf_setlen(&filename, strlen(filename.buf) - strlen(f->suffix));
+ strbuf_addstr(&filename, ".tar.asc");
+ html(" (");
+ cgit_snapshot_link("sig", NULL, NULL, NULL, NULL,
+ filename.buf);
+ html(")");
+ }
+ html(separator);
}
strbuf_release(&filename);
}
void cgit_set_title_from_path(const char *path)
{
- size_t path_len, path_index, path_last_end;
- char *new_title;
+ struct strbuf sb = STRBUF_INIT;
+ const char *slash, *last_slash;
if (!path)
return;
- path_len = strlen(path);
- new_title = xmalloc(path_len + 3 + strlen(ctx.page.title) + 1);
- new_title[0] = '\0';
-
- for (path_index = path_len, path_last_end = path_len; path_index-- > 0;) {
- if (path[path_index] == '/') {
- if (path_index == path_len - 1) {
- path_last_end = path_index - 1;
- continue;
- }
- strncat(new_title, &path[path_index + 1], path_last_end - path_index - 1);
- strcat(new_title, "\\");
- path_last_end = path_index;
- }
+ for (last_slash = path + strlen(path); (slash = memrchr(path, '/', last_slash - path)) != NULL; last_slash = slash) {
+ strbuf_add(&sb, slash + 1, last_slash - slash - 1);
+ strbuf_addstr(&sb, " \xc2\xab ");
}
- if (path_last_end)
- strncat(new_title, path, path_last_end);
-
- strcat(new_title, " - ");
- strcat(new_title, ctx.page.title);
- ctx.page.title = new_title;
+ strbuf_add(&sb, path, last_slash - path);
+ strbuf_addf(&sb, " - %s", ctx.page.title);
+ ctx.page.title = strbuf_detach(&sb, NULL);
}