/
getimports.go
52 lines (48 loc) · 1.42 KB
/
getimports.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
package main
import (
"go/build"
"strings"
"time"
"github.com/tillberg/alog"
"github.com/tillberg/stringset"
)
func getPackageImportsRecurse(pName string, target Target, all *stringset.StringSet, level int) (isCommand bool) {
if Opts.VeryVerbose {
t := alog.NewTimer()
defer func() {
durStr := t.FormatElapsedColor(100*time.Millisecond, 200*time.Millisecond)
alog.Printf("@(dim:[)%s@(dim:]) getPackageImportsRecurse%s %s\n", durStr, strings.Repeat("+", level), pName)
}()
}
// var buildContext build.Context = build.Default
buildContext := build.Default
if !target.OSArch.IsLocal() {
buildContext.GOOS = target.OSArch.OS
buildContext.GOARCH = target.OSArch.Arch
}
bPkg, err := buildContext.Import(pName, goPath, 0)
if err != nil {
// Ignore import errors on non-root packages; they should show as higher-level build failures
if level == 0 {
alog.Printf("@(warn:Error parsing package) @(dim:%s:) %s\n", pName, err.Error())
}
return false
}
if level == 0 && !bPkg.IsCommand() {
return false
}
for _, importName := range bPkg.Imports {
if isStandardPkg(importName) {
continue
}
if all.Add(importName) {
getPackageImportsRecurse(importName, target, all, level+1)
}
}
return true
}
func getPackageImports(pName string, target Target) (deps *stringset.StringSet, isCommand bool) {
all := stringset.New()
isCommand = getPackageImportsRecurse(pName, target, all, 0)
return all, isCommand
}