github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/constants/version/version.go (about)

     1  package version
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  
     9  	"github.com/ActiveState/cli/internal/environment"
    10  	"github.com/blang/semver"
    11  )
    12  
    13  func Detect(relPath string) (semver.Version, error) {
    14  	root, err := environment.GetRootPath()
    15  	if err != nil {
    16  		return semver.Version{}, err
    17  	}
    18  	versionFile := filepath.Join(root, relPath, "version.txt")
    19  	_, err = os.Stat(versionFile)
    20  	if err != nil {
    21  		return semver.Version{}, fmt.Errorf("Could not access version.txt file at %s: %w", versionFile, err)
    22  	}
    23  	data, err := os.ReadFile(versionFile)
    24  	if err != nil {
    25  		return semver.Version{}, fmt.Errorf("Could not read from file %s: %w", versionFile, err)
    26  	}
    27  	v, err := semver.Parse(strings.TrimSpace(strings.Split(string(data), "-")[0]))
    28  	if err != nil {
    29  		return semver.Version{}, fmt.Errorf("Failed to parse version from file %s: %w", versionFile, err)
    30  	}
    31  	return v, nil
    32  }
    33  
    34  func VersionWithRevision(v semver.Version, revision string) (semver.Version, error) {
    35  	prVersion, err := semver.NewPRVersion("SHA" + revision)
    36  	if err != nil {
    37  		return semver.Version{}, fmt.Errorf("failed to create pre-release version number: %v", err)
    38  	}
    39  	v.Pre = []semver.PRVersion{prVersion}
    40  
    41  	return v, nil
    42  }
    43  
    44  // NumberIsProduction returns whether or not the provided version number
    45  // indicates a production build.
    46  func NumberIsProduction(number string) bool {
    47  	version, err := semver.Parse(number)
    48  	if err != nil {
    49  		return false
    50  	}
    51  
    52  	return version.Major > 0 || version.Minor > 0 || version.Patch > 0
    53  }