Skip to content

Instantly share code, notes, and snippets.

@hidez8891
Created September 20, 2016 14:39
Show Gist options
  • Save hidez8891/b26c2bfe831f9694af829dd133d424db to your computer and use it in GitHub Desktop.
Save hidez8891/b26c2bfe831f9694af829dd133d424db to your computer and use it in GitHub Desktop.
auto version string updater for Golang
package main
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
"io/ioutil"
"os"
"strconv"
"strings"
)
func main() {
verfile := "version.go"
if len(os.Args) > 1 {
verfile = os.Args[1]
}
ver, pos, err := searchVersion(verfile)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
if ver[0] != '"' || ver[len(ver)-1] != '"' {
fmt.Fprintln(os.Stderr, "Version need string type")
os.Exit(1)
}
ver = ver[1 : len(ver)-1] // "1.0" -> 1.0
nums := strings.Split(ver, ".")
lastnum, err := strconv.Atoi(nums[len(nums)-1])
if err != nil {
fmt.Fprintln(os.Stderr, "can't analyze version number")
os.Exit(1)
}
lastnum++
nums[len(nums)-1] = strconv.Itoa(lastnum)
verup := strings.Join(nums, ".")
text, err := ioutil.ReadFile(verfile)
if err != nil {
fmt.Fprintf(os.Stderr, "read failed %s: %v\n", verfile, err)
os.Exit(1)
}
if len(ver) < len(verup) {
text = append(text, byte(0))
copy(text[pos.Offset+1:], text[pos.Offset:len(text)-1])
}
verup = `"` + verup + `"`
copy(text[pos.Offset:pos.Offset+len(verup)], []byte(verup))
if err := ioutil.WriteFile(verfile, text, os.ModePerm); err != nil {
fmt.Fprintf(os.Stderr, "write failed %s: %v\n", verfile, err)
os.Exit(1)
}
}
func searchVersion(file string) (string, token.Position, error) {
empos := token.Position{}
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, file, nil, 0)
if err != nil {
return "", empos, fmt.Errorf("read failed %s", file)
}
for _, decl := range f.Decls {
if td, ok := decl.(*ast.GenDecl); ok {
for _, sp := range td.Specs {
if valsp, ok := sp.(*ast.ValueSpec); ok {
for i, n := range valsp.Names {
if n.Name == "Version" {
lit := valsp.Values[i].(*ast.BasicLit)
pos := fset.Position(lit.Pos())
return lit.Value, pos, nil
}
}
}
}
}
}
return "", empos, fmt.Errorf("not found Version in %s", file)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment