Skip to content

Commit 3796315

Browse files
fzipitheseion
andauthored
feat: add self update (#369)
* feat: add self update Signed-off-by: Felipe Zipitria <[email protected]> * chore: add version and self-update cmds Signed-off-by: Felipe Zipitria <[email protected]> * Update cmd/self_update.go Co-authored-by: Max Leske <[email protected]> --------- Signed-off-by: Felipe Zipitria <[email protected]> Co-authored-by: Max Leske <[email protected]>
1 parent 613159f commit 3796315

File tree

9 files changed

+302
-7
lines changed

9 files changed

+302
-7
lines changed

cmd/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ func Execute(version string) error {
4545
rootCmd.AddCommand(NewCheckCommand())
4646
rootCmd.AddCommand(NewRunCommand())
4747
rootCmd.AddCommand(NewQuantitativeCmd())
48+
rootCmd.AddCommand(NewSelfUpdateCommand(version))
49+
rootCmd.AddCommand(NewVersionCommand(version))
4850
rootCmd.Version = version
4951

5052
return rootCmd.ExecuteContext(context.Background())

cmd/self_update.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2022 OWASP Core Rule Set Project
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package cmd
5+
6+
import (
7+
"github.com/rs/zerolog/log"
8+
"github.com/spf13/cobra"
9+
10+
"github.com/coreruleset/go-ftw/internal/updater"
11+
)
12+
13+
// NewSelfUpdateCommand represents the self-update command
14+
func NewSelfUpdateCommand(version string) *cobra.Command {
15+
return &cobra.Command{
16+
Use: "self-update",
17+
Short: "Performs self-update",
18+
Long: "Checks GitHub releases for the latest version of this command. If a new version is available, " +
19+
"it will fetch it and replace this binary.",
20+
RunE: func(cmd *cobra.Command, args []string) error {
21+
if version == "dev" {
22+
log.Info().Msg("You are running a development version, skipping self-update")
23+
return nil
24+
}
25+
newVersion, err := updater.Updater(version, "")
26+
if err != nil {
27+
return err
28+
}
29+
if newVersion != "" {
30+
log.Info().Msgf("Updated to version %s", newVersion)
31+
} else {
32+
log.Info().Msg("No updates available")
33+
}
34+
return nil
35+
},
36+
}
37+
}

cmd/self_update_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// Copyright 2022 OWASP Core Rule Set Project
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package cmd
5+
6+
import (
7+
"io/fs"
8+
"os"
9+
"path"
10+
"testing"
11+
12+
"github.com/stretchr/testify/suite"
13+
)
14+
15+
type selfUpdateTestSuite struct {
16+
suite.Suite
17+
tempDir string
18+
executablePath string
19+
}
20+
21+
func (s *selfUpdateTestSuite) SetupTest() {
22+
var err error
23+
s.tempDir, err = os.MkdirTemp("", "self-update-tests")
24+
s.Require().NoError(err)
25+
26+
s.executablePath = path.Join(s.tempDir, "ftw")
27+
err = os.WriteFile(s.executablePath, []byte("Fake Binary"), fs.ModePerm)
28+
s.Require().NoError(err)
29+
}
30+
31+
func (s *selfUpdateTestSuite) TearDownTest() {
32+
err := os.RemoveAll(s.tempDir)
33+
s.Require().NoError(err)
34+
}
35+
36+
// Do not run test suite until there is a new release with the "version" command
37+
func TestRunSelfUpdateTestSuite(t *testing.T) {
38+
suite.Run(t, new(selfUpdateTestSuite))
39+
}
40+
41+
// func (s *selfUpdateTestSuite) TestSelfUpdateDev() {
42+
// _, err := updater.Updater("v0.0.0-dev", s.executablePath)
43+
// s.Require().NoError(err)
44+
//}
45+
//
46+
//func (s *selfUpdateTestSuite) TestSelfUpdateBigVersion() {
47+
// newVersion, err := updater.Updater("v10000.1.1", s.executablePath)
48+
// s.Require().NoError(err)
49+
// s.Equal("v10000.1.1", newVersion)
50+
//}
51+
//
52+
//func (s *selfUpdateTestSuite) TestSelfUpdateWithExecutablePath() {
53+
// newVersion, err := updater.Updater("v1.3.7", s.executablePath)
54+
// s.Require().NoError(err)
55+
// s.NotEmpty(newVersion)
56+
//
57+
// s.FileExists(s.executablePath, "The executable should exist")
58+
// contents, err := os.ReadFile(s.executablePath)
59+
// s.Require().NoError(err)
60+
// s.NotContains(string(contents), "Fake Binary", "The executable should be replaced")
61+
//
62+
// var out, stderr bytes.Buffer
63+
//
64+
// cmd := exec.Command(s.executablePath, "version")
65+
// cmd.Stdout = &out
66+
// cmd.Stderr = &stderr
67+
//
68+
// err = cmd.Run()
69+
// if err == nil {
70+
// versionString := fmt.Sprintf("ftw %s", newVersion)
71+
// s.Contains(out.String(), versionString)
72+
// } else {
73+
// s.Equal("exit status 1", err.Error())
74+
// oldBinaryWithUnsupportedVersionFlagError := "Error: unknown command \"version\" for \"go-ftw\"\nRun 'go-ftw --help' for usage.\n"
75+
// s.Equal(oldBinaryWithUnsupportedVersionFlagError, stderr.String())
76+
// }
77+
//}

cmd/version.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2023 OWASP Core Rule Set Project
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package cmd
5+
6+
import (
7+
"fmt"
8+
"os"
9+
10+
"github.com/rs/zerolog/log"
11+
"github.com/spf13/cobra"
12+
13+
"github.com/coreruleset/go-ftw/internal/updater"
14+
)
15+
16+
func NewVersionCommand(version string) *cobra.Command {
17+
return &cobra.Command{
18+
Use: "version",
19+
Short: "Print the version number of go-ftw",
20+
Run: func(cmd *cobra.Command, args []string) {
21+
fmt.Println("go-ftw", version)
22+
// do not run when in CI (e.g. GitHub Actions)
23+
if os.Getenv("CI") != "true" {
24+
latest, err := updater.LatestVersion()
25+
if err != nil {
26+
log.Error().Err(err).Msg("Failed to check for updates")
27+
} else if latest != "" {
28+
fmt.Println("Latest version is:", latest)
29+
fmt.Println("Run 'go-ftw self-update' to update")
30+
}
31+
}
32+
},
33+
}
34+
}

go.mod

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
module github.com/coreruleset/go-ftw
22

3-
go 1.21
3+
go 1.23
44

55
require (
66
github.com/Masterminds/sprig v2.22.0+incompatible
77
github.com/corazawaf/coraza/v3 v3.2.1
88
github.com/coreruleset/ftw-tests-schema/v2 v2.1.0
9+
github.com/creativeprojects/go-selfupdate v1.3.0
910
github.com/go-logr/zerologr v1.2.3
1011
github.com/goccy/go-yaml v1.9.2
1112
github.com/google/uuid v1.6.0
@@ -32,28 +33,35 @@ require (
3233
cloud.google.com/go/compute/metadata v0.3.0 // indirect
3334
cloud.google.com/go/iam v1.1.6 // indirect
3435
cloud.google.com/go/storage v1.38.0 // indirect
36+
code.gitea.io/sdk/gitea v0.18.0 // indirect
3537
github.com/Masterminds/goutils v1.1.1 // indirect
3638
github.com/Masterminds/semver v1.5.0 // indirect
39+
github.com/Masterminds/semver/v3 v3.2.1 // indirect
3740
github.com/antchfx/htmlquery v1.3.2 // indirect
3841
github.com/antchfx/xpath v1.3.1 // indirect
3942
github.com/aws/aws-sdk-go v1.44.122 // indirect
4043
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
4144
github.com/corazawaf/libinjection-go v0.2.1 // indirect
4245
github.com/davecgh/go-spew v1.1.1 // indirect
46+
github.com/davidmz/go-pageant v1.0.2 // indirect
4347
github.com/fatih/color v1.17.0 // indirect
4448
github.com/felixge/httpsnoop v1.0.4 // indirect
4549
github.com/fsnotify/fsnotify v1.7.0 // indirect
50+
github.com/go-fed/httpsig v1.1.0 // indirect
4651
github.com/go-logr/logr v1.4.2 // indirect
4752
github.com/go-logr/stdr v1.2.2 // indirect
4853
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect
4954
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
5055
github.com/golang/protobuf v1.5.4 // indirect
56+
github.com/google/go-github/v30 v30.1.0 // indirect
57+
github.com/google/go-querystring v1.1.0 // indirect
5158
github.com/google/s2a-go v0.1.7 // indirect
5259
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
5360
github.com/googleapis/gax-go/v2 v2.12.2 // indirect
5461
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
62+
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
5563
github.com/hashicorp/go-safetemp v1.0.0 // indirect
56-
github.com/hashicorp/go-version v1.6.0 // indirect
64+
github.com/hashicorp/go-version v1.7.0 // indirect
5765
github.com/huandu/xstrings v1.3.3 // indirect
5866
github.com/imdario/mergo v0.3.13 // indirect
5967
github.com/inconshreveable/mousetrap v1.1.0 // indirect
@@ -73,7 +81,8 @@ require (
7381
github.com/tidwall/gjson v1.17.3 // indirect
7482
github.com/tidwall/match v1.1.1 // indirect
7583
github.com/tidwall/pretty v1.2.1 // indirect
76-
github.com/ulikunitz/xz v0.5.10 // indirect
84+
github.com/ulikunitz/xz v0.5.12 // indirect
85+
github.com/xanzy/go-gitlab v0.106.0 // indirect
7786
go.opencensus.io v0.24.0 // indirect
7887
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
7988
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect

go.sum

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,17 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX
182182
cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=
183183
cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=
184184
cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=
185+
code.gitea.io/sdk/gitea v0.18.0 h1:+zZrwVmujIrgobt6wVBWCqITz6bn1aBjnCUHmpZrerI=
186+
code.gitea.io/sdk/gitea v0.18.0/go.mod h1:IG9xZJoltDNeDSW0qiF2Vqx5orMWa7OhVWrjvrd5NpI=
185187
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
186188
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
187189
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
188190
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
189191
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
190192
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
191193
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
194+
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
195+
github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
192196
github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60=
193197
github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
194198
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
@@ -226,9 +230,13 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
226230
github.com/coreruleset/ftw-tests-schema/v2 v2.1.0 h1:2ilKzKRG5UzzxBcrJLXFtPalStdQ9jzzaYFuFk0OEk0=
227231
github.com/coreruleset/ftw-tests-schema/v2 v2.1.0/go.mod h1:ZHVFX5ses4+5IxUP0ufCNg/VqRWxziH6ZuUca092Hxo=
228232
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
233+
github.com/creativeprojects/go-selfupdate v1.3.0 h1:Hs+14cJ7Um7xbRpmkmrKEfkZGwec3vZLPWTVEFwYXBc=
234+
github.com/creativeprojects/go-selfupdate v1.3.0/go.mod h1:uYJeumb6ECaI6bhc5dvH3Htjz1KoMArQjFt1P8m71Tc=
229235
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
230236
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
231237
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
238+
github.com/davidmz/go-pageant v1.0.2 h1:bPblRCh5jGU+Uptpz6LgMZGD5hJoOt7otgT454WvHn0=
239+
github.com/davidmz/go-pageant v1.0.2/go.mod h1:P2EDDnMqIwG5Rrp05dTRITj9z2zpGcD9efWSkTNKLIE=
232240
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
233241
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
234242
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -250,6 +258,8 @@ github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld
250258
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
251259
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
252260
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
261+
github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI=
262+
github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
253263
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
254264
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
255265
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -326,6 +336,11 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
326336
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
327337
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
328338
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
339+
github.com/google/go-github/v30 v30.1.0 h1:VLDx+UolQICEOKu2m4uAoMti1SxuEBAl7RSEG16L+Oo=
340+
github.com/google/go-github/v30 v30.1.0/go.mod h1:n8jBpHl45a/rlBUtRJMOG4GhNADUQFEufcolZ95JfU8=
341+
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
342+
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
343+
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
329344
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
330345
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
331346
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -376,10 +391,15 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n
376391
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
377392
github.com/hashicorp/go-getter v1.7.6 h1:5jHuM+aH373XNtXl9TNTUH5Qd69Trve11tHIrB+6yj4=
378393
github.com/hashicorp/go-getter v1.7.6/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744=
394+
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
395+
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
396+
github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU=
397+
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
379398
github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
380399
github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=
381-
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
382400
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
401+
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
402+
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
383403
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
384404
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
385405
github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4=
@@ -490,8 +510,11 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
490510
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
491511
github.com/tonglil/buflogr v1.1.1 h1:CKAjOHBSMmgbRFxpn/RhQHPj5oANc7ekhlsoUDvcZIg=
492512
github.com/tonglil/buflogr v1.1.1/go.mod h1:WLLtPRLqcFYWQLbA+ytXy5WrFTYnfA+beg1MpvJCxm4=
493-
github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8=
494513
github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
514+
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
515+
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
516+
github.com/xanzy/go-gitlab v0.106.0 h1:EDfD03K74cIlQo2EducfiupVrip+Oj02bq9ofw5F8sA=
517+
github.com/xanzy/go-gitlab v0.106.0/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI=
495518
github.com/yargevad/filepathx v1.0.0 h1:SYcT+N3tYGi+NvazubCNlvgIPbzAk7i7y2dwg3I5FYc=
496519
github.com/yargevad/filepathx v1.0.0/go.mod h1:BprfX/gpYNJHJfc35GjRRpVcwWXS89gGulUIU5tK3tA=
497520
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -527,6 +550,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
527550
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
528551
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
529552
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
553+
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
530554
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
531555
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
532556
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
@@ -735,6 +759,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
735759
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
736760
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
737761
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
762+
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
763+
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
738764
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
739765
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
740766
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -751,8 +777,6 @@ golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
751777
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
752778
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
753779
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
754-
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
755-
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
756780
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
757781
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
758782
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

0 commit comments

Comments
 (0)