Move SemVerTag to its own package

This commit is contained in:
2020-11-10 22:14:41 +01:00
parent 28c9f61569
commit 04fa50d9ae
7 changed files with 71 additions and 68 deletions

2
go.mod
View File

@ -1,4 +1,4 @@
module lookbuilding module hulthe.net/lookbuilding
go 1.15 go 1.15

View File

@ -0,0 +1,38 @@
package semver
import (
"fmt"
"regexp"
"github.com/coreos/go-semver/semver"
)
var (
rxSemVerPrefix = regexp.MustCompile(`^[^\d]*`)
)
// Returns nil if the tag did not parse as semver
func ParseTagAsSemVer(dockerTag string) *Tag {
var prefix string
loc := rxSemVerPrefix.FindStringIndex(dockerTag)
if loc != nil {
prefix = dockerTag[:loc[1]]
dockerTag = dockerTag[loc[1]:]
}
version, err := semver.NewVersion(dockerTag)
if err != nil {
return nil
}
svt := Tag{
prefix,
*version,
}
return &svt
}
func (svt Tag) String() string {
return fmt.Sprintf("%s%s", svt.Prefix, svt.Version.String())
}

View File

@ -0,0 +1,8 @@
package semver
import "github.com/coreos/go-semver/semver"
type Tag struct {
Prefix string
Version semver.Version
}

View File

@ -3,16 +3,14 @@ package main
import ( import (
"fmt" "fmt"
"github.com/heroku/docker-registry-client/registry" "github.com/heroku/docker-registry-client/registry"
d "github.com/opencontainers/go-digest" digest "github.com/opencontainers/go-digest"
//"github.com/docker/distribution/digest" "hulthe.net/lookbuilding/internal/pkg/semver"
//"github.com/docker/distribution/manifest"
//"github.com/docker/libtrust"
) )
type Tag struct { type Tag struct {
Name string Name string
SemVer *SemVerTag SemVer *semver.Tag
Digest d.Digest Digest digest.Digest
} }
func anonymousClient() (*registry.Registry, error) { func anonymousClient() (*registry.Registry, error) {
@ -30,9 +28,9 @@ func anonymousClient() (*registry.Registry, error) {
return registry, nil return registry, nil
} }
func getDockerRepoTags(hub *registry.Registry, maybe_owner *string, repository string) ([]Tag, error) { func getDockerRepoTags(hub *registry.Registry, maybeOwner *string, repository string) ([]Tag, error) {
if maybe_owner != nil { if maybeOwner != nil {
repository = fmt.Sprintf("%s/%s", *maybe_owner, repository) repository = fmt.Sprintf("%s/%s", *maybeOwner, repository)
} }
tags, err := hub.Tags(repository) tags, err := hub.Tags(repository)
@ -48,7 +46,7 @@ func getDockerRepoTags(hub *registry.Registry, maybe_owner *string, repository s
return nil, err return nil, err
} }
svt := parseTagAsSemVer(tag) svt := semver.ParseTagAsSemVer(tag)
out = append(out, Tag{tag, svt, digest}) out = append(out, Tag{tag, svt, digest})
} }

View File

@ -1,43 +0,0 @@
package main
import (
"regexp"
"github.com/coreos/go-semver/semver"
)
var (
rxSemVerPrefix = regexp.MustCompile(`^[^\d]*`)
)
type SemVerTag struct {
prefix string
version semver.Version
}
// Return a
// Returns nil if the tag did not parse as semver
func parseTagAsSemVer(tag string) *SemVerTag {
var prefix string
loc := rxSemVerPrefix.FindStringIndex(tag)
if loc != nil {
prefix = tag[:loc[1]]
tag = tag[loc[1]:]
}
version, err := semver.NewVersion(tag)
if err != nil {
return nil
}
svt := SemVerTag{
prefix,
*version,
}
return &svt
}
func (SemVerTag) asTag() string {
return ""
}

