/
dragon.go
74 lines (64 loc) · 1.2 KB
/
dragon.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
package dragon
import (
"errors"
"io/ioutil"
"os"
"golang.org/x/sync/errgroup"
)
// Imports generate zstdlib.go from api files and libs in GOPATH.
func Imports(restore, gomodules bool) error {
if !existGoImports() {
return errors.New("goimports command isn't installed")
}
if restore {
return install()
}
libChan := make(chan lib, 1000)
done := make(chan error)
tmp, err := ioutil.TempFile(outPath(), "dragon-imports")
if err != nil {
return err
}
defer func(fname string) {
tmp.Close()
os.Remove(fname)
}(tmp.Name())
go func() {
done <- out(libChan, tmp)
}()
eg := &errgroup.Group{}
eg.Go(func() error {
return stdLibs(libChan)
})
eg.Go(func() error {
if gomodules {
return gomoduleLibs(libChan)
} else {
return gopathLibs(libChan)
}
})
if err := eg.Wait(); err != nil {
return err
}
close(libChan)
err = <-done
if err != nil {
return err
}
if err := tmp.Close(); err != nil {
return err
}
return installUsing(tmp.Name())
}
type lib struct {
object string
path string
}
func existGoImports() bool {
for _, path := range [...]string{outPath(), cmdPath()} {
if _, err := os.Stat(path); os.IsNotExist(err) {
return false
}
}
return true
}