gopkg.in/constabulary/gb.v0@v0.4.4/cmd/gb-vendor/purge.go (about)

     1  package main
     2  
     3  import (
     4  	"path/filepath"
     5  	"strings"
     6  
     7  	"github.com/constabulary/gb"
     8  	"github.com/constabulary/gb/cmd"
     9  	"github.com/constabulary/gb/internal/fileutils"
    10  	"github.com/constabulary/gb/internal/vendor"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  var cmdPurge = &cmd.Command{
    15  	Name:      "purge",
    16  	UsageLine: "purge",
    17  	Short:     "purges all unreferenced dependencies",
    18  	Long: `gb vendor purge will remove all unreferenced dependencies
    19  
    20  `,
    21  	Run: func(ctx *gb.Context, args []string) error {
    22  		m, err := vendor.ReadManifest(manifestFile(ctx))
    23  		if err != nil {
    24  			return errors.Wrap(err, "could not load manifest")
    25  		}
    26  
    27  		imports, err := vendor.ParseImports(ctx.Projectdir())
    28  		if err != nil {
    29  			return errors.Wrap(err, "import could not be parsed")
    30  		}
    31  
    32  		var hasImportWithPrefix = func(d string) bool {
    33  			for i := range imports {
    34  				if strings.HasPrefix(i, d) {
    35  					return true
    36  				}
    37  			}
    38  			return false
    39  		}
    40  
    41  		dependencies := make([]vendor.Dependency, len(m.Dependencies))
    42  		copy(dependencies, m.Dependencies)
    43  
    44  		for _, d := range dependencies {
    45  			if !hasImportWithPrefix(d.Importpath) {
    46  				dep, err := m.GetDependencyForImportpath(d.Importpath)
    47  				if err != nil {
    48  					return errors.Wrap(err, "could not get get dependency")
    49  				}
    50  
    51  				if err := m.RemoveDependency(dep); err != nil {
    52  					return errors.Wrap(err, "dependency could not be removed")
    53  				}
    54  				if err := fileutils.RemoveAll(filepath.Join(ctx.Projectdir(), "vendor", "src", filepath.FromSlash(d.Importpath))); err != nil {
    55  					// TODO(dfc) need to apply vendor.cleanpath here to remove intermediate directories.
    56  					return errors.Wrap(err, "dependency could not be deleted")
    57  				}
    58  			}
    59  		}
    60  
    61  		return vendor.WriteManifest(manifestFile(ctx), m)
    62  	},
    63  }