5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 05:30:52 +08:00
wails/v2/internal/gomod/gomod.go
2023-11-12 12:30:49 +11:00

115 lines
2.5 KiB
Go

package gomod
import (
"fmt"
"github.com/Masterminds/semver"
"golang.org/x/mod/modfile"
)
func GetWailsVersionFromModFile(goModText []byte) (*semver.Version, error) {
file, err := modfile.Parse("", goModText, nil)
if err != nil {
return nil, err
}
for _, req := range file.Require {
if req.Syntax == nil {
continue
}
tokenPosition := 0
if !req.Syntax.InBlock {
tokenPosition = 1
}
if req.Syntax.Token[tokenPosition] == "github.com/wailsapp/wails/v2" {
version := req.Syntax.Token[tokenPosition+1]
return semver.NewVersion(version)
}
}
return nil, nil
}
func GoModOutOfSync(goModData []byte, currentVersion string) (bool, error) {
gomodversion, err := GetWailsVersionFromModFile(goModData)
if err != nil {
return false, err
}
if gomodversion == nil {
return false, fmt.Errorf("Unable to find Wails in go.mod")
}
result, err := semver.NewVersion(currentVersion)
if err != nil || result == nil {
return false, fmt.Errorf("Unable to parse Wails version: %s", currentVersion)
}
return !gomodversion.Equal(result), nil
}
func UpdateGoModVersion(goModText []byte, currentVersion string) ([]byte, error) {
file, err := modfile.Parse("", goModText, nil)
if err != nil {
return nil, err
}
err = file.AddRequire("github.com/wailsapp/wails/v2", currentVersion)
if err != nil {
return nil, err
}
// Replace
if len(file.Replace) == 0 {
return file.Format()
}
for _, req := range file.Replace {
if req.Syntax == nil {
continue
}
tokenPosition := 0
if !req.Syntax.InBlock {
tokenPosition = 1
}
if req.Syntax.Token[tokenPosition] == "github.com/wailsapp/wails/v2" {
version := req.Syntax.Token[tokenPosition+1]
_, err := semver.NewVersion(version)
if err == nil {
req.Syntax.Token[tokenPosition+1] = currentVersion
}
}
}
return file.Format()
}
func SyncGoVersion(goModText []byte, goVersion string) ([]byte, bool, error) {
file, err := modfile.Parse("", goModText, nil)
if err != nil {
return nil, false, err
}
modVersion, err := semver.NewVersion(file.Go.Version)
if err != nil {
return nil, false, fmt.Errorf("Unable to parse Go version from go mod file: %s", err)
}
targetVersion, err := semver.NewVersion(goVersion)
if err != nil {
return nil, false, fmt.Errorf("Unable to parse Go version: %s", targetVersion)
}
if !targetVersion.GreaterThan(modVersion) {
return goModText, false, nil
}
file.Go.Version = goVersion
file.Go.Syntax.Token[1] = goVersion
goModText, err = file.Format()
if err != nil {
return nil, false, err
}
return goModText, true, nil
}