diff --git a/pkg/reducer/helper_test.go b/pkg/reducer/helper_test.go index 8a166c1..d192616 100644 --- a/pkg/reducer/helper_test.go +++ b/pkg/reducer/helper_test.go @@ -2,8 +2,19 @@ package reducer import ( "github.com/rmohr/bazeldnf/pkg/api" + "github.com/rmohr/bazeldnf/pkg/api/bazeldnf" ) +func withRepository(packages []api.Package) []api.Package{ + r := []api.Package{} + for _, p := range packages { + p.Repository = &bazeldnf.Repository{} + r = append(r, p) + } + + return r +} + func newPackageList(names ...string) []api.Package { r := []api.Package{} for _, name := range names { diff --git a/pkg/reducer/reducer.go b/pkg/reducer/reducer.go index b998271..6cf7947 100644 --- a/pkg/reducer/reducer.go +++ b/pkg/reducer/reducer.go @@ -50,15 +50,17 @@ func (r *RepoReducer) Resolve(packages []string) (matched []string, involved []* return nil, nil, fmt.Errorf("Package %s does not exist", req) } - if len(candidates) > 0 { - selected := candidates[0] - for _, p := range candidates { + for i, p := range candidates { + if selected, ok := discovered[p.String()]; !ok { + discovered[p.String()] = candidates[i] + } else { if selected.Repository.Priority > p.Repository.Priority { - selected = p + discovered[p.String()] = candidates[i] } } + } - discovered[selected.String()] = selected + if len(candidates) > 0 { matched = append(matched, candidates[0].Name) } } diff --git a/pkg/reducer/reducer_test.go b/pkg/reducer/reducer_test.go index 4be79c8..88a7cda 100644 --- a/pkg/reducer/reducer_test.go +++ b/pkg/reducer/reducer_test.go @@ -5,6 +5,7 @@ import ( . "github.com/onsi/gomega" "github.com/rmohr/bazeldnf/pkg/api" + "github.com/rmohr/bazeldnf/pkg/api/bazeldnf" ) type MockPackageLoader struct { @@ -59,7 +60,7 @@ func TestReducerOnlyImplicitRequires(t *testing.T) { g := NewGomegaWithT(t) packageInfo := packageInfo{ - packages: newPackageList("foo"), + packages: withRepository(newPackageList("foo")), } matched, involved, err := resolve(&packageInfo, []string{}, []string{"foo"}) @@ -71,7 +72,7 @@ func TestReducerOnlyImplicitRequires(t *testing.T) { func TestReducerSingleCandidate(t *testing.T) { g := NewGomegaWithT(t) - packages := newPackageList("bar") + packages := withRepository(newPackageList("bar")) packageInfo := packageInfo{packages: packages} matched, involved, err := resolve(&packageInfo, []string{"bar"}, []string{}) @@ -84,7 +85,7 @@ func TestReducerSingleCandidate(t *testing.T) { func TestReducerMultipleCandidates(t *testing.T) { g := NewGomegaWithT(t) packageNames := []string{"foo", "bar", "baz"} - packages := newPackageList(packageNames...) + packages := withRepository(newPackageList(packageNames...)) packageInfo := packageInfo{packages: packages} matched, involved, err := resolve(&packageInfo, packageNames, []string{}) @@ -96,7 +97,7 @@ func TestReducerMultipleCandidates(t *testing.T) { func TestReducerMultipleNameMatch(t *testing.T) { g := NewGomegaWithT(t) - packages := newPackageList("foo", "foo", "bar") + packages := withRepository(newPackageList("foo", "foo", "bar")) packages[0].Version = api.Version{Epoch: "1"} packageInfo := packageInfo{packages: packages} @@ -108,9 +109,9 @@ func TestReducerMultipleNameMatch(t *testing.T) { func TestReducerRequiresMissingProvides(t *testing.T) { g := NewGomegaWithT(t) - packages := []api.Package{ + packages := withRepository([]api.Package{ newPackageWithDeps("foo", []string{"bar"}, nil), - } + }) packageInfo := packageInfo{packages: packages} matched, involved, err := resolve(&packageInfo, []string{"foo"}, []string{}) @@ -121,10 +122,10 @@ func TestReducerRequiresMissingProvides(t *testing.T) { func TestReducerRequiresFoundProvides(t *testing.T) { g := NewGomegaWithT(t) - packages := []api.Package{ + packages := withRepository([]api.Package{ newPackageWithDeps("foo", []string{"bar"}, nil), newPackage("bar"), - } + }) packageInfo := packageInfo{ packages: packages, provides: map[string][]*api.Package{ @@ -140,12 +141,12 @@ func TestReducerRequiresFoundProvides(t *testing.T) { func TestReducerRequiresFoundMultipleProvides(t *testing.T) { g := NewGomegaWithT(t) - packages := []api.Package{ + packages := withRepository([]api.Package{ newPackageWithDeps("foo", []string{"baz", "bam"}, nil), newPackage("baz"), newPackage("bam"), - } - + }) + packageInfo := packageInfo{ packages: packages, provides: map[string][]*api.Package{ @@ -162,11 +163,11 @@ func TestReducerRequiresFoundMultipleProvides(t *testing.T) { func TestReducerRequiresFoundMultipleProvidesInOne(t *testing.T) { g := NewGomegaWithT(t) - packages := []api.Package{ + packages := withRepository([]api.Package{ newPackageWithDeps("foo", []string{"baz", "bam"}, nil), newPackage("baz"), newPackage("bam"), - } + }) packageInfo := packageInfo{ packages: packages, @@ -183,11 +184,11 @@ func TestReducerRequiresFoundMultipleProvidesInOne(t *testing.T) { func TestReducerMultiLevelRequires(t *testing.T) { g := NewGomegaWithT(t) - packages := []api.Package{ + packages := withRepository([]api.Package{ newPackageWithDeps("foo", []string{"baz"}, nil), newPackageWithDeps("baz", []string{"bam"}, nil), newPackage("bam"), - } + }) packageInfo := packageInfo{ packages: packages, @@ -206,13 +207,13 @@ func TestReducerMultiLevelRequires(t *testing.T) { func TestReducerExcludePinnedDependency(t *testing.T) { g := NewGomegaWithT(t) pinned := newPackage("bar") - pinned.Version = api.Version{Epoch:"1"} - - packages := []api.Package{ + pinned.Version = api.Version{Epoch: "1"} + + packages := withRepository([]api.Package{ newPackageWithDeps("foo", []string{"bar"}, nil), newPackage("bar"), - } - + }) + packageInfo := packageInfo{ packages: packages, provides: map[string][]*api.Package{ @@ -227,11 +228,12 @@ func TestReducerExcludePinnedDependency(t *testing.T) { } func TestInvolvedProvidesIsNotRequiredOrSelf(t *testing.T) { - g:= NewGomegaWithT(t) - packages := []api.Package{ + g := NewGomegaWithT(t) + packages := withRepository([]api.Package{ newPackageWithDeps("foo", nil, []string{"bar"}), - } + }) expectedPackage := newPackageWithDeps("foo", nil, []string{}) + expectedPackage.Repository = &bazeldnf.Repository{} packageInfo := packageInfo{packages: packages} matched, involved, err := resolve(&packageInfo, []string{"foo"}, []string{}) @@ -241,11 +243,13 @@ func TestInvolvedProvidesIsNotRequiredOrSelf(t *testing.T) { } func TestInvolvedProvidesIsSelf(t *testing.T) { - g:= NewGomegaWithT(t) - packages := []api.Package{ + g := NewGomegaWithT(t) + packages := withRepository([]api.Package{ newPackageWithDeps("foo", nil, []string{"foo"}), - } + }) expectedPackage := newPackageWithDeps("foo", nil, []string{"foo"}) + expectedPackage.Repository = &bazeldnf.Repository{} + packageInfo := packageInfo{packages: packages} matched, involved, err := resolve(&packageInfo, []string{"foo"}, []string{}) @@ -253,3 +257,36 @@ func TestInvolvedProvidesIsSelf(t *testing.T) { g.Expect(matched).Should(ConsistOf("foo")) g.Expect(involved).Should(ConsistOf(&expectedPackage)) } + +func TestRepositoryPriority(t *testing.T) { + g := NewGomegaWithT(t) + packages := withRepository(newPackageList("bar", "bar")) + packages[0].Repository.Priority = 2 + packages[1].Repository.Priority = 1 + packages[1].Summary = "I'm the one" + + packageInfo := packageInfo{packages: packages} + + matched, involved, err := resolve(&packageInfo, []string{"bar"}, []string{}) + + g.Expect(err).Should(BeNil()) + g.Expect(matched).Should(ConsistOf("bar")) + g.Expect(involved).Should(ConsistOf(&packages[1])) +} + +func TestRepositoryPriorityWithVersion(t *testing.T) { + g := NewGomegaWithT(t) + packages := withRepository(newPackageList("bar", "bar", "bar")) + packages[0].Repository.Priority = 2 + packages[1].Repository.Priority = 1 + packages[1].Summary = "I'm the one" + packages[2].Version = api.Version{Epoch: "3"} + + packageInfo := packageInfo{packages: packages} + + matched, involved, err := resolve(&packageInfo, []string{"bar"}, []string{}) + + g.Expect(err).Should(BeNil()) + g.Expect(matched).Should(ConsistOf("bar")) + g.Expect(involved).Should(ConsistOf(&packages[1], &packages[2])) +}