Move SemVerTag to its own package
This commit is contained in:
2
go.mod
2
go.mod
@ -1,4 +1,4 @@
|
|||||||
module lookbuilding
|
module hulthe.net/lookbuilding
|
||||||
|
|
||||||
go 1.15
|
go 1.15
|
||||||
|
|
||||||
|
|||||||
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 (
|
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})
|
||||||
}
|
}
|
||||||
|
|||||||
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 (
|
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
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user