From d3970953420a2e4aae4f684ef57a88c0135436fd Mon Sep 17 00:00:00 2001 From: liuhaoming Date: Tue, 23 Apr 2024 16:46:16 +0800 Subject: [PATCH] feat: update tui implementation of kusion cli --- go.mod | 27 +++------- go.sum | 73 +++++---------------------- pkg/cmd/apply/apply.go | 41 +++++++-------- pkg/cmd/apply/apply_test.go | 17 +++---- pkg/cmd/cmd.go | 13 +++-- pkg/cmd/destroy/destroy.go | 55 +++++++++++++------- pkg/cmd/destroy/destroy_test.go | 24 +++------ pkg/cmd/generate/generate.go | 41 ++++++++------- pkg/cmd/preview/preview.go | 19 ++++--- pkg/cmd/preview/preview_test.go | 4 +- pkg/engine/api/apply.go | 1 + pkg/engine/api/destroy.go | 5 +- pkg/engine/operation/models/change.go | 22 ++++---- pkg/util/pretty/ui.go | 19 +++++++ test/e2e/kusionctl_test.go | 2 +- 15 files changed, 168 insertions(+), 195 deletions(-) create mode 100644 pkg/util/pretty/ui.go diff --git a/go.mod b/go.mod index 166ad757..6c5e4968 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module kusionstack.io/kusion go 1.22.1 require ( - github.com/AlecAivazis/survey/v2 v2.3.4 github.com/Azure/azure-sdk-for-go v68.0.0+incompatible github.com/Azure/go-autorest/autorest v0.11.29 github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 @@ -53,7 +52,7 @@ require ( github.com/onsi/ginkgo/v2 v2.15.0 github.com/onsi/gomega v1.31.0 github.com/pkg/errors v0.9.1 - github.com/pterm/pterm v0.12.60 + github.com/pterm/pterm v0.12.79 github.com/pulumi/pulumi/sdk/v3 v3.68.0 github.com/sergi/go-diff v1.3.1 github.com/spf13/afero v1.6.0 @@ -93,7 +92,6 @@ require ( cloud.google.com/go/storage v1.36.0 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/Microsoft/hcsshim v0.11.0 // indirect - github.com/VividCortex/ewma v1.1.1 // indirect github.com/ajg/form v1.5.1 // indirect github.com/alibabacloud-go/darabonba-array v0.1.0 // indirect github.com/alibabacloud-go/darabonba-encode-util v0.0.2 // indirect @@ -108,9 +106,6 @@ require ( github.com/aliyun/alibabacloud-dkms-gcs-go-sdk v0.5.1 // indirect github.com/aliyun/alibabacloud-dkms-transfer-go-sdk v0.1.8 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/bgentry/speakeasy v0.1.0 // indirect - github.com/briandowns/spinner v1.11.1 // indirect - github.com/cheggaaa/pb/v3 v3.0.5 // indirect github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/deckarep/golang-set v1.7.1 // indirect @@ -131,25 +126,18 @@ require ( github.com/hashicorp/yamux v0.1.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/lab47/vterm v0.0.0-20201001232628-a9dd795f94c2 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/mitchellh/go-glint v0.0.0-20201015034436-f80573c636de // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/oklog/run v1.0.0 // indirect - github.com/olekukonko/tablewriter v0.0.4 // indirect github.com/orcaman/concurrent-map v0.0.0-20210501183033-44dafcb38ecc // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/swaggo/files v1.0.1 // indirect - github.com/tj/go-spin v1.1.0 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect github.com/ulikunitz/xz v0.5.10 // indirect github.com/vbatts/tar-split v0.11.3 // indirect github.com/xlab/treeprint v1.2.0 // indirect - github.com/y0ssar1an/q v1.0.7 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect @@ -165,9 +153,9 @@ require ( ) require ( - atomicgo.dev/cursor v0.1.1 // indirect + atomicgo.dev/cursor v0.2.0 // indirect atomicgo.dev/keyboard v0.2.9 // indirect - atomicgo.dev/schedule v0.0.2 // indirect + atomicgo.dev/schedule v0.1.0 // indirect dario.cat/mergo v1.0.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect @@ -239,7 +227,7 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gookit/color v1.5.3 // indirect + github.com/gookit/color v1.5.4 // indirect github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gosuri/uilive v0.0.4 // indirect @@ -251,7 +239,6 @@ require ( github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/hc-install v0.6.2 github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/waypoint-plugin-sdk v0.0.0-20230412210808-dcdb2a03f714 github.com/imdario/mergo v0.3.16 github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect @@ -260,18 +247,16 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/jtolds/gls v4.20.0+incompatible // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/lithammer/fuzzysearch v1.1.7 // indirect + github.com/lithammer/fuzzysearch v1.1.8 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-ciede2000 v0.0.0-20170301095244-782e8c62fec3 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-ps v1.0.0 github.com/mitchellh/go-wordwrap v1.0.1 // indirect diff --git a/go.sum b/go.sum index 80bad384..883f1830 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,11 @@ atomicgo.dev/assert v0.0.2 h1:FiKeMiZSgRrZsPo9qn/7vmr7mCsh5SZyXY4YGYiYwrg= atomicgo.dev/assert v0.0.2/go.mod h1:ut4NcI3QDdJtlmAxQULOmA13Gz6e2DWbSAS8RUOmNYQ= -atomicgo.dev/cursor v0.1.1 h1:0t9sxQomCTRh5ug+hAMCs59x/UmC9QL6Ci5uosINKD4= -atomicgo.dev/cursor v0.1.1/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= +atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw= +atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= -atomicgo.dev/schedule v0.0.2 h1:2e/4KY6t3wokja01Cyty6qgkQM8MotJzjtqCH70oX2Q= -atomicgo.dev/schedule v0.0.2/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= +atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= +atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -197,8 +197,6 @@ dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -github.com/AlecAivazis/survey/v2 v2.3.4 h1:pchTU9rsLUSvWEl2Aq9Pv3k0IE2fkqtGxazskAMd9Ng= -github.com/AlecAivazis/survey/v2 v2.3.4/go.mod h1:hrV6Y/kQCLhIZXGcriDCUBtB3wnN7156gMXJ3+b23xM= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= @@ -258,15 +256,11 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.11.0 h1:7EFNIY4igHEXUdj1zXgAyU3fLc7QfOKHbkldRVTBdiM= github.com/Microsoft/hcsshim v0.11.0/go.mod h1:OEthFdQv/AD2RAdzR6Mm1N1KPCztGKDurW1Z8b8VGMM= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= -github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= @@ -355,12 +349,9 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/briandowns/spinner v1.11.1 h1:OixPqDEcX3juo5AjQZAnFPbeUA0jvkp2qzB5gOZJ/L0= -github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= @@ -388,8 +379,6 @@ github.com/chai2010/jsonv v1.1.3/go.mod h1:mEoT1dQ9qVF4oP9peVTl0UymTmJwXoTDOh+sN github.com/chai2010/protorpc v1.1.4 h1:CTtFUhzXRoeuR7FtgQ2b2vdT/KgWVpCM+sIus8zJjHs= github.com/chai2010/protorpc v1.1.4/go.mod h1:/wO0kiyVdu7ug8dCMrA2yDr2vLfyhsLEuzLa9J2HJ+I= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/cheggaaa/pb/v3 v3.0.5 h1:lmZOti7CraK9RSjzExsY53+WWfub9Qv13B5m4ptEoPE= -github.com/cheggaaa/pb/v3 v3.0.5/go.mod h1:X1L61/+36nz9bjIsrDU52qHKOQukUQe2Ge+YvGuquCw= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -410,7 +399,6 @@ github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/P github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.7.6 h1:oNAVsnhPoy4BTPQivLgTzI9Oleml9l/+eYIDYXRCYo8= @@ -422,8 +410,6 @@ github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNA github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= @@ -494,8 +480,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= @@ -700,11 +684,10 @@ github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMd github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/gookit/color v1.3.1/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= -github.com/gookit/color v1.5.3 h1:twfIhZs4QLCtimkP7MOxlF3A0U/5cDPseRT9M/+2SCE= -github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE= +github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= +github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -763,12 +746,8 @@ github.com/hashicorp/hcl/v2 v2.16.1 h1:BwuxEMD/tsYgbhIW7UuI3crjovf3MzuFWiVgiv57i github.com/hashicorp/hcl/v2 v2.16.1/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng= github.com/hashicorp/vault/api v1.10.0 h1:/US7sIjWN6Imp4o/Rj1Ce2Nr5bki/AXi9vAW3p2tOJQ= github.com/hashicorp/vault/api v1.10.0/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8= -github.com/hashicorp/waypoint-plugin-sdk v0.0.0-20230412210808-dcdb2a03f714 h1:TSRVyQsxvIcmTNLVnFpLjZJCHhXWZkCztpGAkrSugXg= -github.com/hashicorp/waypoint-plugin-sdk v0.0.0-20230412210808-dcdb2a03f714/go.mod h1:rOgUMVr2mANMW8A0q5IijEpedGAtcX1/cMEemQtBo7k= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/howieyuen/uilive v0.0.6 h1:BgyopdqMZNxsBiOazBlZOPtq4cl5yDLEXcRurZt25+c= github.com/howieyuen/uilive v0.0.6/go.mod h1:A2XFIq01RvLom1CHxG3tZmFAvtF50S5NlnMYjC6gH3c= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -809,8 +788,6 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -836,14 +813,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lab47/vterm v0.0.0-20201001232628-a9dd795f94c2 h1:kKK3E7yYM7ZZVlc6M2Rtu3LmQoDLpXCiEu+iGT4O7Rw= -github.com/lab47/vterm v0.0.0-20201001232628-a9dd795f94c2/go.mod h1:IODMeTGM8OBitkNwP3bvFuccNVzo1gIevvC3dM6MujU= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/fuzzysearch v1.1.7 h1:q8rZNmBIUkqxsxb/IlwsXVbCoPIH/0juxjFHY0UIwhU= -github.com/lithammer/fuzzysearch v1.1.7/go.mod h1:ZhIlfRGxnD8qa9car/yplC6GmnM14CS07BYAKJJBK2I= +github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= +github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= @@ -852,7 +827,6 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/mattn/go-ciede2000 v0.0.0-20170301095244-782e8c62fec3 h1:BXxTozrOU8zgC5dkpn3J6NTRdoP+hjok/e+ACr4Hibk= github.com/mattn/go-ciede2000 v0.0.0-20170301095244-782e8c62fec3/go.mod h1:x1uk6vxTiVuNt6S5R2UYgdhpj3oKojXvOXauHZ7dEnI= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= @@ -865,18 +839,13 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-glint v0.0.0-20201015034436-f80573c636de h1:zEtM2uLDYhUgehFO/lhsepZLz5TZpysDuwrezt+/w4k= -github.com/mitchellh/go-glint v0.0.0-20201015034436-f80573c636de/go.mod h1:9X3rpO+I3yuihb6p8ktF8qWxROGwij9DBW/czUsMlhk= 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-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= @@ -921,8 +890,6 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= 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/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -956,12 +923,10 @@ github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1H github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.3.0/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -994,8 +959,8 @@ github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEej github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= -github.com/pterm/pterm v0.12.60 h1:wvmH/P3rY8Z8PMZFW/FhqIafuEncg5ZkiD4ANOM+Gt8= -github.com/pterm/pterm v0.12.60/go.mod h1:07yyGZKQr8BpKKBaOZI1qKzzngqUisHdSYR4fQ9Nb4g= +github.com/pterm/pterm v0.12.79 h1:lH3yrYMhdpeqX9y5Ep1u7DejyHy7NSQg9qrBjF9dFT4= +github.com/pterm/pterm v0.12.79/go.mod h1:1v/gzOF1N0FsjbgTHZ1wVycRkKiatFvJSJC4IGaQAAo= github.com/pulumi/pulumi/sdk/v3 v3.68.0 h1:JWn3DGJhzoWL8bNbUdyLSSPeKS2F9mv14/EL9QeVT3w= github.com/pulumi/pulumi/sdk/v3 v3.68.0/go.mod h1:A/WHc5MlxU8GpX/sRmfQ9G0/Bxxl4GNdSP7TQmy4yIw= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1003,7 +968,6 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -1036,7 +1000,6 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= @@ -1068,8 +1031,6 @@ github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= -github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= @@ -1080,8 +1041,6 @@ github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0o github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck= github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= -github.com/vektra/neko v0.0.0-20170502000624-99acbdf12420 h1:OMelMt+D75Fax25tMcBfUoOyNp8OziZK/Ca8dB8BX38= -github.com/vektra/neko v0.0.0-20170502000624-99acbdf12420/go.mod h1:7tfPLehrsToaevw9Vi9iL6FOslcBJ/uqYQc8y3YIbdI= github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 h1:JwtAtbp7r/7QSyGz8mKUbYJBg2+6Cd7OjM8o/GNOcVo= github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74/go.mod h1:RmMWU37GKR2s6pgrIEB4ixgpVCt/cf7dnJv3fuH1J1c= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -1091,8 +1050,6 @@ github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -github.com/y0ssar1an/q v1.0.7 h1:s3ckTY+wjk6Y0sFce4rIS1Ezf8S6d0UFJrKwe40MyiQ= -github.com/y0ssar1an/q v1.0.7/go.mod h1:Q1Rk1StqWjSOfA/CF4zJEW1fLmkl5Cy8EsILdkB+DgE= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1130,7 +1087,6 @@ go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6 go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200707032745-474f21a9602d/go.mod h1:f0znQkUKRrkk36XxWbGjMqQM8wGv/xHBVE2qc3B5oFU= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -1152,7 +1108,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -1323,7 +1278,6 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1349,10 +1303,8 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1408,7 +1360,6 @@ golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/pkg/cmd/apply/apply.go b/pkg/cmd/apply/apply.go index 863cfd06..4c8da3ac 100644 --- a/pkg/cmd/apply/apply.go +++ b/pkg/cmd/apply/apply.go @@ -20,7 +20,6 @@ import ( "strings" "sync" - "github.com/AlecAivazis/survey/v2" "github.com/pterm/pterm" "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericiooptions" @@ -92,16 +91,16 @@ type ApplyOptions struct { } // NewApplyFlags returns a default ApplyFlags -func NewApplyFlags(streams genericiooptions.IOStreams) *ApplyFlags { +func NewApplyFlags(ui *pretty.UI, streams genericiooptions.IOStreams) *ApplyFlags { return &ApplyFlags{ - PreviewFlags: preview.NewPreviewFlags(streams), + PreviewFlags: preview.NewPreviewFlags(ui, streams), IOStreams: streams, } } // NewCmdApply creates the `apply` command. -func NewCmdApply(ioStreams genericiooptions.IOStreams) *cobra.Command { - flags := NewApplyFlags(ioStreams) +func NewCmdApply(ui *pretty.UI, ioStreams genericiooptions.IOStreams) *cobra.Command { + flags := NewApplyFlags(ui, ioStreams) cmd := &cobra.Command{ Use: "apply", @@ -172,11 +171,10 @@ func (o *ApplyOptions) Run() error { // set no style if o.NoStyle { pterm.DisableStyling() - pterm.DisableColor() } // Generate Spec - spec, err := generate.GenerateSpecWithSpinner(o.RefProject, o.RefStack, o.RefWorkspace, nil, o.NoStyle) + spec, err := generate.GenerateSpecWithSpinner(o.RefProject, o.RefStack, o.RefWorkspace, nil, o.UI, o.NoStyle) if err != nil { return err } @@ -200,7 +198,7 @@ func (o *ApplyOptions) Run() error { } // summary preview table - changes.Summary(o.IOStreams.Out, false) + changes.Summary(o.IOStreams.Out, o.NoStyle) // detail detection if o.Detail && o.All { @@ -213,14 +211,14 @@ func (o *ApplyOptions) Run() error { // prompt if !o.Yes { for { - input, err := prompt() + input, err := prompt(o.UI) if err != nil { return err } if input == "yes" { break } else if input == "details" { - target, err := changes.PromptDetails() + target, err := changes.PromptDetails(o.UI) if err != nil { return err } @@ -303,10 +301,11 @@ func Apply( var ls lineSummary // progress bar, print dag walk detail - progressbar, err := pterm.DefaultProgressbar. + progressbar, err := o.UI.ProgressbarPrinter. WithMaxWidth(0). // Set to 0, the terminal width will be used WithTotal(len(changes.StepKeys)). WithWriter(out). + WithRemoveWhenDone(). Start() if err != nil { return err @@ -517,21 +516,19 @@ func allUnChange(changes *models.Changes) bool { return true } -func prompt() (string, error) { +func prompt(ui *pretty.UI) (string, error) { // don`t display yes item when only preview options := []string{"yes", "details", "no"} - - p := &survey.Select{ - Message: `Do you want to apply these diffs?`, - Options: options, - Default: "details", - } - - var input string - err := survey.AskOne(p, &input) + input, err := ui.InteractiveSelectPrinter. + WithFilter(false). + WithDefaultText(`Do you want to apply these diffs?`). + WithOptions(options). + WithDefaultOption("details"). + Show() if err != nil { - fmt.Printf("Prompt failed %v\n", err) + fmt.Printf("Prompt failed: %v\n", err) return "", err } + return input, nil } diff --git a/pkg/cmd/apply/apply_test.go b/pkg/cmd/apply/apply_test.go index 651fc144..42208b4a 100644 --- a/pkg/cmd/apply/apply_test.go +++ b/pkg/cmd/apply/apply_test.go @@ -19,11 +19,10 @@ import ( "errors" "os" "path/filepath" - "reflect" "testing" - "github.com/AlecAivazis/survey/v2" "github.com/bytedance/mockey" + "github.com/pterm/pterm" "github.com/stretchr/testify/assert" apiv1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" @@ -39,6 +38,7 @@ import ( "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/engine/runtime/kubernetes" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" + "kusionstack.io/kusion/pkg/util/pretty" workspacestorages "kusionstack.io/kusion/pkg/workspace/storages" ) @@ -72,6 +72,7 @@ func NewApplyOptions() *ApplyOptions { NoStyle: false, Output: "", IgnoreFields: nil, + UI: pretty.DefaultUI(), }, } } @@ -112,6 +113,7 @@ func mockGenerateSpecWithSpinner() { stack *apiv1.Stack, workspace *apiv1.Workspace, parameters map[string]string, + ui *pretty.UI, noStyle bool, ) (*apiv1.Spec, error) { return &apiv1.Spec{Resources: []apiv1.Resource{sa1, sa2, sa3}}, nil @@ -317,21 +319,18 @@ func mockOperationApply(res models.OpResult) { func TestPrompt(t *testing.T) { mockey.PatchConvey("prompt error", t, func() { - mockey.Mock(survey.AskOne).Return(errors.New("mock error")).Build() - _, err := prompt() + mockey.Mock((*pterm.InteractiveSelectPrinter).Show).Return("", errors.New("mock error")).Build() + _, err := prompt(pretty.DefaultUI()) assert.NotNil(t, err) }) mockey.PatchConvey("prompt yes", t, func() { mockPromptOutput("yes") - _, err := prompt() + _, err := prompt(pretty.DefaultUI()) assert.Nil(t, err) }) } func mockPromptOutput(res string) { - mockey.Mock(survey.AskOne).To(func(p survey.Prompt, response interface{}, opts ...survey.AskOpt) error { - reflect.ValueOf(response).Elem().Set(reflect.ValueOf(res)) - return nil - }).Build() + mockey.Mock((*pterm.InteractiveSelectPrinter).Show).Return(res, nil).Build() } diff --git a/pkg/cmd/cmd.go b/pkg/cmd/cmd.go index 5a51b96a..491d227e 100644 --- a/pkg/cmd/cmd.go +++ b/pkg/cmd/cmd.go @@ -1,10 +1,8 @@ package cmd import ( - "context" "os" - "github.com/hashicorp/waypoint-plugin-sdk/terminal" "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericiooptions" cliflag "k8s.io/component-base/cli/flag" @@ -24,13 +22,14 @@ import ( "kusionstack.io/kusion/pkg/cmd/version" "kusionstack.io/kusion/pkg/cmd/workspace" "kusionstack.io/kusion/pkg/util/i18n" + "kusionstack.io/kusion/pkg/util/pretty" ) type KusionctlOptions struct { Arguments []string // UI is used to write to the CLI. - UI terminal.UI + UI *pretty.UI genericiooptions.IOStreams } @@ -39,7 +38,7 @@ type KusionctlOptions struct { func NewDefaultKusionctlCommand() *cobra.Command { return NewDefaultKusionctlCommandWithArgs(KusionctlOptions{ Arguments: os.Args, - UI: terminal.ConsoleUI(context.Background()), + UI: pretty.DefaultUI(), IOStreams: genericiooptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}, }) } @@ -117,9 +116,9 @@ func NewKusionctlCmd(o KusionctlOptions) *cobra.Command { { Message: "Runtime Commands:", Commands: []*cobra.Command{ - preview.NewCmdPreview(o.IOStreams), - apply.NewCmdApply(o.IOStreams), - destroy.NewCmdDestroy(o.IOStreams), + preview.NewCmdPreview(o.UI, o.IOStreams), + apply.NewCmdApply(o.UI, o.IOStreams), + destroy.NewCmdDestroy(o.UI, o.IOStreams), }, }, { diff --git a/pkg/cmd/destroy/destroy.go b/pkg/cmd/destroy/destroy.go index 4292f8cd..5b2c2083 100644 --- a/pkg/cmd/destroy/destroy.go +++ b/pkg/cmd/destroy/destroy.go @@ -20,7 +20,6 @@ import ( "strings" "sync" - "github.com/AlecAivazis/survey/v2" "github.com/pterm/pterm" "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericiooptions" @@ -62,6 +61,9 @@ type DeleteFlags struct { Operator string Yes bool Detail bool + NoStyle bool + + UI *pretty.UI genericiooptions.IOStreams } @@ -73,21 +75,25 @@ type DeleteOptions struct { Operator string Yes bool Detail bool + NoStyle bool + + UI *pretty.UI genericiooptions.IOStreams } // NewDeleteFlags returns a default DeleteFlags -func NewDeleteFlags(streams genericiooptions.IOStreams) *DeleteFlags { +func NewDeleteFlags(ui *pretty.UI, streams genericiooptions.IOStreams) *DeleteFlags { return &DeleteFlags{ MetaFlags: meta.NewMetaFlags(), + UI: ui, IOStreams: streams, } } // NewCmdDestroy creates the `delete` command. -func NewCmdDestroy(ioStreams genericiooptions.IOStreams) *cobra.Command { - flags := NewDeleteFlags(ioStreams) +func NewCmdDestroy(ui *pretty.UI, ioStreams genericiooptions.IOStreams) *cobra.Command { + flags := NewDeleteFlags(ui, ioStreams) cmd := &cobra.Command{ Use: "destroy", @@ -117,6 +123,7 @@ func (flags *DeleteFlags) AddFlags(cmd *cobra.Command) { cmd.Flags().StringVarP(&flags.Operator, "operator", "", flags.Operator, i18n.T("Specify the operator")) cmd.Flags().BoolVarP(&flags.Yes, "yes", "y", false, i18n.T("Automatically approve and perform the update after previewing it")) cmd.Flags().BoolVarP(&flags.Detail, "detail", "d", false, i18n.T("Automatically show preview details after previewing it")) + cmd.Flags().BoolVarP(&flags.NoStyle, "no-style", "", false, i18n.T("no-style sets to RawOutput mode and disables all of styling")) } // ToOptions converts from CLI inputs to runtime inputs. @@ -132,6 +139,8 @@ func (flags *DeleteFlags) ToOptions() (*DeleteOptions, error) { Operator: flags.Operator, Detail: flags.Detail, Yes: flags.Yes, + NoStyle: flags.NoStyle, + UI: flags.UI, IOStreams: flags.IOStreams, } @@ -170,18 +179,24 @@ func (o *DeleteOptions) Run() error { } // preview - changes.Summary(os.Stdout, false) + changes.Summary(os.Stdout, o.NoStyle) // detail detection if o.Detail { changes.OutputDiff("all") return nil } + + // set no style + if o.NoStyle { + pterm.DisableStyling() + } + // prompt if !o.Yes { for { var input string - input, err = prompt() + input, err = prompt(o.UI) if err != nil { return err } @@ -190,7 +205,7 @@ func (o *DeleteOptions) Run() error { break } else if input == "details" { var target string - target, err = changes.PromptDetails() + target, err = changes.PromptDetails(o.UI) if err != nil { return err } @@ -266,7 +281,11 @@ func (o *DeleteOptions) destroy(planResources *apiv1.Spec, changes *models.Chang var deleted int // progress bar, print dag walk detail - progressbar, err := pterm.DefaultProgressbar.WithMaxWidth(0).WithTotal(len(changes.StepKeys)).Start() + progressbar, err := o.UI.ProgressbarPrinter. + WithMaxWidth(0). + WithTotal(len(changes.StepKeys)). + WithRemoveWhenDone(). + Start() if err != nil { return err } @@ -349,18 +368,18 @@ func (o *DeleteOptions) destroy(planResources *apiv1.Spec, changes *models.Chang return nil } -func prompt() (string, error) { - p := &survey.Select{ - Message: `Do you want to destroy these diffs?`, - Options: []string{"yes", "details", "no"}, - Default: "details", - } - - var input string - err := survey.AskOne(p, &input) +func prompt(ui *pretty.UI) (string, error) { + options := []string{"yes", "details", "no"} + input, err := ui.InteractiveSelectPrinter. + WithFilter(false). + WithDefaultText(`Do you want to destroy these diffs?`). + WithOptions(options). + WithDefaultOption("details"). + Show() if err != nil { - fmt.Printf("Prompt failed %v\n", err) + fmt.Printf("Prompt failed: %v\n", err) return "", err } + return input, nil } diff --git a/pkg/cmd/destroy/destroy_test.go b/pkg/cmd/destroy/destroy_test.go index 2d6970d4..829cb45d 100644 --- a/pkg/cmd/destroy/destroy_test.go +++ b/pkg/cmd/destroy/destroy_test.go @@ -19,11 +19,10 @@ import ( "errors" "os" "path/filepath" - "reflect" "testing" - "github.com/AlecAivazis/survey/v2" "github.com/bytedance/mockey" + "github.com/pterm/pterm" "github.com/stretchr/testify/assert" apiv1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" @@ -39,6 +38,7 @@ import ( "kusionstack.io/kusion/pkg/engine/runtime/kubernetes" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" "kusionstack.io/kusion/pkg/project" + "kusionstack.io/kusion/pkg/util/pretty" workspacestorages "kusionstack.io/kusion/pkg/workspace/storages" ) @@ -68,6 +68,7 @@ func NewDeleteOptions() *DeleteOptions { }, Operator: "", Detail: false, + UI: pretty.DefaultUI(), } } @@ -316,29 +317,18 @@ func mockWorkspaceStorage() { func TestPrompt(t *testing.T) { mockey.PatchConvey("prompt error", t, func() { - mockey.Mock( - survey.AskOne).To( - func(p survey.Prompt, response interface{}, opts ...survey.AskOpt) error { - return errors.New("mock error") - }, - ).Build() - _, err := prompt() + mockey.Mock((*pterm.InteractiveSelectPrinter).Show).Return("", errors.New("mock error")).Build() + _, err := prompt(pretty.DefaultUI()) assert.NotNil(t, err) }) mockey.PatchConvey("prompt yes", t, func() { mockPromptOutput("yes") - _, err := prompt() + _, err := prompt(pretty.DefaultUI()) assert.Nil(t, err) }) } func mockPromptOutput(res string) { - mockey.Mock( - survey.AskOne).To( - func(p survey.Prompt, response interface{}, opts ...survey.AskOpt) error { - reflect.ValueOf(response).Elem().Set(reflect.ValueOf(res)) - return nil - }, - ).Build() + mockey.Mock((*pterm.InteractiveSelectPrinter).Show).Return(res, nil).Build() } diff --git a/pkg/cmd/generate/generate.go b/pkg/cmd/generate/generate.go index 3c419cab..8c211e06 100644 --- a/pkg/cmd/generate/generate.go +++ b/pkg/cmd/generate/generate.go @@ -21,7 +21,6 @@ import ( "os" "strings" - "github.com/hashicorp/waypoint-plugin-sdk/terminal" "github.com/pterm/pterm" "github.com/spf13/cobra" yamlv3 "gopkg.in/yaml.v3" @@ -57,10 +56,11 @@ var ( type GenerateFlags struct { MetaFlags *meta.MetaFlags - Output string - Values []string + Output string + Values []string + NoStyle bool - UI terminal.UI + UI *pretty.UI genericiooptions.IOStreams } @@ -69,16 +69,17 @@ type GenerateFlags struct { type GenerateOptions struct { *meta.MetaOptions - Output string - Values []string + Output string + Values []string + NoStyle bool - UI terminal.UI + UI *pretty.UI genericiooptions.IOStreams } // NewGenerateFlags returns a default GenerateFlags -func NewGenerateFlags(ui terminal.UI, streams genericiooptions.IOStreams) *GenerateFlags { +func NewGenerateFlags(ui *pretty.UI, streams genericiooptions.IOStreams) *GenerateFlags { return &GenerateFlags{ MetaFlags: meta.NewMetaFlags(), UI: ui, @@ -87,7 +88,7 @@ func NewGenerateFlags(ui terminal.UI, streams genericiooptions.IOStreams) *Gener } // NewCmdGenerate creates the `generate` command. -func NewCmdGenerate(ui terminal.UI, ioStreams genericiooptions.IOStreams) *cobra.Command { +func NewCmdGenerate(ui *pretty.UI, ioStreams genericiooptions.IOStreams) *cobra.Command { flags := NewGenerateFlags(ui, ioStreams) cmd := &cobra.Command{ @@ -117,6 +118,7 @@ func (flags *GenerateFlags) AddFlags(cmd *cobra.Command) { cmd.Flags().StringVarP(&flags.Output, "output", "o", flags.Output, i18n.T("File to write generated Spec resources to")) cmd.Flags().StringArrayVar(&flags.Values, "set", []string{}, i18n.T("Set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)")) + cmd.Flags().BoolVarP(&flags.NoStyle, "no-style", "", false, i18n.T("no-style sets to RawOutput mode and disables all of styling")) } // ToOptions converts from CLI inputs to runtime inputs. @@ -131,6 +133,7 @@ func (flags *GenerateFlags) ToOptions() (*GenerateOptions, error) { MetaOptions: metaOptions, Output: flags.Output, Values: flags.Values, + NoStyle: flags.NoStyle, UI: flags.UI, IOStreams: flags.IOStreams, @@ -156,12 +159,16 @@ func (o *GenerateOptions) Validate(cmd *cobra.Command, args []string) error { // Run executes the `generate` command. func (o *GenerateOptions) Run() error { + // set no style + if o.NoStyle { + pterm.DisableStyling() + } + // build parameters parameters := o.buildParameters() // call default generator to generate Spec - o.UI.Output("Generating...", terminal.WithHeaderStyle()) - spec, err := GenerateSpecWithSpinner(o.RefProject, o.RefStack, o.RefWorkspace, parameters, true) + spec, err := GenerateSpecWithSpinner(o.RefProject, o.RefStack, o.RefWorkspace, parameters, o.UI, o.NoStyle) if err != nil { return err } @@ -169,7 +176,7 @@ func (o *GenerateOptions) Run() error { // write Spec to output file or a writer err = write(spec, o.Output, o.Out) if err != nil { - o.UI.Output("Error writing generated Spec: %s", err.Error(), terminal.WithErrorStyle()) + // o.UI.Output("Error writing generated Spec: %s", err.Error(), terminal.WithErrorStyle()) return err } return nil @@ -194,6 +201,7 @@ func GenerateSpecWithSpinner( stack *v1.Stack, workspace *v1.Workspace, parameters map[string]string, + ui *pretty.UI, noStyle bool, ) (*v1.Spec, error) { // Construct generator instance @@ -204,14 +212,13 @@ func GenerateSpecWithSpinner( Runner: &run.KPMRunner{}, } - var sp *pterm.SpinnerPrinter if noStyle { - fmt.Printf("Generating Spec in the Stack %s...\n", stack.Name) - } else { - sp = &pretty.SpinnerT - sp, _ = sp.Start(fmt.Sprintf("Generating Spec in the Stack %s...", stack.Name)) + pterm.DisableStyling() } + sp := ui.SpinnerPrinter + sp, _ = sp.Start(fmt.Sprintf("Generating Spec in the Stack %s...", stack.Name)) + // style means color and prompt here. Currently, sp will be nil only when o.NoStyle is true style := !noStyle && sp != nil diff --git a/pkg/cmd/preview/preview.go b/pkg/cmd/preview/preview.go index 55ebaf75..68145900 100644 --- a/pkg/cmd/preview/preview.go +++ b/pkg/cmd/preview/preview.go @@ -77,6 +77,8 @@ type PreviewFlags struct { Output string IgnoreFields []string + UI *pretty.UI + genericiooptions.IOStreams } @@ -91,20 +93,23 @@ type PreviewOptions struct { Output string IgnoreFields []string + UI *pretty.UI + genericiooptions.IOStreams } // NewPreviewFlags returns a default PreviewFlags -func NewPreviewFlags(streams genericiooptions.IOStreams) *PreviewFlags { +func NewPreviewFlags(ui *pretty.UI, streams genericiooptions.IOStreams) *PreviewFlags { return &PreviewFlags{ MetaFlags: meta.NewMetaFlags(), + UI: ui, IOStreams: streams, } } // NewCmdPreview creates the `preview` command. -func NewCmdPreview(ioStreams genericiooptions.IOStreams) *cobra.Command { - flags := NewPreviewFlags(ioStreams) +func NewCmdPreview(ui *pretty.UI, ioStreams genericiooptions.IOStreams) *cobra.Command { + flags := NewPreviewFlags(ui, ioStreams) cmd := &cobra.Command{ Use: "preview", @@ -155,6 +160,7 @@ func (f *PreviewFlags) ToOptions() (*PreviewOptions, error) { NoStyle: f.NoStyle, Output: f.Output, IgnoreFields: f.IgnoreFields, + UI: f.UI, IOStreams: f.IOStreams, } @@ -175,11 +181,10 @@ func (o *PreviewOptions) Run() error { // set no style if o.NoStyle || o.Output == jsonOutput { pterm.DisableStyling() - pterm.DisableColor() } // Generate spec - spec, err := generate.GenerateSpecWithSpinner(o.RefProject, o.RefStack, o.RefWorkspace, nil, o.NoStyle) + spec, err := generate.GenerateSpecWithSpinner(o.RefProject, o.RefStack, o.RefWorkspace, nil, o.UI, o.NoStyle) if err != nil { return err } @@ -215,13 +220,13 @@ func (o *PreviewOptions) Run() error { } // summary preview table - changes.Summary(o.IOStreams.Out, false) + changes.Summary(o.IOStreams.Out, o.NoStyle) // detail detection if o.Detail { for { var target string - target, err = changes.PromptDetails() + target, err = changes.PromptDetails(o.UI) if err != nil { return err } diff --git a/pkg/cmd/preview/preview_test.go b/pkg/cmd/preview/preview_test.go index 09897771..b65cf492 100644 --- a/pkg/cmd/preview/preview_test.go +++ b/pkg/cmd/preview/preview_test.go @@ -34,6 +34,7 @@ import ( "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/engine/runtime/kubernetes" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" + "kusionstack.io/kusion/pkg/util/pretty" workspacestorages "kusionstack.io/kusion/pkg/workspace/storages" ) @@ -215,6 +216,7 @@ func mockGenerateSpecWithSpinner() { stack *apiv1.Stack, workspace *apiv1.Workspace, parameters map[string]string, + ui *pretty.UI, noStyle bool, ) (*apiv1.Spec, error) { return &apiv1.Spec{Resources: []apiv1.Resource{sa1, sa2, sa3}}, nil @@ -228,7 +230,7 @@ func mockNewKubernetesRuntime() { } func mockPromptDetail(input string) { - mockey.Mock((*models.ChangeOrder).PromptDetails).To(func(co *models.ChangeOrder) (string, error) { + mockey.Mock((*models.ChangeOrder).PromptDetails).To(func(ui *pretty.UI) (string, error) { return input, nil }).Build() } diff --git a/pkg/engine/api/apply.go b/pkg/engine/api/apply.go index 2c2999fa..a8579f92 100644 --- a/pkg/engine/api/apply.go +++ b/pkg/engine/api/apply.go @@ -63,6 +63,7 @@ func Apply( WithMaxWidth(0). // Set to 0, the terminal width will be used WithTotal(len(changes.StepKeys)). WithWriter(out). + WithRemoveWhenDone(). Start() if err != nil { return err diff --git a/pkg/engine/api/destroy.go b/pkg/engine/api/destroy.go index b3147f53..3b4803de 100644 --- a/pkg/engine/api/destroy.go +++ b/pkg/engine/api/destroy.go @@ -78,7 +78,10 @@ func Destroy( var deleted int // progress bar, print dag walk detail - progressbar, err := pterm.DefaultProgressbar.WithTotal(len(changes.StepKeys)).Start() + progressbar, err := pterm.DefaultProgressbar. + WithTotal(len(changes.StepKeys)). + WithRemoveWhenDone(). + Start() if err != nil { return err } diff --git a/pkg/engine/operation/models/change.go b/pkg/engine/operation/models/change.go index bf0adb17..bae4722a 100644 --- a/pkg/engine/operation/models/change.go +++ b/pkg/engine/operation/models/change.go @@ -6,7 +6,6 @@ import ( "io" "strings" - "github.com/AlecAivazis/survey/v2" "github.com/pterm/pterm" v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" @@ -226,7 +225,6 @@ func (p *Changes) Summary(writer io.Writer, noStyle bool) { if noStyle { pterm.DisableStyling() - pterm.DisableColor() } for _, step := range p.Values() { @@ -244,7 +242,7 @@ func (p *Changes) Summary(writer io.Writer, noStyle bool) { pterm.Println() // Blank line } -func (o *ChangeOrder) PromptDetails() (string, error) { +func (o *ChangeOrder) PromptDetails(ui *pretty.UI) (string, error) { // Prepare the selects options := []string{"all"} optionMaps := map[string]string{"all": "all"} @@ -258,19 +256,17 @@ func (o *ChangeOrder) PromptDetails() (string, error) { options = append(options, "cancel") - // Build prompt - prompt := &survey.Select{ - Message: `Which diff detail do you want to see?`, - Options: options, - } - - // Run prompt - var input string - err := survey.AskOne(prompt, &input) + input, err := ui.InteractiveSelectPrinter. + WithFilter(false). + WithDefaultText(`Which diff detail do you want to see?`). + WithOptions(options). + WithDefaultOption("all"). + Show() if err != nil { - fmt.Printf("Prompt failed %v\n", err) + fmt.Printf("Prompt failed: %v\n", err) return "", err } + return optionMaps[input], nil } diff --git a/pkg/util/pretty/ui.go b/pkg/util/pretty/ui.go new file mode 100644 index 00000000..c002187b --- /dev/null +++ b/pkg/util/pretty/ui.go @@ -0,0 +1,19 @@ +package pretty + +import "github.com/pterm/pterm" + +type UI struct { + SpinnerPrinter *pterm.SpinnerPrinter + ProgressbarPrinter *pterm.ProgressbarPrinter + InteractiveSelectPrinter *pterm.InteractiveSelectPrinter +} + +// DefaultUI returns a UI for Kusion CLI display with default +// SpinnerPrinter, ProgressbarPrinter and InteractiveSelectPrinter. +func DefaultUI() *UI { + return &UI{ + SpinnerPrinter: &SpinnerT, + ProgressbarPrinter: &pterm.DefaultProgressbar, + InteractiveSelectPrinter: &pterm.DefaultInteractiveSelect, + } +} diff --git a/test/e2e/kusionctl_test.go b/test/e2e/kusionctl_test.go index 7c0c0bc4..f1c2d436 100644 --- a/test/e2e/kusionctl_test.go +++ b/test/e2e/kusionctl_test.go @@ -30,7 +30,7 @@ var _ = ginkgo.Describe("Kusion Configuration Commands", func() { var _ = ginkgo.Describe("kusion Runtime Commands", func() { ginkgo.It("kusion preview", func() { path := filepath.Join(GetWorkDir(), "konfig", "example", "service-multi-stack", "dev") - _, err := ExecKusionWithWorkDir("kusion preview -d", path) + _, err := ExecKusionWithWorkDir("kusion preview -d=false", path) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) })