[PATCH v4 14/16] ui-shared: add helper for generating non-urlencoded links

Andy Green andy at warmcat.com
Wed Jun 20 12:13:10 CEST 2018


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 <andy at warmcat.com>
---
 ui-shared.c |   32 ++++++++++++++++++++++++++++++++
 ui-shared.h |    3 +++
 2 files changed, 35 insertions(+)

diff --git a/ui-shared.c b/ui-shared.c
index 21bbded..c9a34fb 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -221,6 +221,38 @@ void cgit_index_link(const char *name, const char *title, const char *class,
 	site_link(NULL, name, title, class, pattern, sort, ofs, always_root);
 }
 
+const char *cgit_repo_create_url(struct strbuf *sb, struct strbuf *sb_post,
+				 const char *page, const char *head,
+				 const char *path)
+{
+	const char *delim = "?";
+
+	if (ctx.cfg.virtual_root) {
+		strbuf_addf(sb, "%s%s", ctx.cfg.virtual_root, ctx.repo->url);
+	} else {
+		strbuf_addstr(sb, ctx.cfg.script_name);
+		sb = sb_post;
+		strbuf_addf(sb, "?url=%s", ctx.repo->url);
+		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 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..e78b5fd 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 const char *cgit_repo_create_url(struct strbuf *sb, 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);



More information about the CGit mailing list