Skip to content

Commit 32f2838

Browse files
committed
Add version command, print help on base cmd
1 parent ecf46fd commit 32f2838

File tree

7 files changed

+152
-14
lines changed

7 files changed

+152
-14
lines changed

.goreleaser.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
builds:
2-
- dir: "./cmd/wush"
2+
- main: "./cmd/wush"
33
env:
44
- CGO_ENABLED=0
55
mod_timestamp: "{{ .CommitTimestamp }}"
66
flags:
77
- -trimpath
88
ldflags:
9-
- "-s -w -X main.version={{.Version}} -X main.commit={{.Commit}}"
9+
- "-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.commitDate={{.CommitTimestamp}}"
1010
goos:
1111
- freebsd
1212
- windows
@@ -32,7 +32,7 @@ nfpms:
3232
description: |-
3333
Wush installer package.
3434
Wush creates secure Wireguard tunnels between two devices.
35-
license: CC0
35+
license: CC0-1.0
3636
contents:
3737
- src: LICENSE
3838
dst: "/usr/share/doc/{{ .ProjectName }}/copyright"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ On the client machine:
3131
```bash
3232
$ wush
3333
┃ Enter the receiver's Auth key:
34-
| > 112v1RyL5KPzsbMbhT7fkEGrcfpygxtnvwjR5kMLGxDHGeLTK1BvoPqsUcjo7xyMkFn46KLTdedKuPCG5trP84mz9kx
34+
> 112v1RyL5KPzsbMbhT7fkEGrcfpygxtnvwjR5kMLGxDHGeLTK1BvoPqsUcjo7xyMkFn46KLTdedKuPCG5trP84mz9kx
3535
Auth information:
3636
> Server overlay STUN address: Disabled
3737
> Server overlay DERP home: Toronto

cmd/wush/main.go

Lines changed: 114 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,129 @@ package main
33
import (
44
"fmt"
55
"os"
6+
"strconv"
7+
"strings"
8+
"time"
69

10+
"github.com/coder/pretty"
711
"github.com/coder/serpent"
12+
"github.com/coder/wush/cliui"
13+
"github.com/mitchellh/go-wordwrap"
814
)
915

1016
func main() {
11-
cmd := sshCmd()
12-
cmd.Children = []*serpent.Command{
13-
receiveCmd(),
14-
rsyncCmd(),
17+
var (
18+
showVersion bool
19+
20+
fmtLong = "wush %s - peer-to-peer file transfers and shells\n"
21+
)
22+
cmd := &serpent.Command{
23+
Use: "wush <subcommand>",
24+
Long: fmt.Sprintf(fmtLong, getBuildInfo().version) + formatExamples(
25+
example{
26+
Description: "Start the wush server",
27+
Command: "wush receive",
28+
},
29+
example{
30+
Description: "Open a shell to the wush host",
31+
Command: "wush ssh",
32+
},
33+
example{
34+
Description: "Transfer files to the wush host using rsync",
35+
Command: "wush rsync local-file.txt :/path/to/remote/file",
36+
},
37+
),
38+
Handler: func(i *serpent.Invocation) error {
39+
if showVersion {
40+
return versionCmd().Handler(i)
41+
}
42+
return serpent.DefaultHelpFn()(i)
43+
},
44+
Children: []*serpent.Command{
45+
versionCmd(),
46+
sshCmd(),
47+
receiveCmd(),
48+
rsyncCmd(),
49+
},
50+
Options: []serpent.Option{
51+
{
52+
Flag: "version",
53+
Description: "Print the version and exit.",
54+
Value: serpent.BoolOf(&showVersion),
55+
},
56+
},
1557
}
58+
1659
err := cmd.Invoke().WithOS().Run()
1760
if err != nil {
1861
fmt.Fprintf(os.Stderr, "error: %v\n", err)
1962
os.Exit(1)
2063
}
2164
}
65+
66+
// example represents a standard example for command usage, to be used
67+
// with formatExamples.
68+
type example struct {
69+
Description string
70+
Command string
71+
}
72+
73+
// formatExamples formats the examples as width wrapped bulletpoint
74+
// descriptions with the command underneath.
75+
func formatExamples(examples ...example) string {
76+
var sb strings.Builder
77+
78+
padStyle := cliui.DefaultStyles.Wrap.With(pretty.XPad(4, 0))
79+
for i, e := range examples {
80+
if len(e.Description) > 0 {
81+
wordwrap.WrapString(e.Description, 80)
82+
_, _ = sb.WriteString(
83+
" - " + pretty.Sprint(padStyle, e.Description+":")[4:] + "\n\n ",
84+
)
85+
}
86+
// We add 1 space here because `cliui.DefaultStyles.Code` adds an extra
87+
// space. This makes the code block align at an even 2 or 6
88+
// spaces for symmetry.
89+
_, _ = sb.WriteString(" " + pretty.Sprint(cliui.DefaultStyles.Code, fmt.Sprintf("$ %s", e.Command)))
90+
if i < len(examples)-1 {
91+
_, _ = sb.WriteString("\n\n")
92+
}
93+
}
94+
return sb.String()
95+
}
96+
97+
var (
98+
version string
99+
commit string
100+
commitDate string
101+
)
102+
103+
type buildInfo struct {
104+
version string
105+
commitHash string
106+
commitTime time.Time
107+
}
108+
109+
func getBuildInfo() buildInfo {
110+
bi := buildInfo{
111+
version: "v0.0.0-devel",
112+
commitHash: "0000000000000000000000000000000000000000",
113+
commitTime: time.Now(),
114+
}
115+
116+
if version != "" {
117+
bi.version = version
118+
}
119+
if commit != "" {
120+
bi.commitHash = commit
121+
}
122+
if commitDate != "" {
123+
dateUnix, err := strconv.ParseInt(commitDate, 10, 64)
124+
if err != nil {
125+
panic("invalid commitDate: " + err.Error())
126+
}
127+
bi.commitTime = time.Unix(dateUnix, 0)
128+
}
129+
130+
return bi
131+
}

cmd/wush/ssh.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ func sshCmd() *serpent.Command {
3030
sshStdio bool
3131
)
3232
return &serpent.Command{
33-
Use: "wush",
34-
Aliases: []string{"ssh"},
33+
Use: "ssh",
34+
Aliases: []string{},
3535
Long: "Opens an SSH connection to a " + cliui.Code("wush") + " peer. " +
3636
"Use " + cliui.Code("wush receive") + " on the computer you would like to connect to.",
3737
Handler: func(inv *serpent.Invocation) error {

cmd/wush/version.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
"github.com/coder/serpent"
8+
)
9+
10+
func versionCmd() *serpent.Command {
11+
cmd := &serpent.Command{
12+
Use: "version",
13+
Short: "Show wush version",
14+
Handler: func(inv *serpent.Invocation) error {
15+
bi := getBuildInfo()
16+
fmt.Printf("Wush %s-%s %s\n", bi.version, bi.commitHash[:7], bi.commitTime.Format(time.RFC1123))
17+
fmt.Printf("https://github.com/coder/wush/commit/%s\n", commit)
18+
return nil
19+
},
20+
Options: serpent.OptionSet{},
21+
}
22+
23+
return cmd
24+
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ require (
1212
github.com/charmbracelet/huh v0.4.2
1313
github.com/coder/coder/v2 v2.14.1
1414
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0
15-
github.com/coder/serpent v0.7.0
15+
github.com/coder/serpent v0.7.1-0.20240823180923-556f4d27e175
1616
github.com/go-chi/chi/v5 v5.1.0
1717
github.com/google/uuid v1.6.0
1818
github.com/klauspost/compress v1.17.9
1919
github.com/mattn/go-isatty v0.0.20
20+
github.com/mitchellh/go-wordwrap v1.0.1
2021
github.com/muesli/termenv v0.15.2
2122
github.com/pion/stun/v3 v3.0.0
2223
github.com/prometheus/client_golang v1.19.1
@@ -141,7 +142,6 @@ require (
141142
github.com/mitchellh/copystructure v1.2.0 // indirect
142143
github.com/mitchellh/go-ps v1.0.0 // indirect
143144
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
144-
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
145145
github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect
146146
github.com/mitchellh/reflectwalk v1.0.2 // indirect
147147
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect

go.sum

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ github.com/coder/coder/v2 v2.14.1 h1:tSYe7H4pNRL8hh9ynwHK7QYTOvG5hcuZJEOkn4ZPASE
153153
github.com/coder/coder/v2 v2.14.1/go.mod h1:dO79BI5XlP8rrtne1JpRcVehe27bNMXdZKyn1NsWbjA=
154154
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 h1:3A0ES21Ke+FxEM8CXx9n47SZOKOpgSE1bbJzlE4qPVs=
155155
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0/go.mod h1:5UuS2Ts+nTToAMeOjNlnHFkPahrtDkmpydBen/3wgZc=
156-
github.com/coder/serpent v0.7.0 h1:zGpD2GlF3lKIVkMjNGKbkip88qzd5r/TRcc30X/SrT0=
157-
github.com/coder/serpent v0.7.0/go.mod h1:REkJ5ZFHQUWFTPLExhXYZ1CaHFjxvGNRlLXLdsI08YA=
156+
github.com/coder/serpent v0.7.1-0.20240823180923-556f4d27e175 h1:/YekbSbvOFGlkfnDC8VMIV3fWZC7jm1i+RiEDs12fWs=
157+
github.com/coder/serpent v0.7.1-0.20240823180923-556f4d27e175/go.mod h1:cZFW6/fP+kE9nd/oRkEHJpG6sXCtQ+AX7WMMEHv0Y3Q=
158158
github.com/coder/ssh v0.0.0-20231128192721-70855dedb788 h1:YoUSJ19E8AtuUFVYBpXuOD6a/zVP3rcxezNsoDseTUw=
159159
github.com/coder/ssh v0.0.0-20231128192721-70855dedb788/go.mod h1:aGQbuCLyhRLMzZF067xc84Lh7JDs1FKwCmF1Crl9dxQ=
160160
github.com/coder/terraform-provider-coder v0.23.0 h1:DuNLWxhnGlXyG0g+OCAZRI6xd8+bJjIEnE4F3hYgA4E=
@@ -376,6 +376,8 @@ github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4=
376376
github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY=
377377
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
378378
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
379+
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
380+
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
379381
github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
380382
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
381383
github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
@@ -394,6 +396,8 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU
394396
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
395397
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
396398
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
399+
github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A=
400+
github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM=
397401
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
398402
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
399403
github.com/nsf/jsondiff v0.0.0-20200515183724-f29ed568f4ce h1:RPclfga2SEJmgMmz2k+Mg7cowZ8yv4Trqw9UsJby758=

0 commit comments

Comments
 (0)