@@ -4,9 +4,15 @@ import (
44 "io/ioutil"
55 "os"
66 "path/filepath"
7+ "strings"
78
9+ mapset "github.com/deckarep/golang-set/v2"
10+ ver "github.com/hashicorp/go-version"
811 "github.com/pubgo/funk/assert"
912 "github.com/pubgo/funk/pathutil"
13+ "github.com/pubgo/funk/v2/result"
14+ "github.com/pubgo/protobuild/internal/shutil"
15+ "github.com/samber/lo"
1016 "golang.org/x/mod/modfile"
1117)
1218
@@ -28,6 +34,35 @@ func GoModPath() string {
2834 return getFileByRecursion ("go.mod" , pwd )
2935}
3036
37+ func LoadVersionGraph () map [string ]string {
38+ modList := strings .Split (result .Wrap (shutil .GoModGraph ()).Must (), "\n " )
39+ modSet := mapset .NewSet [string ]()
40+ for _ , m := range modList {
41+ for _ , v := range strings .Split (m , " " ) {
42+ modSet .Add (strings .TrimSpace (v ))
43+ }
44+ }
45+
46+ var modMap = make (map [string ][]* ver.Version )
47+ modSet .Each (func (s string ) bool {
48+ ver2 := strings .Split (s , "@" )
49+ if len (ver2 ) != 2 {
50+ return false
51+ }
52+
53+ if ! strings .HasPrefix (ver2 [1 ], "v" ) {
54+ return false
55+ }
56+
57+ modMap [ver2 [0 ]] = append (modMap [ver2 [0 ]], ver .Must (ver .NewSemver (ver2 [1 ])))
58+ return false
59+ })
60+
61+ return lo .MapValues (modMap , func (versions []* ver.Version , path string ) string {
62+ return "v" + maxVersion (versions ).String ()
63+ })
64+ }
65+
3166func LoadVersions () map [string ]string {
3267 path := GoModPath ()
3368 assert .Assert (path == "" , "go.mod not exists" )
@@ -51,3 +86,7 @@ func LoadVersions() map[string]string {
5186
5287 return versions
5388}
89+
90+ func maxVersion (versions []* ver.Version ) * ver.Version {
91+ return lo .MaxBy (versions , func (a * ver.Version , b * ver.Version ) bool { return a .GreaterThan (b ) })
92+ }
0 commit comments