Skip to content

Commit 06a01ba

Browse files
committed
initial version
1 parent a363cda commit 06a01ba

File tree

4 files changed

+465
-0
lines changed

4 files changed

+465
-0
lines changed

cmd/manageDeploymentRepo.go

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
package cmd
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"os"
7+
"path/filepath"
8+
"time"
9+
10+
"github.com/go-git/go-git/v5"
11+
"github.com/go-git/go-git/v5/config"
12+
"github.com/go-git/go-git/v5/plumbing"
13+
"github.com/go-git/go-git/v5/plumbing/object"
14+
gitconfig "github.com/openmcp-project/bootstrapper/internal/git-config"
15+
"github.com/openmcp-project/bootstrapper/internal/template"
16+
"github.com/spf13/cobra"
17+
)
18+
19+
const (
20+
FlagGitConfig = "git-config"
21+
)
22+
23+
// manageDeploymentRepoCmd represents the manageDeploymentRepo command
24+
var manageDeploymentRepoCmd = &cobra.Command{
25+
Use: "manageDeploymentRepo",
26+
Short: "A brief description of your command",
27+
Long: `A longer description that spans multiple lines and likely contains examples
28+
and usage of using your command. For example:
29+
30+
Cobra is a CLI library for Go that empowers applications.
31+
This application is a tool to generate the needed files
32+
to quickly create a Cobra application.`,
33+
Args: cobra.ExactArgs(3),
34+
ArgAliases: []string{
35+
"deploymentRepository",
36+
"deploymentRepositoryBranch",
37+
"templateDirectory",
38+
},
39+
RunE: func(cmd *cobra.Command, args []string) error {
40+
deploymentRepository := args[0]
41+
deploymentRepositoryBranch := args[1]
42+
templateDirectory := args[2]
43+
44+
gitConfig, err := gitconfig.ParseConfig(cmd.Flag(FlagGitConfig).Value.String())
45+
if err != nil {
46+
return err
47+
}
48+
if err := gitConfig.Validate(); err != nil {
49+
return err
50+
}
51+
52+
cloneOptions := &git.CloneOptions{
53+
URL: deploymentRepository,
54+
}
55+
if err := gitConfig.ConfigureCloneOptions(cloneOptions); err != nil {
56+
return err
57+
}
58+
59+
repo, tmpDir, err := CloneRepo(deploymentRepository, gitConfig)
60+
fmt.Printf("Cloned repository to temporary directory: %s\n", tmpDir)
61+
if err != nil {
62+
return fmt.Errorf("failed to clone repository: %w", err)
63+
}
64+
defer func(path string) {
65+
err := os.RemoveAll(path)
66+
if err != nil {
67+
fmt.Fprintf(os.Stderr, "failed to remove temporary directory %s: %v\n", path, err)
68+
}
69+
}(tmpDir)
70+
71+
// Check if branch exists
72+
branchExists := false
73+
branches, err := repo.Branches()
74+
if err != nil {
75+
return fmt.Errorf("failed to list branches: %w", err)
76+
}
77+
branchRefName := plumbing.NewBranchReferenceName(deploymentRepositoryBranch)
78+
branches.ForEach(func(ref *plumbing.Reference) error {
79+
if ref.Name() == branchRefName {
80+
branchExists = true
81+
}
82+
return nil
83+
})
84+
85+
workTree, err := repo.Worktree()
86+
if err != nil {
87+
return fmt.Errorf("failed to get worktree: %w", err)
88+
}
89+
90+
if !branchExists {
91+
// Create and checkout new branch
92+
fmt.Printf("Branch %s does not exist. Creating...\n", deploymentRepositoryBranch)
93+
err = workTree.Checkout(&git.CheckoutOptions{
94+
Branch: branchRefName,
95+
Create: true,
96+
})
97+
if err != nil {
98+
return fmt.Errorf("failed to create branch: %w", err)
99+
}
100+
101+
pushOptions := &git.PushOptions{
102+
RefSpecs: []config.RefSpec{
103+
config.RefSpec(branchRefName + ":" + branchRefName),
104+
},
105+
}
106+
107+
if err := gitConfig.ConfigurePushOptions(pushOptions); err != nil {
108+
return fmt.Errorf("failed to configure push options: %w", err)
109+
}
110+
111+
// Push new branch to remote
112+
err = repo.Push(pushOptions)
113+
if err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) {
114+
return fmt.Errorf("failed to push new branch: %w", err)
115+
}
116+
} else {
117+
// Checkout existing branch
118+
err = workTree.Checkout(&git.CheckoutOptions{
119+
Branch: branchRefName,
120+
})
121+
if err != nil {
122+
return fmt.Errorf("failed to checkout branch: %w", err)
123+
}
124+
}
125+
126+
// open the template directory
127+
templateDir, err := os.Open(templateDirectory)
128+
if err != nil {
129+
return fmt.Errorf("failed to open template directory: %w", err)
130+
}
131+
defer func() {
132+
if err := templateDir.Close(); err != nil {
133+
fmt.Fprintf(os.Stderr, "failed to close template directory: %v\n", err)
134+
}
135+
}()
136+
137+
te := template.NewTemplateExecution()
138+
templateInput := make(map[string]interface{})
139+
140+
// Recursively walk through all files in the template directory
141+
err = filepath.WalkDir(templateDirectory, func(path string, d os.DirEntry, err error) error {
142+
if err != nil {
143+
return err
144+
}
145+
if !d.IsDir() {
146+
// Process the file (path)
147+
fmt.Printf("Found file: %s\n", path)
148+
template, err := os.ReadFile(path)
149+
if err != nil {
150+
return fmt.Errorf("failed to read template file %s: %w", path, err)
151+
}
152+
153+
templateResult, err := te.Execute(path, string(template), templateInput)
154+
if err != nil {
155+
return fmt.Errorf("failed to execute template %s: %w", path, err)
156+
}
157+
158+
pathInRepo, err := filepath.Rel(templateDirectory, path)
159+
fileInWt, err := workTree.Filesystem.OpenFile(pathInRepo, os.O_WRONLY|os.O_CREATE, 0644)
160+
if err != nil {
161+
return fmt.Errorf("failed to open file in worktree %s: %w", path, err)
162+
}
163+
defer fileInWt.Close()
164+
_, err = fileInWt.Write(templateResult)
165+
if err != nil {
166+
return fmt.Errorf("failed to write to file in worktree %s: %w", path, err)
167+
}
168+
// Add the file to the git index
169+
if _, err := workTree.Add(pathInRepo); err != nil {
170+
return fmt.Errorf("failed to add file to git index: %w", err)
171+
}
172+
}
173+
return nil
174+
})
175+
if err != nil {
176+
return fmt.Errorf("failed to walk template directory: %w", err)
177+
}
178+
179+
// Commit the changes
180+
commitMsg := "Update deployment repo with template files"
181+
_, err = workTree.Commit(commitMsg, &git.CommitOptions{
182+
Author: &object.Signature{
183+
Name: "openmcp-bootstrapper",
184+
185+
When: time.Now(),
186+
},
187+
})
188+
if err != nil {
189+
if !errors.Is(err, git.ErrEmptyCommit) {
190+
return fmt.Errorf("failed to commit changes: %w", err)
191+
}
192+
}
193+
194+
// Push the changes
195+
pushOptions := &git.PushOptions{}
196+
if err := gitConfig.ConfigurePushOptions(pushOptions); err != nil {
197+
return fmt.Errorf("failed to configure push options: %w", err)
198+
}
199+
err = repo.Push(pushOptions)
200+
if err != nil {
201+
if !errors.Is(err, git.NoErrAlreadyUpToDate) {
202+
return fmt.Errorf("failed to push changes: %w", err)
203+
}
204+
}
205+
206+
return nil
207+
},
208+
}
209+
210+
func init() {
211+
RootCmd.AddCommand(manageDeploymentRepoCmd)
212+
213+
manageDeploymentRepoCmd.PersistentFlags().StringP("ocm-config", "", "", "ocm configuration file")
214+
manageDeploymentRepoCmd.Flags().StringP(FlagGitConfig, "", "", "Git configuration file")
215+
if err := manageDeploymentRepoCmd.MarkFlagRequired(FlagGitConfig); err != nil {
216+
panic(err)
217+
}
218+
}
219+
220+
func CloneRepo(repoURL string, config *gitconfig.Config) (*git.Repository, string, error) {
221+
cloneOptions := &git.CloneOptions{
222+
URL: repoURL,
223+
}
224+
225+
if err := config.ConfigureCloneOptions(cloneOptions); err != nil {
226+
return nil, "", err
227+
}
228+
229+
tmpDir, err := os.MkdirTemp("", "deployment-repo-")
230+
if err != nil {
231+
return nil, "", fmt.Errorf("failed to create temp dir: %w", err)
232+
}
233+
234+
repo, err := git.PlainClone(tmpDir, false, cloneOptions)
235+
if err != nil {
236+
return nil, tmpDir, fmt.Errorf("failed to clone repository: %w", err)
237+
}
238+
239+
return repo, tmpDir, nil
240+
}

