Skip to content

Commit

Permalink
Print highest semver bump when updating buildpack.toml
Browse files Browse the repository at this point in the history
- This will significantly assist automation (e.g. auto-labeling PRs with a semver:<value> tag)
  • Loading branch information
robdimsdale committed Jun 26, 2024
1 parent 8475f48 commit ace2ba6
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 0 deletions.
64 changes: 64 additions & 0 deletions commands/update_buildpack.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"os"
"strings"

"github.com/Masterminds/semver/v3"
"github.com/paketo-buildpacks/jam/v2/internal"
"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -59,6 +60,7 @@ func updateBuildpackRun(flags updateBuildpackFlags) error {
return err
}

highestFoundSemverBump := "<none>"
for i, dependency := range pkg.Dependencies {
var (
buildpackageID string
Expand Down Expand Up @@ -114,6 +116,12 @@ func updateBuildpackRun(flags updateBuildpackFlags) error {
for j, order := range bp.Order {
for k, group := range order.Group {
if group.ID == buildpackageID {
bump, err := semverBump(group.Version, image.Version)
if err != nil {
return err
}
highestFoundSemverBump = highestSemverBump(highestFoundSemverBump, bump)

bp.Order[j].Group[k].Version = image.Version
}
}
Expand All @@ -130,5 +138,61 @@ func updateBuildpackRun(flags updateBuildpackFlags) error {
return err
}

fmt.Printf("Highest semver bump: %s\n", highestFoundSemverBump)

return nil
}

func semverBump(oldVersion, newVersion string) (string, error) {
oldSemver, err := semver.StrictNewVersion(oldVersion)
if err != nil {
return "", err
}

newSemver, err := semver.StrictNewVersion(newVersion)
if err != nil {
return "", err
}

if newSemver.Major() > oldSemver.Major() {
return "major", nil
}

if newSemver.Minor() > oldSemver.Minor() {
return "minor", nil
}

if newSemver.Patch() > oldSemver.Patch() {
return "patch", nil
}

return "<none>", nil
}

func highestSemverBump(highest, current string) string {
if highest == "major" {
return highest
}

if highest == "minor" {
if current == "major" {
return current
} else {
return highest
}
}

if highest == "patch" {
if current == "major" || current == "minor" {
return current
} else {
return highest
}
}

if highest == "<none>" {
return current
}

return highest
}
2 changes: 2 additions & 0 deletions integration/update_buildpack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,7 @@ func testUpdateBuildpack(t *testing.T, context spec.G, it spec.S) {
Expect(err).NotTo(HaveOccurred())

Eventually(session).Should(gexec.Exit(0), func() string { return string(buffer.Contents()) })
Expect(string(buffer.Contents())).To(ContainSubstring("Highest semver bump: minor"))

buildpackContents, err := os.ReadFile(filepath.Join(buildpackDir, "buildpack.toml"))
Expect(err).NotTo(HaveOccurred())
Expand Down Expand Up @@ -295,6 +296,7 @@ func testUpdateBuildpack(t *testing.T, context spec.G, it spec.S) {
Expect(err).NotTo(HaveOccurred())

Eventually(session).Should(gexec.Exit(0), func() string { return string(buffer.Contents()) })
Expect(session).Should(gbytes.Say("Highest semver bump: patch"))

buildpackContents, err := os.ReadFile(filepath.Join(buildpackDir, "buildpack.toml"))
Expect(err).NotTo(HaveOccurred())
Expand Down

0 comments on commit ace2ba6

Please sign in to comment.