Skip to content

Commit

Permalink
adding support for disconnected release versions and go package versi…
Browse files Browse the repository at this point in the history
…on families

Signed-off-by: Scott Nichols <scott@chainguard.dev>
  • Loading branch information
n3wscott committed Oct 22, 2021
1 parent b0d568c commit 138b5e8
Show file tree
Hide file tree
Showing 11 changed files with 258 additions and 127 deletions.
7 changes: 6 additions & 1 deletion buoy/commands/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
func addCheckCmd(root *cobra.Command) {
var domain string
var release string
var moduleRelease string
var rulesetFlag string
var ruleset git.RulesetType
var verbose bool
Expand Down Expand Up @@ -59,6 +60,9 @@ Rulesets,
if ruleset == git.InvalidRule {
return fmt.Errorf("invalid ruleset, please select one of: [%s]", strings.Join(git.Rulesets(), ", "))
}
if moduleRelease == "" {
moduleRelease = release
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
Expand All @@ -69,7 +73,7 @@ Rulesets,
out = cmd.OutOrStderr()
}

err := gomod.Check(gomodFile, release, domain, ruleset, out)
err := gomod.Check(gomodFile, release, moduleRelease, domain, ruleset, out)
if errors.Is(err, gomod.DependencyErr) {
_, _ = fmt.Fprintln(cmd.OutOrStdout(), err.Error())
os.Exit(1)
Expand All @@ -83,6 +87,7 @@ Rulesets,
_ = cmd.MarkFlagRequired("domain")
cmd.Flags().StringVarP(&release, "release", "r", "", "release should be '<major>.<minor>' (i.e.: 1.23 or v1.23) [required]")
_ = cmd.MarkFlagRequired("release")
cmd.Flags().StringVarP(&moduleRelease, "module-release", "m", "", "if the go modules are a different release set than the release, use --module-release, should be '<major>.<minor>' (i.e.: 0.12 or v0.12)")
cmd.Flags().StringVar(&rulesetFlag, "ruleset", git.ReleaseOrReleaseBranchRule.String(), fmt.Sprintf("The ruleset to evaluate the dependency refs. Rulesets: [%s]", strings.Join(git.Rulesets(), ", ")))
cmd.Flags().BoolVarP(&verbose, "verbose", "v", false, "Print verbose output.")

Expand Down
19 changes: 13 additions & 6 deletions buoy/commands/exists.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,31 @@ package commands

import (
"fmt"
"github.com/spf13/cobra"
"io"
"os"

"github.com/spf13/cobra"

"knative.dev/test-infra/pkg/gomod"
)

func addExistsCmd(root *cobra.Command) {
var (
release string
verbose bool
tag bool
release string
moduleRelease string
verbose bool
tag bool
)

var cmd = &cobra.Command{
Use: "exists go.mod",
Short: "Determine if the release branch exists for a given module.",
Args: cobra.ExactArgs(1),
PreRunE: func(cmd *cobra.Command, args []string) error {
if moduleRelease == "" {
moduleRelease = release
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
gomodFile := args[0]

Expand All @@ -45,7 +51,7 @@ func addExistsCmd(root *cobra.Command) {
out = cmd.OutOrStderr()
}

meta, err := gomod.ReleaseStatus(gomodFile, release, out)
meta, err := gomod.ReleaseStatus(gomodFile, release, moduleRelease, out)
if err != nil {
return err
}
Expand All @@ -64,6 +70,7 @@ func addExistsCmd(root *cobra.Command) {

cmd.Flags().StringVarP(&release, "release", "r", "", "release should be '<major>.<minor>' (i.e.: 1.23 or v1.23) [required]")
_ = cmd.MarkFlagRequired("release")
cmd.Flags().StringVarP(&moduleRelease, "module-release", "m", "", "if the go modules are a different release set than the release, use --module-release, should be '<major>.<minor>' (i.e.: 0.12 or v0.12)")
cmd.Flags().BoolVarP(&verbose, "verbose", "v", false, "Print verbose output (stderr)")
cmd.Flags().BoolVarP(&tag, "next", "t", false, "Print the next release tag (stdout)")

Expand Down
15 changes: 10 additions & 5 deletions buoy/commands/float.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@ import (

func addFloatCmd(root *cobra.Command) {
var (
domain string
release string
rulesetFlag string
ruleset git.RulesetType
domain string
release string
moduleRelease string
rulesetFlag string
ruleset git.RulesetType
)

var cmd = &cobra.Command{
Expand Down Expand Up @@ -64,13 +65,16 @@ For rulesets that that restrict the selection process, no ref is selected.
if ruleset == git.InvalidRule {
return fmt.Errorf("invalid ruleset, please select one of: [%s]", strings.Join(git.Rulesets(), ", "))
}
if moduleRelease == "" {
moduleRelease = release
}
return nil
},

RunE: func(cmd *cobra.Command, args []string) error {
gomodFile := args[0]

refs, err := gomod.Float(gomodFile, release, domain, ruleset)
refs, err := gomod.Float(gomodFile, release, moduleRelease, domain, ruleset)
if err != nil {
return err
}
Expand All @@ -87,6 +91,7 @@ For rulesets that that restrict the selection process, no ref is selected.
cmd.Flags().StringVarP(&domain, "domain", "d", "knative.dev", "domain filter (i.e. knative.dev) [required]")
cmd.Flags().StringVarP(&release, "release", "r", "", "release should be '<major>.<minor>' (i.e.: 1.23 or v1.23) [required]")
_ = cmd.MarkFlagRequired("release")
cmd.Flags().StringVarP(&moduleRelease, "module-release", "m", "", "if the go modules are a different release set than the release, use --module-release, should be '<major>.<minor>' (i.e.: 0.12 or v0.12)")
cmd.Flags().StringVar(&rulesetFlag, "ruleset", git.AnyRule.String(), fmt.Sprintf("The ruleset to evaluate the dependency refs. Rulesets: [%s]", strings.Join(git.Rulesets(), ", ")))

root.AddCommand(cmd)
Expand Down
6 changes: 3 additions & 3 deletions pkg/git/git.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ func (rt RefType) String() string {

// BestRefFor Returns module@ref, isRelease based on the provided ruleset for
// a this release.
func (r *Repo) BestRefFor(this semver.Version, ruleset RulesetType) (string, RefType) {
func (r *Repo) BestRefFor(release, moduleRelease semver.Version, ruleset RulesetType) (string, RefType) {
switch ruleset {
case AnyRule, ReleaseOrReleaseBranchRule, ReleaseRule:
var largest *semver.Version
Expand All @@ -104,7 +104,7 @@ func (r *Repo) BestRefFor(this semver.Version, ruleset RulesetType) (string, Ref
if v.Pre != nil || v.Build != nil {
continue
}
if v.Major == this.Major && v.Minor == this.Minor {
if v.Major == moduleRelease.Major && v.Minor == moduleRelease.Minor {
if largest == nil || largest.LT(v) {
largest = &v
}
Expand All @@ -124,7 +124,7 @@ func (r *Repo) BestRefFor(this semver.Version, ruleset RulesetType) (string, Ref
if bv, ok := normalizeBranchVersion(b); ok {
v, _ := semver.Make(bv)

if v.Major == this.Major && v.Minor == this.Minor {
if v.Major == release.Major && v.Minor == release.Minor {
if largest == nil || largest.LT(v) {
largest = &v
}
Expand Down
59 changes: 52 additions & 7 deletions pkg/git/git_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package git

import (
"github.com/google/go-cmp/cmp"
"testing"

"github.com/blang/semver/v4"
Expand Down Expand Up @@ -57,15 +58,16 @@ func TestRepo_BestRefFor(t *testing.T) {
Ref: "ref",
DefaultBranch: "main",
Tags: []string{"v0.1.0", "bar", "v0.2.0", "baz", "v0.2.1", "v0.2.2-rc.1", "v0.2.2+build", "foo"},
Branches: []string{"release-0.1", "bar", "release-0.2", "baz", "main", "release-0.3"},
Branches: []string{"release-0.1", "bar", "release-0.2", "baz", "main", "release-0.3", "release-1.0"},
}

tests := map[string]struct {
repo *Repo
version semver.Version
want string
release RefType
rule RulesetType
repo *Repo
version semver.Version
moduleVersion semver.Version
want string
release RefType
rule RulesetType
}{
"Any - v0.1": {
repo: repo,
Expand Down Expand Up @@ -95,6 +97,14 @@ func TestRepo_BestRefFor(t *testing.T) {
release: DefaultBranchRef,
rule: AnyRule,
},
"Any - v1.0.0 && v0.4.0 mod": {
repo: repo,
version: semver.MustParse("1.0.0"),
moduleVersion: semver.MustParse("0.4.0"),
want: "ref@release-1.0",
release: ReleaseBranchRef,
rule: AnyRule,
},

"ReleaseOrReleaseBranch - v0.1": {
repo: repo,
Expand Down Expand Up @@ -124,6 +134,22 @@ func TestRepo_BestRefFor(t *testing.T) {
release: NoRef,
rule: ReleaseOrReleaseBranchRule,
},
"ReleaseOrReleaseBranch - v1.0.0 && v0.4.0 mod": {
repo: repo,
version: semver.MustParse("1.0.0"),
moduleVersion: semver.MustParse("0.4.0"),
want: "ref@release-1.0",
release: ReleaseBranchRef,
rule: ReleaseOrReleaseBranchRule,
},
"ReleaseOrReleaseBranch - v2.0.0 && v0.4.0 mod": {
repo: repo,
version: semver.MustParse("2.0.0"),
moduleVersion: semver.MustParse("0.4.0"),
want: "ref",
release: NoRef,
rule: ReleaseOrReleaseBranchRule,
},

"Release - v0.1": {
repo: repo,
Expand Down Expand Up @@ -153,6 +179,14 @@ func TestRepo_BestRefFor(t *testing.T) {
release: NoRef,
rule: ReleaseRule,
},
"Release - v1.0.0 and mod v0.4": {
repo: repo,
version: semver.MustParse("1.0.0"),
moduleVersion: semver.MustParse("0.4.0"),
want: "ref",
release: NoRef,
rule: ReleaseRule,
},

"ReleaseBranch - v0.1": {
repo: repo,
Expand Down Expand Up @@ -182,10 +216,21 @@ func TestRepo_BestRefFor(t *testing.T) {
release: NoRef,
rule: ReleaseBranchRule,
},
"ReleaseBranch - v1.0.0 && v0.4.0 mod": {
repo: repo,
version: semver.MustParse("1.0.0"),
moduleVersion: semver.MustParse("0.4.0"),
want: "ref@release-1.0",
release: ReleaseBranchRef,
rule: ReleaseBranchRule,
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
got, release := tt.repo.BestRefFor(tt.version, tt.rule)
if cmp.Equal(tt.moduleVersion, semver.Version{}) {
tt.moduleVersion = tt.version
}
got, release := tt.repo.BestRefFor(tt.version, tt.moduleVersion, tt.rule)
if got != tt.want {
t.Errorf("repo.BestRefFor() got ref = %v, want %v", got, tt.want)
}
Expand Down
15 changes: 10 additions & 5 deletions pkg/gomod/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,27 @@ import (
// Check examines a go mod file for dependencies and determines if each have a release artifact
// based on the ruleset provided. Check leverages the same rules used by
// knative.dev/test-infra/pkg/git.Repo().BestRefFor
func Check(gomod, release, domain string, ruleset git.RulesetType, out io.Writer) error {
func Check(gomod, release, moduleRelease, domain string, ruleset git.RulesetType, out io.Writer) error {
modulePkgs, _, err := Modules([]string{gomod}, domain)
if err != nil {
return err
}

for module, packages := range modulePkgs {
if err := check(module, packages, release, ruleset, out); err != nil {
if err := check(module, packages, release, moduleRelease, ruleset, out); err != nil {
return err
}
}
return nil
}

func check(module string, packages []string, release string, ruleset git.RulesetType, out io.Writer) error {
this, err := semver.ParseTolerant(release)
func check(module string, packages []string, release, moduleRelease string, ruleset git.RulesetType, out io.Writer) error {
r, err := semver.ParseTolerant(release)
if err != nil {
return err
}

mr, err := semver.ParseTolerant(moduleRelease)
if err != nil {
return err
}
Expand All @@ -61,7 +66,7 @@ func check(module string, packages []string, release string, ruleset git.Ruleset
return err
}

ref, refType := repo.BestRefFor(this, ruleset)
ref, refType := repo.BestRefFor(r, mr, ruleset)
switch refType {
case git.NoRef:
nonReady = append(nonReady, ref)
Expand Down

0 comments on commit 138b5e8

Please sign in to comment.