diff options
Diffstat (limited to 'source/ui-shared.c')
-rw-r--r--source/ui-shared.c46
1 file changed, 23 insertions, 23 deletions
diff --git a/source/ui-shared.c b/source/ui-shared.c
index f762fd7..409ad40 100644
--- a/source/ui-shared.c
+++ b/source/ui-shared.c
@@ -651,11 +651,8 @@ static void print_repo_tabs(void)
static void print_repo_search(void)
{
html("<form class='search' role='search' method='get' action='");
- if (ctx.cfg.virtual_root) {
- char *fileurl = cgit_fileurl(ctx.qry.repo, "log", ctx.qry.vpath, NULL);
- html_url_path(fileurl);
- free(fileurl);
- }
+ if (ctx.cfg.virtual_root)
+ write_page_url("log", ctx.qry.vpath);
html("'>\n");
cgit_add_hidden_formfields(1, 0, "log");
html("<select name='qt' aria-label='Search type'>\n");
@@ -896,10 +893,17 @@ const char *cgit_loginurl(void)
char *cgit_repourl(const char *reponame)
{
- if (ctx.cfg.virtual_root)
- return cgit_fmtalloc("%s%s/", ctx.cfg.virtual_root, reponame);
- else
- return cgit_fmtalloc("?r=%s", reponame);
+ struct strbuf sb = STRBUF_INIT;
+
+ if (ctx.cfg.virtual_root) {
+ strbuf_addstr(&sb, ctx.cfg.virtual_root);
+ cgit_add_url_path(&sb, reponame);
+ strbuf_addch(&sb, '/');
+ } else {
+ strbuf_addstr(&sb, "?r=");
+ cgit_add_url_path(&sb, reponame);
+ }
+ return strbuf_detach(&sb, NULL);
}
char *cgit_fileurl(const char *reponame, const char *pagename, const char *filename,
@@ -908,16 +912,17 @@ char *cgit_fileurl(const char *reponame, const char *pagename, const char *filen
struct strbuf sb = STRBUF_INIT;
const char *delim;
- // The result is a raw URL, so the query joiner is a bare ampersand
- // and each sink escapes the whole string for wherever it lands.
+ // The query joiner is a bare ampersand, because each sink escapes the
+ // whole string for wherever it lands.
if (ctx.cfg.virtual_root) {
- strbuf_addf(&sb, "%s%s/%s/%s", ctx.cfg.virtual_root, reponame, pagename,
- filename ? filename : "");
+ strbuf_addstr(&sb, ctx.cfg.virtual_root);
delim = "?";
} else {
- strbuf_addf(&sb, "?url=%s/%s/%s", reponame, pagename, (filename ? filename : ""));
+ strbuf_addstr(&sb, "?url=");
delim = "&";
}
+ cgit_add_url_path(&sb, reponame);
+ strbuf_addf(&sb, "/%s/%s", pagename, filename ? filename : "");
if (query)
strbuf_addf(&sb, "%s%s", delim, query);
return strbuf_detach(&sb, NULL);
@@ -1509,7 +1514,7 @@ void cgit_redirect(const char *url, const char *query, bool permanent)
{
htmlf("Status: %d %s\n", permanent ? 301 : 302, permanent ? "Moved Permanently" : "Found");
html("Location: ");
- html_url_path(url);
+ html_header_query(url);
if (query)
html_header_query(query);
html("\n\n");
@@ -1580,18 +1585,13 @@ void cgit_print_docstart(void)
html("'>\n");
}
if (host && ctx.repo && ctx.qry.head) {
- char *fileurl;
- struct strbuf sb = STRBUF_INIT;
- strbuf_addf(&sb, "h=%s", ctx.qry.head);
-
html("<link rel='alternate' title='Atom feed' href='");
html(cgit_httpscheme());
html_attr(host);
- fileurl = cgit_fileurl(ctx.repo->url, "atom", ctx.qry.vpath, sb.buf);
- html_attr(fileurl);
+ html(write_page_url("atom", ctx.qry.vpath) ? "&amp;" : "?");
+ html("h=");
+ html_url_arg(ctx.qry.head);
html("' type='application/atom+xml'>\n");
- strbuf_release(&sb);
- free(fileurl);
}
if (ctx.repo)
cgit_add_clone_urls(print_rel_vcs_link);