blob: 5b998585bb92fd11c7505e890895c6340a6cfb05 [file] [log] [blame]
package dependency
import (
"strings"
"github.com/Masterminds/glide/msg"
"github.com/Masterminds/glide/util"
)
var osList []string
var archList []string
func init() {
// The supported systems are listed in
// https://github.com/golang/go/blob/master/src/go/build/syslist.go
// The lists are not exported so we need to duplicate them here.
osListString := "android darwin dragonfly freebsd linux nacl netbsd openbsd plan9 solaris windows"
osList = strings.Split(osListString, " ")
archListString := "386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc s390 s390x sparc sparc64"
archList = strings.Split(archListString, " ")
}
// IterativeScan attempts to obtain a list of imported dependencies from a
// package. This scanning is different from ImportDir as part of the go/build
// package. It looks over different permutations of the supported OS/Arch to
// try and find all imports. This is different from setting UseAllFiles to
// true on the build Context. It scopes down to just the supported OS/Arch.
//
// Note, there are cases where multiple packages are in the same directory. This
// usually happens with an example that has a main package and a +build tag
// of ignore. This is a bit of a hack. It causes UseAllFiles to have errors.
func IterativeScan(path string) ([]string, error) {
var pkgs []string
for _, o := range osList {
for _, a := range archList {
b, err := util.GetBuildContext()
if err != nil {
return []string{}, err
}
// Make sure use all files is off
b.UseAllFiles = false
// Set the OS and Arch for this pass
b.GOARCH = a
b.GOOS = o
pk, err := b.ImportDir(path, 0)
if err != nil {
msg.Debug("Problem parsing package at %s for %s %s", path, o, a)
return []string{}, err
}
for _, dep := range pk.Imports {
found := false
for _, p := range pkgs {
if p == dep {
found = true
}
}
if !found {
pkgs = append(pkgs, dep)
}
}
}
}
return pkgs, nil
}