github.com/SAP/jenkins-library@v1.362.0/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  }