|  | package action | 
|  |  | 
|  | import ( | 
|  | "os" | 
|  | "os/exec" | 
|  | "path" | 
|  | "path/filepath" | 
|  | "strings" | 
|  |  | 
|  | "github.com/Masterminds/glide/cfg" | 
|  | "github.com/Masterminds/glide/msg" | 
|  | gpath "github.com/Masterminds/glide/path" | 
|  | ) | 
|  |  | 
|  | // Rebuild rebuilds '.a' files for a project. | 
|  | // | 
|  | // Prior to Go 1.4, this could substantially reduce time on incremental compiles. | 
|  | // It remains to be seen whether this is tremendously beneficial to modern Go | 
|  | // programs. | 
|  | func Rebuild() { | 
|  | msg.Warn("The rebuild command is deprecated and will be removed in a future version") | 
|  | msg.Warn("Use the go install command instead") | 
|  | conf := EnsureConfig() | 
|  | vpath, err := gpath.Vendor() | 
|  | if err != nil { | 
|  | msg.Die("Could not get vendor path: %s", err) | 
|  | } | 
|  |  | 
|  | msg.Info("Building dependencies.\n") | 
|  |  | 
|  | if len(conf.Imports) == 0 { | 
|  | msg.Info("No dependencies found. Nothing built.\n") | 
|  | return | 
|  | } | 
|  |  | 
|  | for _, dep := range conf.Imports { | 
|  | if err := buildDep(dep, vpath); err != nil { | 
|  | msg.Warn("Failed to build %s: %s\n", dep.Name, err) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func buildDep(dep *cfg.Dependency, vpath string) error { | 
|  | if len(dep.Subpackages) == 0 { | 
|  | buildPath(dep.Name) | 
|  | } | 
|  |  | 
|  | for _, pkg := range dep.Subpackages { | 
|  | if pkg == "**" || pkg == "..." { | 
|  | //Info("Building all packages in %s\n", dep.Name) | 
|  | buildPath(path.Join(dep.Name, "...")) | 
|  | } else { | 
|  | paths, err := resolvePackages(vpath, dep.Name, pkg) | 
|  | if err != nil { | 
|  | msg.Warn("Error resolving packages: %s", err) | 
|  | } | 
|  | buildPaths(paths) | 
|  | } | 
|  | } | 
|  |  | 
|  | return nil | 
|  | } | 
|  |  | 
|  | func resolvePackages(vpath, pkg, subpkg string) ([]string, error) { | 
|  | sdir, _ := os.Getwd() | 
|  | if err := os.Chdir(filepath.Join(vpath, pkg, subpkg)); err != nil { | 
|  | return []string{}, err | 
|  | } | 
|  | defer os.Chdir(sdir) | 
|  | p, err := filepath.Glob(path.Join(vpath, pkg, subpkg)) | 
|  | if err != nil { | 
|  | return []string{}, err | 
|  | } | 
|  | for k, v := range p { | 
|  | nv := strings.TrimPrefix(v, vpath) | 
|  | p[k] = strings.TrimPrefix(nv, string(filepath.Separator)) | 
|  | } | 
|  | return p, nil | 
|  | } | 
|  |  | 
|  | func buildPaths(paths []string) error { | 
|  | for _, path := range paths { | 
|  | if err := buildPath(path); err != nil { | 
|  | return err | 
|  | } | 
|  | } | 
|  |  | 
|  | return nil | 
|  | } | 
|  |  | 
|  | func buildPath(path string) error { | 
|  | msg.Info("Running go build %s\n", path) | 
|  | // . in a filepath.Join is removed so it needs to be prepended separately. | 
|  | p := "." + string(filepath.Separator) + filepath.Join("vendor", path) | 
|  | out, err := exec.Command(goExecutable(), "install", p).CombinedOutput() | 
|  | if err != nil { | 
|  | msg.Warn("Failed to run 'go install' for %s: %s", path, string(out)) | 
|  | } | 
|  | return err | 
|  | } |