diff --git a/go.mod b/go.mod index d97e97e..ff18c9f 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module lookbuilding +module hulthe.net/lookbuilding go 1.15 diff --git a/internal/pkg/semver/parsing.go b/internal/pkg/semver/parsing.go new file mode 100644 index 0000000..1410e73 --- /dev/null +++ b/internal/pkg/semver/parsing.go @@ -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()) +} diff --git a/internal/pkg/semver/types.go b/internal/pkg/semver/types.go new file mode 100644 index 0000000..cb53aaa --- /dev/null +++ b/internal/pkg/semver/types.go @@ -0,0 +1,8 @@ +package semver + +import "github.com/coreos/go-semver/semver" + +type Tag struct { + Prefix string + Version semver.Version +} diff --git a/registry.go b/registry.go index 6056be3..eb9a9cd 100644 --- a/registry.go +++ b/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}) } diff --git a/semver.go b/semver.go deleted file mode 100644 index ddba329..0000000 --- a/semver.go +++ /dev/null @@ -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 "" -} diff --git a/versioning_mode.go b/versioning_mode.go index 0881d07..23ce566 100644 --- a/versioning_mode.go +++ b/versioning_mode.go @@ -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 }) } diff --git a/worker.go b/worker.go index 28c218c..254564e 100644 --- a/worker.go +++ b/worker.go @@ -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) }