diff --git a/cmd/cog/cog.go b/cmd/cog/cog.go index 3645ea6ace..a0ae6bb1b2 100644 --- a/cmd/cog/cog.go +++ b/cmd/cog/cog.go @@ -3,16 +3,16 @@ package main import ( "github.com/replicate/cog/pkg/cli" - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" ) func main() { cmd, err := cli.NewRootCommand() if err != nil { - log.Fatalf("%f", err) + console.Fatal("%f", err) } if err = cmd.Execute(); err != nil { - log.Fatalf("%s", err) + console.Fatal("%s", err) } } diff --git a/cmd/generate_compatibility_matrices/main.go b/cmd/generate_compatibility_matrices/main.go index f5a60fdef5..12ddea26e2 100644 --- a/cmd/generate_compatibility_matrices/main.go +++ b/cmd/generate_compatibility_matrices/main.go @@ -10,7 +10,8 @@ import ( "strings" "github.com/anaskhan96/soup" - log "github.com/sirupsen/logrus" + + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/model" ) @@ -22,28 +23,28 @@ func main() { flag.Parse() if *tfOutputPath == "" && *torchOutputPath == "" && *cudaImagesOutputPath == "" { - log.Fatal("at least one of -tf-output, -torch-output, -cuda-images-output must be provided") + console.Fatal("at least one of -tf-output, -torch-output, -cuda-images-output must be provided") } if *tfOutputPath != "" { if err := writeTFCompatibilityMatrix(*tfOutputPath); err != nil { - log.Fatalf("Failed to write Tensorflow compatibility matrix: %s", err) + console.Fatal("Failed to write Tensorflow compatibility matrix: %s", err) } } if *torchOutputPath != "" { if err := writeTorchCompatibilityMatrix(*torchOutputPath); err != nil { - log.Fatalf("Failed to write PyTorch compatibility matrix: %s", err) + console.Fatal("Failed to write PyTorch compatibility matrix: %s", err) } } if *cudaImagesOutputPath != "" { if err := writeCUDABaseImageTags(*cudaImagesOutputPath); err != nil { - log.Fatalf("Failed to write CUDA base images: %s", err) + console.Fatal("Failed to write CUDA base images: %s", err) } } } func writeTFCompatibilityMatrix(outputPath string) error { - log.Infof("Writing Tensorflow compatibility matrix to %s...", outputPath) + console.Info("Writing Tensorflow compatibility matrix to %s...", outputPath) url := "https://www.tensorflow.org/install/source" resp, err := soup.Get(url) @@ -93,7 +94,7 @@ func writeTFCompatibilityMatrix(outputPath string) error { } func writeTorchCompatibilityMatrix(outputPath string) error { - log.Infof("Writing PyTorch compatibility matrix to %s...", outputPath) + console.Info("Writing PyTorch compatibility matrix to %s...", outputPath) compats := []model.TorchCompatibility{} var err error @@ -122,7 +123,7 @@ func writeTorchCompatibilityMatrix(outputPath string) error { } func writeCUDABaseImageTags(outputPath string) error { - log.Infof("Writing CUDA base images to %s...", outputPath) + console.Info("Writing CUDA base images to %s...", outputPath) url := "https://hub.docker.com/v2/repositories/nvidia/cuda/tags/?page_size=1000&name=devel-ubuntu&ordering=last_updated" resp, err := soup.Get(url) if err != nil { diff --git a/go.mod b/go.mod index 1d1e320870..82e9e9856a 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/Microsoft/go-winio v0.4.16 // indirect - github.com/TylerBrock/colorjson v0.0.0-20200706003622-8a50f05110d2 // indirect + github.com/TylerBrock/colorjson v0.0.0-20200706003622-8a50f05110d2 github.com/anaskhan96/soup v1.2.4 github.com/containerd/containerd v1.4.4 // indirect github.com/docker/distribution v2.7.1+incompatible // indirect @@ -14,22 +14,21 @@ require ( github.com/fatih/color v1.10.0 // indirect github.com/golang/protobuf v1.4.3 // indirect github.com/google/go-cmp v0.5.4 // indirect - github.com/gopherdata/gophernotes v0.7.2 // indirect github.com/gorilla/mux v1.8.0 + github.com/hokaccha/go-prettyjson v0.0.0-20210113012101-fb4e108d2519 // indirect github.com/kr/text v0.2.0 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible + github.com/mattn/go-isatty v0.0.12 github.com/mholt/archiver/v3 v3.5.0 github.com/mitchellh/go-homedir v1.1.0 - github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf // indirect + github.com/mitchellh/go-wordwrap v1.0.1 + github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf github.com/morikuni/aec v1.0.0 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/onsi/ginkgo v1.8.0 // indirect - github.com/onsi/gomega v1.4.3 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect - github.com/pebbe/zmq4 v0.0.0-20170917105202-90d69e412a09 // indirect - github.com/satori/go.uuid v1.2.1-0.20180103174451-36e9d2ebbde5 // indirect github.com/schollz/progressbar/v3 v3.7.6 - github.com/sirupsen/logrus v1.7.0 + github.com/sirupsen/logrus v1.7.0 // indirect github.com/spf13/cobra v1.1.3 github.com/stretchr/testify v1.7.0 github.com/xeonx/timeago v1.0.0-rc4 @@ -40,11 +39,8 @@ require ( golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c // indirect google.golang.org/grpc v1.35.0 // indirect - gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 - gotest.tools/gotestsum v1.6.2 // indirect gotest.tools/v3 v3.0.3 // indirect ) diff --git a/go.sum b/go.sum index afe9d8ef12..7bcd33eda2 100644 --- a/go.sum +++ b/go.sum @@ -46,18 +46,15 @@ github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos72/gomacro v0.0.0-20210316200708-0b986404ea46 h1:OsccoDca2/mpwQBivqw4GA9DfZpbz8HYyZ+yba4c8t0= -github.com/cosmos72/gomacro v0.0.0-20210316200708-0b986404ea46/go.mod h1:70Ia4ft7PpdHfiZoVU9yiSFfMqJNnbHINgQrG5G90MM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= -github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v20.10.5+incompatible h1:o5WL5onN4awYGwrW7+oTn5x9AF2prw7V0Ox8ZEkoCdg= @@ -74,25 +71,15 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-zeromq/goczmq/v4 v4.2.2 h1:HAJN+i+3NW55ijMJJhk7oWxHKXgAuSBkoFfvr8bYj4U= -github.com/go-zeromq/goczmq/v4 v4.2.2/go.mod h1:Sm/lxrfxP/Oxqs0tnHD6WAhwkWrx+S+1MRrKzcxoaYE= -github.com/go-zeromq/zmq4 v0.9.0 h1:aFkxnxJvYhXCrE7UhoRR6oP6wqanjkuO2nA0nMsnm0g= -github.com/go-zeromq/zmq4 v0.9.0/go.mod h1:hCJ0OxYnL3Y3erSLQ025VLGi/W63zJjvr9i17oU2P24= -github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6rR7UHz84= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -122,20 +109,15 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherdata/gophernotes v0.7.2 h1:w/L6IXEfpJ8UQuxD7LG5Sw1coPb8o9w7Is6xKHeoSa8= -github.com/gopherdata/gophernotes v0.7.2/go.mod h1:Bvw0PgqIzP56vlMUpOKC48MhvhCIrGbyC6sdgbf1r78= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -163,10 +145,10 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hokaccha/go-prettyjson v0.0.0-20210113012101-fb4e108d2519 h1:nqAlWFEdqI0ClbTDrhDvE/8LeQ4pftrqKUX9w5k0j3s= +github.com/hokaccha/go-prettyjson v0.0.0-20210113012101-fb4e108d2519/go.mod h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -188,20 +170,15 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -213,6 +190,8 @@ github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -229,18 +208,12 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pebbe/zmq4 v0.0.0-20170917105202-90d69e412a09/go.mod h1:7N4y5R18zBiu3l0vajMUWQgZyjv464prE8RCyBcmnZM= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterh/liner v1.2.0 h1:w/UPXyl5GfahFxcTOz2j9wCIHNI+pUPr2laqpojKNCg= -github.com/peterh/liner v1.2.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pierrec/lz4/v4 v4.1.2 h1:qvY3YFXRQE/XB8MlLzJH7mSzBs74eA2gg52YTk6jUPM= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -267,7 +240,6 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/satori/go.uuid v1.2.1-0.20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v3 v3.7.6 h1:akAvVpTy2IAcePWYndctoBaY9bLE3z4LE1Hn91BJ9g4= github.com/schollz/progressbar/v3 v3.7.6/go.mod h1:Y9mmL2knZj3LUaBDyBEzFdPrymIr08hnlFMZmfxwbx4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -307,7 +279,6 @@ github.com/xeonx/timeago v1.0.0-rc4/go.mod h1:qDLrYEFynLO7y5Ho7w3GwgtYgpy5UfhcXI github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -319,8 +290,6 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -341,11 +310,8 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -359,7 +325,6 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -370,17 +335,13 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -388,15 +349,11 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210223095934-7937bea0104d h1:u0GOGnBJ3EKE/tNqREhhGiCzE9jFXydDo2lf7hOwGuc= golang.org/x/sys v0.0.0-20210223095934-7937bea0104d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492 h1:Paq34FxTluEPvVyayQqMPgHm+vTOrIifmcYxFBx9TLg= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -433,11 +390,7 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20201023150057-2f4fa188d925 h1:iGGR3nU1TUd+WTF17QPTTShBEDG66IKsDIDKtC4EseY= -golang.org/x/tools v0.0.0-20201023150057-2f4fa188d925/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -481,18 +434,14 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -501,8 +450,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/gotestsum v1.6.2 h1:QRO7xoLEUQOdSzBzUaasXvn6WOSQjf2hBIBDWEs3VqI= -gotest.tools/gotestsum v1.6.2/go.mod h1:H74H1IvjJE+E/1INpsn2P4+QW0uLDgL/T2sVajPHmTM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= diff --git a/pkg/cli/build.go b/pkg/cli/build.go index ad08200423..4ff3f3dc7e 100644 --- a/pkg/cli/build.go +++ b/pkg/cli/build.go @@ -5,9 +5,10 @@ import ( "os" "path" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/replicate/cog/pkg/console" + "github.com/replicate/cog/pkg/client" "github.com/replicate/cog/pkg/global" ) @@ -39,7 +40,7 @@ func buildPackage(cmd *cobra.Command, args []string) error { return fmt.Errorf("%s does not exist in %s. Are you in the right directory?", global.ConfigFilename, projectDir) } - log.Infof("--> Uploading %s", projectDir) + console.Info("Uploading %s to %s", projectDir, repo) cli := client.NewClient() mod, err := cli.UploadPackage(repo, projectDir) diff --git a/pkg/cli/infer.go b/pkg/cli/infer.go index 0b7b022636..4bff849e5b 100644 --- a/pkg/cli/infer.go +++ b/pkg/cli/infer.go @@ -13,9 +13,10 @@ import ( "time" "github.com/TylerBrock/colorjson" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/replicate/cog/pkg/console" + "github.com/replicate/cog/pkg/client" "github.com/replicate/cog/pkg/logger" "github.com/replicate/cog/pkg/model" @@ -50,7 +51,7 @@ func cmdInfer(cmd *cobra.Command, args []string) error { packageId := args[0] client := client.NewClient() - fmt.Println("--> Loading package", packageId) + fmt.Println("Loading package", packageId) pkg, err := client.GetPackage(repo, packageId) if err != nil { return err @@ -60,14 +61,14 @@ func cmdInfer(cmd *cobra.Command, args []string) error { if err != nil { return err } - logWriter := logger.NewLogrusLogger() + logWriter := logger.NewConsoleLogger() deployment, err := servingPlatform.Deploy(pkg, model.TargetDockerCPU, logWriter) if err != nil { return err } defer func() { if err := deployment.Undeploy(); err != nil { - log.Warnf("Failed to kill Docker container: %s", err) + console.Warn("Failed to kill Docker container: %s", err) } }() @@ -130,7 +131,7 @@ func cmdInfer(cmd *cobra.Command, args []string) error { return err } - fmt.Println("--> Written output to " + outPath) + fmt.Println("Written output to " + outPath) return nil } diff --git a/pkg/cli/repo.go b/pkg/cli/repo.go index fefd25413b..630417c232 100644 --- a/pkg/cli/repo.go +++ b/pkg/cli/repo.go @@ -5,9 +5,10 @@ import ( "os" "path/filepath" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/replicate/cog/pkg/console" + "github.com/replicate/cog/pkg/client" "github.com/replicate/cog/pkg/files" "github.com/replicate/cog/pkg/global" @@ -62,7 +63,7 @@ func setRepo(cmd *cobra.Command, args []string) error { } exists, err := files.FileExists(filepath.Join(cwd, global.ConfigFilename)) if !exists { - log.Warnf("%s does not exist in %s. Are you in the right directory?", global.ConfigFilename, cwd) + console.Warn("%s does not exist in %s. Are you in the right directory?", global.ConfigFilename, cwd) } cli := client.NewClient() diff --git a/pkg/cli/root.go b/pkg/cli/root.go index a8570b250f..13235963d5 100644 --- a/pkg/cli/root.go +++ b/pkg/cli/root.go @@ -2,13 +2,12 @@ package cli import ( "fmt" + "os" "regexp" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "os" - + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/global" "github.com/replicate/cog/pkg/model" "github.com/replicate/cog/pkg/settings" @@ -26,7 +25,7 @@ func NewRootCommand() (*cobra.Command, error) { // This stops errors being printed because we print them in cmd/keepsake/main.go PersistentPreRun: func(cmd *cobra.Command, args []string) { if global.Verbose { - log.SetLevel(log.DebugLevel) + console.SetLevel(console.DebugLevel) } }, } diff --git a/pkg/cli/server.go b/pkg/cli/server.go index 68344adc91..4e09b95005 100644 --- a/pkg/cli/server.go +++ b/pkg/cli/server.go @@ -6,9 +6,10 @@ import ( "path/filepath" "strconv" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/replicate/cog/pkg/console" + "github.com/replicate/cog/pkg/database" "github.com/replicate/cog/pkg/docker" "github.com/replicate/cog/pkg/server" @@ -47,7 +48,7 @@ func startServer(cmd *cobra.Command, args []string) error { } } - log.Debugf("Preparing to start server on port %d", port) + console.Debug("Preparing to start server on port %d", port) // TODO(andreas): make this configurable dataDir := ".cog" @@ -65,7 +66,7 @@ func startServer(cmd *cobra.Command, args []string) error { return err } if dockerRegistry == "" { - log.Warn("Running without docker registry. Please add --docker-registry to be able to push images") + console.Warn("Running without docker registry. Please add --docker-registry to be able to push images") } dockerImageBuilder := docker.NewLocalImageBuilder(dockerRegistry) servingPlatform, err := serving.NewLocalDockerPlatform() diff --git a/pkg/client/upload.go b/pkg/client/upload.go index 04c2a7cf3e..5b47379cf8 100644 --- a/pkg/client/upload.go +++ b/pkg/client/upload.go @@ -11,7 +11,8 @@ import ( "github.com/mholt/archiver/v3" "github.com/schollz/progressbar/v3" - log "github.com/sirupsen/logrus" + + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/logger" "github.com/replicate/cog/pkg/model" @@ -42,19 +43,19 @@ func (c *Client) UploadPackage(repo *model.Repo, projectDir string) (*model.Mode z := archiver.Zip{ImplicitTopLevelFolder: false} err := z.WriterArchive([]string{projectDir}, io.MultiWriter(zipWriter, bar)) if err != nil { - log.Fatal(err) + console.Fatal(err.Error()) } // MultiWriter is a Writer not a WriteCloser, but zipWriter is a WriteCloser, so we need to Close it ourselves if err = zipWriter.Close(); err != nil { - log.Fatal(err) + console.Fatal(err.Error()) } }() go func() { err := uploadFile(req, "file", "package.zip", zipReader, bodyWriter) if err != nil { - log.Fatal(err) + console.Fatal(err.Error()) } - log.Info("--> Building package...") + console.Info("Building package...") }() resp, err := client.Do(req) @@ -72,26 +73,26 @@ func (c *Client) UploadPackage(repo *model.Repo, projectDir string) (*model.Mode break } if err == io.ErrUnexpectedEOF { - log.Warn("Unexpected EOF") + console.Warn("Unexpected EOF") break } - log.Warn(err) + console.Warn(err.Error()) } msg := new(logger.Message) if err := json.Unmarshal(line, msg); err != nil { - log.Debug(string(line)) - log.Warnf("Failed to parse log message: %s", err) + console.Debug(string(line)) + console.Warn("Failed to parse console message: %s", err) continue } switch msg.Type { case logger.MessageTypeError: return nil, fmt.Errorf("Error: %s", msg.Text) case logger.MessageTypeLogLine: - log.Info(msg.Text) + console.Info(msg.Text) case logger.MessageTypeDebugLine: - log.Debug(msg.Text) + console.Debug(msg.Text) case logger.MessageTypeStatus: - log.Info("--> " + msg.Text) + console.Info(msg.Text) case logger.MessageTypeModel: mod = msg.Model } diff --git a/pkg/console/console.go b/pkg/console/console.go new file mode 100644 index 0000000000..50b4696095 --- /dev/null +++ b/pkg/console/console.go @@ -0,0 +1,128 @@ +// Package console provides a standard interface for user- and machine-interface with the console +package console + +import ( + "fmt" + "os" + "strings" + "sync" + + "github.com/logrusorgru/aurora" + "github.com/mitchellh/go-wordwrap" +) + +// Console represents a standardized interface for console UI. It is designed to abstract: +// - Writing messages to logs or displaying on console +// - Console user interface elements (progress, interactive prompts, etc) +// - Switching between human and machine modes for these things (e.g. don't display progress bars or colors in logs, don't prompt for input when in a script) +type Console struct { + Color bool + IsMachine bool + Level Level + mu sync.Mutex +} + +// Debug level message +func (c *Console) Debug(msg string, v ...interface{}) { + c.log(DebugLevel, msg, v...) +} + +// Info level message +func (c *Console) Info(msg string, v ...interface{}) { + c.log(InfoLevel, msg, v...) +} + +// Warn level message +func (c *Console) Warn(msg string, v ...interface{}) { + c.log(WarnLevel, msg, v...) +} + +// Error level message +func (c *Console) Error(msg string, v ...interface{}) { + c.log(ErrorLevel, msg, v...) +} + +// Fatal level message, followed by exit +func (c *Console) Fatal(msg string, v ...interface{}) { + c.log(FatalLevel, msg, v...) + os.Exit(1) +} + +// Output a line to stdout. Useful for printing primary output of a command, or the output of a subcommand. +func (c *Console) Output(line string) { + c.mu.Lock() + defer c.mu.Unlock() + fmt.Fprintln(os.Stdout, line) +} + +// OutputErr a line to stderr. Useful for printing primary output of a command, or the output of a subcommand. +func (c *Console) OutputErr(line string) { + c.mu.Lock() + defer c.mu.Unlock() + fmt.Fprintln(os.Stderr, line) +} + +// DebugOutput a line to stdout. Like Output, but only when level is DebugLevel. +func (c *Console) DebugOutput(line string) { + if c.Level > DebugLevel { + return + } + if c.Color { + line = aurora.Faint(line).String() + } + c.mu.Lock() + defer c.mu.Unlock() + fmt.Fprintln(os.Stderr, line) +} + +func (c *Console) log(level Level, msg string, v ...interface{}) { + if level < c.Level { + return + } + + prompt := "═══╡ " + continuationPrompt := " │ " + + formattedMsg := fmt.Sprintf(msg, v...) + + // Word wrap + width, err := GetWidth() + if err != nil { + Debug("error getting width of terminal: %s", err) + } else if width > 30 { + // Only do word wrapping for terminals 30 chars or wider. Anything smaller and the terminal + // is probably resized really small for some reason, and when the user resizes it to be big + // again then we want the text to flow sensibly instead of having one word per line, or + // whatever. This also makes width-len(prompt) always be positive. + formattedMsg = wordwrap.WrapString(formattedMsg, uint(width)-uint(len(prompt))) + } + + // Add color after word wrapping so naive length of prompt is correct + if c.Color { + color := aurora.Faint + if level == WarnLevel { + color = aurora.Yellow + } else if level == ErrorLevel { + color = aurora.Red + } else if level == FatalLevel { + color = aurora.Red + } + prompt = color(prompt).String() + continuationPrompt = color(continuationPrompt).String() + } + + c.mu.Lock() + defer c.mu.Unlock() + + for i, line := range strings.Split(formattedMsg, "\n") { + if c.Color && level == DebugLevel { + line = aurora.Faint(line).String() + } + if i == 0 { + line = prompt + line + } else { + line = continuationPrompt + line + } + fmt.Fprintln(os.Stderr, line) + } +} diff --git a/pkg/console/formatting.go b/pkg/console/formatting.go new file mode 100644 index 0000000000..3184b7a280 --- /dev/null +++ b/pkg/console/formatting.go @@ -0,0 +1,11 @@ +package console + +import ( + "time" + + "github.com/xeonx/timeago" +) + +func FormatTime(t time.Time) string { + return timeago.English.Format(t) +} diff --git a/pkg/console/global.go b/pkg/console/global.go new file mode 100644 index 0000000000..5c3bb8f579 --- /dev/null +++ b/pkg/console/global.go @@ -0,0 +1,69 @@ +package console + +import ( + "os" + + "github.com/mattn/go-isatty" +) + +// ConsoleInstance is the global instance of console, so we don't have to pass it around everywhere +var ConsoleInstance *Console = &Console{ + Color: true, + Level: InfoLevel, + IsMachine: false, +} + +// SetLevel sets log level +func SetLevel(level Level) { + ConsoleInstance.Level = level +} + +// SetColor sets whether to print colors +func SetColor(color bool) { + ConsoleInstance.Color = color +} + +// Debug level message. +func Debug(msg string, v ...interface{}) { + ConsoleInstance.Debug(msg, v...) +} + +// Info level message. +func Info(msg string, v ...interface{}) { + ConsoleInstance.Info(msg, v...) +} + +// Warn level message. +func Warn(msg string, v ...interface{}) { + ConsoleInstance.Warn(msg, v...) +} + +// Error level message. +func Error(msg string, v ...interface{}) { + ConsoleInstance.Error(msg, v...) +} + +// Fatal level message. +func Fatal(msg string, v ...interface{}) { + ConsoleInstance.Fatal(msg, v...) +} + +// Output a line to stdout. Useful for printing primary output of a command, or the output of a subcommand. +func Output(line string) { + ConsoleInstance.Output(line) +} + +// OutputErr a line to stderr. Useful for printing primary output of a command, or the output of a subcommand. +func OutputErr(line string) { + ConsoleInstance.OutputErr(line) +} + +// DebugOutput a line to stdout. Like Output, but only when level is DebugLevel. +func DebugOutput(line string) { + ConsoleInstance.DebugOutput(line) +} + +// IsTTY checks if a file is a TTY or not. E.g. IsTTY(os.Stdin) +func IsTTY(f *os.File) bool { + return isatty.IsTerminal(f.Fd()) +} diff --git a/pkg/console/interactive.go b/pkg/console/interactive.go new file mode 100644 index 0000000000..ca44efb921 --- /dev/null +++ b/pkg/console/interactive.go @@ -0,0 +1,111 @@ +package console + +import ( + "bufio" + "fmt" + "io" + "os" + "strings" + + "github.com/replicate/cog/pkg/slices" +) + +type Interactive struct { + Prompt string + Default string + Options []string + Required bool +} + +func (i Interactive) Read() (string, error) { + if i.Default != "" && i.Options != nil && !slices.ContainsString(i.Options, i.Default) { + panic("Default is not an option") + } + + parens := "" + if i.Required { + parens += "required" + } + if i.Default != "" { + if parens != "" { + parens += ", " + } + parens += "default: " + i.Default + } + if i.Options != nil { + if parens != "" { + parens += ", " + } + parens += "options: " + strings.Join(i.Options, ", ") + } + if parens != "" { + parens = " (" + parens + ")" + } + + for { + fmt.Printf("%s%s: ", i.Prompt, parens) + reader := bufio.NewReader(os.Stdin) + text, err := reader.ReadString('\n') + if err != nil { + return "", err + } + text = strings.TrimSpace(text) + if text == "" && i.Default != "" { + text = i.Default + } + + if i.Required && text == "" { + Warn("Please enter a value") + continue + } + + if !i.Required && text == "" { + return "", nil + } + + if i.Options != nil { + if !slices.ContainsString(i.Options, text) { + Warn("%s is not a valid option", text) + continue + } + } + + return text, nil + } +} + +type InteractiveBool struct { + Prompt string + Default bool + // NonDefaultFlag is the flag to suggest passing to do the thing which isn't default when running inside a script + NonDefaultFlag string +} + +func (i InteractiveBool) Read() (bool, error) { + defaults := "y/N" + if i.Default { + defaults = "Y/n" + } + for { + fmt.Printf("%s (%s) ", i.Prompt, defaults) + reader := bufio.NewReader(os.Stdin) + text, err := reader.ReadString('\n') + if err != nil { + if err == io.EOF { + return false, fmt.Errorf("stdin is closed. If you're running in a script, you need to pass the '%s' option.", i.NonDefaultFlag) + } + return false, err + } + text = strings.ToLower(strings.TrimSpace(text)) + if text == "yes" || text == "y" { + return true, nil + } + if text == "no" || text == "n" { + return false, nil + } + if text == "" { + return i.Default, nil + } + Warn("Please enter 'y' or 'n'") + } +} diff --git a/pkg/console/levels.go b/pkg/console/levels.go new file mode 100644 index 0000000000..cd3512a131 --- /dev/null +++ b/pkg/console/levels.go @@ -0,0 +1,66 @@ +package console + +// Mostly lifted from https://github.com/apex/log/blob/master/levels.go + +import ( + "errors" + "strings" +) + +// ErrInvalidLevel is returned if the severity level is invalid. +var ErrInvalidLevel = errors.New("invalid level") + +// Level of severity. +type Level int + +// Log levels. +const ( + InvalidLevel Level = iota - 1 + DebugLevel + InfoLevel + WarnLevel + ErrorLevel + FatalLevel +) + +var levelNames = [...]string{ + DebugLevel: "debug", + InfoLevel: "info", + WarnLevel: "warn", + ErrorLevel: "error", + FatalLevel: "fatal", +} + +var levelStrings = map[string]Level{ + "debug": DebugLevel, + "info": InfoLevel, + "warn": WarnLevel, + "warning": WarnLevel, + "error": ErrorLevel, + "fatal": FatalLevel, +} + +// String implementation. +func (l Level) String() string { + return levelNames[l] +} + +// ParseLevel parses level string. +func ParseLevel(s string) (Level, error) { + l, ok := levelStrings[strings.ToLower(s)] + if !ok { + return InvalidLevel, ErrInvalidLevel + } + + return l, nil +} + +// MustParseLevel parses level string or panics. +func MustParseLevel(s string) Level { + l, err := ParseLevel(s) + if err != nil { + panic("invalid log level") + } + + return l +} diff --git a/pkg/console/term.go b/pkg/console/term.go new file mode 100644 index 0000000000..e044181c65 --- /dev/null +++ b/pkg/console/term.go @@ -0,0 +1,27 @@ +package console + +import ( + "os" + + "github.com/moby/term" +) + +// IsTerminal returns true if we're in a terminal and a user is interacting with us +func IsTerminal() bool { + return term.IsTerminal(os.Stdin.Fd()) +} + +// GetWidth returns the width of the terminal (from stderr -- stdout might be piped) +// +// Returns 0 if we're not in a terminal +func GetWidth() (uint16, error) { + fd := os.Stderr.Fd() + if term.IsTerminal(fd) { + ws, err := term.GetWinsize(fd) + if err != nil { + return 0, err + } + return ws.Width, nil + } + return 0, nil +} diff --git a/pkg/docker/local_builder.go b/pkg/docker/local_builder.go index 9061517444..9c50327efb 100644 --- a/pkg/docker/local_builder.go +++ b/pkg/docker/local_builder.go @@ -8,7 +8,7 @@ import ( "regexp" "strings" - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/logger" "github.com/replicate/cog/pkg/shell" @@ -45,7 +45,7 @@ func (b *LocalImageBuilder) BuildAndPush(dir string, dockerfilePath string, name } func (b *LocalImageBuilder) build(dir string, dockerfilePath string, logWriter logger.Logger) (tag string, err error) { - log.Debugf("Building in %s", dir) + console.Debug("Building in %s", dir) cmd := exec.Command( "docker", "build", ".", @@ -81,7 +81,7 @@ func (b *LocalImageBuilder) build(dir string, dockerfilePath string, logWriter l } func (b *LocalImageBuilder) tag(tag string, fullImageTag string, logWriter logger.Logger) error { - log.Debugf("Tagging %s as %s", tag, fullImageTag) + console.Debug("Tagging %s as %s", tag, fullImageTag) cmd := exec.Command("docker", "tag", tag, fullImageTag) cmd.Env = os.Environ() @@ -100,7 +100,7 @@ func (b *LocalImageBuilder) push(tag string, logWriter logger.Logger) error { cmd := exec.Command("docker", args...) cmd.Env = os.Environ() - log.Debug("Pushing model to Registry...") + console.Debug("Pushing model to Registry...") stderrDone, err := pipeToWithDockerChecks(cmd.StderrPipe, logWriter) if err != nil { return err @@ -173,10 +173,10 @@ func pipeToWithDockerChecks(pf shell.PipeFunc, logWriter logger.Logger) (done ch return shell.PipeTo(pf, func(args ...interface{}) { line := args[0].(string) if strings.Contains(line, "Cannot connect to the Docker daemon") { - log.Fatal("Docker does not appear to be running; please start Docker and try again") + console.Fatal("Docker does not appear to be running; please start Docker and try again") } if strings.Contains(line, "failed to dial gRPC: unable to upgrade to h2c, received 502") { - log.Fatal("Your Docker version appears to be out out date; please upgrade Docker to the latest version and try again") + console.Fatal("Your Docker version appears to be out out date; please upgrade Docker to the latest version and try again") } if logWriter != nil { logWriter.WriteLogLine(line) diff --git a/pkg/docker/pull.go b/pkg/docker/pull.go index d96f7fe386..9a65c2b8a8 100644 --- a/pkg/docker/pull.go +++ b/pkg/docker/pull.go @@ -4,13 +4,13 @@ import ( "fmt" "os/exec" - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/logger" ) func Pull(tag string, logWriter logger.Logger) error { - log.Info("Downloading image...") + console.Info("Downloading image...") cmd := exec.Command("docker", "pull", tag) stderrDone, err := pipeToWithDockerChecks(cmd.StderrPipe, logWriter) diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index af9084a2d7..aa5d31336f 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -1,7 +1,7 @@ package logger import ( - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/model" ) @@ -14,29 +14,29 @@ type Logger interface { WriteModel(mod *model.Model) } -type LogrusLogger struct { +type ConsoleLogger struct { } -func NewLogrusLogger() *LogrusLogger { - return new(LogrusLogger) +func NewConsoleLogger() *ConsoleLogger { + return new(ConsoleLogger) } -func (l *LogrusLogger) WriteLogLine(line string, args ...interface{}) { - log.Infof(line, args...) +func (l *ConsoleLogger) WriteLogLine(line string, args ...interface{}) { + console.Info(line, args...) } -func (l *LogrusLogger) WriteDebugLine(line string, args ...interface{}) { - log.Debugf(line, args...) +func (l *ConsoleLogger) WriteDebugLine(line string, args ...interface{}) { + console.Debug(line, args...) } -func (l *LogrusLogger) WriteStatus(status string, args ...interface{}) { - log.Infof(status, args...) +func (l *ConsoleLogger) WriteStatus(status string, args ...interface{}) { + console.Info(status, args...) } -func (l *LogrusLogger) WriteError(err error) { - log.Error(err.Error()) +func (l *ConsoleLogger) WriteError(err error) { + console.Error(err.Error()) } -func (l *LogrusLogger) WriteModel(mod *model.Model) { - log.Infof("%v", mod) +func (l *ConsoleLogger) WriteModel(mod *model.Model) { + console.Info("%v", mod) } diff --git a/pkg/logger/stream_logger.go b/pkg/logger/stream_logger.go index 1c07683760..dbf017ee55 100644 --- a/pkg/logger/stream_logger.go +++ b/pkg/logger/stream_logger.go @@ -5,7 +5,7 @@ import ( "fmt" "net/http" - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/model" ) @@ -38,7 +38,7 @@ func (logger *StreamLogger) logText(messageType MessageType, text string) { msg := Message{Type: messageType, Text: text} data, err := json.Marshal(msg) if err != nil { - log.Warnf("Failed to marshal log text: %s", text) + console.Warn("Failed to marshal console text: %s", text) } logger.write(data) } @@ -46,13 +46,13 @@ func (logger *StreamLogger) logText(messageType MessageType, text string) { func (logger *StreamLogger) write(data []byte) { data = append(data, '\n') if _, err := logger.writer.Write(data); err != nil { - log.Warnf("HTTP response writer failed to write: %s", data) + console.Warn("HTTP response writer failed to write: %s", data) return } if f, ok := logger.writer.(http.Flusher); ok { f.Flush() } else { - log.Warnf("HTTP response writer can not be flushed") + console.Warn("HTTP response writer can not be flushed") } } @@ -76,7 +76,7 @@ func (logger *StreamLogger) WriteModel(mod *model.Model) { msg := Message{Type: MessageTypeModel, Model: mod} data, err := json.Marshal(msg) if err != nil { - log.Warnf("Failed to marshal model") + console.Warn("Failed to marshal model") } logger.write(data) } diff --git a/pkg/model/compatibility.go b/pkg/model/compatibility.go index e676b958cd..b7f76fa7e2 100644 --- a/pkg/model/compatibility.go +++ b/pkg/model/compatibility.go @@ -7,7 +7,7 @@ import ( "sort" "strings" - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/version" ) @@ -105,13 +105,13 @@ var CUDABaseImages []CUDABaseImage func init() { if err := json.Unmarshal(tfCompatibilityMatrixData, &TFCompatibilityMatrix); err != nil { - log.Fatalf("Failed to load embedded Tensorflow compatibility matrix: %s", err) + console.Fatal("Failed to load embedded Tensorflow compatibility matrix: %s", err) } if err := json.Unmarshal(torchCompatibilityMatrixData, &TorchCompatibilityMatrix); err != nil { - log.Fatalf("Failed to load embedded PyTorch compatibility matrix: %s", err) + console.Fatal("Failed to load embedded PyTorch compatibility matrix: %s", err) } if err := json.Unmarshal(cudaBaseImageTagsData, &CUDABaseImages); err != nil { - log.Fatalf("Failed to load embedded CUDA base images: %s", err) + console.Fatal("Failed to load embedded CUDA base images: %s", err) } } diff --git a/pkg/model/config.go b/pkg/model/config.go index 23381edd77..900a6fc0bf 100644 --- a/pkg/model/config.go +++ b/pkg/model/config.go @@ -4,8 +4,9 @@ import ( "fmt" "strings" - log "github.com/sirupsen/logrus" "gopkg.in/yaml.v2" + + "github.com/replicate/cog/pkg/console" ) // TODO(andreas): support conda packages @@ -94,7 +95,7 @@ func (c *Config) pythonPackageVersion(name string) (version string, ok bool) { pkgName, version, err := splitPythonPackage(pkg) if err != nil { // this should be caught by validation earlier - log.Warnf("Python package %s is malformed.", pkg) + console.Warn("Python package %s is malformed.", pkg) return "", false } if pkgName == name { @@ -265,19 +266,19 @@ Compatible cuDNN version is: %s`, if c.Environment.CUDA == "" { if len(cudas) == 0 { c.Environment.CUDA = defaultCUDA() - log.Infof("Setting CUDA to version %s", c.Environment.CUDA) + console.Info("Setting CUDA to version %s", c.Environment.CUDA) } else { c.Environment.CUDA = latestCUDAFrom(cudas) - log.Infof("Setting CUDA to version %s from torch/tensorflow version", c.Environment.CUDA) + console.Info("Setting CUDA to version %s from torch/tensorflow version", c.Environment.CUDA) } } if c.Environment.CuDNN == "" { if cuDNN == "" { c.Environment.CuDNN = latestCuDNNForCUDA(c.Environment.CUDA) - log.Infof("Setting CuDNN to version %s", c.Environment.CuDNN) + console.Info("Setting CuDNN to version %s", c.Environment.CuDNN) } else { c.Environment.CuDNN = cuDNN - log.Infof("Setting CuDNN to version %s from torch/tensorflow version", c.Environment.CuDNN) + console.Info("Setting CuDNN to version %s from torch/tensorflow version", c.Environment.CuDNN) } } diff --git a/pkg/server/server.go b/pkg/server/server.go index 032a8ab203..da905ac728 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -14,7 +14,8 @@ import ( "github.com/gorilla/mux" "github.com/mholt/archiver/v3" - log "github.com/sirupsen/logrus" + + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/database" "github.com/replicate/cog/pkg/docker" @@ -53,7 +54,7 @@ func (s *Server) Start() error { router.Path("/ping"). Methods(http.MethodGet). HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - log.Info("Received ping request") + console.Info("Received ping request") w.Write([]byte("pong")) }) router.Path("/v1/repos/{user}/{name}/packages/{id}.zip"). @@ -78,12 +79,12 @@ func (s *Server) Start() error { func (s *Server) ReceiveFile(w http.ResponseWriter, r *http.Request) { user, name, _ := getRepoVars(r) - log.Infof("Received build request") + console.Info("Received build request") streamLogger := logger.NewStreamLogger(w) mod, err := s.ReceiveModel(r, streamLogger, user, name) if err != nil { streamLogger.WriteError(err) - log.Error(err) + console.Error(err.Error()) return } streamLogger.WriteModel(mod) @@ -91,12 +92,12 @@ func (s *Server) ReceiveFile(w http.ResponseWriter, r *http.Request) { func (s *Server) SendModelPackage(w http.ResponseWriter, r *http.Request) { user, name, id := getRepoVars(r) - log.Infof("Received download request for %s/%s/%s", user, name, id) + console.Info("Received download request for %s/%s/%s", user, name, id) modTime := time.Now() // TODO mod, err := s.db.GetModel(user, name, id) if err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } @@ -107,21 +108,21 @@ func (s *Server) SendModelPackage(w http.ResponseWriter, r *http.Request) { content, err := s.store.Download(user, name, id) if err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } - log.Infof("Downloaded %d bytes", len(content)) + console.Info("Downloaded %d bytes", len(content)) http.ServeContent(w, r, id+".zip", modTime, bytes.NewReader(content)) } func (s *Server) SendModelMetadata(w http.ResponseWriter, r *http.Request) { user, name, id := getRepoVars(r) - log.Infof("Received get request for %s/%s/%s", user, name, id) + console.Info("Received get request for %s/%s/%s", user, name, id) mod, err := s.db.GetModel(user, name, id) if err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } @@ -133,7 +134,7 @@ func (s *Server) SendModelMetadata(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(mod); err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } @@ -141,11 +142,11 @@ func (s *Server) SendModelMetadata(w http.ResponseWriter, r *http.Request) { func (s *Server) ListPackages(w http.ResponseWriter, r *http.Request) { user, name, _ := getRepoVars(r) - log.Infof("Received list request for %s%s", user, name) + console.Info("Received list request for %s%s", user, name) models, err := s.db.ListModels(user, name) if err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } @@ -153,7 +154,7 @@ func (s *Server) ListPackages(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(models); err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } @@ -161,11 +162,11 @@ func (s *Server) ListPackages(w http.ResponseWriter, r *http.Request) { func (s *Server) DeletePackage(w http.ResponseWriter, r *http.Request) { user, name, id := getRepoVars(r) - log.Infof("Received delete request for %s/%s/%s", user, name, id) + console.Info("Received delete request for %s/%s/%s", user, name, id) mod, err := s.db.GetModel(user, name, id) if err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } @@ -175,12 +176,12 @@ func (s *Server) DeletePackage(w http.ResponseWriter, r *http.Request) { } if err := s.store.Delete(user, name, id); err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } if err := s.db.DeleteModel(user, name, id); err != nil { - log.Error(err) + console.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) return } diff --git a/pkg/settings/project.go b/pkg/settings/project.go index 913fc51643..7471acdb7d 100644 --- a/pkg/settings/project.go +++ b/pkg/settings/project.go @@ -6,7 +6,7 @@ import ( "os" "path/filepath" - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/files" "github.com/replicate/cog/pkg/model" @@ -32,7 +32,7 @@ func LoadProjectSettings(projectRoot string) (*ProjectSettings, error) { } text, err := ioutil.ReadFile(settingsPath) if err != nil { - log.Warnf("Failed to read %s: %s", settingsPath, err) + console.Warn("Failed to read %s: %s", settingsPath, err) return settings, nil } diff --git a/pkg/shell/net.go b/pkg/shell/net.go index d4a707762e..fab25b5dbe 100644 --- a/pkg/shell/net.go +++ b/pkg/shell/net.go @@ -7,7 +7,7 @@ import ( "strconv" "time" - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" ) func NextFreePort(port int) (int, error) { @@ -37,7 +37,7 @@ func WaitForPort(port int, timeout time.Duration) error { func WaitForHTTPOK(url string, timeout time.Duration) error { start := time.Now() - log.Debugf("Waiting for %s to become accessible", url) + console.Debug("Waiting for %s to become accessible", url) for { now := time.Now() if now.Sub(start) > timeout { @@ -52,7 +52,7 @@ func WaitForHTTPOK(url string, timeout time.Duration) error { if resp.StatusCode != http.StatusOK { continue } - log.Debugf("Got successful response from %s", url) + console.Debug("Got successful response from %s", url) return nil } } diff --git a/pkg/slices/slices.go b/pkg/slices/slices.go new file mode 100644 index 0000000000..166329c3c0 --- /dev/null +++ b/pkg/slices/slices.go @@ -0,0 +1,58 @@ +package slices + +import ( + "reflect" + "sort" +) + +// ContainsString checks if a []string slice contains a query string +func ContainsString(strings []string, query string) bool { + for _, s := range strings { + if s == query { + return true + } + } + return false +} + +// ContainsAnyString checks if an []interface{} slice contains a query string +func ContainsAnyString(strings interface{}, query interface{}) bool { + return ContainsString(StringSlice(strings), query.(string)) +} + +// FilterString returns a copy of a slice with the items that return true when passed to `test` +func FilterString(ss []string, test func(string) bool) (ret []string) { + for _, s := range ss { + if test(s) { + ret = append(ret, s) + } + } + return +} + +// StringSlice converts an []interface{} slice to a []string slice +func StringSlice(strings interface{}) []string { + if reflect.TypeOf(strings).Kind() != reflect.Slice { + panic("strings is not a slice") + } + ret := []string{} + vals := reflect.ValueOf(strings) + for i := 0; i < vals.Len(); i++ { + ret = append(ret, vals.Index(i).String()) + } + return ret +} + +// StringKeys returns the keys from a map[string]interface{} as a sorted []string slice +func StringKeys(m interface{}) []string { + keys := []string{} + v := reflect.ValueOf(m) + if v.Kind() == reflect.Map { + for _, key := range v.MapKeys() { + keys = append(keys, key.String()) + } + sort.Strings(keys) + return keys + } + panic("StringKeys received not a map") +} diff --git a/pkg/storage/local.go b/pkg/storage/local.go index 2d5d266d55..2fac268354 100644 --- a/pkg/storage/local.go +++ b/pkg/storage/local.go @@ -6,7 +6,7 @@ import ( "os" "path/filepath" - log "github.com/sirupsen/logrus" + "github.com/replicate/cog/pkg/console" "github.com/replicate/cog/pkg/files" ) @@ -48,7 +48,7 @@ func (s *LocalStorage) Upload(user string, name string, id string, reader io.Rea return fmt.Errorf("Failed to create directory %s: %w", dir, err) } } - log.Debugf("Saving to %s", path) + console.Debug("Saving to %s", path) file, err := os.Create(path) if err != nil { return fmt.Errorf("Failed to create %s: %w", path, err)