You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

util.go 1.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package util
  5. import (
  6. "net/url"
  7. "path"
  8. "strings"
  9. "code.gitea.io/gitea/modules/log"
  10. )
  11. // OptionalBool a boolean that can be "null"
  12. type OptionalBool byte
  13. const (
  14. // OptionalBoolNone a "null" boolean value
  15. OptionalBoolNone = iota
  16. // OptionalBoolTrue a "true" boolean value
  17. OptionalBoolTrue
  18. // OptionalBoolFalse a "false" boolean value
  19. OptionalBoolFalse
  20. )
  21. // IsTrue return true if equal to OptionalBoolTrue
  22. func (o OptionalBool) IsTrue() bool {
  23. return o == OptionalBoolTrue
  24. }
  25. // IsFalse return true if equal to OptionalBoolFalse
  26. func (o OptionalBool) IsFalse() bool {
  27. return o == OptionalBoolFalse
  28. }
  29. // IsNone return true if equal to OptionalBoolNone
  30. func (o OptionalBool) IsNone() bool {
  31. return o == OptionalBoolNone
  32. }
  33. // OptionalBoolOf get the corresponding OptionalBool of a bool
  34. func OptionalBoolOf(b bool) OptionalBool {
  35. if b {
  36. return OptionalBoolTrue
  37. }
  38. return OptionalBoolFalse
  39. }
  40. // Max max of two ints
  41. func Max(a, b int) int {
  42. if a < b {
  43. return b
  44. }
  45. return a
  46. }
  47. // URLJoin joins url components, like path.Join, but preserving contents
  48. func URLJoin(base string, elems ...string) string {
  49. if !strings.HasSuffix(base, "/") {
  50. base += "/"
  51. }
  52. baseURL, err := url.Parse(base)
  53. if err != nil {
  54. log.Error(4, "URLJoin: Invalid base URL %s", base)
  55. return ""
  56. }
  57. joinedPath := path.Join(elems...)
  58. argURL, err := url.Parse(joinedPath)
  59. if err != nil {
  60. log.Error(4, "URLJoin: Invalid arg %s", joinedPath)
  61. return ""
  62. }
  63. joinedURL := baseURL.ResolveReference(argURL).String()
  64. if !baseURL.IsAbs() && !strings.HasPrefix(base, "/") {
  65. return joinedURL[1:] // Removing leading '/' if needed
  66. }
  67. return joinedURL
  68. }
  69. // Min min of two ints
  70. func Min(a, b int) int {
  71. if a > b {
  72. return b
  73. }
  74. return a
  75. }