diff --git a/README.md b/README.md index b3c51c3..13efc20 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ GoVersionInfo ========== -[![Build Status](https://travis-ci.org/josephspurrier/goversioninfo.svg)](https://travis-ci.org/josephspurrier/goversioninfo) [![Coverage Status](https://coveralls.io/repos/josephspurrier/goversioninfo/badge.svg)](https://coveralls.io/r/josephspurrier/goversioninfo) [![GoDoc](https://godoc.org/github.com/josephspurrier/goversioninfo?status.svg)](https://godoc.org/github.com/josephspurrier/goversioninfo) + +[![Go Report Card](https://goreportcard.com/badge/github.com/josephspurrier/goversioninfo)](https://goreportcard.com/report/github.com/josephspurrier/goversioninfo) [![Build Status](https://travis-ci.org/josephspurrier/goversioninfo.svg)](https://travis-ci.org/josephspurrier/goversioninfo) [![Coverage Status](https://coveralls.io/repos/josephspurrier/goversioninfo/badge.svg)](https://coveralls.io/r/josephspurrier/goversioninfo) [![GoDoc](https://godoc.org/github.com/josephspurrier/goversioninfo?status.svg)](https://godoc.org/github.com/josephspurrier/goversioninfo) Microsoft Windows File Properties/Version Info and Icon Resource Generator for the Go Language @@ -40,12 +41,14 @@ Complete list of the flags for goversioninfo: -company="": StringFileInfo.CompanyName -copyright="": StringFileInfo.LegalCopyright -description="": StringFileInfo.FileDescription - -example=false: just dump out an example versioninfo.json to stdout + -example=false: dump out an example versioninfo.json to stdout -file-version="": StringFileInfo.FileVersion -icon="": icon file name -internal-name="": StringFileInfo.InternalName -manifest="": manifest file name -o="resource.syso": output file name + -gofile="": Go output file name (optional) - generates a Go file to access version information internally + -gofilepackage="main": Go output package name (optional, requires parameter: 'gofile') -platform-specific=false: output i386 and amd64 named resource.syso, ignores -o -original-name="": StringFileInfo.OriginalFilename -private-build="": StringFileInfo.PrivateBuild diff --git a/cmd/goversioninfo/main.go b/cmd/goversioninfo/main.go index 53357b7..af6e4fd 100644 --- a/cmd/goversioninfo/main.go +++ b/cmd/goversioninfo/main.go @@ -14,10 +14,10 @@ import ( ) func main() { - flagExample := flag.Bool("example", false, "just dump out an example versioninfo.json to stdout") + flagExample := flag.Bool("example", false, "dump out an example versioninfo.json to stdout") flagOut := flag.String("o", "resource.syso", "output file name") - flagGo := flag.String("go", "versioninfo.go", "go output file name") - flagPackage := flag.String("package", "main", "go output package") + flagGo := flag.String("gofile", "", "Go output file name (optional)") + flagPackage := flag.String("gofilepackage", "main", "Go output package name (optional, requires parameter: 'gofile')") flagPlatformSpecific := flag.Bool("platform-specific", false, "output i386 and amd64 named resource.syso, ignores -o") flagIcon := flag.String("icon", "", "icon file name") flagManifest := flag.String("manifest", "", "manifest file name") @@ -175,6 +175,7 @@ func main() { // Write the data to a buffer. vi.Walk() + // If the flag is set, then generate the optional Go file. if *flagGo != "" { vi.WriteGo(*flagGo, *flagPackage) } diff --git a/goversioninfo.go b/goversioninfo.go index 1826208..42701c0 100644 --- a/goversioninfo.go +++ b/goversioninfo.go @@ -161,7 +161,7 @@ func (t Translation) getTranslation() string { // IO Methods // ***************************************************************************** -// Walk writes the data buffer with hexidecimal data from the structs +// Walk writes the data buffer with hexadecimal data from the structs func (vi *VersionInfo) Walk() { // Create a buffer var b bytes.Buffer @@ -193,7 +193,7 @@ func (vi *VersionInfo) WriteSyso(filename string, arch string) error { // Create a new RSRC section rsrc := coff.NewRSRC() - // Set the architechture + // Set the architecture err := rsrc.Arch(arch) if err != nil { return err @@ -233,6 +233,8 @@ func (vi *VersionInfo) WriteHex(filename string) error { return ioutil.WriteFile(filename, vi.Buffer.Bytes(), 0655) } +// WriteGo creates a Go file that contains the version info so you can access +// it in the application func (vi *VersionInfo) WriteGo(filename, packageName string) error { if len(packageName) == 0 { packageName = "main" @@ -243,19 +245,19 @@ func (vi *VersionInfo) WriteGo(filename, packageName string) error { return err } - ffib, err2 := json.MarshalIndent(vi.FixedFileInfo, "\t", "\t") - if err2 != nil { - return err2 + ffib, err := json.MarshalIndent(vi.FixedFileInfo, "\t", "\t") + if err != nil { + return err } - sfib, err3 := json.MarshalIndent(vi.StringFileInfo, "\t", "\t") - if err3 != nil { - return err3 + sfib, err := json.MarshalIndent(vi.StringFileInfo, "\t", "\t") + if err != nil { + return err } - vfib, err4 := json.MarshalIndent(vi.VarFileInfo, "\t", "\t") - if err4 != nil { - return err4 + vfib, err := json.MarshalIndent(vi.VarFileInfo, "\t", "\t") + if err != nil { + return err } replace := "`\" + \"`\" + \"`" @@ -263,18 +265,21 @@ func (vi *VersionInfo) WriteGo(filename, packageName string) error { str += `"FixedFileInfo":` str += strings.Replace(string(ffib), "`", replace, -1) str += ",\n\t" - str += `"StringFileInfo":` + str += `"StringFileInfo":` str += strings.Replace(string(sfib), "`", replace, -1) str += ",\n\t" str += `"VarFileInfo":` str += strings.Replace(string(vfib), "`", replace, -1) str += "\n" str += "}`" - fmt.Fprintf(out, `//auto-generated file. Do not edit. + fmt.Fprintf(out, `// Auto-generated file by goversioninfo. Do not edit. package %v -import "encoding/json" -import "github.com/josephspurrier/goversioninfo" +import ( + "encoding/json" + + "github.com/josephspurrier/goversioninfo" +) func unmarshalGoVersionInfo(b []byte) goversioninfo.VersionInfo { vi := goversioninfo.VersionInfo{} diff --git a/goversioninfo_test.go b/goversioninfo_test.go index fcc208e..73801bd 100644 --- a/goversioninfo_test.go +++ b/goversioninfo_test.go @@ -59,22 +59,27 @@ func testFile(t *testing.T, filename string) { t.Error("Data does not match " + filename + ".hex") } + // Test the Go file generation. tmpdir, err := ioutil.TempDir("", "generate_go") if err != nil { t.Error("Could not create temp dir", err) } defer os.RemoveAll(tmpdir) - path4 := filepath.Join(tmpdir, filename + ".go") - vi.WriteGo(path4, "") - gen, err4 := ioutil.ReadFile(path4) - if err4 != nil { - t.Error("Could not load " + path4, err4) + path4 := filepath.Join(tmpdir, filename+".go") + err = vi.WriteGo(path4, "") + if err != nil { + t.Error("Could not write "+path4, err) } - path5, _ := filepath.Abs("./testdata/go/" + filename + ".go") - expected5, err5 := ioutil.ReadFile(path5) - if err5 != nil { - t.Error("Could not load " + path5, err5) + gen, err := ioutil.ReadFile(path4) + if err != nil { + t.Error("Could not load "+path4, err) + } + + path5, _ := filepath.Abs("./testdata/gofile/" + filename + ".go") + expected5, err := ioutil.ReadFile(path5) + if err != nil { + t.Error("Could not load "+path5, err) } if !bytes.Equal(gen, expected5) { diff --git a/testdata/bash/build.sh b/testdata/bash/build.sh index 5b81e49..6751525 100755 --- a/testdata/bash/build.sh +++ b/testdata/bash/build.sh @@ -17,4 +17,13 @@ GOOS=windows GOARCH=amd64 go generate GOOS=windows GOARCH=amd64 go build rm example64.exe rm resource.syso +cd ../../ + +# Test Windows 64 with Go output file. +cd testdata/example64-gofile +GOOS=windows GOARCH=amd64 go generate +GOOS=windows GOARCH=amd64 go build +rm example64-gofile.exe +rm resource.syso +rm versioninfo.go cd ../../ \ No newline at end of file diff --git a/testdata/example64-gofile/main.go b/testdata/example64-gofile/main.go new file mode 100644 index 0000000..40d87a3 --- /dev/null +++ b/testdata/example64-gofile/main.go @@ -0,0 +1,9 @@ +//go:generate goversioninfo -icon=../resource/icon.ico -manifest=../resource/goversioninfo.exe.manifest -gofile=versioninfo.go + +package main + +import "fmt" + +func main() { + fmt.Printf("Hello world %v %v %v\n%v", versionInfo.StringFileInfo.ProductName, versionInfo.StringFileInfo.ProductVersion, versionInfo.FixedFileInfo.FileVersion, versionInfo.StringFileInfo.LegalCopyright) +} diff --git a/testdata/example64-gofile/versioninfo.json b/testdata/example64-gofile/versioninfo.json new file mode 100644 index 0000000..fe59b22 --- /dev/null +++ b/testdata/example64-gofile/versioninfo.json @@ -0,0 +1,43 @@ +{ + "FixedFileInfo": { + "FileVersion": { + "Major": 1, + "Minor": 0, + "Patch": 0, + "Build": 0 + }, + "ProductVersion": { + "Major": 1, + "Minor": 0, + "Patch": 0, + "Build": 0 + }, + "FileFlagsMask": "3f", + "FileFlags ": "00", + "FileOS": "040004", + "FileType": "01", + "FileSubType": "00" + }, + "StringFileInfo": { + "Comments": "Test file.", + "CompanyName": "josephspurrier", + "FileDescription": "This is a hello world file.", + "FileVersion": "v1.0.0.0", + "InternalName": "goversioninfo.exe", + "LegalCopyright": "Copyright (c) 2019 Joseph Spurrier", + "LegalTrademarks": "", + "OriginalFilename": "main.go", + "PrivateBuild": "", + "ProductName": "goversioninfo", + "ProductVersion": "v1.0.0.0", + "SpecialBuild": "" + }, + "VarFileInfo": { + "Translation": { + "LangID": "0409", + "CharsetID": "04B0" + } + }, + "IconPath": "", + "ManifestPath": "" +} \ No newline at end of file diff --git a/testdata/example64/main.go b/testdata/example64/main.go index 614fd0b..70112fb 100644 --- a/testdata/example64/main.go +++ b/testdata/example64/main.go @@ -1,9 +1,9 @@ -//go:generate goversioninfo -icon=../resource/icon.ico -manifest=../resource/goversioninfo.exe.manifest -go=versioninfo.go +//go:generate goversioninfo -icon=../resource/icon.ico -manifest=../resource/goversioninfo.exe.manifest package main import "fmt" func main() { - fmt.Printf("Hello world %v %v %v\n%v", versionInfo.StringFileInfo.ProductName, versionInfo.StringFileInfo.ProductVersion, versionInfo.FixedFileInfo.FileVersion, versionInfo.StringFileInfo.LegalCopyright) + fmt.Println("Hello world") } diff --git a/testdata/go/cmd.go b/testdata/gofile/cmd.go similarity index 89% rename from testdata/go/cmd.go rename to testdata/gofile/cmd.go index 9150db5..0559ad7 100644 --- a/testdata/go/cmd.go +++ b/testdata/gofile/cmd.go @@ -1,8 +1,11 @@ -//auto-generated file. Do not edit. +// Auto-generated file by goversioninfo. Do not edit. package main -import "encoding/json" -import "github.com/josephspurrier/goversioninfo" +import ( + "encoding/json" + + "github.com/josephspurrier/goversioninfo" +) func unmarshalGoVersionInfo(b []byte) goversioninfo.VersionInfo { vi := goversioninfo.VersionInfo{} diff --git a/testdata/go/control.go b/testdata/gofile/control.go similarity index 89% rename from testdata/go/control.go rename to testdata/gofile/control.go index b8fff3f..b7801de 100644 --- a/testdata/go/control.go +++ b/testdata/gofile/control.go @@ -1,8 +1,11 @@ -//auto-generated file. Do not edit. +// Auto-generated file by goversioninfo. Do not edit. package main -import "encoding/json" -import "github.com/josephspurrier/goversioninfo" +import ( + "encoding/json" + + "github.com/josephspurrier/goversioninfo" +) func unmarshalGoVersionInfo(b []byte) goversioninfo.VersionInfo { vi := goversioninfo.VersionInfo{} diff --git a/testdata/go/explorer.go b/testdata/gofile/explorer.go similarity index 89% rename from testdata/go/explorer.go rename to testdata/gofile/explorer.go index 0aef682..c6e2a81 100644 --- a/testdata/go/explorer.go +++ b/testdata/gofile/explorer.go @@ -1,8 +1,11 @@ -//auto-generated file. Do not edit. +// Auto-generated file by goversioninfo. Do not edit. package main -import "encoding/json" -import "github.com/josephspurrier/goversioninfo" +import ( + "encoding/json" + + "github.com/josephspurrier/goversioninfo" +) func unmarshalGoVersionInfo(b []byte) goversioninfo.VersionInfo { vi := goversioninfo.VersionInfo{} diff --git a/testdata/go/simple.go b/testdata/gofile/simple.go similarity index 87% rename from testdata/go/simple.go rename to testdata/gofile/simple.go index c89954c..bc05165 100644 --- a/testdata/go/simple.go +++ b/testdata/gofile/simple.go @@ -1,8 +1,11 @@ -//auto-generated file. Do not edit. +// Auto-generated file by goversioninfo. Do not edit. package main -import "encoding/json" -import "github.com/josephspurrier/goversioninfo" +import ( + "encoding/json" + + "github.com/josephspurrier/goversioninfo" +) func unmarshalGoVersionInfo(b []byte) goversioninfo.VersionInfo { vi := goversioninfo.VersionInfo{}