forked from gopasspw/gopass
/
version.go
59 lines (48 loc) · 1014 Bytes
/
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
package cli
import (
"bufio"
"bytes"
"context"
"os/exec"
"strings"
"github.com/blang/semver"
)
type gpgBin struct {
path string
ver semver.Version
}
type byVersion []gpgBin
func (v byVersion) Len() int {
return len(v)
}
func (v byVersion) Swap(i, j int) {
v[i], v[j] = v[j], v[i]
}
func (v byVersion) Less(i, j int) bool {
return v[i].ver.LT(v[j].ver)
}
// Version will returns GPG version information
func (g *GPG) Version(ctx context.Context) semver.Version {
return version(ctx, g.Binary())
}
func version(ctx context.Context, binary string) semver.Version {
v := semver.Version{}
cmd := exec.CommandContext(ctx, binary, "--version")
out, err := cmd.Output()
if err != nil {
return v
}
scanner := bufio.NewScanner(bytes.NewReader(out))
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if strings.HasPrefix(line, "gpg ") {
p := strings.Fields(line)
sv, err := semver.Parse(p[len(p)-1])
if err != nil {
continue
}
return sv
}
}
return v
}