github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/versioning/properties.go (about) 1 package versioning 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 8 "github.com/magiconair/properties" 9 "github.com/pkg/errors" 10 ) 11 12 // PropertiesFile defines an artifact using a properties file for versioning 13 type PropertiesFile struct { 14 path string 15 content *properties.Properties 16 versioningScheme string 17 versionField string 18 writeFile func(string, []byte, os.FileMode) error 19 } 20 21 func (p *PropertiesFile) init() error { 22 if len(p.versionField) == 0 { 23 p.versionField = "version" 24 } 25 if p.writeFile == nil { 26 p.writeFile = os.WriteFile 27 } 28 if p.content == nil { 29 var err error 30 p.content, err = properties.LoadFile(p.path, properties.UTF8) 31 if err != nil { 32 return errors.Wrapf(err, "failed to load file %v", p.path) 33 } 34 } 35 return nil 36 } 37 38 // VersioningScheme returns the relevant versioning scheme 39 func (p *PropertiesFile) VersioningScheme() string { 40 if len(p.versioningScheme) == 0 { 41 return "semver2" 42 } 43 return p.versioningScheme 44 } 45 46 // GetVersion returns the current version of the artifact with a ini-file-based build descriptor 47 func (p *PropertiesFile) GetVersion() (string, error) { 48 err := p.init() 49 if err != nil { 50 return "", err 51 } 52 version := p.content.GetString(p.versionField, "") 53 if len(version) == 0 { 54 return "", fmt.Errorf("no version found in field %v", p.versionField) 55 } 56 return version, nil 57 } 58 59 // SetVersion updates the version of the artifact with a ini-file-based build descriptor 60 func (p *PropertiesFile) SetVersion(version string) error { 61 err := p.init() 62 if err != nil { 63 return err 64 } 65 err = p.content.SetValue(p.versionField, version) 66 if err != nil { 67 return errors.Wrapf(err, "failed to set version") 68 } 69 70 var propsContent bytes.Buffer 71 _, err = p.content.Write(&propsContent, properties.UTF8) 72 if err != nil { 73 return errors.Wrap(err, "failed to write version") 74 } 75 err = p.writeFile(p.path, propsContent.Bytes(), 0666) 76 if err != nil { 77 return errors.Wrap(err, "failed to write file") 78 } 79 return nil 80 } 81 82 // GetCoordinates returns the coordinates 83 func (p *PropertiesFile) GetCoordinates() (Coordinates, error) { 84 result := Coordinates{} 85 return result, nil 86 }