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")