Skip to content

Commit 2e89a90

Browse files
james-fitzgeraldJames FitzGerald
andauthored
Allow GO build flags to be defined so that we can vet code that is under a build tag. (#10)
Co-authored-by: James FitzGerald <[email protected]>
1 parent 6a9c912 commit 2e89a90

File tree

4 files changed

+47
-8
lines changed

4 files changed

+47
-8
lines changed

main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func (s *SQLVet) Vet() {
4444
Schema: s.Schema,
4545
},
4646
s.ProjectRoot,
47+
s.Cfg.BuildFlags,
4748
s.Cfg.SqlFuncMatchers,
4849
)
4950
if err != nil {

pkg/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
type Config struct {
1515
DbEngine string `toml:"db_engine"`
1616
SchemaPath string `toml:"schema_path"`
17+
BuildFlags string `toml:"build_flags"`
1718
SqlFuncMatchers []vet.SqlFuncMatcher `toml:"sqlfunc_matchers"`
1819
}
1920

pkg/vet/gosource.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ func getMatchers(extraMatchers []SqlFuncMatcher) []*SqlFuncMatcher {
223223
return matchers
224224
}
225225

226-
func loadGoPackages(dir string) ([]*packages.Package, error) {
226+
func loadGoPackages(dir string, buildFlags string) ([]*packages.Package, error) {
227227
cfg := &packages.Config{
228228
Mode: packages.NeedName |
229229
packages.NeedFiles |
@@ -235,6 +235,9 @@ func loadGoPackages(dir string) ([]*packages.Package, error) {
235235
Dir: dir,
236236
Env: append(os.Environ(), "GO111MODULE=auto"),
237237
}
238+
if buildFlags != "" {
239+
cfg.BuildFlags = strings.Split(buildFlags, " ")
240+
}
238241
dirAbs, err := filepath.Abs(dir)
239242
if err != nil {
240243
return nil, fmt.Errorf("Invalid path: %w", err)
@@ -484,13 +487,13 @@ func getSortedIgnoreNodes(pkgs []*packages.Package) []ast.Node {
484487
return ignoreNodes
485488
}
486489

487-
func CheckDir(ctx VetContext, dir string, extraMatchers []SqlFuncMatcher) ([]*QuerySite, error) {
490+
func CheckDir(ctx VetContext, dir, buildFlags string, extraMatchers []SqlFuncMatcher) ([]*QuerySite, error) {
488491
_, err := os.Stat(filepath.Join(dir, "go.mod"))
489492
if os.IsNotExist(err) {
490493
return nil, errors.New("sqlvet only supports projects using go modules for now.")
491494
}
492495

493-
pkgs, err := loadGoPackages(dir)
496+
pkgs, err := loadGoPackages(dir, buildFlags)
494497
if err != nil {
495498
return nil, err
496499
}
@@ -539,6 +542,10 @@ func CheckDir(ctx VetContext, dir string, extraMatchers []SqlFuncMatcher) ([]*Qu
539542
BuildCallGraph: true,
540543
})
541544

545+
if err != nil {
546+
return nil, err
547+
}
548+
542549
queries := []*QuerySite{}
543550

544551
cg := anaRes.CallGraph

pkg/vet/gosource_test.go

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func main() {
6161
`), 0644)
6262
assert.NoError(t, err)
6363

64-
_, err = vet.CheckDir(vet.VetContext{}, dir, nil)
64+
_, err = vet.CheckDir(vet.VetContext{}, dir, "", nil)
6565
assert.Error(t, err)
6666
}
6767

@@ -105,7 +105,7 @@ func main() {
105105
err := ioutil.WriteFile(fpath, source, 0644)
106106
assert.NoError(t, err)
107107

108-
queries, err := vet.CheckDir(vet.VetContext{}, dir, nil)
108+
queries, err := vet.CheckDir(vet.VetContext{}, dir, "", nil)
109109
assert.NoError(t, err)
110110
assert.Equal(t, 0, len(queries))
111111
}
@@ -162,7 +162,7 @@ func main() {
162162
err := ioutil.WriteFile(fpath, source, 0644)
163163
assert.NoError(t, err)
164164

165-
queries, err := vet.CheckDir(vet.VetContext{}, dir, nil)
165+
queries, err := vet.CheckDir(vet.VetContext{}, dir, "", nil)
166166
if err != nil {
167167
t.Fatalf("Failed to load package: %s", err.Error())
168168
return
@@ -214,7 +214,7 @@ func main() {
214214
os.Chdir(parentDir)
215215
defer os.Chdir(cwd)
216216

217-
queries, err := vet.CheckDir(vet.VetContext{}, filepath.Base(dir), nil)
217+
queries, err := vet.CheckDir(vet.VetContext{}, filepath.Base(dir), "", nil)
218218
if err != nil {
219219
t.Fatalf("Failed to load package: %s", err.Error())
220220
return
@@ -258,7 +258,7 @@ func main() {
258258
err := ioutil.WriteFile(fpath, source, 0644)
259259
assert.NoError(t, err)
260260

261-
queries, err := vet.CheckDir(vet.VetContext{}, dir, nil)
261+
queries, err := vet.CheckDir(vet.VetContext{}, dir, "", nil)
262262
if err != nil {
263263
t.Fatalf("Failed to load package: %s", err.Error())
264264
return
@@ -284,3 +284,33 @@ func main() {
284284
assert.Equal(t, "SELECT 2 FROM foo WHERE id=$1 OR value=$1", queries[3].Query)
285285
assert.Equal(t, 1, queries[3].ParameterArgCount)
286286
}
287+
288+
func (s *GoSourceTests) SubTestBuildFlags(t *testing.T, fixtures struct {
289+
TmpDir string `fixture:"GoSourceTmpDir"`
290+
}) {
291+
dir := fixtures.TmpDir
292+
293+
source := []byte(`
294+
//+build myBuildTag
295+
296+
package main
297+
298+
import (
299+
"fmt"
300+
)
301+
302+
func main() {
303+
fmt.Printf("Hello World\n")
304+
}
305+
`)
306+
307+
fpath := filepath.Join(dir, "main.go")
308+
err := ioutil.WriteFile(fpath, source, 0644)
309+
assert.NoError(t, err)
310+
311+
_, err = vet.CheckDir(vet.VetContext{}, dir, "", nil)
312+
assert.Error(t, err)
313+
314+
_, err = vet.CheckDir(vet.VetContext{}, dir, "-tags myBuildTag", nil)
315+
assert.NoError(t, err)
316+
}

0 commit comments

Comments
 (0)