diff --git a/scribe/emitter.go b/scribe/emitter.go index 11788789..fe2b7a59 100644 --- a/scribe/emitter.go +++ b/scribe/emitter.go @@ -2,6 +2,7 @@ package scribe import ( "io" + "strconv" "time" "github.com/paketo-buildpacks/packit" @@ -41,3 +42,44 @@ func (e Emitter) SelectedDependency(entry packit.BuildpackPlanEntry, dependency } e.Break() } + +func (e Emitter) Candidates(entries []packit.BuildpackPlanEntry) { + e.Subprocess("Candidate version sources (in priority order):") + + var ( + sources [][2]string + maxLen int + ) + +Entries: + for _, entry := range entries { + versionSource, ok := entry.Metadata["version-source"].(string) + if !ok { + versionSource = "" + } + + if len(versionSource) > maxLen { + maxLen = len(versionSource) + } + + version, ok := entry.Metadata["version"].(string) + if !ok { + version = "" + } + + source := [2]string{versionSource, version} + for _, s := range sources { + if s == source { + continue Entries + } + } + + sources = append(sources, source) + } + + for _, source := range sources { + e.Action(("%-" + strconv.Itoa(maxLen) + "s -> %q"), source[0], source[1]) + } + + e.Break() +} diff --git a/scribe/emitter_test.go b/scribe/emitter_test.go index a05db642..e1606171 100644 --- a/scribe/emitter_test.go +++ b/scribe/emitter_test.go @@ -118,4 +118,75 @@ func testEmitter(t *testing.T, context spec.G, it spec.S) { }) }) }) + + context("Candidates", func() { + it("logs the candidate entries", func() { + emitter.Candidates([]packit.BuildpackPlanEntry{ + { + Metadata: map[string]interface{}{ + "version-source": "some-source", + "version": "some-version", + }, + }, + { + Metadata: map[string]interface{}{ + "version": "other-version", + }, + }, + }) + Expect(buffer.String()).To(Equal(` Candidate version sources (in priority order): + some-source -> "some-version" + -> "other-version" + +`)) + }) + + context("when there are deuplicate version sources with the same version", func() { + it("logs the candidate entries and removes duplicates", func() { + emitter.Candidates([]packit.BuildpackPlanEntry{ + { + Metadata: map[string]interface{}{ + "version-source": "some-source", + "version": "some-version", + }, + }, + { + Metadata: map[string]interface{}{ + "version-source": "some-source", + "version": "other-version", + }, + }, + { + Metadata: map[string]interface{}{ + "version-source": "other-source", + "version": "some-version", + }, + }, + { + Metadata: map[string]interface{}{ + "version": "other-version", + }, + }, + { + Metadata: map[string]interface{}{ + "version": "other-version", + }, + }, + { + Metadata: map[string]interface{}{ + "version-source": "some-source", + "version": "some-version", + }, + }, + }) + Expect(buffer.String()).To(Equal(` Candidate version sources (in priority order): + some-source -> "some-version" + some-source -> "other-version" + other-source -> "some-version" + -> "other-version" + +`), buffer.String()) + }) + }) + }) }