/
version.go
116 lines (100 loc) · 2.52 KB
/
version.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package porter
import (
"bytes"
"context"
"fmt"
"runtime"
"text/template"
"get.porter.sh/porter/pkg"
"get.porter.sh/porter/pkg/mixin"
"get.porter.sh/porter/pkg/pkgmgmt"
"get.porter.sh/porter/pkg/porter/version"
"get.porter.sh/porter/pkg/printer"
"get.porter.sh/porter/pkg/tracing"
)
type VersionOpts struct {
version.Options
System bool
}
type SystemInfo struct {
OS string
Arch string
}
type Mixins []mixin.Metadata
type SystemDebugInfo struct {
Version pkgmgmt.PackageMetadata `json:"version"`
SysInfo SystemInfo `json:"system"`
Mixins Mixins `json:"mixins"`
}
func (mixins Mixins) PrintMixinsTable() string {
buffer := &bytes.Buffer{}
printMixinRow :=
func(v interface{}) []string {
m, ok := v.(mixin.Metadata)
if !ok {
return nil
}
return []string{m.Name, m.VersionInfo.Version, m.VersionInfo.Author}
}
err := printer.PrintTable(buffer, mixins, printMixinRow, "Name", "Version", "Author")
if err != nil {
return ""
}
return buffer.String()
}
func (p *Porter) PrintVersion(ctx context.Context, opts VersionOpts) error {
metadata := pkgmgmt.Metadata{
Name: "porter",
VersionInfo: pkgmgmt.VersionInfo{
Version: pkg.Version,
Commit: pkg.Commit,
},
}
if opts.System {
return p.PrintDebugInfo(ctx, opts, metadata)
}
return version.PrintVersion(p.Context, opts.Options, metadata)
}
func getSystemInfo() *SystemInfo {
return &SystemInfo{
OS: runtime.GOOS,
Arch: runtime.GOARCH,
}
}
func (p *Porter) PrintDebugInfo(ctx context.Context, opts VersionOpts, metadata pkgmgmt.Metadata) error {
log := tracing.LoggerFromContext(ctx)
opts.RawFormat = string(printer.FormatPlaintext)
sysInfo := getSystemInfo()
mixins, err := p.ListMixins(ctx)
if err != nil {
log.Debug(err.Error())
return nil
}
sysDebugInfo := SystemDebugInfo{
Version: metadata,
SysInfo: *sysInfo,
Mixins: mixins,
}
switch opts.Format {
case printer.FormatJson:
return printer.PrintJson(p.Out, sysDebugInfo)
case printer.FormatPlaintext:
plaintextTmpl := `{{.Version.Name}} {{.Version.VersionInfo.Version}} ({{.Version.VersionInfo.Commit}})
System
-------
os: {{.SysInfo.OS}}
arch: {{.SysInfo.Arch}}
{{if .Mixins}}
Mixins
{{.Mixins.PrintMixinsTable}}{{end}}
`
tmpl, err := template.New("systemDebugInfo").Parse(plaintextTmpl)
if err != nil {
return log.Error(fmt.Errorf("Failed to parse plaintext template: %w", err))
}
err = tmpl.Execute(p.Out, sysDebugInfo)
return log.Error(err)
default:
return log.Error(fmt.Errorf("unsupported format: %s", opts.Format))
}
}