Skip to content

Commit

Permalink
Use jam CLI directly in packing tools
Browse files Browse the repository at this point in the history
Signed-off-by: Forest Eckhardt <[email protected]>
  • Loading branch information
Sophie Wigmore authored and ForestEckhardt committed Jan 4, 2021
1 parent 51ce83c commit a995f35
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 30 deletions.
32 changes: 32 additions & 0 deletions fakes/executable.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package fakes

import (
"sync"

"github.com/paketo-buildpacks/packit/pexec"
)

type Executable struct {
ExecuteCall struct {
sync.Mutex
CallCount int
Receives struct {
Execution pexec.Execution
}
Returns struct {
Error error
}
Stub func(pexec.Execution) error
}
}

func (f *Executable) Execute(param1 pexec.Execution) error {
f.ExecuteCall.Lock()
defer f.ExecuteCall.Unlock()
f.ExecuteCall.CallCount++
f.ExecuteCall.Receives.Execution = param1
if f.ExecuteCall.Stub != nil {
return f.ExecuteCall.Stub(param1)
}
return f.ExecuteCall.Returns.Error
}
10 changes: 1 addition & 9 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,9 @@ module github.com/ForestEckhardt/freezer
go 1.13

require (
github.com/golang/protobuf v1.4.3 // indirect
github.com/google/go-cmp v0.5.2 // indirect
github.com/mattn/go-colorable v0.1.8 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/nxadm/tail v1.4.5 // indirect
github.com/oklog/ulid v1.3.1
github.com/onsi/ginkgo v1.14.2 // indirect
github.com/onsi/gomega v1.10.4
github.com/paketo-buildpacks/occam v0.0.22
github.com/paketo-buildpacks/packit v0.5.0
github.com/sclevine/spec v1.4.0
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13 // indirect
google.golang.org/protobuf v1.25.0 // indirect
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
)
3 changes: 3 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/ForestEckhardt/freezer v0.0.3/go.mod h1:/uALnKwx6+QSyKdZYC/FjihjQeI4XsE7i3RXPKyM8Vs=
github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14=
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
Expand Down Expand Up @@ -331,6 +332,8 @@ github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2i
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/paketo-buildpacks/occam v0.0.22 h1:zMG3FHJ9Ws5PleWLzgXbx8puzvvRcKTliNu11ltEexM=
github.com/paketo-buildpacks/occam v0.0.22/go.mod h1:aPNRyPEgYp4a01O4UKAuFWYnRmY4ujeuV3x6yAa1hxs=
github.com/paketo-buildpacks/packit v0.5.0 h1:WXLewsOY5NeqyJzIUca9GRJs02SW2qA5DiIG8RUebJk=
github.com/paketo-buildpacks/packit v0.5.0/go.mod h1:ATLZccUzqEAyPlirdka8hs+XNqS4pyJ/tjyU1NXJKm8=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
Expand Down
34 changes: 16 additions & 18 deletions packing_tools.go
Original file line number Diff line number Diff line change
@@ -1,43 +1,41 @@
package freezer

import (
"fmt"
"os"
"path/filepath"

"github.com/paketo-buildpacks/packit/cargo"
"github.com/paketo-buildpacks/packit/cargo/jam/commands"
"github.com/paketo-buildpacks/packit/pexec"
"github.com/paketo-buildpacks/packit/scribe"
)

//go:generate faux --interface Executable --output fakes/executable.go
type Executable interface {
Execute(pexec.Execution) error
}

type PackingTools struct {
jam commands.Pack
jam Executable
}

func NewPackingTools() PackingTools {
logger := scribe.NewLogger(os.Stdout)
bash := pexec.NewExecutable("bash")

transport := cargo.NewTransport()
directoryDuplicator := cargo.NewDirectoryDuplicator()
buildpackParser := cargo.NewBuildpackParser()
fileBundler := cargo.NewFileBundler()
tarBuilder := cargo.NewTarBuilder(logger)
prePackager := cargo.NewPrePackager(bash, logger, scribe.NewWriter(os.Stdout, scribe.WithIndent(2)))
dependencyCacher := cargo.NewDependencyCacher(transport, logger)

return PackingTools{
jam: commands.NewPack(directoryDuplicator, buildpackParser, prePackager, dependencyCacher, fileBundler, tarBuilder, os.Stdout),
jam: pexec.NewExecutable("jam"),
}
}

