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 }