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 }