go.mod

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,30 @@ require (
1010
)
1111

1212
require (
13+
dario.cat/mergo v1.0.0 // indirect
14+
github.com/Microsoft/go-winio v0.6.2 // indirect
15+
github.com/ProtonMail/go-crypto v1.1.6 // indirect
16+
github.com/cloudflare/circl v1.6.1 // indirect
17+
github.com/cyphar/filepath-securejoin v0.4.1 // indirect
1318
github.com/davecgh/go-spew v1.1.1 // indirect
19+
github.com/emirpasic/gods v1.18.1 // indirect
20+
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
21+
github.com/go-git/go-billy/v5 v5.6.2 // indirect
22+
github.com/go-git/go-git/v5 v5.16.2 // indirect
23+
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
1424
github.com/inconshreveable/mousetrap v1.1.0 // indirect
25+
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
26+
github.com/kevinburke/ssh_config v1.2.0 // indirect
27+
github.com/pjbgf/sha1cd v0.3.2 // indirect
1528
github.com/pmezard/go-difflib v1.0.0 // indirect
29+
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
30+
github.com/skeema/knownhosts v1.3.1 // indirect
1631
github.com/spf13/pflag v1.0.7 // indirect
32+
github.com/xanzy/ssh-agent v0.3.3 // indirect
1733
go.yaml.in/yaml/v2 v2.4.2 // indirect
34+
golang.org/x/crypto v0.37.0 // indirect
35+
golang.org/x/net v0.39.0 // indirect
36+
golang.org/x/sys v0.32.0 // indirect
37+
gopkg.in/warnings.v0 v0.1.2 // indirect
1838
gopkg.in/yaml.v3 v3.0.1 // indirect
1939
)

go.sum

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,90 @@
1+
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
2+
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
3+
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
4+
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
5+
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
6+
github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
7+
github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
8+
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
9+
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
110
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
11+
github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s=
12+
github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
13+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
214
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
315
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
16+
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
17+
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
18+
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
19+
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
20+
github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM=
21+
github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=
22+
github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM=
23+
github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=
24+
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
25+
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
426
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
527
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
628
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
729
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
30+
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
31+
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
32+
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
33+
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
34+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
35+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
36+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
37+
github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4=
38+
github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A=
39+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
840
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
941
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1042
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
43+
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
44+
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
45+
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
46+
github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8=
47+
github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY=
1148
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
1249
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
1350
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
1451
github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
1552
github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
53+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
54+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
55+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
1656
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
1757
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
58+
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
59+
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
1860
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
1961
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
2062
go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
2163
go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
64+
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
65+
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
66+
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
67+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
68+
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
69+
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
70+
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
71+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
72+
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
73+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
74+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
75+
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
76+
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
77+
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
78+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
79+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
80+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
2281
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
2382
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
83+
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
84+
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
85+
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
86+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
87+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
2488
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
2589
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
2690
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=

0 commit comments

Comments
 (0)