1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
package image
import (
"fmt"
"github.com/containers/image/docker/reference"
)
// imageParts describes the parts of an image's name
type imageParts struct {
transport string
registry string
name string
tag string
isTagged bool
hasRegistry bool
}
// decompose breaks an input name into an imageParts description
func decompose(input string) (imageParts, error) {
var (
parts imageParts
hasRegistry bool
tag string
)
imgRef, err := reference.Parse(input)
if err != nil {
return parts, err
}
ntag, isTagged := imgRef.(reference.NamedTagged)
if !isTagged {
tag = "latest"
if _, hasDigest := imgRef.(reference.Digested); hasDigest {
tag = "none"
}
} else {
tag = ntag.Tag()
}
registry := reference.Domain(imgRef.(reference.Named))
if registry != "" {
hasRegistry = true
}
imageName := reference.Path(imgRef.(reference.Named))
return imageParts{
registry: registry,
hasRegistry: hasRegistry,
name: imageName,
tag: tag,
isTagged: isTagged,
transport: DefaultTransport,
}, nil
}
// assemble concatenates an image's parts into a string
func (ip *imageParts) assemble() string {
return fmt.Sprintf("%s/%s:%s", ip.registry, ip.name, ip.tag)
}
// assemble concatenates an image's parts with transport into a string
func (ip *imageParts) assembleWithTransport() string {
return fmt.Sprintf("%s%s/%s:%s", ip.transport, ip.registry, ip.name, ip.tag)
}
|