diff --git a/client/image.go b/client/image.go index 9a43dac41d282120de9ecc374786d8f6abb543d6..f925544536722264b8d6ef3073fe1be667ce7786 100644 --- a/client/image.go +++ b/client/image.go @@ -48,6 +48,44 @@ func (r *Remote) Image(flake string) (store.Image, error) { return image, err } +// ImageGroup returns an entire group of store.Image. +func (r *Remote) ImageGroup(flake string) ([]store.Image, error) { + if image, err := r.Image(flake); err != nil { + return nil, err + } else { + var group []store.Image + + // Iterate forwards + if err = func(image store.Image) error { + group = []store.Image{image} + for image.Child != "" { + if image, err = r.Image(image.Child); err != nil { + return err + } + group = append(group, image) + } + return nil + }(image); err != nil { + return group, err + } + + // Iterate backwards + if err = func(image store.Image) error { + for image.Parent != "" { + if image, err = r.Image(image.Parent); err != nil { + return err + } + group = append([]store.Image{image}, group...) + } + return nil + }(image); err != nil { + return group, err + } + + return group, nil + } +} + // ImageUpdate updates metadata of store.Image with given snowflake. To persist original value in a field set \000. func (r *Remote) ImageUpdate(flake, source, parent, commentary, commentaryTranslation string) error { payload := api.ImageUpdatePayload{