-
Notifications
You must be signed in to change notification settings - Fork 4
/
version_file.go
117 lines (101 loc) · 2.47 KB
/
version_file.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package release
import (
"bytes"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"strings"
"github.com/gobuffalo/genny"
"github.com/gobuffalo/genny/movinglater/gotools"
"github.com/gobuffalo/genny/movinglater/plushgen"
"github.com/gobuffalo/plush"
"github.com/pkg/errors"
)
var versionRx = regexp.MustCompile("[const|var] [vV]ersion = ([`\"].*[`\"])")
func WriteVersionFile(opts *Options) genny.RunFn {
return func(r *genny.Runner) error {
if len(opts.VersionFile) == 0 {
opts.VersionFile = "version.go"
}
if len(opts.Version) == 0 {
return errors.New("version can not be blank")
}
f, err := r.FindFile(opts.VersionFile)
if err != nil {
f, err = defaultVersionFile(opts.VersionFile)
if err != nil {
return errors.WithStack(err)
}
}
var matches []string
bb := &bytes.Buffer{}
for _, line := range strings.Split(f.String(), "\n") {
line = strings.TrimSpace(line)
if strings.HasPrefix(line, "//") {
bb.WriteString(line + "\n")
continue
}
matches = versionRx.FindStringSubmatch(line)
if len(matches) > 1 {
v := matches[1]
bb.WriteString(strings.Replace(line, v, `"`+opts.Version+`"`, 1) + "\n")
continue
}
bb.WriteString(line + "\n")
}
body := strings.TrimSpace(bb.String())
f = genny.NewFile(f.Name(), strings.NewReader(body+"\n"))
return r.File(f)
}
}
func defaultVersionFile(name string) (genny.File, error) {
dir := filepath.Dir(name)
files, err := ioutil.ReadDir(dir)
_, ok := err.(*os.PathError)
if err != nil && !ok {
return nil, errors.WithStack(err)
}
var pkg string
if len(files) == 0 {
pkg = filepath.Base(dir)
} else {
for _, fi := range files {
ext := filepath.Ext(fi.Name())
if ext != ".go" {
continue
}
if strings.HasSuffix(fi.Name(), "_test.go") {
continue
}
b, err := ioutil.ReadFile(fi.Name())
if err != nil {
return nil, errors.WithStack(err)
}
xf := genny.NewFile(fi.Name(), bytes.NewReader(b))
pkg, err = gotools.PackageName(xf)
if err != nil {
return nil, errors.WithStack(err)
}
break
}
}
f := genny.NewFile(name+".plush", strings.NewReader(versionTmpl))
if len(pkg) == 0 {
pwd, err := os.Getwd()
if err != nil {
return f, errors.WithStack(err)
}
pkg = filepath.Base(pwd)
}
ctx := plush.NewContext()
ctx.Set("pkg", pkg)
t := plushgen.Transformer(ctx)
f, err = t.Transform(f)
if err != nil {
return f, errors.WithStack(err)
}
return f, nil
}
const versionTmpl = `package <%= pkg %>
const Version = ""`