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

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"path/filepath"
     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 (
    15  	// gb vendor delete flags
    16  
    17  	// delete all dependencies
    18  	deleteAll bool
    19  )
    20  
    21  func addDeleteFlags(fs *flag.FlagSet) {
    22  	fs.BoolVar(&deleteAll, "all", false, "delete all dependencies")
    23  }
    24  
    25  var cmdDelete = &cmd.Command{
    26  	Name:      "delete",
    27  	UsageLine: "delete [-all] importpath",
    28  	Short:     "deletes a local dependency",
    29  	Long: `delete removes a dependency from $PROJECT/vendor/src and the vendor manifest
    30  
    31  Flags:
    32  	-all
    33  		remove all dependencies
    34  
    35  `,
    36  	Run: func(ctx *gb.Context, args []string) error {
    37  		if len(args) != 1 && !deleteAll {
    38  			return errors.New("delete: import path or --all flag is missing")
    39  		} else if len(args) >= 1 && deleteAll {
    40  			return errors.New("delete: you cannot specify path and --all flag at once")
    41  		}
    42  
    43  		m, err := vendor.ReadManifest(manifestFile(ctx))
    44  		if err != nil {
    45  			return errors.Errorf("could not load manifest: %v", err)
    46  		}
    47  
    48  		var dependencies []vendor.Dependency
    49  		if deleteAll {
    50  			dependencies = make([]vendor.Dependency, len(m.Dependencies))
    51  			copy(dependencies, m.Dependencies)
    52  		} else {
    53  			p := args[0]
    54  			dependency, err := m.GetDependencyForImportpath(p)
    55  			if err != nil {
    56  				return errors.Wrap(err, "could not get dependency")
    57  			}
    58  			dependencies = append(dependencies, dependency)
    59  		}
    60  
    61  		for _, d := range dependencies {
    62  			path := d.Importpath
    63  
    64  			if err := m.RemoveDependency(d); err != nil {
    65  				return errors.Wrap(err, "dependency could not be deleted")
    66  			}
    67  
    68  			if err := fileutils.RemoveAll(filepath.Join(ctx.Projectdir(), "vendor", "src", filepath.FromSlash(path))); err != nil {
    69  				// TODO(dfc) need to apply vendor.cleanpath here to remove intermediate directories.
    70  				return errors.Wrap(err, "dependency could not be deleted")
    71  			}
    72  		}
    73  		return vendor.WriteManifest(manifestFile(ctx), m)
    74  	},
    75  	AddFlags: addDeleteFlags,
    76  }