Skip to content

Commit

Permalink
* Use constants for assumed and default lifecycle descriptor fields
Browse files Browse the repository at this point in the history
* Fix implementation of `api.Version#SupportsVersion`
* Remove AdditionalBuildpack wrapper

Signed-off-by: Javier Romero <[email protected]>
Signed-off-by: Andrew Meyer <[email protected]>
  • Loading branch information
jromero committed Sep 9, 2019
1 parent 53c99eb commit d915cb0
Show file tree
Hide file tree
Showing 17 changed files with 198 additions and 248 deletions.
10 changes: 9 additions & 1 deletion acceptance/acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,15 @@ func TestAcceptance(t *testing.T) {

previousPackPath := os.Getenv(envPreviousPackPath)

lifecycleDescriptor := builder.DefaultLifecycleDescriptor()
lifecycleDescriptor := builder.LifecycleDescriptor{
Info: builder.LifecycleInfo{
Version: builder.VersionMustParse(builder.DefaultLifecycleVersion),
},
API: builder.LifecycleAPI{
BuildpackVersion: api.MustParse(builder.DefaultBuildpackAPIVersion),
PlatformVersion: api.MustParse(builder.DefaultPlatformAPIVersion),
},
}
lifecyclePath := os.Getenv(envLifecyclePath)
if lifecyclePath != "" {
lifecyclePath, err = filepath.Abs(lifecyclePath)
Expand Down
46 changes: 16 additions & 30 deletions api/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,56 +77,42 @@ func (v *Version) UnmarshalText(text []byte) error {
return nil
}

// SupportsVersion determines whether the argument version is compatible based on matching `major` version with the
// exception of pre-stable version. Any version with `major` equal to 0 is not compatible if `minor` value does not
// match.
func (v *Version) SupportsVersion(v2 *Version) bool {
if v.Compare(v2) == 0 {
// SupportsVersion determines whether this version supports a given version. If comparing two pre-stable (major == 0)
// versions, minors must match exactly. Otherwise, this minor must be greater than or equal to the given minor. Majors
// must always match.
func (v *Version) SupportsVersion(o *Version) bool {
if v.Equal(o) {
return true
}

if v != nil && v2 != nil {
if v.major > 0 && v.major == v2.major {
return true
}
if v.major != 0 {
return v.major == o.major && v.minor >= o.minor
}

return false
}

func (v *Version) Equal(v2 *Version) bool {
return v.Compare(v2) == 0
func (v *Version) Equal(o *Version) bool {
return v.Compare(o) == 0
}

func (v *Version) Compare(v2 *Version) int {
if v == nil && v2 == nil {
return 0
}

if v == nil {
return -1
}

if v2 == nil {
return 1
}

if v.major != v2.major {
if v.major < v2.major {
func (v *Version) Compare(o *Version) int {
if v.major != o.major {
if v.major < o.major {
return -1
}

if v.major > v2.major {
if v.major > o.major {
return 1
}
}

if v.minor != v2.minor {
if v.minor < v2.minor {
if v.minor != o.minor {
if v.minor < o.minor {
return -1
}

if v.minor > v2.minor {
if v.minor > o.minor {
return 1
}
}
Expand Down
81 changes: 43 additions & 38 deletions api/version_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,59 +32,64 @@ func testAPIVersion(t *testing.T, when spec.G, it spec.S) {
})

when("#SupportsVersion", func() {
it("is none-stable with matching minor value", func() {
subject := api.MustParse("0.2")
comparison := api.MustParse("0.2")
when("pre-stable", func() {
it("matching minor value", func() {
subject := api.MustParse("0.2")
comparison := api.MustParse("0.2")

h.AssertEq(t, subject.SupportsVersion(comparison), true)
})
it("is none-stable with subject minor > comparison minor", func() {
subject := api.MustParse("0.2")
comparison := api.MustParse("0.1")
h.AssertEq(t, subject.SupportsVersion(comparison), true)
})

h.AssertEq(t, subject.SupportsVersion(comparison), false)
})
it("subject minor > comparison minor", func() {
subject := api.MustParse("0.2")
comparison := api.MustParse("0.1")

it("is none-stable with subject minor < comparison minor", func() {
subject := api.MustParse("0.1")
comparison := api.MustParse("0.2")
h.AssertEq(t, subject.SupportsVersion(comparison), false)
})

h.AssertEq(t, subject.SupportsVersion(comparison), false)
it("subject minor < comparison minor", func() {
subject := api.MustParse("0.1")
comparison := api.MustParse("0.2")

h.AssertEq(t, subject.SupportsVersion(comparison), false)
})
})

it("is stable with matching major and minor", func() {
subject := api.MustParse("1.2")
comparison := api.MustParse("1.2")
when("stable", func() {
it("matching major and minor", func() {
subject := api.MustParse("1.2")
comparison := api.MustParse("1.2")

h.AssertEq(t, subject.SupportsVersion(comparison), true)
})
h.AssertEq(t, subject.SupportsVersion(comparison), true)
})

it("is stable with matching major but minor > comparison minor", func() {
subject := api.MustParse("1.2")
comparison := api.MustParse("1.1")
it("matching major but minor > comparison minor", func() {
subject := api.MustParse("1.2")
comparison := api.MustParse("1.1")

h.AssertEq(t, subject.SupportsVersion(comparison), true)
})
h.AssertEq(t, subject.SupportsVersion(comparison), true)
})

it("is stable with matching major but minor < comparison minor", func() {
subject := api.MustParse("1.1")
comparison := api.MustParse("1.2")
it("matching major but minor < comparison minor", func() {
subject := api.MustParse("1.1")
comparison := api.MustParse("1.2")

h.AssertEq(t, subject.SupportsVersion(comparison), true)
})
h.AssertEq(t, subject.SupportsVersion(comparison), false)
})

it("is stable with major < comparison major", func() {
subject := api.MustParse("1.0")
comparison := api.MustParse("2.0")
it("major < comparison major", func() {
subject := api.MustParse("1.0")
comparison := api.MustParse("2.0")

h.AssertEq(t, subject.SupportsVersion(comparison), false)
})
h.AssertEq(t, subject.SupportsVersion(comparison), false)
})

it("is stable with major > comparison major", func() {
subject := api.MustParse("2.0")
comparison := api.MustParse("1.0")
it("major > comparison major", func() {
subject := api.MustParse("2.0")
comparison := api.MustParse("1.0")

h.AssertEq(t, subject.SupportsVersion(comparison), false)
h.AssertEq(t, subject.SupportsVersion(comparison), false)
})
})
})
}
11 changes: 4 additions & 7 deletions build.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,9 @@ func (c *Client) processProxyConfig(config *ProxyConfig) ProxyConfig {
}
}

func (c *Client) processBuildpacks(buildpacks []string) ([]builder.AdditionalBuildpack, builder.OrderEntry, error) {
func (c *Client) processBuildpacks(buildpacks []string) ([]builder.Buildpack, builder.OrderEntry, error) {
group := builder.OrderEntry{Group: []builder.BuildpackRef{}}
var bps []builder.AdditionalBuildpack
var bps []builder.Buildpack
for _, bp := range buildpacks {
if isBuildpackID(bp) {
id, version := c.parseBuildpack(bp)
Expand Down Expand Up @@ -239,10 +239,7 @@ func (c *Client) processBuildpacks(buildpacks []string) ([]builder.AdditionalBui
return nil, builder.OrderEntry{}, errors.Wrapf(err, "creating buildpack from %s", style.Symbol(bp))
}

bps = append(bps, builder.AdditionalBuildpack{
Source: bp,
Buildpack: fetchedBP,
})
bps = append(bps, fetchedBP)

group.Group = append(group.Group, builder.BuildpackRef{
BuildpackInfo: fetchedBP.Descriptor().Info,
Expand Down Expand Up @@ -306,7 +303,7 @@ func (c *Client) parseBuildpack(bp string) (string, string) {
return parts[0], ""
}

func (c *Client) createEphemeralBuilder(rawBuilderImage imgutil.Image, env map[string]string, group builder.OrderEntry, buildpacks []builder.AdditionalBuildpack) (*builder.Builder, error) {
func (c *Client) createEphemeralBuilder(rawBuilderImage imgutil.Image, env map[string]string, group builder.OrderEntry, buildpacks []builder.Buildpack) (*builder.Builder, error) {
origBuilderName := rawBuilderImage.Name()
bldr, err := builder.New(rawBuilderImage, fmt.Sprintf("pack.local/builder/%x:latest", randString(10)))
if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ func (l *Lifecycle) Execute(ctx context.Context, opts LifecycleOptions) error {

lifecycleVersion := l.builder.GetLifecycleDescriptor().Info.Version
if lifecycleVersion == nil {
l.logger.Warn("lifecycle version unknown")
lifecycleVersion = builder.AssumedLifecycleDescriptor().Info.Version
l.logger.Warnf("lifecycle version unknown, assuming %s", style.Symbol(builder.AssumedLifecycleVersion))
lifecycleVersion = builder.VersionMustParse(builder.AssumedLifecycleVersion)
} else {
l.logger.Debugf("Executing lifecycle version %s", style.Symbol(lifecycleVersion.String()))
}
Expand Down
45 changes: 0 additions & 45 deletions build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -600,51 +600,6 @@ func testBuild(t *testing.T, when spec.G, it spec.S) {
h.AssertNil(t, os.Remove(buildpackTgz))
})

when("buildpack is an older api version", func() {
var (
incompatibleBuildpackTGZ *os.File
err error
)

it.Before(func() {
incompatibleBuildpackTGZ, err = ifakes.CreateBuildpackTGZ(tmpDir, builder.BuildpackDescriptor{
API: api.MustParse("0.9"),
Info: builder.BuildpackInfo{
ID: "incompatible.id",
Version: "incompatible.id.version",
},
Stacks: []builder.Stack{
{
ID: "some.stack.id",
},
},
Order: nil,
})

h.AssertNil(t, err)
})

it("should error", func() {
err := subject.Build(context.TODO(), BuildOptions{
Image: "some/app",
Builder: builderName,
ClearCache: true,
Buildpacks: []string{
"[email protected]",
incompatibleBuildpackTGZ.Name(),
},
})

h.AssertError(t, err, fmt.Sprintf(
"buildpack from URI '%s' (Buildpack API version %s) is incompatible with lifecycle '%s' (Buildpack API version %s)",
incompatibleBuildpackTGZ.Name(),
"0.9",
"0.3.0",
"0.3",
))
})
})

when("is windows", func() {
it.Before(func() {
h.SkipIf(t, runtime.GOOS != "windows", "Skipped on non-windows")
Expand Down
Loading

0 comments on commit d915cb0

Please sign in to comment.