Recursive glide for 'get' and 'up'.
diff --git a/cmd/recursive_glide.go b/cmd/recursive_glide.go
index 1ddd457..26d4f4a 100644
--- a/cmd/recursive_glide.go
+++ b/cmd/recursive_glide.go
@@ -5,6 +5,7 @@
"path"
"github.com/Masterminds/cookoo"
+ "github.com/kylelemons/go-gypsy/yaml"
)
// Recurse does glide installs on dependent packages.
@@ -22,11 +23,13 @@
// Look in each package to see whether it has a glide.yaml, and no vendor/
for _, imp := range conf.Imports {
Info("Looking in %s for a glide.yaml file.\n", imp.Name)
- if needsGlideUp(path.Join(vend, imp.Name)) {
- Info("Package %s needs `glide up`\n", imp.Name)
- // How do we want to do this? Should we run the glide command,
- // which would allow environmental control, or should we just
- // run the update route in that directory?
+ base := path.Join(vend, imp.Name)
+ if !needsGlideUp(base) {
+ Info("Package %s manages its own dependencies.\n", imp.Name)
+ }
+ Info("Package %s needs `glide up`\n", imp.Name)
+ if err := dependencyGlideUp(base); err != nil {
+ Warn("Failed to update dependency %s: %s", imp.Name, err)
}
}
@@ -34,6 +37,46 @@
return nil, nil
}
+func dependencyGlideUp(base string) error {
+ //conf := new(Config)
+ fname := path.Join(base, "glide.yaml")
+ f, err := yaml.ReadFile(fname)
+ if err != nil {
+ return err
+ }
+
+ conf, err := FromYaml(f.Root)
+ if err != nil {
+ return err
+ }
+ for _, imp := range conf.Imports {
+ Info("Importing %s to project %s\n", imp.Name, base)
+ // We don't use the global var to find vendor dir name because the
+ // user may mis-use that var to modify the local vendor dir, and
+ // we don't want that to break the embedded vendor dirs.
+ wd := path.Join(base, "vendor", imp.Name)
+ if err := ensureDir(wd); err != nil {
+ Warn("Skipped getting %s (vendor/ error): %s\n", imp.Name, err)
+ continue
+ }
+
+ // How do we want to do this? Should we run the glide command,
+ // which would allow environmental control, or should we just
+ // run the update route in that directory?
+ if err := VcsGet(imp, wd); err != nil {
+ Warn("Skipped getting %s: %s\n", imp.Name, err)
+ }
+ }
+ return nil
+}
+
+func ensureDir(dirpath string) error {
+ if fi, err := os.Stat(dirpath); err == nil && fi.IsDir() {
+ return nil
+ }
+ return os.MkdirAll(dirpath, 0755)
+}
+
func needsGlideUp(dir string) bool {
stat, err := os.Stat(path.Join(dir, "glide.yaml"))
if err != nil || stat.IsDir() {
diff --git a/glide.go b/glide.go
index 535fa03..b5b43fe 100644
--- a/glide.go
+++ b/glide.go
@@ -293,6 +293,7 @@
Using("package").From("cxt:package").
Using("conf").From("cxt:cfg").
Does(cmd.MergeToYaml, "merged").Using("conf").From("cxt:cfg").
+ Does(cmd.Recurse, "recurse").Using("conf").From("cxt:cfg").
Does(cmd.WriteYaml, "out").
Using("yaml.Node").From("cxt:merged").
Using("filename").WithDefault("glide.yaml").From("cxt:yaml")