This repository was archived by the owner on Feb 9, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdate.go
More file actions
123 lines (99 loc) · 2.24 KB
/
update.go
File metadata and controls
123 lines (99 loc) · 2.24 KB
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
117
118
119
120
121
122
123
package main
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"os/exec"
"strings"
"github.com/spf13/viper"
"golang.org/x/mod/modfile"
"golang.org/x/mod/semver"
)
func runCmd(cmd string, args ...string) string {
buf := new(bytes.Buffer)
p := viper.GetString("path")
if p == "" {
p = "./"
}
c := exec.Command(cmd, args...)
c.Stdout = buf
c.Stderr = os.Stderr
c.Dir = p
if err := c.Run(); err != nil {
fmt.Printf("Something went wrong: %s\n", err)
os.Exit(2)
}
out := buf.Bytes()
out = bytes.TrimSpace(out)
return string(out)
}
func updateCommand(dryRun bool) {
if dryRun {
fmt.Printf("--dry-run option enabled, check only for updates\n\n")
}
goModPath := runCmd("go", "env", "GOMOD")
if goModPath == "" {
fmt.Println("Could not find modfile")
os.Exit(2)
}
info, err := os.Stat(goModPath)
if err != nil {
fmt.Printf("Could not check file: %s\n", err)
os.Exit(2)
}
data, err := ioutil.ReadFile(goModPath)
if err != nil {
fmt.Printf("Could not read modfile: %s\n", err)
os.Exit(2)
}
mod, err := modfile.Parse(goModPath, data, nil)
if err != nil {
fmt.Printf("Could not parse modfile: %s\n", err)
os.Exit(2)
}
changed := false
result := new(strings.Builder)
for _, r := range mod.Require {
if r.Indirect {
continue
}
now := r.Mod.Version
max := r.Mod.Version
out := runCmd("go", "list", "-m", "-mod=mod", "-versions", r.Mod.Path)
if items := strings.Fields(out); len(items) > 0 {
items = items[1:]
for i := range items {
if !semver.IsValid(items[i]) || semver.Canonical(items[i]) == "" || semver.Prerelease(items[i]) != "" {
continue
}
if semver.Compare(items[i], max) == 1 {
max = items[i]
}
}
}
fmt.Printf(".")
if max != now {
changed = true
mod.AddRequire(r.Mod.Path, max)
_, _ = fmt.Fprintf(result, "%s %s // %s => %s\n", r.Mod.Path, max, now, max)
}
}
fmt.Println()
if !changed {
fmt.Println("Everything is up to date")
return
}
_, _ = os.Stdout.WriteString(result.String())
if dryRun {
return
}
out, err := mod.Format()
if err != nil {
fmt.Printf("Could not format: %s\n", err)
os.Exit(2)
} else if err = ioutil.WriteFile(goModPath, out, info.Mode()); err != nil {
fmt.Printf("Could not write file: %s\n", err)
os.Exit(2)
}
}