-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmodfmt.go
70 lines (55 loc) · 1.3 KB
/
modfmt.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
package main
import (
"os"
"golang.org/x/mod/modfile"
)
func MergeRequires(goModFilename string) ([]byte, error) {
contents, err := os.ReadFile(goModFilename)
if err != nil {
return nil, err
}
mod, err := modfile.ParseLax(goModFilename, contents, nil)
if err != nil {
return nil, err
}
if err := mergeRequires(mod); err != nil {
return nil, err
}
updatedContents, err := mod.Format()
if err != nil {
return nil, err
}
return updatedContents, nil
}
func mergeRequires(mod *modfile.File) (err error) {
defer func() {
if r := recover(); r != nil {
possibleErr, ok := r.(error)
if ok {
err = possibleErr
}
}
}()
allRequires := make([]modfile.Require, len(mod.Require))
for i, reqs := range mod.Require {
// Save all the requires to a new slice
allRequires[i] = *reqs
// while removing them from the original slice
mod.DropRequire(reqs.Mod.Path)
}
// Cleanup the modfile
// This removes the empty require blocks
mod.Cleanup()
// Add the requires back to the modfile
for _, reqs := range allRequires {
mod.AddNewRequire(reqs.Mod.Path, reqs.Mod.Version, reqs.Indirect)
}
mod.Cleanup()
// Sort the require blocks
mod.SortBlocks()
mod.Cleanup()
// Set the require blocks to separate indirects
mod.SetRequireSeparateIndirect(mod.Require)
mod.Cleanup()
return
}