/
update.go
88 lines (69 loc) · 1.56 KB
/
update.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
package module
import (
"context"
"io/ioutil"
"path/filepath"
"github.com/beatlabs/gomodctl/internal"
"golang.org/x/mod/modfile"
)
// Updater is exported
type Updater struct {
Ctx context.Context
}
const (
goMod = "go.mod"
goModBackup = "go.mod.backup"
)
// Update is exported
func (u *Updater) Update(path string) (map[string]internal.CheckResult, error) {
absolutePath, err := filepath.Abs(path)
if err != nil {
return nil, err
}
absoluteFile := filepath.Join(absolutePath, goMod)
backupFile := filepath.Join(absolutePath, goModBackup)
content, err := ioutil.ReadFile(absoluteFile)
if err != nil {
return nil, err
}
parse, err := modfile.Parse("go.mod", content, nil)
if err != nil {
return nil, err
}
filter := getLatestVersion
latestMinors, err := getModAndFilter(u.Ctx, absolutePath, filter)
if err != nil {
return nil, err
}
updates := 0
for moduleName, result := range latestMinors {
if result.Error == nil && result.LatestVersion.GreaterThan(result.LocalVersion) {
err := parse.DropRequire(moduleName)
if err != nil {
return nil, err
}
err = parse.AddRequire(moduleName, result.LatestVersion.Original())
if err != nil {
return nil, err
}
updates++
}
}
if updates > 0 {
parse.Cleanup()
parse.SortBlocks()
format, err := parse.Format()
if err != nil {
return nil, err
}
err = ioutil.WriteFile(absoluteFile, format, 0666)
if err != nil {
return nil, err
}
err = ioutil.WriteFile(backupFile, content, 0666)
if err != nil {
return nil, err
}
}
return latestMinors, nil
}