From 55cd4a624882773604f606f24c5cf4847f62d769 Mon Sep 17 00:00:00 2001
From: "j. mccann" <info@mrsdizzie.com>
Date: Sun, 16 Feb 2020 01:02:56 -0500
Subject: [PATCH] Don't manually replace whitespace during render

For historical reasons Gitea manually alters the urlPrefix and replaces
a whitespace with a +. This Works for URLs, but we're also passing
urlPrefix to git calls and adding the + is breaking the tree path.

Goldmark will automatically convert a white space to the proper %20, so
we should leave the string as is which lets us pass it to git unmodified
and then let Goldmark fix it.

Also fixed separate bug in URLJoin I noticed while testing where it will
silently discard sections of a path that have # in them (possibly
others). We should just escape it first.

Fixes 10156
---
 modules/markup/markdown/goldmark.go | 1 -
 modules/markup/markup.go            | 1 -
 modules/util/url.go                 | 3 +++
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/modules/markup/markdown/goldmark.go b/modules/markup/markdown/goldmark.go
index a1c8e1ded0..a9475b58c5 100644
--- a/modules/markup/markdown/goldmark.go
+++ b/modules/markup/markdown/goldmark.go
@@ -52,7 +52,6 @@ func (g *GiteaASTTransformer) Transform(node *ast.Document, reader text.Reader,
 
 				lnk := string(link)
 				lnk = giteautil.URLJoin(prefix, lnk)
-				lnk = strings.Replace(lnk, " ", "+", -1)
 				link = []byte(lnk)
 			}
 			v.Destination = link
diff --git a/modules/markup/markup.go b/modules/markup/markup.go
index 008b21ab97..f8deb2b29b 100644
--- a/modules/markup/markup.go
+++ b/modules/markup/markup.go
@@ -81,7 +81,6 @@ func RenderWiki(filename string, rawBytes []byte, urlPrefix string, metas map[st
 }
 
 func render(parser Parser, rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte {
-	urlPrefix = strings.Replace(urlPrefix, " ", "+", -1)
 	result := parser.Render(rawBytes, urlPrefix, metas, isWiki)
 	// TODO: one day the error should be returned.
 	result, err := PostProcess(result, urlPrefix, metas, isWiki)
diff --git a/modules/util/url.go b/modules/util/url.go
index 263255fcd3..1acd713766 100644
--- a/modules/util/url.go
+++ b/modules/util/url.go
@@ -25,6 +25,9 @@ func PathEscapeSegments(path string) string {
 
 // URLJoin joins url components, like path.Join, but preserving contents
 func URLJoin(base string, elems ...string) string {
+	// We do need to escape special chars here or else they can be silently discarded
+	// in the ResolveReference call below
+	base = PathEscapeSegments(base)
 	if !strings.HasSuffix(base, "/") {
 		base += "/"
 	}