blob: 62de0a3ce960b42821b8a489f78f127ab5e73dc0 [file] [log] [blame]
package action
import (
"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 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)
// Prepare a solver. This validates our params.
s, err := gps.Prepare(params, sm)
if err != nil {
msg.Err("Aborted get - could not set up solver to reconcile dependencies: %s", err)
return
}
r, err := s.Solve()
if err != nil {
msg.Err("Failed to find a solution for all new dependencies: %s", err.Error())
return
}
// 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.
//
// It generates neither an error nor a warning for a pkg that does not exist
// in the list of deps.
func rmDeps(pkgs []string, deps []*cfg.Dependency) []*cfg.Dependency {
res := []*cfg.Dependency{}
for _, d := range deps {
rem := false
for _, p := range pkgs {
if p == d.Name {
rem = true
}
}
if !rem {
res = append(res, d)
}
}
return res
}