X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/e65ea965a07c7d48d269b2d2278d0101f7ac2b48..0899eb644fab415e9a3b304f53da9da50aaf91aa:/ui-shared.c?ds=sidebyside diff --git a/ui-shared.c b/ui-shared.c index 0c6ca60..b53c56d 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -133,25 +133,38 @@ const char *cgit_repobasename(const char *reponame) 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; } +const char *cgit_snapshot_prefix(const struct cgit_repo *repo) +{ + if (repo->snapshot_prefix) + return repo->snapshot_prefix; + + return cgit_repobasename(repo->url); +} + static void site_url(const char *page, const char *search, const char *sort, int ofs, int always_root) { char *delim = "?"; @@ -767,6 +780,8 @@ void cgit_print_docstart(void) 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("\n"); html("
\n"); if (ctx.cfg.header) @@ -969,8 +984,6 @@ static void print_header(void) } 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("\n"); } @@ -1103,30 +1116,50 @@ void cgit_compose_snapshot_prefix(struct strbuf *filename, const char *base, strbuf_addf(filename, "%s-%s", base, ref); } -void cgit_print_snapshot_links(const char *repo, const char *head, - const char *hex, int snapshots) +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; - cgit_compose_snapshot_prefix(&filename, cgit_repobasename(repo), hex); + basename = cgit_snapshot_prefix(repo); + if (starts_with(ref, basename)) + strbuf_addstr(&filename, ref); + else + cgit_compose_snapshot_prefix(&filename, basename, ref); + prefixlen = filename.len; for (f = cgit_snapshot_formats; f->suffix; f++) { - if (!(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("