From 6768e02d910c32abba0e679fc46d8ec00b0694a7 Mon Sep 17 00:00:00 2001 From: Marcin Bilski Date: Wed, 12 Jan 2022 12:44:09 +0100 Subject: [PATCH] Fix tagging failing with 400 while no remote tags yet. --- pkg/vcs/git.go | 37 ++++++++++++++++++++++++------------- pkg/vcs/tags.go | 26 +++++++++++++++----------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/pkg/vcs/git.go b/pkg/vcs/git.go index 89d43c3..890d2b8 100644 --- a/pkg/vcs/git.go +++ b/pkg/vcs/git.go @@ -34,6 +34,8 @@ type gitVCS struct { auth Auth } +var ErrNoMatchingVersion = errors.New("no matching versions") + // NewGit return a go-git VCS client implementation that provides information // about the specific module using the pgiven authentication mechanism. func NewGit(l logger, dir string, module string, auth Auth) VCS { @@ -61,9 +63,8 @@ func (g *gitVCS) List(ctx context.Context) ([]Version, error) { if err != nil { return nil, err } - list := []Version{} - var masterHash plumbing.Hash + masterHash := "" tagPrefix := "" if g.prefix != "" { tagPrefix = g.prefix + "/" @@ -71,18 +72,24 @@ func (g *gitVCS) List(ctx context.Context) ([]Version, error) { for _, ref := range refs { name := ref.Name() if name == plumbing.Master { - masterHash = ref.Hash() + masterHash = ref.Hash().String() } else if name.IsTag() && strings.HasPrefix(name.String(), "refs/tags/"+tagPrefix+"v") { list = append(list, Version(strings.TrimPrefix(name.String(), "refs/tags/"+tagPrefix))) } } if len(list) == 0 { - if masterHash.IsZero() { + if masterHash == "" { return nil, errors.New("no tags and no master branch found") } - masterCommit, err := repo.CommitObject(masterHash) + short := masterHash[:12] + version, err := g.versionFromHash(ctx, short) + if err != nil { + return nil, err + } + + masterCommit, err := g.commit(ctx, version) if err != nil { return nil, err } @@ -92,23 +99,27 @@ func (g *gitVCS) List(ctx context.Context) ([]Version, error) { return nil, err } + // No tags while it's a module. if g.isModule(tree) { - return nil, errors.New("no matching versions") + return nil, ErrNoMatchingVersion } - hashStr := masterHash.String() - short := hashStr[:12] - t, err := g.Timestamp(ctx, Version("v0.0.0-20060102150405-"+short)) - if err != nil { - return nil, err - } - list = []Version{Version(fmt.Sprintf("v0.0.0-%s-%s", t.Format("20060102150405"), short))} + list = []Version{version} } g.log("gitVCS.List", "module", g.module, "list", list) return list, nil } +func (g *gitVCS) versionFromHash(ctx context.Context, hash string) (Version, error) { + t, err := g.Timestamp(ctx, Version("v0.0.0-20060102150405-"+hash)) + if err != nil { + return Version(""), err + } + v := Version(fmt.Sprintf("v0.0.0-%s-%s", t.Format("20060102150405"), hash)) + return v, nil +} + func (g *gitVCS) isModule(tree *object.Tree) bool { mod := "go.mod" for path := g.prefix; path != "."; path = filepath.Dir(path) { diff --git a/pkg/vcs/tags.go b/pkg/vcs/tags.go index 55310b0..899b172 100644 --- a/pkg/vcs/tags.go +++ b/pkg/vcs/tags.go @@ -62,8 +62,20 @@ func NewGitWithEphemeralTags(l logger, dir string, module string, auth Auth, sto } } -func (v *taggableVCS) Tag(ctx context.Context, semVer Version, short string) error { +func (v *taggableVCS) safeList(ctx context.Context) ([]Version, error) { remoteVersions, err := v.wrapped.List(ctx) + if err != nil { + // Ignore this error, we can still count on ephemeral tags. + if err != ErrNoMatchingVersion { + return nil, err + } + v.wrapped.log("No remote version tags yet:", err) + } + return remoteVersions, nil +} + +func (v *taggableVCS) Tag(ctx context.Context, semVer Version, short string) error { + remoteVersions, err := v.safeList(ctx) if err != nil { return err } @@ -74,11 +86,10 @@ func (v *taggableVCS) Tag(ctx context.Context, semVer Version, short string) err } func (v *taggableVCS) List(ctx context.Context) ([]Version, error) { - remoteVersions, err := v.wrapped.List(ctx) + remoteVersions, err := v.safeList(ctx) if err != nil { return nil, err } - tags := v.storage.tags(v.module) // Remote versions win. return appendEphemeralVersion(remoteVersions, tags...), nil @@ -124,14 +135,7 @@ func (v *taggableVCS) Zip(ctx context.Context, version Version) (io.ReadCloser, func (v *taggableVCS) resolveVersion(ctx context.Context, version Version) (Version, error) { for _, tag := range v.storage.tags(v.module) { if tag.semVer == version { - // TODO(bilus): Duplicated in git.go. - t, err := v.wrapped.Timestamp(ctx, Version("v0.0.0-20060102150405-"+tag.short)) - if err != nil { - return Version(""), err - } - version2 := Version(fmt.Sprintf("v0.0.0-%s-%s", t.Format("20060102150405"), tag.short)) - - return version2, nil + return v.wrapped.versionFromHash(ctx, tag.short) } } return version, nil