Skip to content

Commit

Permalink
Merge pull request #603 from cloudfoundry/vendor-prefix
Browse files Browse the repository at this point in the history
  • Loading branch information
rkoster authored Nov 29, 2022
2 parents d61f116 + 15e3389 commit a3bcca5
Show file tree
Hide file tree
Showing 10 changed files with 96 additions and 24 deletions.
1 change: 1 addition & 0 deletions cmd/opts/opts.go
Original file line number Diff line number Diff line change
Expand Up @@ -1019,6 +1019,7 @@ type VendorPackageOpts struct {
Args VendorPackageArgs `positional-args:"true" required:"true"`

Directory DirOrCWDArg `long:"dir" description:"Release directory path if not current working directory" default:"."`
Prefix string `long:"prefix" description:"Prefix to add to the package name" default:""`

cmd
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/vendor_package.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func (c VendorPackageCmd) Run(opts VendorPackageOpts) error {

for _, pkg := range srcRelease.Packages() {
if pkg.Name() == opts.Args.PackageName {
return dstReleaseDir.VendorPackage(pkg)
return dstReleaseDir.VendorPackage(pkg, opts.Prefix)
}
}

Expand Down
10 changes: 8 additions & 2 deletions release/pkg/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ func (a ByName) Less(i, j int) bool { return a[i].Name() < a[j].Name() }

type Package struct {
resource Resource
prefix string

Dependencies []*Package
dependencyNames []string
Expand Down Expand Up @@ -63,7 +64,10 @@ func (p *Package) RehashWithCalculator(calculator crypto.DigestCalculator, archi
}

func (p *Package) Build(dev, final ArchiveIndex) error { return p.resource.Build(dev, final) }
func (p *Package) Finalize(final ArchiveIndex) error { return p.resource.Finalize(final) }
func (p *Package) Finalize(final ArchiveIndex) error {
p.resource.Prefix(p.prefix)
return p.resource.Finalize(final)
}

func (p *Package) AttachDependencies(packages []*Package) error {
for _, pkgName := range p.dependencyNames {
Expand Down Expand Up @@ -99,7 +103,9 @@ func (p *Package) Deps() []Compilable {
func (p *Package) IsCompiled() bool { return false }

func (p *Package) ExtractedPath() string { return p.extractedPath }

func (p *Package) Prefix(prefix string) {
p.prefix = prefix
}
func (p *Package) CleanUp() error {
if p.fs != nil && len(p.extractedPath) > 0 {
return p.fs.RemoveAll(p.extractedPath)
Expand Down
1 change: 1 addition & 0 deletions release/resource/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ type ArchiveIndex interface {

type Resource interface {
Name() string
Prefix(prefix string)
Fingerprint() string

ArchivePath() string
Expand Down
20 changes: 15 additions & 5 deletions release/resource/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (

type ResourceImpl struct {
name string
prefix string
fingerprint string

archivePath string
Expand Down Expand Up @@ -52,21 +53,29 @@ func NewResourceWithBuiltArchive(name, fp, path, sha1 string) *ResourceImpl {
}
}

func (r *ResourceImpl) Name() string { return r.name }
func (r *ResourceImpl) Name() string {
if r.prefix != "" {
return fmt.Sprintf("%s-%s", r.prefix, r.name)
}
return r.name
}
func (r *ResourceImpl) Prefix(prefix string) {
r.prefix = prefix
}
func (r *ResourceImpl) Fingerprint() string { return r.fingerprint }

func (r *ResourceImpl) ArchivePath() string {
if len(r.archivePath) == 0 {
errMsg := "Internal inconsistency: Resource '%s/%s' must be found or built before getting its archive path"
panic(fmt.Sprintf(errMsg, r.name, r.fingerprint))
panic(fmt.Sprintf(errMsg, r.Name(), r.fingerprint))
}
return r.archivePath
}

func (r *ResourceImpl) ArchiveDigest() string {
if len(r.archiveDigest) == 0 {
errMsg := "Internal inconsistency: Resource '%s/%s' must be found or built before getting its archive SHA1"
panic(fmt.Sprintf(errMsg, r.name, r.fingerprint))
panic(fmt.Sprintf(errMsg, r.Name(), r.fingerprint))
}
return r.archiveDigest
}
Expand Down Expand Up @@ -107,15 +116,16 @@ func (r *ResourceImpl) Build(devIndex, finalIndex ArchiveIndex) error {
}

func (r *ResourceImpl) Finalize(finalIndex ArchiveIndex) error {
finalPath, finalSHA1, err := finalIndex.Find(r.name, r.fingerprint)
finalPath, finalSHA1, err := finalIndex.Find(r.Name(), r.fingerprint)
if err != nil {
return err
} else if len(finalPath) > 0 {

r.attachArchive(finalPath, finalSHA1)
return nil
}

_, _, err = finalIndex.Add(r.name, r.fingerprint, r.ArchivePath(), r.ArchiveDigest())
_, _, err = finalIndex.Add(r.Name(), r.fingerprint, r.ArchivePath(), r.ArchiveDigest())
de, ok := err.(duplicateError)
if ok && de.IsDuplicate() {
return r.Finalize(finalIndex)
Expand Down
39 changes: 39 additions & 0 deletions release/resource/resourcefakes/fake_resource.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions releasedir/fs_release_dir.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,13 +236,14 @@ func (d FSReleaseDir) BuildRelease(name string, version semver.Version, force bo
return release, nil
}

func (d FSReleaseDir) VendorPackage(pkg *boshpkg.Package) error {
func (d FSReleaseDir) VendorPackage(pkg *boshpkg.Package, prefix string) error {
allInterestingPkgs := map[*boshpkg.Package]struct{}{}

d.collectDependentPackages(pkg, allInterestingPkgs)

for pkg2 := range allInterestingPkgs {
pkg2.Prefix(prefix)
err := pkg2.Finalize(d.finalIndicies.Packages)

if err != nil {
return bosherr.WrapErrorf(err, "Finalizing vendored package")
}
Expand Down
22 changes: 17 additions & 5 deletions releasedir/fs_release_dir_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
boshman "github.com/cloudfoundry/bosh-cli/v7/release/manifest"
boshpkg "github.com/cloudfoundry/bosh-cli/v7/release/pkg"
fakerel "github.com/cloudfoundry/bosh-cli/v7/release/releasefakes"
"github.com/cloudfoundry/bosh-cli/v7/release/resource"
fakeres "github.com/cloudfoundry/bosh-cli/v7/release/resource/resourcefakes"
. "github.com/cloudfoundry/bosh-cli/v7/releasedir"
fakereldir "github.com/cloudfoundry/bosh-cli/v7/releasedir/releasedirfakes"
Expand Down Expand Up @@ -662,7 +663,7 @@ var _ = Describe("FSGenerator", func() {
Expect(fs.WriteFileString("/dir/packages/pkg1-name/packaging", "old-packaging")).ToNot(HaveOccurred())
Expect(fs.WriteFileString("/dir/packages/pkg2-name/spec.lock", "old-spec-lock")).ToNot(HaveOccurred())

err = releaseDir.VendorPackage(pkg1)
err = releaseDir.VendorPackage(pkg1, "")
Expect(err).ToNot(HaveOccurred())

// recorded files
Expand Down Expand Up @@ -707,6 +708,17 @@ fingerprint: pkg4-fp
Expect(pkg4Res.FinalizeArgsForCall(0) == finalIndicies.Packages).To(BeTrue())
})

It("finalize given package with prefix", func() {
pkg1Res := resource.NewResourceWithBuiltArchive("pkg1-name", "pkg1-fp", "/test/something", "something")
pkg1 := boshpkg.NewPackage(pkg1Res, nil)

err := releaseDir.VendorPackage(pkg1, "prefix")
Expect(err).ToNot(HaveOccurred())
Expect(fs.ReadFileString("/dir/packages/prefix-pkg1-name/spec.lock")).To(Equal(`name: prefix-pkg1-name
fingerprint: pkg1-fp
`))
})

It("returns error if package finalize fails", func() {
pkg1Res := &fakeres.FakeResource{
NameStub: func() string { return "pkg1-name" },
Expand All @@ -716,7 +728,7 @@ fingerprint: pkg4-fp

pkg1Res.FinalizeReturns(errors.New("fake-err"))

err := releaseDir.VendorPackage(pkg1)
err := releaseDir.VendorPackage(pkg1, "")
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("fake-err"))
})
Expand All @@ -730,7 +742,7 @@ fingerprint: pkg4-fp

fs.RemoveAllStub = func(path string) error { return errors.New("fake-err") }

err := releaseDir.VendorPackage(pkg1)
err := releaseDir.VendorPackage(pkg1, "")
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("fake-err"))
})
Expand All @@ -741,7 +753,7 @@ fingerprint: pkg4-fp
}
pkg1 := boshpkg.NewPackage(pkg1Res, nil)

err := releaseDir.VendorPackage(pkg1)
err := releaseDir.VendorPackage(pkg1, "")
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("Marshaling vendored package 'pkg1-name' spec lock"))
})
Expand All @@ -755,7 +767,7 @@ fingerprint: pkg4-fp

fs.WriteFileErrors["/dir/packages/pkg1-name/spec.lock"] = errors.New("fake-err")

err := releaseDir.VendorPackage(pkg1)
err := releaseDir.VendorPackage(pkg1, "")
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("fake-err"))
})
Expand Down
2 changes: 1 addition & 1 deletion releasedir/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ type ReleaseDir interface {
// BuildRelease builds a new version of the Release
// from the release directory by looking at jobs, packages, etc. directories.
BuildRelease(name string, version semver.Version, force bool) (boshrel.Release, error)
VendorPackage(*boshpkg.Package) error
VendorPackage(pkg *boshpkg.Package, prefix string) error

// FinalizeRelease adds the Release to the final list so that it's consumable by others.
FinalizeRelease(release boshrel.Release, force bool) error
Expand Down
18 changes: 10 additions & 8 deletions releasedir/releasedirfakes/fake_release_dir.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit a3bcca5

Please sign in to comment.