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