Skip to content

Commit c7e4266

Browse files
Merge pull request #1654 from benluddy/error-duplicated-solver-inputs
Return an error when solver input contains duplicate identifiers.
2 parents 171bd7e + e39f593 commit c7e4266

File tree

4 files changed

+27
-6
lines changed

4 files changed

+27
-6
lines changed

pkg/controller/registry/resolver/solver/lit_mapping.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ import (
99
"github.com/irifrance/gini/z"
1010
)
1111

12+
type DuplicateIdentifier Identifier
13+
14+
func (e DuplicateIdentifier) Error() string {
15+
return fmt.Sprintf("duplicate identifier %q in input", Identifier(e))
16+
}
17+
1218
type inconsistentLitMapping []error
1319

1420
func (inconsistentLitMapping) Error() string {
@@ -32,7 +38,7 @@ type litMapping struct {
3238
// the provided slice of Installables. This includes construction of
3339
// the translation tables between Installables/Constraints and the
3440
// inputs to the underlying solver.
35-
func newLitMapping(installables []Installable) *litMapping {
41+
func newLitMapping(installables []Installable) (*litMapping, error) {
3642
d := litMapping{
3743
inorder: installables,
3844
installables: make(map[z.Lit]Installable, len(installables)),
@@ -44,6 +50,9 @@ func newLitMapping(installables []Installable) *litMapping {
4450
// First pass to assign lits:
4551
for _, installable := range installables {
4652
im := d.c.Lit()
53+
if _, ok := d.lits[installable.Identifier()]; ok {
54+
return nil, DuplicateIdentifier(installable.Identifier())
55+
}
4756
d.lits[installable.Identifier()] = im
4857
d.installables[im] = installable
4958
}
@@ -65,7 +74,7 @@ func newLitMapping(installables []Installable) *litMapping {
6574
}
6675
}
6776

68-
return &d
77+
return &d, nil
6978
}
7079

7180
// LitOf returns the positive literal corresponding to the Installable

pkg/controller/registry/resolver/solver/search_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ func TestSearch(t *testing.T) {
7979
var depth int
8080
counter := &TestScopeCounter{depth: &depth, S: &s}
8181

82-
lits := newLitMapping(tt.Installables)
82+
lits, err := newLitMapping(tt.Installables)
83+
assert.NoError(err)
8384
h := search{
8485
s: counter,
8586
lits: lits,

pkg/controller/registry/resolver/solver/solve.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,9 @@ type Option func(s *solver) error
131131

132132
func WithInput(input []Installable) Option {
133133
return func(s *solver) error {
134-
s.litMap = newLitMapping(input)
135-
return nil
134+
var err error
135+
s.litMap, err = newLitMapping(input)
136+
return err
136137
}
137138
}
138139

@@ -146,7 +147,9 @@ func WithTracer(t Tracer) Option {
146147
var defaults = []Option{
147148
func(s *solver) error {
148149
if s.litMap == nil {
149-
s.litMap = newLitMapping(nil)
150+
var err error
151+
s.litMap, err = newLitMapping(nil)
152+
return err
150153
}
151154
return nil
152155
},

pkg/controller/registry/resolver/solver/solve_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,3 +353,11 @@ func TestSolve(t *testing.T) {
353353
})
354354
}
355355
}
356+
357+
func TestDuplicateIdentifier(t *testing.T) {
358+
_, err := New(WithInput([]Installable{
359+
installable("a"),
360+
installable("a"),
361+
}))
362+
assert.Equal(t, DuplicateIdentifier("a"), err)
363+
}

0 commit comments

Comments
 (0)