refactor parsing to a function

Signed-off-by: Chanwit Kaewkasi <chanwit@gmail.com>
This commit is contained in:
Chanwit Kaewkasi 2015-06-01 00:43:52 +07:00
parent 2701342a0c
commit 7725b572c2
2 changed files with 66 additions and 19 deletions

View File

@ -13,6 +13,35 @@ type Image struct {
Engine *Engine
}
func toImageName(repo string, name string, tag string) string {
fullname := name
if tag != "" {
fullname = name + ":" + tag
}
if repo != "" {
fullname = repo + "/" + fullname
}
return fullname
}
func parseImageName(fullname string) (repo string, name string, tag string) {
parts := strings.SplitN(fullname, "/", 2)
nameAndTag := parts[0]
if len(parts) == 2 {
repo = parts[0]
nameAndTag = parts[1]
}
parts = strings.SplitN(nameAndTag, ":", 2)
name = parts[0]
if len(parts) == 2 {
tag = parts[1]
}
return
}
// Match is exported
func (image *Image) Match(IDOrName string, matchTag bool) bool {
size := len(IDOrName)
@ -21,33 +50,22 @@ func (image *Image) Match(IDOrName string, matchTag bool) bool {
return true
}
repo := ""
name := IDOrName
if strings.Contains(IDOrName, "/") {
parts := strings.SplitN(IDOrName, "/", 2)
repo = parts[0] + "/"
name = parts[1]
}
imageName := IDOrName
repo, name, tag := parseImageName(imageName)
if matchTag {
if len(strings.SplitN(name, ":", 2)) == 1 {
name = repo + name + ":latest"
} else {
name = repo + name
if tag == "" {
imageName = toImageName(repo, name, "latest")
}
} else {
name = repo + strings.SplitN(name, ":", 2)[0]
imageName = toImageName(repo, name, "")
}
for _, repoTag := range image.RepoTags {
if matchTag == false {
if strings.Contains(repoTag, "/") {
parts := strings.SplitN(repoTag, "/", 2)
repoTag = parts[0] + "/" + strings.SplitN(parts[1], ":", 2)[0]
} else {
repoTag = strings.SplitN(repoTag, ":", 2)[0]
}
r, n, _ := parseImageName(repoTag)
repoTag = toImageName(r, n, "")
}
if repoTag == name {
if repoTag == imageName {
return true
}
}

View File

@ -33,6 +33,35 @@ func TestMatch(t *testing.T) {
assert.False(t, img.Match("na", false))
}
func TestParseImage(t *testing.T) {
repo, name, tag := parseImageName("private.registry.com:5000/name:latest")
assert.Equal(t, repo, "private.registry.com:5000")
assert.Equal(t, name, "name")
assert.Equal(t, tag, "latest")
repo, name, tag = parseImageName("name:latest")
assert.Equal(t, repo, "")
assert.Equal(t, name, "name")
assert.Equal(t, tag, "latest")
repo, name, tag = parseImageName("name")
assert.Equal(t, repo, "")
assert.Equal(t, name, "name")
assert.Equal(t, tag, "")
repo, name, tag = parseImageName("")
assert.Equal(t, repo, "")
assert.Equal(t, name, "")
assert.Equal(t, tag, "")
}
func TestToImage(t *testing.T) {
assert.Equal(t, toImageName("", "name", ""), "name")
assert.Equal(t, toImageName("", "name", "latest"), "name:latest")
assert.Equal(t, toImageName("a", "name", ""), "a/name")
assert.Equal(t, toImageName("private.registry.com:5000", "name", "latest"), "private.registry.com:5000/name:latest")
}
func TestMatchPrivateRepo(t *testing.T) {
img := Image{}