0d073ef687ab3c33122aff049ede9330c76f4e89
- Author
- Ayman Bagabas <ayman.bagabas@gmail.com>
- Committer
- Ayman Bagabas <ayman.bagabas@gmail.com>
- Date
Message
Diff
This diff is truncated to protect this page.
1diff --git a/.gitignore b/.gitignore
2index 0a3b2a832f5f4c6d68c447602ad9db763249c3d1..7f48767177e75ab62894454f61761e963f03f43e 100644
3--- a/.gitignore
4+++ b/.gitignore
5@@ -2,4 +2,6 @@ cmd/soft/soft
6 .ssh
7 .repos
8 dist
9-testdata
10+testdata
11+completions/
12+manpages/
13diff --git a/.goreleaser.yml b/.goreleaser.yml
14index 0c59621d718309bcc405930ca49691206a51a433..e986cb5d3166aa8ac81eb55c0455e2931d7542c8 100644
15--- a/.goreleaser.yml
16+++ b/.goreleaser.yml
17@@ -1,12 +1,12 @@
18 includes:
19 - from_url:
20- url: charmbracelet/meta/main/goreleaser.yaml
21+ url: charmbracelet/meta/main/goreleaser-full.yaml
22
23 variables:
24 main: "./cmd/soft"
25 binary_name: soft
26 description: "A tasty, self-hostable Git server for the command line🍦"
27 github_url: "https://github.com/charmbracelet/soft-serve"
28- maintainer: "Christian Rocha <christian@charm.sh>"
29- brew_commit_author_name: "Christian Rocha"
30- brew_commit_author_email: "christian@charm.sh"
31+ maintainer: "Ayman Bagabas <ayman@charm.sh>"
32+ brew_commit_author_name: "Ayman Bagabas"
33+ brew_commit_author_email: "ayman@charm.sh"
34diff --git a/Dockerfile b/Dockerfile
35index 589d64ba996de01c5a004abeb5e164a7a64468cb..6b451e96b2410d08c894a36396bf0c033989431f 100644
36--- a/Dockerfile
37+++ b/Dockerfile
38@@ -19,4 +19,4 @@ ENV SOFT_SERVE_REPO_PATH "/soft-serve/repos"
39 EXPOSE 23231/tcp
40
41 # Set the default command
42-ENTRYPOINT [ "/usr/local/bin/soft" ]
43+ENTRYPOINT [ "/usr/local/bin/soft", "serve" ]
44diff --git a/cmd/soft/main.go b/cmd/soft/main.go
45deleted file mode 100644
46index 160e9c73a153052b16d9fc2d255b62cc542b45aa..0000000000000000000000000000000000000000
47--- a/cmd/soft/main.go
48+++ /dev/null
49@@ -1,110 +0,0 @@
50-package main
51-
52-import (
53- "context"
54- "fmt"
55- "log"
56- "os"
57- "os/signal"
58- "runtime/debug"
59- "syscall"
60- "time"
61-
62- "github.com/charmbracelet/soft-serve/config"
63- "github.com/charmbracelet/soft-serve/server"
64- mcobra "github.com/muesli/mango-cobra"
65- "github.com/muesli/roff"
66- "github.com/spf13/cobra"
67-)
68-
69-var (
70- // Version contains the application version number. It's set via ldflags
71- // when building.
72- Version = ""
73-
74- // CommitSHA contains the SHA of the commit that this application was built
75- // against. It's set via ldflags when building.
76- CommitSHA = ""
77-
78- rootCmd = &cobra.Command{
79- Use: "soft",
80- Short: "A self-hostable Git server for the command line",
81- Long: "Soft Serve is a self-hostable Git server for the command line.",
82- RunE: func(cmd *cobra.Command, args []string) error {
83- return cmd.Help()
84- },
85- }
86-
87- serveCmd = &cobra.Command{
88- Use: "serve",
89- Short: "Start the server",
90- Long: "Start the server",
91- Args: cobra.NoArgs,
92- RunE: func(cmd *cobra.Command, args []string) error {
93- cfg := config.DefaultConfig()
94- s := server.NewServer(cfg)
95-
96- done := make(chan os.Signal, 1)
97- signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
98-
99- log.Printf("Starting SSH server on %s:%d", cfg.BindAddr, cfg.Port)
100- go func() {
101- if err := s.Start(); err != nil {
102- log.Fatalln(err)
103- }
104- }()
105-
106- <-done
107-
108- log.Printf("Stopping SSH server on %s:%d", cfg.BindAddr, cfg.Port)
109- ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
110- defer func() { cancel() }()
111- return s.Shutdown(ctx)
112- },
113- }
114-
115- manCmd = &cobra.Command{
116- Use: "man",
117- Short: "Generate man pages",
118- Args: cobra.NoArgs,
119- Hidden: true,
120- RunE: func(cmd *cobra.Command, args []string) error {
121- manPage, err := mcobra.NewManPage(1, rootCmd) //.
122- if err != nil {
123- return err
124- }
125-
126- manPage = manPage.WithSection("Copyright", "(C) 2021-2022 Charmbracelet, Inc.\n"+
127- "Released under MIT license.")
128- fmt.Println(manPage.Build(roff.NewDocument()))
129- return nil
130- },
131- }
132-)
133-
134-func init() {
135- rootCmd.AddCommand(
136- serveCmd,
137- manCmd,
138- )
139- rootCmd.CompletionOptions.HiddenDefaultCmd = true
140-
141- if len(CommitSHA) >= 7 {
142- vt := rootCmd.VersionTemplate()
143- rootCmd.SetVersionTemplate(vt[:len(vt)-1] + " (" + CommitSHA[0:7] + ")\n")
144- }
145- if Version == "" {
146- if info, ok := debug.ReadBuildInfo(); ok && info.Main.Sum != "" {
147- Version = info.Main.Version
148- } else {
149diff --git a/cmd/soft/man.go b/cmd/soft/man.go
150new file mode 100644
151index 0000000000000000000000000000000000000000..ae59fec1bafe3f201c1fe4ec3a0a4a2f3ee298a2
152--- /dev/null
153+++ b/cmd/soft/man.go
154@@ -0,0 +1,29 @@
155+package main
156+
157+import (
158+ "fmt"
159+
160+ mcobra "github.com/muesli/mango-cobra"
161+ "github.com/muesli/roff"
162+ "github.com/spf13/cobra"
163+)
164+
165+var (
166+ manCmd = &cobra.Command{
167+ Use: "man",
168+ Short: "Generate man pages",
169+ Args: cobra.NoArgs,
170+ Hidden: true,
171+ RunE: func(cmd *cobra.Command, args []string) error {
172+ manPage, err := mcobra.NewManPage(1, rootCmd) //.
173+ if err != nil {
174+ return err
175+ }
176+
177+ manPage = manPage.WithSection("Copyright", "(C) 2021-2022 Charmbracelet, Inc.\n"+
178+ "Released under MIT license.")
179+ fmt.Println(manPage.Build(roff.NewDocument()))
180+ return nil
181+ },
182+ }
183+)
184diff --git a/cmd/soft/root.go b/cmd/soft/root.go
185new file mode 100644
186index 0000000000000000000000000000000000000000..6a536f228ad45f575beed27782f3bb4df83cbf20
187--- /dev/null
188+++ b/cmd/soft/root.go
189@@ -0,0 +1,54 @@
190+package main
191+
192+import (
193+ "log"
194+ "runtime/debug"
195+
196+ "github.com/spf13/cobra"
197+)
198+
199+var (
200+ // Version contains the application version number. It's set via ldflags
201+ // when building.
202+ Version = ""
203+
204+ // CommitSHA contains the SHA of the commit that this application was built
205+ // against. It's set via ldflags when building.
206+ CommitSHA = ""
207+
208+ rootCmd = &cobra.Command{
209+ Use: "soft",
210+ Short: "A self-hostable Git server for the command line",
211+ Long: "Soft Serve is a self-hostable Git server for the command line.",
212+ RunE: func(cmd *cobra.Command, args []string) error {
213+ return cmd.Help()
214+ },
215+ }
216+)
217+
218+func init() {
219+ rootCmd.AddCommand(
220+ serveCmd,
221+ manCmd,
222+ )
223+ rootCmd.CompletionOptions.HiddenDefaultCmd = true
224+
225+ if len(CommitSHA) >= 7 {
226+ vt := rootCmd.VersionTemplate()
227+ rootCmd.SetVersionTemplate(vt[:len(vt)-1] + " (" + CommitSHA[0:7] + ")\n")
228+ }
229+ if Version == "" {
230+ if info, ok := debug.ReadBuildInfo(); ok && info.Main.Sum != "" {
231+ Version = info.Main.Version
232+ } else {
233+ Version = "unknown (built from source)"
234+ }
235+ }
236+ rootCmd.Version = Version
237+}
238+
239+func main() {
240+ if err := rootCmd.Execute(); err != nil {
241+ log.Fatalln(err)
242+ }
243+}
244diff --git a/cmd/soft/serve.go b/cmd/soft/serve.go
245new file mode 100644
246index 0000000000000000000000000000000000000000..ecdd628744766a522b901747035c2913533858fc
247--- /dev/null
248+++ b/cmd/soft/serve.go
249@@ -0,0 +1,44 @@
250+package main
251+
252+import (
253+ "context"
254+ "log"
255+ "os"
256+ "os/signal"
257+ "syscall"
258+ "time"
259+
260+ "github.com/charmbracelet/soft-serve/config"
261+ "github.com/charmbracelet/soft-serve/server"
262+ "github.com/spf13/cobra"
263+)
264+
265+var (
266+ serveCmd = &cobra.Command{
267+ Use: "serve",
268+ Short: "Start the server",
269+ Long: "Start the server",
270+ Args: cobra.NoArgs,
271+ RunE: func(cmd *cobra.Command, args []string) error {
272+ cfg := config.DefaultConfig()
273+ s := server.NewServer(cfg)
274+
275+ done := make(chan os.Signal, 1)
276+ signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
277+
278+ log.Printf("Starting SSH server on %s:%d", cfg.BindAddr, cfg.Port)
279+ go func() {
280+ if err := s.Start(); err != nil {
281+ log.Fatalln(err)
282+ }
283+ }()
284+
285+ <-done
286+
287+ log.Printf("Stopping SSH server on %s:%d", cfg.BindAddr, cfg.Port)
288+ ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
289+ defer func() { cancel() }()
290+ return s.Shutdown(ctx)
291+ },
292+ }
293+)
294diff --git a/go.mod b/go.mod
295index 088bc2e6793f050084d73f210349365c9b2b56fa..ffc7aed12ac21ebb49549ca399fd16bc2f1e7789 100755
296--- a/go.mod
297+++ b/go.mod
298@@ -5,10 +5,10 @@ go 1.17
299 require (
300 github.com/alecthomas/chroma v0.10.0
301 github.com/caarlos0/env/v6 v6.9.1
302- github.com/charmbracelet/bubbles v0.10.4-0.20220302223835-88562515cf7b
303- github.com/charmbracelet/bubbletea v0.20.0
304+ github.com/charmbracelet/bubbles v0.11.0
305+ github.com/charmbracelet/bubbletea v0.22.0
306 github.com/charmbracelet/glamour v0.4.0
307- github.com/charmbracelet/lipgloss v0.4.0
308+ github.com/charmbracelet/lipgloss v0.5.0
309 github.com/charmbracelet/wish v0.5.0
310 github.com/dustin/go-humanize v1.0.0
311 github.com/gliderlabs/ssh v0.3.4
312@@ -16,7 +16,7 @@ require (
313 github.com/go-git/go-git/v5 v5.4.3-0.20210630082519-b4368b2a2ca4
314 github.com/matryer/is v1.4.0
315 github.com/muesli/reflow v0.3.0
316- github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739
317+ github.com/muesli/termenv v0.12.0
318 github.com/sergi/go-diff v1.1.0
319 golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70
320 )
321@@ -56,6 +56,7 @@ require (
322 github.com/microcosm-cc/bluemonday v1.0.17 // indirect
323 github.com/mitchellh/go-homedir v1.1.0 // indirect
324 github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 // indirect
325+ github.com/muesli/cancelreader v0.2.1 // indirect
326 github.com/muesli/mango v0.1.0 // indirect
327 github.com/muesli/mango-pflag v0.1.0 // indirect
328 github.com/olekukonko/tablewriter v0.0.5 // indirect
329@@ -66,7 +67,7 @@ require (
330 github.com/yuin/goldmark v1.4.4 // indirect
331 github.com/yuin/goldmark-emoji v1.0.1 // indirect
332 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
333- golang.org/x/sys v0.0.0-20220111092808-5a964db01320 // indirect
334+ golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect
335 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
336 gopkg.in/warnings.v0 v0.1.2 // indirect
337 )
338diff --git a/go.sum b/go.sum
339index a5d68d44bd3e096ed599fb98129367b28bb08514..33dfda0d298ab4e4aecf23c4bf0868352a12a29f 100644
340--- a/go.sum
341+++ b/go.sum
342@@ -24,21 +24,22 @@ github.com/caarlos0/env/v6 v6.9.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Z
343 github.com/caarlos0/sshmarshal v0.0.0-20220308164159-9ddb9f83c6b3/go.mod h1:7Pd/0mmq9x/JCzKauogNjSQEhivBclCQHfr9dlpDIyA=
344 github.com/caarlos0/sshmarshal v0.1.0 h1:zTCZrDORFfWh526Tsb7vCm3+Yg/SfW/Ub8aQDeosk0I=
345 github.com/caarlos0/sshmarshal v0.1.0/go.mod h1:7Pd/0mmq9x/JCzKauogNjSQEhivBclCQHfr9dlpDIyA=
346-github.com/charmbracelet/bubbles v0.10.4-0.20220302223835-88562515cf7b h1:o+LFpRn1fXtu1hDJLtBFjp7tMZ8AqwSpl84w1TnUj0Y=
347-github.com/charmbracelet/bubbles v0.10.4-0.20220302223835-88562515cf7b/go.mod h1:jOA+DUF1rjZm7gZHcNyIVW+YrBPALKfpGVdJu8UiJsA=
348-github.com/charmbracelet/bubbletea v0.19.3/go.mod h1:VuXF2pToRxDUHcBUcPmCRUHRvFATM4Ckb/ql1rBl3KA=
349-github.com/charmbracelet/bubbletea v0.20.0 h1:/b8LEPgCbNr7WWZ2LuE/BV1/r4t5PyYJtDb+J3vpwxc=
350+github.com/charmbracelet/bubbles v0.11.0 h1:fBLyY0PvJnd56Vlu5L84JJH6f4axhgIJ9P3NET78f0Q=
351+github.com/charmbracelet/bubbles v0.11.0/go.mod h1:bbeTiXwPww4M031aGi8UK2HT9RDWoiNibae+1yCMtcc=
352 github.com/charmbracelet/bubbletea v0.20.0/go.mod h1:zpkze1Rioo4rJELjRyGlm9T2YNou1Fm4LIJQSa5QMEM=
353+github.com/charmbracelet/bubbletea v0.21.0/go.mod h1:GgmJMec61d08zXsOhqRC/AiOx4K4pmz+VIcRIm1FKr4=
354+github.com/charmbracelet/bubbletea v0.22.0 h1:E1BTNSE3iIrq0G0X6TjGAmrQ32cGCbFDPcIuImikrUc=
355+github.com/charmbracelet/bubbletea v0.22.0/go.mod h1:aoVIwlNlr5wbCB26KhxfrqAn0bMp4YpJcoOelbxApjs=
356 github.com/charmbracelet/glamour v0.4.0 h1:scR+smyB7WdmrlIaff6IVlm48P48JaNM7JypM/VGl4k=
357 github.com/charmbracelet/glamour v0.4.0/go.mod h1:9ZRtG19AUIzcTm7FGLGbq3D5WKQ5UyZBbQsMQN0XIqc=
358-github.com/charmbracelet/harmonica v0.1.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
359+github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
360 github.com/charmbracelet/keygen v0.3.0 h1:mXpsQcH7DDlST5TddmXNXjS0L7ECk4/kLQYyBcsan2Y=
361 github.com/charmbracelet/keygen v0.3.0/go.mod h1:1ukgO8806O25lUZ5s0IrNur+RlwTBERlezdgW71F5rM=
362-github.com/charmbracelet/lipgloss v0.4.0 h1:768h64EFkGUr8V5yAKV7/Ta0NiVceiPaV+PphaW1K9g=
363 github.com/charmbracelet/lipgloss v0.4.0/go.mod h1:vmdkHvce7UzX6xkyf4cca8WlwdQ5RQr8fzta+xl7BOM=
364+github.com/charmbracelet/lipgloss v0.5.0 h1:lulQHuVeodSgDez+3rGiuxlPVXSnhth442DATR2/8t8=
365+github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs=
366 github.com/charmbracelet/wish v0.5.0 h1:FkkdNBFqrLABR1ciNrAL2KCxoyWfKhXnIGZw6GfAtPg=
367 github.com/charmbracelet/wish v0.5.0/go.mod h1:5GAn5SrDSZ7cgKjnC+3kDmiIo7I6k4/AYiRzC4+tpCk=
368-github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=
369 github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
370 github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
371 github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
372@@ -120,6 +121,9 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk
373 github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho=
374 github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 h1:kMlmsLSbjkikxQJ1IPwaM+7LJ9ltFu/fi8CRzvSnQmA=
375 github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho=
376+github.com/muesli/cancelreader v0.2.0/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
377+github.com/muesli/cancelreader v0.2.1 h1:Xzd1B4U5bWQOuSKuN398MyynIGTNT89dxzpEDsalXZs=
378+github.com/muesli/cancelreader v0.2.1/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
379 github.com/muesli/mango v0.1.0 h1:DZQK45d2gGbql1arsYA4vfg4d7I9Hfx5rX/GCmzsAvI=
380 github.com/muesli/mango v0.1.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4=
381 github.com/muesli/mango-cobra v1.2.0 h1:DQvjzAM0PMZr85Iv9LIMaYISpTOliMEg+uMFtNbYvWg=
382@@ -132,8 +136,10 @@ github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKt
383 github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8=
384 github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig=
385 github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw=
386-github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 h1:QANkGiGr39l1EESqrE0gZw0/AJNYzIvoGLhIoVYtluI=
387+github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
388 github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
389+github.com/muesli/termenv v0.12.0 h1:KuQRUE3PgxRFWhq4gHvZtPSLCGDqM5q/cYr1pZ39ytc=
390+github.com/muesli/termenv v0.12.0/go.mod h1:WCCv32tusQ/EEZ5S8oUIIrC/nIuBcxCVqlN4Xfkv+7A=
391 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
392 github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
393 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
394@@ -204,8 +210,9 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
395 golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
396 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
397 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
398-golang.org/x/sys v0.0.0-20220111092808-5a964db01320 h1:0jf+tOCoZ3LyutmCOWpVni1chK4VfFLhRsDK7MhqGRY=
399-golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
400+golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
401+golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c=
402+golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
403 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
404 golang.org/x/term v0.0.0-20210422114643-f5beecf764ed/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
405 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=