2017-01-25 03:43:02 +01: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 13:50:42 +01:00
|
|
|
import (
|
|
|
|
"net/url"
|
|
|
|
"path"
|
2018-05-29 05:51:42 +02:00
|
|
|
"strings"
|
2018-02-20 13:50:42 +01:00
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
|
|
)
|
|
|
|
|
2017-01-25 03:43:02 +01: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 19:36:19 +02: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 03:43:02 +01:00
|
|
|
// OptionalBoolOf get the corresponding OptionalBool of a bool
|
|
|
|
func OptionalBoolOf(b bool) OptionalBool {
|
|
|
|
if b {
|
|
|
|
return OptionalBoolTrue
|
|
|
|
}
|
|
|
|
return OptionalBoolFalse
|
|
|
|
}
|
2017-10-27 08:10:54 +02:00
|
|
|
|
|
|
|
// Max max of two ints
|
|
|
|
func Max(a, b int) int {
|
|
|
|
if a < b {
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
return a
|
|
|
|
}
|
|
|
|
|
2018-02-20 13:50:42 +01:00
|
|
|
// URLJoin joins url components, like path.Join, but preserving contents
|
|
|
|
func URLJoin(base string, elems ...string) string {
|
2018-05-29 05:51:42 +02:00
|
|
|
if !strings.HasSuffix(base, "/") {
|
|
|
|
base += "/"
|
|
|
|
}
|
|
|
|
baseURL, err := url.Parse(base)
|
2018-02-20 13:50:42 +01:00
|
|
|
if err != nil {
|
|
|
|
log.Error(4, "URLJoin: Invalid base URL %s", base)
|
|
|
|
return ""
|
|
|
|
}
|
2018-05-29 05:51:42 +02: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 15:23:43 +02:00
|
|
|
if !baseURL.IsAbs() && !strings.HasPrefix(base, "/") {
|
|
|
|
return joinedURL[1:] // Removing leading '/' if needed
|
2018-05-29 05:51:42 +02:00
|
|
|
}
|
|
|
|
return joinedURL
|
2018-02-20 13:50:42 +01:00
|
|
|
}
|
|
|
|
|
2017-10-27 08:10:54 +02:00
|
|
|
// Min min of two ints
|
|
|
|
func Min(a, b int) int {
|
|
|
|
if a > b {
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
return a
|
|
|
|
}
|