func (p PackingTools) WithExecutable(executable Executable) PackingTools {
p.jam = executable
return p
}

func (p PackingTools) Execute(buildpackDir, output, version string, cached bool) error {
_, err := os.Stat(filepath.Join(buildpackDir, ".packit"))
if err != nil {
return err
return fmt.Errorf("unable to find .packit in buildpack directory: %w", err)
}

args := []string{
"pack",
"--buildpack", filepath.Join(buildpackDir, "buildpack.toml"),
"--output", output,
"--version", version,
Expand All @@ -47,5 +45,5 @@ func (p PackingTools) Execute(buildpackDir, output, version string, cached bool)
args = append(args, "--offline")
}

return p.jam.Execute(args)
return p.jam.Execute(pexec.Execution{Args: args})
}
69 changes: 66 additions & 3 deletions packing_tools_test.go
Original file line number Diff line number Diff line change
@@ -1,32 +1,95 @@
package freezer_test

import (
"errors"
"io/ioutil"
"os"
"path/filepath"
"testing"

"github.com/ForestEckhardt/freezer"
. "github.com/onsi/gomega"
"github.com/paketo-buildpacks/occam/fakes"
"github.com/sclevine/spec"

. "github.com/onsi/gomega"
)

func testPackingTools(t *testing.T, context spec.G, it spec.S) {
var (
Expect = NewWithT(t).Expect

buildpackDir string

executable *fakes.Executable
packingTools freezer.PackingTools
)

it.Before(func() {
packingTools = freezer.NewPackingTools()
var err error
buildpackDir, err = ioutil.TempDir("", "buildpack-dir")
Expect(err).ToNot(HaveOccurred())
Expect(ioutil.WriteFile(filepath.Join(buildpackDir, ".packit"), nil, 0600)).To(Succeed())

executable = &fakes.Executable{}

packingTools = freezer.NewPackingTools().WithExecutable(executable)

})

it.After(func() {
Expect(os.RemoveAll(buildpackDir)).To(Succeed())
})

context("Execute", func() {
it("creates a correct pexec.Execution", func() {
err := packingTools.Execute(buildpackDir, "some-output", "some-version", false)
Expect(err).NotTo(HaveOccurred())

Expect(executable.ExecuteCall.Receives.Execution.Args).To(Equal([]string{
"pack",
"--buildpack", filepath.Join(buildpackDir, "buildpack.toml"),
"--output", "some-output",
"--version", "some-version",
}))
})

context("when cache is set to true", func() {
it("creates a correct pexec.Execution", func() {
err := packingTools.Execute(buildpackDir, "some-output", "some-version", true)
Expect(err).NotTo(HaveOccurred())

Expect(executable.ExecuteCall.Receives.Execution.Args).To(Equal([]string{
"pack",
"--buildpack", filepath.Join(buildpackDir, "buildpack.toml"),
"--output", "some-output",
"--version", "some-version",
"--offline",
}))
})
})

context("failure cases", func() {
context("when the buildpack is not a packit buildpack", func() {
it.Before(func() {
os.Remove(filepath.Join(buildpackDir, ".packit"))
})

it("returns an error", func() {
err := packingTools.Execute("fake-dir/", "", "", false)
err := packingTools.Execute(buildpackDir, "some-output", "some-version", true)
Expect(err).To(MatchError(ContainSubstring("unable to find .packit in buildpack directory:")))
Expect(err).To(MatchError(ContainSubstring("no such file or directory")))
})
})

context("when the execution returns an error", func() {
it.Before(func() {
executable.ExecuteCall.Returns.Error = errors.New("some error")
})
it("returns an error", func() {
err := packingTools.Execute(buildpackDir, "some-output", "some-version", true)
Expect(err).To(MatchError("some error"))
})
})
})
})
}

0 comments on commit a995f35

Please sign in to comment.