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 41069bb
Show file tree
Hide file tree
Showing 10 changed files with 206 additions and 120 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
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
115 changes: 63 additions & 52 deletions pkg/gomod/check_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,81 +27,92 @@ import (
// TestCheck - This is an integration test, it will make a call out to the internet.
func TestCheck(t *testing.T) {
tests := map[string]struct {
gomod string
release string
domain string
rule git.RulesetType
wantErr bool
gomod string
release string
moduleRelease string
domain string
rule git.RulesetType
wantErr bool
}{
"demo1, v0.15, knative.dev, any rule": {
gomod: "./testdata/gomod.check1",
release: "v0.15",
domain: "knative.dev",
rule: git.AnyRule,
gomod: "./testdata/gomod.check1",
release: "v0.15",
moduleRelease: "v0.15",
domain: "knative.dev",
rule: git.AnyRule,
},
"demo1, v0.15, knative.dev, release rule": {
gomod: "./testdata/gomod.check1",
release: "v0.15",
domain: "knative.dev",
rule: git.ReleaseRule,
wantErr: true,
gomod: "./testdata/gomod.check1",
release: "v0.15",
moduleRelease: "v0.15",
domain: "knative.dev",
rule: git.ReleaseRule,
wantErr: true,
},
"demo1, v0.15, knative.dev, release branch rule": {
gomod: "./testdata/gomod.check1",
release: "v0.15",
domain: "knative.dev",
rule: git.ReleaseBranchRule,
gomod: "./testdata/gomod.check1",
release: "v0.15",
moduleRelease: "v0.15",
domain: "knative.dev",
rule: git.ReleaseBranchRule,
},
"demo1, v99.99, knative.dev, release branch or release rule": {
gomod: "./testdata/gomod.check1",
release: "v99.99",
domain: "knative.dev",
rule: git.ReleaseOrReleaseBranchRule,
wantErr: true,
gomod: "./testdata/gomod.check1",
release: "v99.99",
moduleRelease: "v99.99",
domain: "knative.dev",
rule: git.ReleaseOrReleaseBranchRule,
wantErr: true,
},
"demo1, v0.16, knative.dev, any rule": {
gomod: "./testdata/gomod.check1",
release: "v0.16",
domain: "knative.dev",
rule: git.AnyRule,
gomod: "./testdata/gomod.check1",
release: "v0.16",
moduleRelease: "v0.16",
domain: "knative.dev",
rule: git.AnyRule,
},
"demo1, v0.16, k8s.io, any rule": {
gomod: "./testdata/gomod.check1",
release: "v0.16",
domain: "knative.dev",
rule: git.AnyRule,
"demo1, v0.16, v0.15 mods, knative.dev, any rule": {
gomod: "./testdata/gomod.check1",
release: "v0.16",
moduleRelease: "v0.15",
domain: "knative.dev",
rule: git.AnyRule,
},
"demo1, v99.99, knative.dev, any rule": {
gomod: "./testdata/gomod.check1",
release: "v99.99",
domain: "knative.dev",
rule: git.AnyRule,
gomod: "./testdata/gomod.check1",
release: "v99.99",
moduleRelease: "v99.99",
domain: "knative.dev",
rule: git.AnyRule,
},
"bad release": {
gomod: "./testdata/gomod.check1",
release: "not gonna work",
domain: "knative.dev",
rule: git.AnyRule,
wantErr: true,
gomod: "./testdata/gomod.check1",
release: "not gonna work",
moduleRelease: "not gonna work",
domain: "knative.dev",
rule: git.AnyRule,
wantErr: true,
},
"bad go module": {
gomod: "./testdata/gomod.float1",
release: "v0.15",
domain: "does-not-exist.nope",
rule: git.AnyRule,
wantErr: true,
gomod: "./testdata/gomod.float1",
release: "v0.15",
moduleRelease: "v0.15",
domain: "does-not-exist.nope",
rule: git.AnyRule,
wantErr: true,
},
"bad go mod file": {
gomod: "./testdata/bad.example",
release: "v0.15",
domain: "knative.dev",
rule: git.AnyRule,
wantErr: true,
gomod: "./testdata/bad.example",
release: "v0.15",
moduleRelease: "v0.15",
domain: "knative.dev",
rule: git.AnyRule,
wantErr: true,
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
err := Check(tt.gomod, tt.release, tt.domain, tt.rule, os.Stdout)
err := Check(tt.gomod, tt.release, tt.moduleRelease, tt.domain, tt.rule, os.Stdout)
if (tt.wantErr && err == nil) || (!tt.wantErr && err != nil) {
t.Errorf("unexpected error state, want error == %t, got %v", tt.wantErr, err)
}
Expand Down
11 changes: 8 additions & 3 deletions pkg/gomod/float.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,18 @@ import (
// Returns the set of module refs that were found. If no ref is found for a
// dependency, Float omits that ref from the returned list. Float leverages
// the same rules used by knative.dev/test-infra/pkg/git.Repo().BestRefFor
func Float(gomod, release, domain string, ruleset git.RulesetType) ([]string, error) {
func Float(gomod, release, moduleRelease, domain string, ruleset git.RulesetType) ([]string, error) {
_, packages, err := Modules([]string{gomod}, domain)
if err != nil {
return nil, err
}

this, err := semver.ParseTolerant(release)
r, err := semver.ParseTolerant(release)
if err != nil {
return nil, err
}

mr, err := semver.ParseTolerant(moduleRelease)
if err != nil {
return nil, err
}
Expand All @@ -46,7 +51,7 @@ func Float(gomod, release, domain string, ruleset git.RulesetType) ([]string, er
return nil, err
}

if ref, refType := repo.BestRefFor(this, ruleset); refType != git.NoRef {
if ref, refType := repo.BestRefFor(r, mr, ruleset); refType != git.NoRef {
refs = append(refs, ref)
}
}
Expand Down

0 comments on commit 41069bb

Please sign in to comment.