Skip to content

Commit 1eeeb29

Browse files
committed
feat: add version command
1 parent 29be977 commit 1eeeb29

4 files changed

Lines changed: 93 additions & 1 deletion

File tree

cmd/diffs/main.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,36 @@ import (
44
"errors"
55
"fmt"
66
"os"
7+
"strings"
78
"time"
9+
10+
"github.com/spf13/cobra"
811
)
912

1013
func main() {
11-
if err := newRootCommand(time.Now()).Execute(); err != nil {
14+
if err := executeRootCommand(newRootCommand(time.Now())); err != nil {
1215
var quiet quietError
1316
if !errors.As(err, &quiet) {
1417
_, _ = fmt.Fprintln(os.Stderr, err)
1518
}
1619
os.Exit(1)
1720
}
1821
}
22+
23+
func executeRootCommand(cmd *cobra.Command) error {
24+
err := cmd.Execute()
25+
if err == nil || !isUnknownCommandError(err) {
26+
return err
27+
}
28+
29+
errOut := cmd.ErrOrStderr()
30+
_, _ = fmt.Fprintln(errOut, err)
31+
_, _ = fmt.Fprintln(errOut)
32+
cmd.SetOut(errOut)
33+
_ = cmd.Help()
34+
return quietError{err: err}
35+
}
36+
37+
func isUnknownCommandError(err error) bool {
38+
return strings.HasPrefix(err.Error(), "unknown command ")
39+
}

cmd/diffs/main_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"bytes"
55
"encoding/json"
6+
"errors"
67
"net"
78
"os"
89
"os/exec"
@@ -143,6 +144,38 @@ func TestRootCommandRejectsDirectPRTarget(t *testing.T) {
143144
}
144145
}
145146

147+
func TestUnknownCommandPrintsRootHelp(t *testing.T) {
148+
var out bytes.Buffer
149+
cmd := newRootCommand(time.Time{})
150+
cmd.SetOut(&bytes.Buffer{})
151+
cmd.SetErr(&out)
152+
cmd.SetArgs([]string{"bogus"})
153+
154+
err := executeRootCommand(cmd)
155+
if err == nil {
156+
t.Fatal("unknown command succeeded, want error")
157+
}
158+
var quiet quietError
159+
if !errors.As(err, &quiet) {
160+
t.Fatalf("error = %T, want quietError", err)
161+
}
162+
163+
got := out.String()
164+
for _, want := range []string{
165+
`unknown command "bogus" for "diffs"`,
166+
"Usage:",
167+
"diffs [flags]",
168+
"Available Commands:",
169+
"local",
170+
"pr",
171+
"version",
172+
} {
173+
if !strings.Contains(got, want) {
174+
t.Fatalf("unknown command output missing %q in:\n%s", want, got)
175+
}
176+
}
177+
}
178+
146179
func TestLocalCommandRejectsNonGitRepository(t *testing.T) {
147180
dir := t.TempDir()
148181
var errOut bytes.Buffer
@@ -408,6 +441,7 @@ func TestRootCommandHelpShowsSubcommandsAndDir(t *testing.T) {
408441
"diffs [flags]",
409442
"local",
410443
"pr",
444+
"version",
411445
"--dir string",
412446
} {
413447
if !strings.Contains(got, want) {
@@ -449,6 +483,21 @@ func TestPRCommandHelp(t *testing.T) {
449483
}
450484
}
451485

486+
func TestVersionCommandPrintsDefaultDevVersion(t *testing.T) {
487+
var out bytes.Buffer
488+
cmd := newRootCommand(time.Time{})
489+
cmd.SetOut(&out)
490+
cmd.SetErr(&bytes.Buffer{})
491+
cmd.SetArgs([]string{"version"})
492+
if err := cmd.Execute(); err != nil {
493+
t.Fatalf("version failed: %v", err)
494+
}
495+
496+
if got := out.String(); got != "dev\n" {
497+
t.Fatalf("version output = %q, want %q", got, "dev\n")
498+
}
499+
}
500+
452501
func TestCommentsCommandAddAndListJSON(t *testing.T) {
453502
dir := t.TempDir()
454503
git(t, dir, "init", "-b", "main")

cmd/diffs/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func newRootCommand(started time.Time) *cobra.Command {
4646
newLocalCommand(opts, started),
4747
newPRCommand(opts, started),
4848
newCommentsCommand(opts),
49+
newVersionCommand(),
4950
)
5051
return root
5152
}

cmd/diffs/version.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/spf13/cobra"
7+
)
8+
9+
var version = "dev"
10+
11+
func newVersionCommand() *cobra.Command {
12+
return &cobra.Command{
13+
Use: "version",
14+
Short: "Print the diffs version",
15+
Args: cobra.NoArgs,
16+
RunE: func(cmd *cobra.Command, _ []string) error {
17+
_, err := fmt.Fprintln(cmd.OutOrStdout(), version)
18+
return err
19+
},
20+
}
21+
}

0 commit comments

Comments
 (0)