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 }