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  }