diff --git a/cmd/dist/images.go b/cmd/dist/images.go index be5a83d..fbc1e76 100644 --- a/cmd/dist/images.go +++ b/cmd/dist/images.go @@ -61,3 +61,41 @@ var imagesCommand = cli.Command{ return nil }, } + +var rmiCommand = cli.Command{ + Name: "rmi", + Usage: "Delete one or more images by reference.", + ArgsUsage: "[flags] [, ...]", + Description: `Delete one or more images by reference.`, + Flags: []cli.Flag{}, + Action: func(clicontext *cli.Context) error { + var ( + ctx = background + exitErr error + ) + + db, err := getDB(clicontext, false) + if err != nil { + return errors.Wrap(err, "failed to open database") + } + + tx, err := db.Begin(true) + if err != nil { + return errors.Wrap(err, "could not start transaction") + } + defer tx.Rollback() + + for _, target := range clicontext.Args() { + if err := images.Delete(tx, target); err != nil { + if exitErr == nil { + exitErr = errors.Wrapf(err, "unable to delete %v", target) + } + log.G(ctx).WithError(err).Errorf("unable to delete %v", target) + } + + fmt.Println(target) + } + + return exitErr + }, +} diff --git a/cmd/dist/main.go b/cmd/dist/main.go index d0070cf..c3fc54e 100644 --- a/cmd/dist/main.go +++ b/cmd/dist/main.go @@ -62,6 +62,7 @@ distribution tool } app.Commands = []cli.Command{ imagesCommand, + rmiCommand, pullCommand, fetchCommand, fetchObjectCommand, diff --git a/cmd/dist/pull.go b/cmd/dist/pull.go index 1c93f25..82423f8 100644 --- a/cmd/dist/pull.go +++ b/cmd/dist/pull.go @@ -67,6 +67,7 @@ command. As part of this process, we do the following: ingester := contentservice.NewIngesterFromClient(contentapi.NewContentClient(conn)) provider := contentservice.NewProviderFromClient(contentapi.NewContentClient(conn)) + cs, err := resolveContentStore(clicontext) if err != nil { return err diff --git a/images/storage.go b/images/storage.go index 2f4382a..050addb 100644 --- a/images/storage.go +++ b/images/storage.go @@ -103,6 +103,12 @@ func List(tx *bolt.Tx) ([]Image, error) { return images, nil } +func Delete(tx *bolt.Tx, name string) error { + return withImagesBucket(tx, func(bkt *bolt.Bucket) error { + return bkt.DeleteBucket([]byte(name)) + }) +} + func readImage(image *Image, bkt *bolt.Bucket) error { return bkt.ForEach(func(k, v []byte) error { if v == nil {