2017-01-25 05:43:02 +03:00
|
|
|
// Copyright 2017 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
|
|
|
|
|
2018-02-20 15:50:42 +03:00
|
|
|
import (
|
|
|
|
"net/url"
|
|
|
|
"path"
|
2018-05-29 06:51:42 +03:00
|
|
|
"strings"
|
2018-02-20 15:50:42 +03:00
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
2018-06-26 17:45:18 +03:00
|
|
|
"code.gitea.io/gitea/modules/setting"
|
2018-02-20 15:50:42 +03:00
|
|
|
)
|
|
|
|
|
2017-01-25 05:43:02 +03:00
|
|
|
// OptionalBool a boolean that can be "null"
|
|
|
|
type OptionalBool byte
|
|
|
|
|
|
|
|
const (
|
|
|
|
// OptionalBoolNone a "null" boolean value
|
|
|
|
OptionalBoolNone = iota
|
|
|
|
// OptionalBoolTrue a "true" boolean value
|
|
|
|
OptionalBoolTrue
|
|
|
|
// OptionalBoolFalse a "false" boolean value
|
|
|
|
OptionalBoolFalse
|
|
|
|
)
|
|
|
|
|
2017-10-24 20:36:19 +03:00
|
|
|
// IsTrue return true if equal to OptionalBoolTrue
|
|
|
|
func (o OptionalBool) IsTrue() bool {
|
|
|
|
return o == OptionalBoolTrue
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsFalse return true if equal to OptionalBoolFalse
|
|
|
|
func (o OptionalBool) IsFalse() bool {
|
|
|
|
return o == OptionalBoolFalse
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsNone return true if equal to OptionalBoolNone
|
|
|
|
func (o OptionalBool) IsNone() bool {
|
|
|
|
return o == OptionalBoolNone
|
|
|
|
}
|
|
|
|
|
2017-01-25 05:43:02 +03:00
|
|
|
// OptionalBoolOf get the corresponding OptionalBool of a bool
|
|
|
|
func OptionalBoolOf(b bool) OptionalBool {
|
|
|
|
if b {
|
|
|
|
return OptionalBoolTrue
|
|
|
|
}
|
|
|
|
return OptionalBoolFalse
|
|
|
|
}
|
2017-10-27 09:10:54 +03:00
|
|
|
|
|
|
|
// Max max of two ints
|
|
|
|
func Max(a, b int) int {
|
|
|
|
if a < b {
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
return a
|
|
|
|
}
|
|
|
|
|
2018-02-20 15:50:42 +03:00
|
|
|
// URLJoin joins url components, like path.Join, but preserving contents
|
|
|
|
func URLJoin(base string, elems ...string) string {
|
2018-05-29 06:51:42 +03:00
|
|
|
if !strings.HasSuffix(base, "/") {
|
|
|
|
base += "/"
|
|
|
|
}
|
|
|
|
baseURL, err := url.Parse(base)
|
2018-02-20 15:50:42 +03:00
|
|
|
if err != nil {
|
|
|
|
log.Error(4, "URLJoin: Invalid base URL %s", base)
|
|
|
|
return ""
|
|
|
|
}
|
2018-05-29 06:51:42 +03:00
|
|
|
joinedPath := path.Join(elems...)
|
|
|
|
argURL, err := url.Parse(joinedPath)
|
|
|
|
if err != nil {
|
|
|
|
log.Error(4, "URLJoin: Invalid arg %s", joinedPath)
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
joinedURL := baseURL.ResolveReference(argURL).String()
|
2018-05-30 16:23:43 +03:00
|
|
|
if !baseURL.IsAbs() && !strings.HasPrefix(base, "/") {
|
|
|
|
return joinedURL[1:] // Removing leading '/' if needed
|
2018-05-29 06:51:42 +03:00
|
|
|
}
|
|
|
|
return joinedURL
|
2018-02-20 15:50:42 +03:00
|
|
|
}
|
|
|
|
|
2018-06-26 17:45:18 +03:00
|
|
|
// IsExternalURL checks if rawURL points to an external URL like http://example.com
|
|
|
|
func IsExternalURL(rawURL string) bool {
|
|
|
|
parsed, err := url.Parse(rawURL)
|
|
|
|
if err != nil {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
if len(parsed.Host) != 0 && strings.Replace(parsed.Host, "www.", "", 1) != strings.Replace(setting.Domain, "www.", "", 1) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2017-10-27 09:10:54 +03:00
|
|
|
// Min min of two ints
|
|
|
|
func Min(a, b int) int {
|
|
|
|
if a > b {
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
return a
|
|
|
|
}
|
2019-01-21 14:45:32 +03:00
|
|
|
|
|
|
|
// IsEmptyString checks if the provided string is empty
|
|
|
|
func IsEmptyString(s string) bool {
|
|
|
|
return len(strings.TrimSpace(s)) == 0
|
|
|
|
}
|