launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/testing/testbase/imports.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package testbase 5 6 import ( 7 "go/build" 8 "path/filepath" 9 "sort" 10 "strings" 11 12 gc "launchpad.net/gocheck" 13 ) 14 15 const jujuPkgPrefix = "launchpad.net/juju-core/" 16 17 // FindJujuCoreImports returns a sorted list of juju-core packages that are 18 // imported by the packageName parameter. The resulting list removes the 19 // common prefix "launchpad.net/juju-core/" leaving just the short names. 20 func FindJujuCoreImports(c *gc.C, packageName string) []string { 21 22 var result []string 23 allpkgs := make(map[string]bool) 24 25 findJujuCoreImports(c, packageName, allpkgs) 26 27 for name := range allpkgs { 28 result = append(result, name[len(jujuPkgPrefix):]) 29 } 30 31 sort.Strings(result) 32 return result 33 } 34 35 // findJujuCoreImports recursively adds all imported packages of given 36 // package (packageName) to allpkgs map. 37 func findJujuCoreImports(c *gc.C, packageName string, allpkgs map[string]bool) { 38 39 var imports []string 40 41 for _, root := range build.Default.SrcDirs() { 42 fullpath := filepath.Join(root, packageName) 43 pkg, err := build.ImportDir(fullpath, 0) 44 if err == nil { 45 imports = pkg.Imports 46 break 47 } 48 } 49 if imports == nil { 50 c.Fatalf(packageName + " not found") 51 } 52 53 for _, name := range imports { 54 if strings.HasPrefix(name, jujuPkgPrefix) { 55 allpkgs[name] = true 56 findJujuCoreImports(c, name, allpkgs) 57 } 58 } 59 60 }