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