Skip to content

Commit 158ce0b

Browse files
committed
Merge pull request #335 from flimzy/bug306c
Another try at handling *.inc.js cleanly
2 parents 09f5ab3 + e5aa7c2 commit 158ce0b

File tree

2 files changed

+76
-44
lines changed

2 files changed

+76
-44
lines changed

build/build.go

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,21 @@ func NewBuildContext(installSuffix string, buildTags []string) *build.Context {
4343
}
4444
}
4545

46-
func Import(path string, mode build.ImportMode, installSuffix string, buildTags []string) (*build.Package, error) {
46+
// Import returns details about the Go package named by the import path. If the
47+
// path is a local import path naming a package that can be imported using
48+
// a standard import path, the returned package will set p.ImportPath to
49+
// that path.
50+
//
51+
// In the directory containing the package, .go and .inc.js files are
52+
// considered part of the package except for:
53+
//
54+
// - .go files in package documentation
55+
// - files starting with _ or . (likely editor temporary files)
56+
// - files with build constraints not satisfied by the context
57+
//
58+
// If an error occurs, Import returns a non-nil error and a nil
59+
// *PackageData.
60+
func Import(path string, mode build.ImportMode, installSuffix string, buildTags []string) (*PackageData, error) {
4761
buildContext := NewBuildContext(installSuffix, buildTags)
4862
if path == "runtime" || path == "syscall" {
4963
buildContext.GOARCH = build.Default.GOARCH
@@ -87,7 +101,28 @@ func Import(path string, mode build.ImportMode, installSuffix string, buildTags
87101
}
88102
}
89103

90-
return pkg, nil
104+
jsFiles, err := jsFilesFromDir(pkg.Dir)
105+
if err != nil {
106+
return nil,err
107+
}
108+
109+
return &PackageData{Package: pkg, JSFiles: jsFiles}, nil
110+
}
111+
112+
// ImportDir is like Import but processes the Go package found in the named
113+
// directory.
114+
func ImportDir(dir string, mode build.ImportMode) (*PackageData, error) {
115+
pkg,err := build.ImportDir(dir, mode)
116+
if err != nil {
117+
return nil,err
118+
}
119+
120+
jsFiles, err := jsFilesFromDir(pkg.Dir)
121+
if err != nil {
122+
return nil,err
123+
}
124+
125+
return &PackageData{Package: pkg, JSFiles: jsFiles}, nil
91126
}
92127

93128
// parse parses and returns all .go files of given pkg.
@@ -248,7 +283,7 @@ func (o *Options) PrintSuccess(format string, a ...interface{}) {
248283

249284
type PackageData struct {
250285
*build.Package
251-
JsFiles []string
286+
JSFiles []string
252287
IsTest bool // IsTest is true if the package is being built for running tests.
253288
SrcModTime time.Time
254289
UpToDate bool
@@ -275,7 +310,7 @@ func NewSession(options *Options) *Session {
275310
options: options,
276311
Packages: make(map[string]*PackageData),
277312
}
278-
s.ImportContext = compiler.NewImportContext(s.ImportPackage)
313+
s.ImportContext = compiler.NewImportContext(s.BuildImportPath)
279314
if options.Watch {
280315
if out, err := exec.Command("ulimit", "-n").Output(); err == nil {
281316
if n, err := strconv.Atoi(strings.TrimSpace(string(out))); err == nil && n < 1024 {
@@ -313,7 +348,7 @@ func (s *Session) BuildDir(packagePath string, importPath string, pkgObj string)
313348
if err != nil {
314349
return err
315350
}
316-
pkg.JsFiles = jsFiles
351+
pkg.JSFiles = jsFiles
317352
if err := s.BuildPackage(pkg); err != nil {
318353
return err
319354
}
@@ -337,7 +372,7 @@ func (s *Session) BuildFiles(filenames []string, pkgObj string, packagePath stri
337372

338373
for _, file := range filenames {
339374
if strings.HasSuffix(file, ".inc.js") {
340-
pkg.JsFiles = append(pkg.JsFiles, file)
375+
pkg.JSFiles = append(pkg.JSFiles, file)
341376
continue
342377
}
343378
pkg.GoFiles = append(pkg.GoFiles, file)
@@ -352,25 +387,18 @@ func (s *Session) BuildFiles(filenames []string, pkgObj string, packagePath stri
352387
return s.WriteCommandPackage(pkg, pkgObj)
353388
}
354389

355-
func (s *Session) ImportPackage(path string) (*compiler.Archive, error) {
390+
func (s *Session) BuildImportPath(path string) (*compiler.Archive, error) {
356391
if pkg, found := s.Packages[path]; found {
357392
return pkg.Archive, nil
358393
}
359394

360-
buildPkg, err := Import(path, 0, s.InstallSuffix(), s.options.BuildTags)
361-
if s.Watcher != nil && buildPkg != nil { // add watch even on error
362-
s.Watcher.Add(buildPkg.Dir)
395+
pkg, err := Import(path, 0, s.InstallSuffix(), s.options.BuildTags)
396+
if s.Watcher != nil && pkg != nil { // add watch even on error
397+
s.Watcher.Add(pkg.Dir)
363398
}
364399
if err != nil {
365400
return nil, err
366401
}
367-
pkg := &PackageData{Package: buildPkg}
368-
369-
jsFiles, err := jsFilesFromDir(pkg.Dir)
370-
if err != nil {
371-
return nil, err
372-
}
373-
pkg.JsFiles = jsFiles
374402

375403
if err := s.BuildPackage(pkg); err != nil {
376404
return nil, err
@@ -415,7 +443,7 @@ func (s *Session) BuildPackage(pkg *PackageData) error {
415443
if importedPkgPath == "unsafe" || ignored {
416444
continue
417445
}
418-
_, err := s.ImportPackage(importedPkgPath)
446+
_, err := s.BuildImportPath(importedPkgPath)
419447
if err != nil {
420448
return err
421449
}
@@ -425,7 +453,7 @@ func (s *Session) BuildPackage(pkg *PackageData) error {
425453
}
426454
}
427455

428-
for _, name := range append(pkg.GoFiles, pkg.JsFiles...) {
456+
for _, name := range append(pkg.GoFiles, pkg.JSFiles...) {
429457
fileInfo, err := os.Stat(filepath.Join(pkg.Dir, name))
430458
if err != nil {
431459
return err
@@ -470,7 +498,7 @@ func (s *Session) BuildPackage(pkg *PackageData) error {
470498
}
471499

472500
var jsDecls []*compiler.Decl
473-
for _, jsFile := range pkg.JsFiles {
501+
for _, jsFile := range pkg.JSFiles {
474502
code, err := ioutil.ReadFile(filepath.Join(pkg.Dir, jsFile))
475503
if err != nil {
476504
return err
@@ -582,7 +610,7 @@ func jsFilesFromDir(dir string) ([]string, error) {
582610
}
583611
var jsFiles []string
584612
for _, file := range files {
585-
if strings.HasSuffix(file.Name(), ".inc.js") && file.Name()[0] != '_' {
613+
if strings.HasSuffix(file.Name(), ".inc.js") && file.Name()[0] != '_' && file.Name()[0] != '.' {
586614
jsFiles = append(jsFiles, file.Name())
587615
}
588616
}

tool.go

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,10 @@ func main() {
110110
if s.Watcher != nil {
111111
s.Watcher.Add(pkgPath)
112112
}
113-
buildPkg, err := gbuild.Import(pkgPath, 0, s.InstallSuffix(), options.BuildTags)
113+
pkg, err := gbuild.Import(pkgPath, 0, s.InstallSuffix(), options.BuildTags)
114114
if err != nil {
115115
return err
116116
}
117-
pkg := &gbuild.PackageData{Package: buildPkg}
118117
if err := s.BuildPackage(pkg); err != nil {
119118
return err
120119
}
@@ -176,7 +175,7 @@ func main() {
176175
}
177176
for _, pkgPath := range pkgs {
178177
pkgPath = filepath.ToSlash(pkgPath)
179-
if _, err := s.ImportPackage(pkgPath); err != nil {
178+
if _, err := s.BuildImportPath(pkgPath); err != nil {
180179
return err
181180
}
182181
pkg := s.Packages[pkgPath]
@@ -254,7 +253,7 @@ func main() {
254253
cmdTest.Flags().AddFlag(flagColor)
255254
cmdTest.Run = func(cmd *cobra.Command, args []string) {
256255
os.Exit(handleError(func() error {
257-
pkgs := make([]*build.Package, len(args))
256+
pkgs := make([]*gbuild.PackageData, len(args))
258257
for i, pkgPath := range args {
259258
pkgPath = filepath.ToSlash(pkgPath)
260259
var err error
@@ -269,7 +268,7 @@ func main() {
269268
if err != nil {
270269
return err
271270
}
272-
var pkg *build.Package
271+
var pkg *gbuild.PackageData
273272
if strings.HasPrefix(currentDirectory, srcDir) {
274273
pkgPath, err := filepath.Rel(srcDir, currentDirectory)
275274
if err != nil {
@@ -280,12 +279,12 @@ func main() {
280279
}
281280
}
282281
if pkg == nil {
283-
if pkg, err = build.ImportDir(currentDirectory, 0); err != nil {
282+
if pkg, err = gbuild.ImportDir(currentDirectory, 0); err != nil {
284283
return err
285284
}
286285
pkg.ImportPath = "_" + currentDirectory
287286
}
288-
pkgs = []*build.Package{pkg}
287+
pkgs = []*gbuild.PackageData{pkg}
289288
}
290289

291290
var exitErr error
@@ -296,9 +295,8 @@ func main() {
296295
}
297296

298297
s := gbuild.NewSession(options)
299-
tests := &testFuncs{Package: pkg}
300-
collectTests := func(buildPkg *build.Package, testPkgName string, needVar *bool) error {
301-
testPkg := &gbuild.PackageData{Package: buildPkg, IsTest: true}
298+
tests := &testFuncs{Package: pkg.Package}
299+
collectTests := func(testPkg *gbuild.PackageData, testPkgName string, needVar *bool) error {
302300
if err := s.BuildPackage(testPkg); err != nil {
303301
return err
304302
}
@@ -316,20 +314,27 @@ func main() {
316314
return nil
317315
}
318316

319-
if err := collectTests(&build.Package{
320-
ImportPath: pkg.ImportPath,
321-
Dir: pkg.Dir,
322-
GoFiles: append(pkg.GoFiles, pkg.TestGoFiles...),
323-
Imports: append(pkg.Imports, pkg.TestImports...),
317+
if err := collectTests(&gbuild.PackageData{
318+
Package: &build.Package{
319+
ImportPath: pkg.ImportPath,
320+
Dir: pkg.Dir,
321+
GoFiles: append(pkg.GoFiles, pkg.TestGoFiles...),
322+
Imports: append(pkg.Imports, pkg.TestImports...),
323+
},
324+
IsTest: true,
325+
JSFiles: pkg.JSFiles,
324326
}, "_test", &tests.NeedTest); err != nil {
325327
return err
326328
}
327329

328-
if err := collectTests(&build.Package{
329-
ImportPath: pkg.ImportPath + "_test",
330-
Dir: pkg.Dir,
331-
GoFiles: pkg.XTestGoFiles,
332-
Imports: pkg.XTestImports,
330+
if err := collectTests(&gbuild.PackageData{
331+
Package: &build.Package{
332+
ImportPath: pkg.ImportPath + "_test",
333+
Dir: pkg.Dir,
334+
GoFiles: pkg.XTestGoFiles,
335+
Imports: pkg.XTestImports,
336+
},
337+
IsTest: true,
333338
}, "_xtest", &tests.NeedXtest); err != nil {
334339
return err
335340
}
@@ -496,8 +501,8 @@ func (fs serveCommandFileSystem) Open(name string) (http.File, error) {
496501
if isPkg || isMap || isIndex {
497502
// If we're going to be serving our special files, make sure there's a Go command in this folder.
498503
s := gbuild.NewSession(fs.options)
499-
buildPkg, err := gbuild.Import(path.Dir(name[1:]), 0, s.InstallSuffix(), fs.options.BuildTags)
500-
if err != nil || buildPkg.Name != "main" {
504+
pkg, err := gbuild.Import(path.Dir(name[1:]), 0, s.InstallSuffix(), fs.options.BuildTags)
505+
if err != nil || pkg.Name != "main" {
501506
isPkg = false
502507
isMap = false
503508
isIndex = false
@@ -508,7 +513,6 @@ func (fs serveCommandFileSystem) Open(name string) (http.File, error) {
508513
buf := bytes.NewBuffer(nil)
509514
browserErrors := bytes.NewBuffer(nil)
510515
exitCode := handleError(func() error {
511-
pkg := &gbuild.PackageData{Package: buildPkg}
512516
if err := s.BuildPackage(pkg); err != nil {
513517
return err
514518
}

0 commit comments

Comments
 (0)