github.com/konsorten/ktn-build-info@v1.0.11/ver/version_info_read.go (about)

     1  package ver
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  
     8  	log "github.com/sirupsen/logrus"
     9  	yaml "gopkg.in/yaml.v2"
    10  )
    11  
    12  const (
    13  	VersionInfoYamlFilename = "version-info.yml"
    14  )
    15  
    16  type versionInfoYAML struct {
    17  	Version string `yaml:"version"`
    18  
    19  	Product struct {
    20  		Name        string `yaml:"name"`
    21  		Description string `yaml:"desc"`
    22  		License     string `yaml:"license"`
    23  	} `yaml:"product"`
    24  
    25  	Author struct {
    26  		Name    string `yaml:"name"`
    27  		Email   string `yaml:"email"`
    28  		Website string `yaml:"url"`
    29  	} `yaml:"author"`
    30  }
    31  
    32  func TryReadFromVersionInfoYAML(maxDepth int) (*VersionInformation, error) {
    33  	// gather version information
    34  	path := VersionInfoYamlFilename
    35  	var found []*VersionInformation
    36  
    37  	for i := 0; i <= maxDepth; i++ {
    38  		vii, err := tryReadVersionInfoYAMLInternal(path)
    39  
    40  		if err != nil {
    41  			return nil, err
    42  		}
    43  
    44  		if vii == nil {
    45  			break
    46  		}
    47  
    48  		log.Debugf("Found version information: %v", path)
    49  
    50  		found = append([]*VersionInformation{vii}, found...)
    51  		path = fmt.Sprintf("../%v", path)
    52  	}
    53  
    54  	// nothing found?
    55  	if len(found) <= 0 {
    56  		return nil, nil
    57  	}
    58  
    59  	// merge the results
    60  	vi := MakeVersionInformation()
    61  
    62  	for _, vii := range found {
    63  		vi.CopyMissingFrom(vii)
    64  	}
    65  
    66  	return vi, nil
    67  }
    68  
    69  func tryReadVersionInfoYAMLInternal(filename string) (*VersionInformation, error) {
    70  	// check if the file exists
    71  	if _, err := os.Stat(filename); err != nil {
    72  		log.Debugf("No %v found", filename)
    73  		return nil, nil
    74  	}
    75  
    76  	// read the file
    77  	data, err := ioutil.ReadFile(filename)
    78  
    79  	if err != nil {
    80  		log.Errorf("Failed to read %v file: %v", filename, err)
    81  		return nil, err
    82  	}
    83  
    84  	// parse the file
    85  	viy := versionInfoYAML{}
    86  
    87  	err = yaml.Unmarshal(data, &viy)
    88  
    89  	if err != nil {
    90  		log.Errorf("Failed to parse %v file: %v", filename, err)
    91  		return nil, err
    92  	}
    93  
    94  	// copy data
    95  	vi := MakeVersionInformation()
    96  
    97  	if viy.Version != "" {
    98  		vi.SetSemVersion(viy.Version)
    99  	}
   100  
   101  	vi.Author = viy.Author.Name
   102  	vi.Email = viy.Author.Email
   103  	vi.Website = viy.Author.Website
   104  	vi.Name = viy.Product.Name
   105  	vi.Description = viy.Product.Description
   106  	vi.License = viy.Product.License
   107  
   108  	return vi, nil
   109  }