Move SemVerTag to its own package
This commit is contained in:
38
internal/pkg/semver/parsing.go
Normal file
38
internal/pkg/semver/parsing.go
Normal 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())
|
||||
}
|
||||
8
internal/pkg/semver/types.go
Normal file
8
internal/pkg/semver/types.go
Normal file
@ -0,0 +1,8 @@
|
||||
package semver
|
||||
|
||||
import "github.com/coreos/go-semver/semver"
|
||||
|
||||
type Tag struct {
|
||||
Prefix string
|
||||
Version semver.Version
|
||||
}
|
||||
18
registry.go
18
registry.go
@ -3,16 +3,14 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/heroku/docker-registry-client/registry"
|
||||
d "github.com/opencontainers/go-digest"
|
||||
//"github.com/docker/distribution/digest"
|
||||
//"github.com/docker/distribution/manifest"
|
||||
//"github.com/docker/libtrust"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
"hulthe.net/lookbuilding/internal/pkg/semver"
|
||||
)
|
||||
|
||||
type Tag struct {
|
||||
Name string
|
||||
SemVer *SemVerTag
|
||||
Digest d.Digest
|
||||
SemVer *semver.Tag
|
||||
Digest digest.Digest
|
||||
}
|
||||
|
||||
func anonymousClient() (*registry.Registry, error) {
|
||||
@ -30,9 +28,9 @@ func anonymousClient() (*registry.Registry, error) {
|
||||
return registry, nil
|
||||
}
|
||||
|
||||
func getDockerRepoTags(hub *registry.Registry, maybe_owner *string, repository string) ([]Tag, error) {
|
||||
if maybe_owner != nil {
|
||||
repository = fmt.Sprintf("%s/%s", *maybe_owner, repository)
|
||||
func getDockerRepoTags(hub *registry.Registry, maybeOwner *string, repository string) ([]Tag, error) {
|
||||
if maybeOwner != nil {
|
||||
repository = fmt.Sprintf("%s/%s", *maybeOwner, repository)
|
||||
}
|
||||
|
||||
tags, err := hub.Tags(repository)
|
||||
@ -48,7 +46,7 @@ func getDockerRepoTags(hub *registry.Registry, maybe_owner *string, repository s
|
||||
return nil, err
|
||||
}
|
||||
|
||||
svt := parseTagAsSemVer(tag)
|
||||
svt := semver.ParseTagAsSemVer(tag)
|
||||
|
||||
out = append(out, Tag{tag, svt, digest})
|
||||
}
|
||||
|
||||
43
semver.go
43
semver.go
@ -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 ""
|
||||
}
|
||||
@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"hulthe.net/lookbuilding/internal/pkg/semver"
|
||||
"sort"
|
||||
)
|
||||
|
||||
@ -34,8 +35,8 @@ func (SameTag) ShouldUpdate(currentTag string, availableTags []Tag) *Tag {
|
||||
return nil // TODO: implement me
|
||||
}
|
||||
|
||||
func semVerShouldUpdate(currentTag string, availableTags []Tag, isValid func(current, available SemVerTag) bool) *Tag {
|
||||
currentSemVer := parseTagAsSemVer(currentTag)
|
||||
func semVerShouldUpdate(currentTag string, availableTags []Tag, isValid func(current, available semver.Tag) bool) *Tag {
|
||||
currentSemVer := semver.ParseTagAsSemVer(currentTag)
|
||||
if currentSemVer == nil {
|
||||
return nil
|
||||
}
|
||||
@ -53,8 +54,8 @@ func semVerShouldUpdate(currentTag string, availableTags []Tag, isValid func(cur
|
||||
}
|
||||
|
||||
sort.Slice(semverTags, func(i, j int) bool {
|
||||
a := semverTags[i].SemVer.version
|
||||
b := semverTags[j].SemVer.version
|
||||
a := semverTags[i].SemVer.Version
|
||||
b := semverTags[j].SemVer.Version
|
||||
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) 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
|
||||
return current.version.LessThan(available.version)
|
||||
return current.Version.LessThan(available.Version)
|
||||
})
|
||||
}
|
||||
|
||||
func (SemVerMinor) Label() string { return "semver_minor" }
|
||||
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
|
||||
return current.version.LessThan(available.version) &&
|
||||
current.version.Major == available.version.Major
|
||||
return current.Version.LessThan(available.Version) &&
|
||||
current.Version.Major == available.Version.Major
|
||||
})
|
||||
}
|
||||
|
||||
func (SemVerPatch) Label() string { return "semver_patch" }
|
||||
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
|
||||
return current.version.LessThan(available.version) &&
|
||||
current.version.Major == available.version.Major &&
|
||||
current.version.Minor == available.version.Minor
|
||||
return current.Version.LessThan(available.Version) &&
|
||||
current.Version.Major == available.Version.Major &&
|
||||
current.Version.Minor == available.Version.Minor
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"github.com/docker/docker/client"
|
||||
"hulthe.net/lookbuilding/internal/pkg/semver"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -82,7 +83,7 @@ func checkAndDoUpdate() {
|
||||
|
||||
Logger.Infof(`tags in registry for "%s": %d`, name, len(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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user