govanityurls/vendor/gopkg.in/yaml.v2/sorter.go
Brandon Philips 26a09c434d
Update to use app engine runtime go112 (#34)
* app.yaml: update to go112

Make the required changes to use go112 due to the deprecation of Go 1.9.

Migration doc:
- https://cloud.google.com/appengine/docs/standard/go111/go-differences

References:
- https://github.com/GoogleCloudPlatform/govanityurls/issues/29#issuecomment-506538041
- https://github.com/etcd-io/maintainers/issues/17

* go.mod: initial commit

Migrate this project to use go.mod and update the README.

This is part of the recommended steps to runtime: go111 and beyond.
https://cloud.google.com/appengine/docs/standard/go111/go-differences

* vendor: add dependent packages

Add all dependencies for the project via vendoring for offline builds.

* travis.yml: drop go 1.6 for 1.12

Go 1.6 is too old to have a number of builtin packages for the latest
appengine package. Remove and update to match app engine version: 1.12.

* appengine.go: remove unused file

From the go111 migration doc:
"The appengine build tag is deprecated and will not be used when
building your app for deployment.  Ensure your code still functions
correctly without it being set."

https://cloud.google.com/appengine/docs/standard/go111/go-differences

* main: respect PORT environment variable

The go111 runtime should use the PORT variable to decide the listening
http port.

"PORT The port that receives HTTP requests."
https://cloud.google.com/appengine/docs/standard/go111/runtime
2020-02-06 09:36:34 -08:00

114 lines
2.6 KiB
Go

package yaml
import (
"reflect"
"unicode"
)
type keyList []reflect.Value
func (l keyList) Len() int { return len(l) }
func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
func (l keyList) Less(i, j int) bool {
a := l[i]
b := l[j]
ak := a.Kind()
bk := b.Kind()
for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
a = a.Elem()
ak = a.Kind()
}
for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
b = b.Elem()
bk = b.Kind()
}
af, aok := keyFloat(a)
bf, bok := keyFloat(b)
if aok && bok {
if af != bf {
return af < bf
}
if ak != bk {
return ak < bk
}
return numLess(a, b)
}
if ak != reflect.String || bk != reflect.String {
return ak < bk
}
ar, br := []rune(a.String()), []rune(b.String())
for i := 0; i < len(ar) && i < len(br); i++ {
if ar[i] == br[i] {
continue
}
al := unicode.IsLetter(ar[i])
bl := unicode.IsLetter(br[i])
if al && bl {
return ar[i] < br[i]
}
if al || bl {
return bl
}
var ai, bi int
var an, bn int64
if ar[i] == '0' || br[i] == '0' {
for j := i-1; j >= 0 && unicode.IsDigit(ar[j]); j-- {
if ar[j] != '0' {
an = 1
bn = 1
break
}
}
}
for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
an = an*10 + int64(ar[ai]-'0')
}
for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
bn = bn*10 + int64(br[bi]-'0')
}
if an != bn {
return an < bn
}
if ai != bi {
return ai < bi
}
return ar[i] < br[i]
}
return len(ar) < len(br)
}
// keyFloat returns a float value for v if it is a number/bool
// and whether it is a number/bool or not.
func keyFloat(v reflect.Value) (f float64, ok bool) {
switch v.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return float64(v.Int()), true
case reflect.Float32, reflect.Float64:
return v.Float(), true
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return float64(v.Uint()), true
case reflect.Bool:
if v.Bool() {
return 1, true
}
return 0, true
}
return 0, false
}
// numLess returns whether a < b.
// a and b must necessarily have the same kind.
func numLess(a, b reflect.Value) bool {
switch a.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return a.Int() < b.Int()
case reflect.Float32, reflect.Float64:
return a.Float() < b.Float()
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return a.Uint() < b.Uint()
case reflect.Bool:
return !a.Bool() && b.Bool()
}
panic("not a number")
}