From mboxrd@z Thu Jan 1 00:00:00 1970 From: andy at warmcat.com (Andy Green) Date: Tue, 19 Jun 2018 17:02:47 +0800 Subject: [PATCH v3 16/17] ui-shared: add helper for generating non-urlencoded links In-Reply-To: <152939875224.4492.4288866616332837866.stgit@mail.warmcat.com> References: <152939875224.4492.4288866616332837866.stgit@mail.warmcat.com> Message-ID: <152939896775.4492.5226901101375441196.stgit@mail.warmcat.com> We are going to have to produce plain links in the next patch. But depending on config, the links are not simple. Reproduce the logic in repolink() to generate correctly- formatted links in a strbuf, without urlencoding, in a reusable helper cgit_repo_create_url(). Signed-off-by: Andy Green --- ui-shared.c | 30 ++++++++++++++++++++++++++++++ ui-shared.h | 3 +++ 2 files changed, 33 insertions(+) diff --git a/ui-shared.c b/ui-shared.c index 21bbded..79c39a8 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -221,6 +221,36 @@ void cgit_index_link(const char *name, const char *title, const char *class, site_link(NULL, name, title, class, pattern, sort, ofs, always_root); } +char *cgit_repo_create_url(struct strbuf *sb_pre, struct strbuf *sb_post, + const char *page, const char *head, const char *path) +{ + const char *delim = "?"; + struct strbuf *sb = sb_pre; + + if (ctx.cfg.virtual_root) + strbuf_addf(sb_pre, "%s%s", ctx.cfg.virtual_root, ctx.repo->url); + else { + strbuf_addstr(sb_pre, ctx.cfg.script_name); + strbuf_addf(sb_post, "?url=%s", ctx.repo->url); + sb = sb_post; + delim = "&"; + } + + if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') + strbuf_addch(sb, '/'); + if (page) { + strbuf_addf(sb, "%s/", page); + if (path) + strbuf_addstr(sb, path); + } + + if (head && ctx.repo->defbranch && strcmp(head, ctx.repo->defbranch)) { + strbuf_addf(sb_post, "%sh=%s", delim, head); + delim = "&"; + } + return fmt("%s", delim); +} + static char *repolink(const char *title, const char *class, const char *page, const char *head, const char *path) { diff --git a/ui-shared.h b/ui-shared.h index c105b3b..679d2f2 100644 --- a/ui-shared.h +++ b/ui-shared.h @@ -59,6 +59,9 @@ extern void cgit_object_link(struct object *obj); extern void cgit_submodule_link(const char *class, char *path, const char *rev); +extern char *cgit_repo_create_url(struct strbuf *sb_pre, struct strbuf *sb_post, + const char *page, const char *head, + const char *path); extern void cgit_print_layout_start(void); extern void cgit_print_layout_end(void);