github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/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 var result []string 22 allpkgs := make(map[string]bool) 23 24 findJujuCoreImports(c, packageName, allpkgs) 25 for name := range allpkgs { 26 result = append(result, name[len(jujuPkgPrefix):]) 27 } 28 sort.Strings(result) 29 return result 30 } 31 32 // findJujuCoreImports recursively adds all imported packages of given 33 // package (packageName) to allpkgs map. 34 func findJujuCoreImports(c *gc.C, packageName string, allpkgs map[string]bool) { 35 36 var imports []string 37 38 for _, root := range build.Default.SrcDirs() { 39 fullpath := filepath.Join(root, packageName) 40 pkg, err := build.ImportDir(fullpath, 0) 41 if err == nil { 42 imports = pkg.Imports 43 break 44 } 45 } 46 if imports == nil { 47 c.Fatalf(packageName + " not found") 48 } 49 50 for _, name := range imports { 51 if strings.HasPrefix(name, jujuPkgPrefix) { 52 allpkgs[name] = true 53 findJujuCoreImports(c, name, allpkgs) 54 } 55 } 56 57 }