github.com/secoba/wails/v2@v2.6.4/internal/gomod/gomod.go (about) 1 package gomod 2 3 import ( 4 "fmt" 5 6 "github.com/Masterminds/semver" 7 "golang.org/x/mod/modfile" 8 ) 9 10 func GetWailsVersionFromModFile(goModText []byte) (*semver.Version, error) { 11 file, err := modfile.Parse("", goModText, nil) 12 if err != nil { 13 return nil, err 14 } 15 16 for _, req := range file.Require { 17 if req.Syntax == nil { 18 continue 19 } 20 tokenPosition := 0 21 if !req.Syntax.InBlock { 22 tokenPosition = 1 23 } 24 if req.Syntax.Token[tokenPosition] == "github.com/secoba/wails/v2" { 25 version := req.Syntax.Token[tokenPosition+1] 26 return semver.NewVersion(version) 27 } 28 } 29 30 return nil, nil 31 } 32 33 func GoModOutOfSync(goModData []byte, currentVersion string) (bool, error) { 34 gomodversion, err := GetWailsVersionFromModFile(goModData) 35 if err != nil { 36 return false, err 37 } 38 if gomodversion == nil { 39 return false, fmt.Errorf("Unable to find Wails in go.mod") 40 } 41 42 result, err := semver.NewVersion(currentVersion) 43 if err != nil || result == nil { 44 return false, fmt.Errorf("Unable to parse Wails version: %s", currentVersion) 45 } 46 47 return !gomodversion.Equal(result), nil 48 } 49 50 func UpdateGoModVersion(goModText []byte, currentVersion string) ([]byte, error) { 51 file, err := modfile.Parse("", goModText, nil) 52 if err != nil { 53 return nil, err 54 } 55 56 err = file.AddRequire("github.com/secoba/wails/v2", currentVersion) 57 if err != nil { 58 return nil, err 59 } 60 61 // Replace 62 if len(file.Replace) == 0 { 63 return file.Format() 64 } 65 66 for _, req := range file.Replace { 67 if req.Syntax == nil { 68 continue 69 } 70 tokenPosition := 0 71 if !req.Syntax.InBlock { 72 tokenPosition = 1 73 } 74 if req.Syntax.Token[tokenPosition] == "github.com/secoba/wails/v2" { 75 version := req.Syntax.Token[tokenPosition+1] 76 _, err := semver.NewVersion(version) 77 if err == nil { 78 req.Syntax.Token[tokenPosition+1] = currentVersion 79 } 80 } 81 } 82 83 return file.Format() 84 } 85 86 func SyncGoVersion(goModText []byte, goVersion string) ([]byte, bool, error) { 87 file, err := modfile.Parse("", goModText, nil) 88 if err != nil { 89 return nil, false, err 90 } 91 92 modVersion, err := semver.NewVersion(file.Go.Version) 93 if err != nil { 94 return nil, false, fmt.Errorf("Unable to parse Go version from go mod file: %s", err) 95 } 96 97 targetVersion, err := semver.NewVersion(goVersion) 98 if err != nil { 99 return nil, false, fmt.Errorf("Unable to parse Go version: %s", targetVersion) 100 } 101 102 if !targetVersion.GreaterThan(modVersion) { 103 return goModText, false, nil 104 } 105 106 file.Go.Version = goVersion 107 file.Go.Syntax.Token[1] = goVersion 108 goModText, err = file.Format() 109 if err != nil { 110 return nil, false, err 111 } 112 113 return goModText, true, nil 114 }