Fixed #32: Detects VCS type and endpoint changes along with a --force flag
to replace the checkout if desired.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 06716e1..e7bf324 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,8 @@
- Switched to github.com/Masterminds/vcs for VCS integration.
- When updating packages are now deleted if the --delete flag is set.
This feature is now opt-in.
+- Fixed #32: Detects VCS type and endpoint changes along with a --force flag
+ to replace the checkout if desired.
# Release 0.4.1 (2015-07-13)
diff --git a/cmd/get_imports.go b/cmd/get_imports.go
index 8929522..17f496d 100644
--- a/cmd/get_imports.go
+++ b/cmd/get_imports.go
@@ -112,6 +112,7 @@
// UpdateImports iterates over the imported packages and updates them.
func UpdateImports(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
cfg := p.Get("conf", nil).(*Config)
+ force := p.Get("force", true).(bool)
cwd, err := VendorPath(c)
if err != nil {
return false, err
@@ -123,7 +124,7 @@
}
for _, dep := range cfg.Imports {
- if err := VcsUpdate(dep, cwd); err != nil {
+ if err := VcsUpdate(dep, cwd, force); err != nil {
Warn("Update failed for %s: %s\n", dep.Name, err)
}
}
@@ -207,7 +208,7 @@
}
// VcsUpdate updates to a particular checkout based on the VCS setting.
-func VcsUpdate(dep *Dependency, vend string) error {
+func VcsUpdate(dep *Dependency, vend string, force bool) error {
Info("Fetching updates for %s.\n", dep.Name)
if filterArchOs(dep) {
@@ -220,19 +221,40 @@
if _, err := os.Stat(dest); os.IsNotExist(err) {
if err = VcsGet(dep, dest); err != nil {
Warn("Unable to checkout %s\n", dep.Name)
- fmt.Println(err)
return err
}
} else {
repo, err := dep.GetRepo(dest)
- if err != nil {
+
+ // Tried to checkout a repo to a path that does not work. Either the
+ // type or endpoint has changed. Force is being passed in so the old
+ // location can be removed and replaced with the new one.
+ // Warning, any changes in the old location will be deleted.
+ // TODO: Put dirty checking in on the existing local checkout.
+ if (err == v.ErrWrongVCS || err == v.ErrWrongRemote) && force == true {
+ var newRemote string
+ if len(dep.Repository) > 0 {
+ newRemote = dep.Repository
+ } else {
+ newRemote = "https://" + dep.Name
+ }
+
+ Warn("Replacing %s with contents from %s\n", dep.Name, newRemote)
+ rerr := os.RemoveAll(dest)
+ if rerr != nil {
+ return rerr
+ }
+ if err = VcsGet(dep, dest); err != nil {
+ Warn("Unable to checkout %s\n", dep.Name)
+ return err
+ }
+ } else if err != nil {
return err
- }
- // TODO: Handle the case of a VCS switching. The could be the config
- // for a VCS or the type of VCS.
- if err := repo.Update(); err != nil {
- Warn("Download failed.\n")
- return err
+ } else {
+ if err := repo.Update(); err != nil {
+ Warn("Download failed.\n")
+ return err
+ }
}
}
diff --git a/cmd/recursive_glide.go b/cmd/recursive_glide.go
index c59ee5b..4916458 100644
--- a/cmd/recursive_glide.go
+++ b/cmd/recursive_glide.go
@@ -16,6 +16,7 @@
if !p.Get("enable", true).(bool) {
return nil, nil
}
+ force := p.Get("force", true).(bool)
godeps, gpm := false, false
if g, ok := p.Has("importGodeps"); ok {
@@ -29,10 +30,10 @@
conf := p.Get("conf", &Config{}).(*Config)
vend, _ := VendorPath(c)
- return recDepResolve(conf, vend, godeps, gpm)
+ return recDepResolve(conf, vend, godeps, gpm, force)
}
-func recDepResolve(conf *Config, vend string, godeps, gpm bool) (interface{}, error) {
+func recDepResolve(conf *Config, vend string, godeps, gpm, force bool) (interface{}, error) {
Info("Inspecting %s.\n", vend)
@@ -57,7 +58,7 @@
continue
}
}
- if err := dependencyGlideUp(base, godeps, gpm); err != nil {
+ if err := dependencyGlideUp(base, godeps, gpm, force); err != nil {
Warn("Failed to update dependency %s: %s", imp.Name, err)
}
}
@@ -66,7 +67,7 @@
return nil, nil
}
-func dependencyGlideUp(base string, godep, gpm bool) error {
+func dependencyGlideUp(base string, godep, gpm, force bool) error {
//conf := new(Config)
fname := path.Join(base, "glide.yaml")
f, err := yaml.ReadFile(fname)
@@ -91,7 +92,7 @@
if VcsExists(imp, wd) {
Info("Updating project %s (%s)\n", imp.Name, wd)
- if err := VcsUpdate(imp, vdir); err != nil {
+ if err := VcsUpdate(imp, vdir, force); err != nil {
// We can still go on just fine even if this fails.
Warn("Skipped update %s: %s\n", imp.Name, err)
continue
@@ -112,7 +113,7 @@
//recDepResolve(conf, path.Join(wd, "vendor"))
}
- recDepResolve(conf, path.Join(base, "vendor"), godep, gpm)
+ recDepResolve(conf, path.Join(base, "vendor"), godep, gpm, force)
return nil
}
diff --git a/glide.go b/glide.go
index 6c59854..3d2bc93 100644
--- a/glide.go
+++ b/glide.go
@@ -281,9 +281,14 @@
Name: "import",
Usage: "When updating dependencies, convert Godeps (GPM, Godep) to glide.yaml and pull dependencies",
},
+ cli.BoolFlag{
+ Name: "force",
+ Usage: "If there was a change in the repo or VCS switch to new one. Warning, changes will be lost.",
+ },
},
Action: func(c *cli.Context) {
cxt.Put("deleteOptIn", c.Bool("delete"))
+ cxt.Put("forceUpdate", c.Bool("force"))
cxt.Put("recursiveDependencies", !c.Bool("no-recursive"))
if c.Bool("import") {
cxt.Put("importGodeps", true)
@@ -356,6 +361,7 @@
Using("enable").From("cxt:recursiveDependencies").
Using("importGodeps").From("cxt:importGodeps").
Using("importGPM").From("cxt:importGPM").
+ Using("force").From("cxt:forceUpdate").WithDefault(false).
Does(cmd.WriteYaml, "out").
Using("yaml.Node").From("cxt:merged").
Using("filename").WithDefault("glide.yaml").From("cxt:yaml")
@@ -375,12 +381,15 @@
Does(cmd.DeleteUnusedPackages, "deleted").
Using("conf").From("cxt:cfg").
Using("optIn").From("cxt:deleteOptIn").
- Does(cmd.UpdateImports, "dependencies").Using("conf").From("cxt:cfg").
+ Does(cmd.UpdateImports, "dependencies").
+ Using("conf").From("cxt:cfg").
+ Using("force").From("cxt:forceUpdate").
Does(cmd.SetReference, "version").Using("conf").From("cxt:cfg").
Does(cmd.Recurse, "recurse").Using("conf").From("cxt:cfg").
Using("importGodeps").From("cxt:importGodeps").
Using("importGPM").From("cxt:importGPM").
- Using("enable").From("cxt:recursiveDependencies")
+ Using("enable").From("cxt:recursiveDependencies").
+ Using("force").From("cxt:forceUpdate")
//Does(cmd.Rebuild, "rebuild").Using("conf").From("cxt:cfg")