Skip to content

Commit 391e101

Browse files
committed
Consider the greatest version matching the constraints first
1 parent 5407d65 commit 391e101

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

resolver.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
package semver
88

9+
import "sort"
10+
911
// Dependency represents a dependency, it must provide methods to return Name and Constraints
1012
type Dependency interface {
1113
GetName() string
@@ -37,6 +39,14 @@ func (set Releases) FilterBy(dep Dependency) Releases {
3739
return res
3840
}
3941

42+
// SortDescent sort the Releases in this set in descending order (the lastest
43+
// release is the first)
44+
func (set Releases) SortDescent() {
45+
sort.Slice(set, func(i, j int) bool {
46+
return set[i].GetVersion().GreaterThan(set[j].GetVersion())
47+
})
48+
}
49+
4050
// Archive contains all Releases set to consider for dependency resolution
4151
type Archive struct {
4252
Releases map[string]Releases
@@ -78,6 +88,10 @@ func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependen
7888

7989
// Otherwise start backtracking the dependency
8090
releases := ar.Releases[dep.GetName()].FilterBy(dep)
91+
92+
// Consider the latest versions first
93+
releases.SortDescent()
94+
8195
debug("releases matching criteria: %s", releases)
8296
for _, release := range releases {
8397
debug("try with %s %s", release, release.GetDependencies())

resolver_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,16 @@ func TestResolver(t *testing.T) {
9090
c100 := rel("C", "1.0.0", deps())
9191
c021 := rel("C", "0.2.1", deps())
9292
c020 := rel("C", "0.2.0", deps())
93-
c010 := rel("C", "0.1.0", deps())
93+
c010 := rel("C", "0.1.0", deps("D"))
94+
d100 := rel("D", "1.0.0", deps())
95+
d120 := rel("D", "1.2.0", deps("E"))
96+
e100 := rel("E", "1.0.0", deps())
9497
arch := &Archive{
9598
Releases: map[string]Releases{
9699
"B": Releases{b131, b130, b121, b120, b111, b110, b100},
97100
"C": Releases{c200, c120, c111, c110, c102, c101, c100, c021, c020, c010},
101+
"D": Releases{d100, d120},
102+
"E": Releases{e100},
98103
},
99104
}
100105

@@ -127,4 +132,10 @@ func TestResolver(t *testing.T) {
127132
r4 := arch.Resolve(a120)
128133
require.Nil(t, r4)
129134
fmt.Println(r4)
135+
136+
r5 := arch.Resolve(c010)
137+
require.Contains(t, r5, c010)
138+
require.Contains(t, r5, d120)
139+
require.Contains(t, r5, e100)
140+
fmt.Println(r5)
130141
}

0 commit comments

Comments
 (0)