github.com/sc0rp1us/gb@v0.4.1-0.20160319180011-4ba8cf1baa5a/cmd/gb-vendor/purge.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "strings" 7 8 "github.com/constabulary/gb" 9 "github.com/constabulary/gb/cmd" 10 "github.com/constabulary/gb/fileutils" 11 "github.com/constabulary/gb/vendor" 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 fmt.Errorf("could not load manifest: %v", err) 25 } 26 27 imports, err := vendor.ParseImports(ctx.Projectdir()) 28 if err != nil { 29 return fmt.Errorf("import could not be parsed: %v", err) 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 fmt.Errorf("could not get get dependency: %v", err) 49 } 50 51 if err := m.RemoveDependency(dep); err != nil { 52 return fmt.Errorf("dependency could not be removed: %v", err) 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 indermediate directories. 56 return fmt.Errorf("dependency could not be deleted: %v", err) 57 } 58 } 59 } 60 61 return vendor.WriteManifest(manifestFile(ctx), m) 62 }, 63 }