mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 06:51:26 +08:00
114 lines
2.5 KiB
Go
114 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
|
|
}
|