74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"github.com/containers/image/docker/reference"
|
||
|
"github.com/containers/storage"
|
||
|
"github.com/pkg/errors"
|
||
|
"github.com/urfave/cli"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
tagDescription = "Adds one or more additional names to locally-stored image"
|
||
|
tagCommand = cli.Command{
|
||
|
Name: "tag",
|
||
|
Usage: "Add an additional name to a local image",
|
||
|
Description: tagDescription,
|
||
|
Action: tagCmd,
|
||
|
ArgsUsage: "IMAGE-NAME [IMAGE-NAME ...]",
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func tagCmd(c *cli.Context) error {
|
||
|
args := c.Args()
|
||
|
if len(args) < 2 {
|
||
|
return errors.Errorf("image name and at least one new name must be specified")
|
||
|
}
|
||
|
store, err := getStore(c)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
img, err := findImage(store, args[0])
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if img == nil {
|
||
|
return errors.New("null image")
|
||
|
}
|
||
|
err = addImageNames(store, img, args[1:])
|
||
|
if err != nil {
|
||
|
return errors.Wrapf(err, "error adding names %v to image %q", args[1:], args[0])
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func addImageNames(store storage.Store, image *storage.Image, addNames []string) error {
|
||
|
// Add tags to the names if applicable
|
||
|
names, err := expandedTags(addNames)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
err = store.SetNames(image.ID, append(image.Names, names...))
|
||
|
if err != nil {
|
||
|
return errors.Wrapf(err, "error adding names (%v) to image %q", names, image.ID)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func expandedTags(tags []string) ([]string, error) {
|
||
|
expandedNames := []string{}
|
||
|
for _, tag := range tags {
|
||
|
name, err := reference.ParseNormalizedNamed(tag)
|
||
|
if err != nil {
|
||
|
return nil, errors.Wrapf(err, "error parsing tag %q", name)
|
||
|
}
|
||
|
|
||
|
name = reference.TagNameOnly(name)
|
||
|
newTag := ""
|
||
|
if tagged, ok := name.(reference.NamedTagged); ok {
|
||
|
newTag = tagged.Tag()
|
||
|
}
|
||
|
expandedNames = append(expandedNames, name.Name()+":"+newTag)
|
||
|
}
|
||
|
return expandedNames, nil
|
||
|
}
|