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  }