Refactor Remove() to gps
diff --git a/action/remove.go b/action/remove.go
index 63a6a58..62de0a3 100644
--- a/action/remove.go
+++ b/action/remove.go
@@ -1,50 +1,102 @@
 package action
 
 import (
-	"github.com/Masterminds/glide/cache"
+	"log"
+	"os"
+	"path/filepath"
+
 	"github.com/Masterminds/glide/cfg"
+	"github.com/Masterminds/glide/dependency"
 	"github.com/Masterminds/glide/msg"
 	gpath "github.com/Masterminds/glide/path"
 	"github.com/Masterminds/glide/repo"
+	"github.com/sdboyer/gps"
 )
 
-// Remove removes a dependncy from the configuration.
-func Remove(packages []string, inst *repo.Installer) {
-	cache.SystemLock()
+// Remove removes a constraint from the configuration.
+func Remove(packages []string, inst *repo.Installer, stripVendor bool) {
 	base := gpath.Basepath()
 	EnsureGopath()
 	EnsureVendorDir()
 	conf := EnsureConfig()
+
 	glidefile, err := gpath.Glide()
 	if err != nil {
 		msg.Die("Could not find Glide file: %s", err)
 	}
 
+	vend, err := gpath.Vendor()
+	if err != nil {
+		msg.Die("Could not find the vendor dir: %s", err)
+	}
+
+	rd := filepath.Dir(glidefile)
+	rt, err := gps.ListPackages(rd, conf.Name)
+	if err != nil {
+		msg.Die("Error while scanning project imports: %s", err)
+	}
+
+	params := gps.SolveParameters{
+		RootDir:         rd,
+		RootPackageTree: rt,
+		Manifest:        conf,
+		Trace:           true,
+		TraceLogger:     log.New(os.Stdout, "", 0),
+	}
+
+	// We load the lock file early and bail out if there's a problem, because we
+	// don't want a get to just update all deps without the user explictly
+	// making that choice.
+	if gpath.HasLock(base) {
+		params.Lock, _, err = loadLockfile(base, conf)
+		if err != nil {
+			msg.Err("Could not load lockfile; aborting get. Other dependency versions cannot be preserved without an invalid lock file . Error was: %s", err)
+			return
+		}
+	}
+
+	// Create the SourceManager for this run
+	sm, err := gps.NewSourceManager(dependency.Analyzer{}, filepath.Join(inst.Home, "cache"))
+	defer sm.Release()
+	if err != nil {
+		msg.Err(err.Error())
+		return
+	}
+
 	msg.Info("Preparing to remove %d packages.", len(packages))
 	conf.Imports = rmDeps(packages, conf.Imports)
 	conf.DevImports = rmDeps(packages, conf.DevImports)
 
-	// Copy used to generate locks.
-	confcopy := conf.Clone()
-
-	//confcopy.Imports = inst.List(confcopy)
-
-	if err := repo.SetReference(confcopy, inst.ResolveTest); err != nil {
-		msg.Err("Failed to set references: %s", err)
-	}
-
-	err = inst.Export(confcopy)
+	// Prepare a solver. This validates our params.
+	s, err := gps.Prepare(params, sm)
 	if err != nil {
-		msg.Die("Unable to export dependencies to vendor directory: %s", err)
+		msg.Err("Aborted get - could not set up solver to reconcile dependencies: %s", err)
+		return
 	}
 
-	// Write glide.yaml
-	if err := conf.WriteFile(glidefile); err != nil {
-		msg.Die("Failed to write glide YAML file: %s", err)
+	r, err := s.Solve()
+	if err != nil {
+		msg.Err("Failed to find a solution for all new dependencies: %s", err.Error())
+		return
 	}
 
-	// Write glide lock
-	writeLock(conf, confcopy, base)
+	// Solve succeeded. Write out the yaml, lock, and vendor to a tmpdir, then mv
+	// them all into place iff all the writes worked
+
+	gw := safeGroupWriter{
+		conf:        conf,
+		lock:        params.Lock.(*cfg.Lockfile),
+		resultLock:  r,
+		sm:          sm,
+		glidefile:   glidefile,
+		vendor:      vend,
+		stripVendor: stripVendor,
+	}
+
+	err = gw.writeAllSafe()
+	if err != nil {
+		msg.Err(err.Error())
+	}
 }
 
 // rmDeps returns a list of dependencies that do not contain the given pkgs.