summaryrefslogtreecommitdiffstats
path: root/modules/util
diff options
context:
space:
mode:
authorEthan Koenig <ethantkoenig@gmail.com>2018-02-20 04:50:42 -0800
committerBo-Yi Wu <appleboy.tw@gmail.com>2018-02-20 20:50:42 +0800
commit7b104f0cd03cf3df2b10f6f447857fe389654df1 (patch)
treecb8517fa34a6a7e18bc275f97f6541aa0783ba13 /modules/util
parent7b297808cee599f5ff58b9f6afa64d3ee980998e (diff)
downloadgitea-7b104f0cd03cf3df2b10f6f447857fe389654df1.tar.gz
gitea-7b104f0cd03cf3df2b10f6f447857fe389654df1.zip
Populate URL field of API commits (#3546)
* Populate URL field of API commits * fix orgmode_test
Diffstat (limited to 'modules/util')
-rw-r--r--modules/util/util.go21
-rw-r--r--modules/util/util_test.go36
2 files changed, 57 insertions, 0 deletions
diff --git a/modules/util/util.go b/modules/util/util.go
index e99f951f21..3a0411f64b 100644
--- a/modules/util/util.go
+++ b/modules/util/util.go
@@ -4,6 +4,13 @@
package util
+import (
+ "net/url"
+ "path"
+
+ "code.gitea.io/gitea/modules/log"
+)
+
// OptionalBool a boolean that can be "null"
type OptionalBool byte
@@ -47,6 +54,20 @@ func Max(a, b int) int {
return a
}
+// URLJoin joins url components, like path.Join, but preserving contents
+func URLJoin(base string, elems ...string) string {
+ u, err := url.Parse(base)
+ if err != nil {
+ log.Error(4, "URLJoin: Invalid base URL %s", base)
+ return ""
+ }
+ joinArgs := make([]string, 0, len(elems)+1)
+ joinArgs = append(joinArgs, u.Path)
+ joinArgs = append(joinArgs, elems...)
+ u.Path = path.Join(joinArgs...)
+ return u.String()
+}
+
// Min min of two ints
func Min(a, b int) int {
if a > b {
diff --git a/modules/util/util_test.go b/modules/util/util_test.go
new file mode 100644
index 0000000000..cc5875263a
--- /dev/null
+++ b/modules/util/util_test.go
@@ -0,0 +1,36 @@
+// Copyright 2018 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package util
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestURLJoin(t *testing.T) {
+ type test struct {
+ Expected string
+ Base string
+ Elements []string
+ }
+ newTest := func(expected, base string, elements ...string) test {
+ return test{Expected: expected, Base: base, Elements: elements}
+ }
+ for _, test := range []test{
+ newTest("https://try.gitea.io/a/b/c",
+ "https://try.gitea.io", "a/b", "c"),
+ newTest("https://try.gitea.io/a/b/c",
+ "https://try.gitea.io/", "/a/b/", "/c/"),
+ newTest("https://try.gitea.io/a/c",
+ "https://try.gitea.io/", "/a/./b/", "../c/"),
+ newTest("a/b/c",
+ "a", "b/c/"),
+ newTest("a/b/d",
+ "a/", "b/c/", "/../d/"),
+ } {
+ assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...))
+ }
+}