View File

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"hulthe.net/lookbuilding/internal/pkg/semver"
"sort" "sort"
) )
@ -34,8 +35,8 @@ func (SameTag) ShouldUpdate(currentTag string, availableTags []Tag) *Tag {
return nil // TODO: implement me return nil // TODO: implement me
} }
func semVerShouldUpdate(currentTag string, availableTags []Tag, isValid func(current, available SemVerTag) bool) *Tag { func semVerShouldUpdate(currentTag string, availableTags []Tag, isValid func(current, available semver.Tag) bool) *Tag {
currentSemVer := parseTagAsSemVer(currentTag) currentSemVer := semver.ParseTagAsSemVer(currentTag)
if currentSemVer == nil { if currentSemVer == nil {
return nil return nil
} }
@ -53,8 +54,8 @@ func semVerShouldUpdate(currentTag string, availableTags []Tag, isValid func(cur
} }
sort.Slice(semverTags, func(i, j int) bool { sort.Slice(semverTags, func(i, j int) bool {
a := semverTags[i].SemVer.version a := semverTags[i].SemVer.Version
b := semverTags[j].SemVer.version b := semverTags[j].SemVer.Version
return b.LessThan(a) return b.LessThan(a)
}) })
@ -63,28 +64,28 @@ func semVerShouldUpdate(currentTag string, availableTags []Tag, isValid func(cur
func (SemVerMajor) Label() string { return "semver_major" } func (SemVerMajor) Label() string { return "semver_major" }
func (SemVerMajor) ShouldUpdate(currentTag string, availableTags []Tag) *Tag { func (SemVerMajor) ShouldUpdate(currentTag string, availableTags []Tag) *Tag {
return semVerShouldUpdate(currentTag, availableTags, func(current, available SemVerTag) bool { return semVerShouldUpdate(currentTag, availableTags, func(current, available semver.Tag) bool {
// The new version should be greater // The new version should be greater
return current.version.LessThan(available.version) return current.Version.LessThan(available.Version)
}) })
} }
func (SemVerMinor) Label() string { return "semver_minor" } func (SemVerMinor) Label() string { return "semver_minor" }
func (SemVerMinor) ShouldUpdate(currentTag string, availableTags []Tag) *Tag { func (SemVerMinor) ShouldUpdate(currentTag string, availableTags []Tag) *Tag {
return semVerShouldUpdate(currentTag, availableTags, func(current, available SemVerTag) bool { return semVerShouldUpdate(currentTag, availableTags, func(current, available semver.Tag) bool {
// The new version should be greater, but still the same major number // The new version should be greater, but still the same major number
return current.version.LessThan(available.version) && return current.Version.LessThan(available.Version) &&
current.version.Major == available.version.Major current.Version.Major == available.Version.Major
}) })
} }
func (SemVerPatch) Label() string { return "semver_patch" } func (SemVerPatch) Label() string { return "semver_patch" }
func (SemVerPatch) ShouldUpdate(currentTag string, availableTags []Tag) *Tag { func (SemVerPatch) ShouldUpdate(currentTag string, availableTags []Tag) *Tag {
return semVerShouldUpdate(currentTag, availableTags, func(current, available SemVerTag) bool { return semVerShouldUpdate(currentTag, availableTags, func(current, available semver.Tag) bool {
// The new version should be greater, but still the same major & minor number // The new version should be greater, but still the same major & minor number
return current.version.LessThan(available.version) && return current.Version.LessThan(available.Version) &&
current.version.Major == available.version.Major && current.Version.Major == available.Version.Major &&
current.version.Minor == available.version.Minor current.Version.Minor == available.Version.Minor
}) })
} }

View File

@ -2,6 +2,7 @@ package main
import ( import (
"github.com/docker/docker/client" "github.com/docker/docker/client"
"hulthe.net/lookbuilding/internal/pkg/semver"
) )
var ( var (
@ -82,7 +83,7 @@ func checkAndDoUpdate() {
Logger.Infof(`tags in registry for "%s": %d`, name, len(repoTags)) Logger.Infof(`tags in registry for "%s": %d`, name, len(repoTags))
for _, tag := range repoTags { for _, tag := range repoTags {
svt := parseTagAsSemVer(tag.Name) svt := semver.ParseTagAsSemVer(tag.Name)
Logger.Infof(`tag_name="%s" semver=%t digest=%s`, tag.Name, svt != nil, tag.Digest) Logger.Infof(`tag_name="%s" semver=%t digest=%s`, tag.Name, svt != nil, tag.Digest)
} }