mod: lock the version of universe for updates of package

Signed-off-by: Sam Alba <samalba@users.noreply.github.com>
This commit is contained in:
Sam Alba
2021-10-22 15:37:28 -07:00
parent 779dda1aca
commit 5e6d1261f7
5 changed files with 84 additions and 41 deletions

View File

@@ -1,12 +1,14 @@
package mod
import (
"context"
"fmt"
"os"
"sort"
"strings"
"github.com/go-git/go-git/v5/plumbing/transport/ssh"
"github.com/rs/zerolog/log"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
@@ -15,9 +17,10 @@ import (
type repo struct {
contents *git.Repository
require *Require
}
func clone(require *Require, dir string, privateKeyFile, privateKeyPassword string) (*repo, error) {
func clone(ctx context.Context, require *Require, dir string, privateKeyFile, privateKeyPassword string) (*repo, error) {
if err := os.RemoveAll(dir); err != nil {
return nil, fmt.Errorf("error cleaning up tmp directory")
}
@@ -46,10 +49,11 @@ func clone(require *Require, dir string, privateKeyFile, privateKeyPassword stri
rr := &repo{
contents: r,
require: require,
}
if require.version == "" {
latestTag, err := rr.latestTag(require.versionConstraint)
latestTag, err := rr.latestTag(ctx, require.versionConstraint)
if err != nil {
return nil, err
}
@@ -57,19 +61,23 @@ func clone(require *Require, dir string, privateKeyFile, privateKeyPassword stri
require.version = latestTag
}
if err := rr.checkout(require.version); err != nil {
if err := rr.checkout(ctx, require.version); err != nil {
return nil, err
}
return rr, nil
}
func (r *repo) checkout(version string) error {
func (r *repo) checkout(ctx context.Context, version string) error {
lg := log.Ctx(ctx)
h, err := r.contents.ResolveRevision(plumbing.Revision(version))
if err != nil {
return err
}
lg.Debug().Str("repository", r.require.repo).Str("version", version).Str("commit", h.String()).Msg("checkout repo")
w, err := r.contents.Worktree()
if err != nil {
return err
@@ -85,7 +93,12 @@ func (r *repo) checkout(version string) error {
return nil
}
func (r *repo) listTagVersions(versionConstraint string) ([]string, error) {
func (r *repo) listTagVersions(ctx context.Context, versionConstraint string) ([]string, error) {
lg := log.Ctx(ctx).With().
Str("repository", r.require.repo).
Str("versionConstraint", versionConstraint).
Logger()
if versionConstraint == "" {
versionConstraint = ">= 0"
}
@@ -105,19 +118,22 @@ func (r *repo) listTagVersions(versionConstraint string) ([]string, error) {
tagV := ref.Name().Short()
if !strings.HasPrefix(tagV, "v") {
// ignore wrong formatted tags
lg.Debug().Str("tag", tagV).Msg("tag version ignored, wrong format")
return nil
}
v, err := version.NewVersion(tagV)
if err != nil {
// ignore invalid tag
lg.Debug().Str("tag", tagV).Err(err).Msg("tag version ignored, parsing error")
return nil
}
if constraint.Check(v) {
// Add tag if it matches the version constraint
tags = append(tags, ref.Name().Short())
lg.Debug().Str("tag", tagV).Msg("version added")
} else {
lg.Debug().Str("tag", tagV).Msg("tag version ignored, does not satisfy constraint")
}
return nil
@@ -130,8 +146,8 @@ func (r *repo) listTagVersions(versionConstraint string) ([]string, error) {
return tags, nil
}
func (r *repo) latestTag(versionConstraint string) (string, error) {
versionsRaw, err := r.listTagVersions(versionConstraint)
func (r *repo) latestTag(ctx context.Context, versionConstraint string) (string, error) {
versionsRaw, err := r.listTagVersions(ctx, versionConstraint)
if err != nil {
return "", err
}
@@ -147,5 +163,7 @@ func (r *repo) latestTag(versionConstraint string) (string, error) {
}
sort.Sort(sort.Reverse(version.Collection(versions)))
return versions[0].Original(), nil
version := versions[0].Original()
return version, nil
}