...
1 package cli
2
3 import (
4 "context"
5 "fmt"
6 "io"
7 "runtime"
8 "text/tabwriter"
9
10 "edge-infra.dev/pkg/lib/build"
11 "edge-infra.dev/pkg/lib/cli/rags"
12 "edge-infra.dev/pkg/lib/cli/sink"
13 )
14
15
16
17 func NewVersionCmd(v *build.Version) *sink.Command {
18 var (
19 short bool
20 commit bool
21 )
22
23 versionCmd := &sink.Command{
24 Use: "version [flags]",
25 Short: "Print CLI version information",
26 Flags: []*rags.Rag{
27 {
28 Name: "commit",
29 Short: "c",
30 Usage: "Only print the versions commit hash",
31 Value: &rags.Bool{Var: &commit},
32 },
33 {
34 Name: "short",
35 Short: "s",
36 Usage: "Only print the machine-readable semantic version string",
37 Value: &rags.Bool{Var: &short},
38 },
39 },
40 Exec: func(_ context.Context, r sink.Run) error {
41 if short {
42 fmt.Fprintln(r.Out(), v.String())
43 return nil
44 }
45
46 if commit {
47 fmt.Fprintln(r.Out(), v.Commit)
48 return nil
49 }
50
51 Version(r.Out(), v)
52 return nil
53 },
54 }
55 return versionCmd
56 }
57
58
59
60 func Version(w io.Writer, v *build.Version) {
61 tw := tabwriter.NewWriter(w, 8, 2, 2, ' ', 0)
62 defer tw.Flush()
63 fmt.Fprintln(tw, v.String()+"\t\t")
64 fmt.Fprintln(tw)
65
66 if v.ReleaseCandidate {
67 fmt.Fprintln(tw, "Release candidate:\t"+v.RCIdentifierStr()+"\t")
68 }
69
70 fmt.Fprintln(tw, "Commit:\t"+v.Commit+"\t")
71 fmt.Fprintln(tw, "Timestamp:\t"+v.Date().String()+"\t")
72 fmt.Fprintln(tw, "Go Version:\t"+runtime.Version()+"\t")
73 fmt.Fprintln(tw, "Go Compiler:\t"+runtime.Compiler+"\t")
74 fmt.Fprintln(tw, "Go Platform:\t"+runtime.GOOS+"/"+runtime.GOARCH+"\t")
75 }
76
View as plain text