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  }