Skip to content

Commit eeea52c

Browse files
committed
First attempt on solving the issue
1 parent 6e5e067 commit eeea52c

9 files changed

+185
-16
lines changed

Diff for: src/Paket.Core/Dependencies/PackageResolver.fs

+38-11
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,11 @@ type GetPackageDetailsParameters =
4444
GetPackageDetailsParameters.ofParamsEx false sources groupName packageName version
4545

4646
type GetPackageVersionsParameters =
47-
{ Package : SourcePackageInfo }
48-
static member ofParams sources groupName packageName =
47+
{ Package : SourcePackageInfo
48+
MinVersion : SemVerInfo option }
49+
static member ofParams sources groupName packageName minVersion =
4950
SourcePackageInfo.ofParams sources groupName packageName
50-
|> fun p -> { Package = p }
51+
|> fun p -> { Package = p; MinVersion = minVersion }
5152

5253
type PackageDetailsFunc = GetPackageDetailsParameters -> Async<PackageDetails>
5354
type PackageDetailsSyncFunc = GetPackageDetailsParameters -> PackageDetails
@@ -585,7 +586,8 @@ let private getCompatibleVersions
585586
let resolverStrategy = getResolverStrategy globalStrategyForDirectDependencies globalStrategyForTransitives rootDependencies allRequirementsOfCurrentPackage currentRequirement
586587

587588
let allVersions =
588-
getVersionsF resolverStrategy (GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName currentRequirement.Name)
589+
let versionParams = GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName currentRequirement.Name currentRequirement.MinVersionSetting
590+
getVersionsF resolverStrategy versionParams
589591
|> Seq.map (fun (v, sources) -> VersionCache.ofParams v sources false)
590592

591593
match currentRequirement.VersionRequirement.Range with
@@ -1079,8 +1081,26 @@ let Resolve (getVersionsRaw : PackageVersionsFunc, getPreferredVersionsRaw : Pre
10791081
let sorted =
10801082
match resolverStrategy with
10811083
| ResolverStrategy.Max -> List.sortDescending versions
1082-
| ResolverStrategy.LatestPatch -> List.sortDescending versions
1083-
| ResolverStrategy.LatestMinor -> List.sortDescending versions
1084+
| ResolverStrategy.LatestPatch ->
1085+
match versionParams.MinVersion with
1086+
| Some minVersion ->
1087+
let preferred =
1088+
versions
1089+
|> List.filter (fun (v,s) -> v.Major = minVersion.Major && v.Minor = minVersion.Minor)
1090+
|> List.sortDescending
1091+
1092+
preferred @ List.sortDescending versions
1093+
| None -> List.sortDescending versions
1094+
| ResolverStrategy.LatestMinor ->
1095+
match versionParams.MinVersion with
1096+
| Some minVersion ->
1097+
let preferred =
1098+
versions
1099+
|> List.filter (fun (v,s) -> v.Major = minVersion.Major)
1100+
|> List.sortDescending
1101+
1102+
preferred @ List.sortDescending versions
1103+
| None -> List.sortDescending versions
10841104
| ResolverStrategy.Min -> List.sort versions
10851105

10861106
yield! sorted }
@@ -1176,7 +1196,8 @@ let Resolve (getVersionsRaw : PackageVersionsFunc, getPreferredVersionsRaw : Pre
11761196

11771197
let currentConflict =
11781198
let getVersionsF packName =
1179-
getVersionsBlock ResolverStrategy.Max (GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName packName) currentStep
1199+
let versionParameters = GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName packName currentRequirement.MinVersionSetting
1200+
getVersionsBlock ResolverStrategy.Max versionParameters currentStep
11801201

11811202
if Seq.isEmpty conflicts then
11821203
{ currentConflict with
@@ -1298,7 +1319,8 @@ let Resolve (getVersionsRaw : PackageVersionsFunc, getPreferredVersionsRaw : Pre
12981319
if not alreadyExplored then
12991320
for (pack,verReq,restr) in exploredPackage.Dependencies do
13001321
async {
1301-
let requestVersions = startRequestGetVersions (GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName pack)
1322+
let versionParameters = GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName pack currentRequirement.MinVersionSetting
1323+
let requestVersions = startRequestGetVersions versionParameters
13021324
requestVersions.Work.TryReprioritize true WorkPriority.LikelyRequired
13031325
let! versions = (requestVersions).Work.Task |> Async.AwaitTask
13041326
// Preload the first version in range of this requirement
@@ -1371,7 +1393,8 @@ let Resolve (getVersionsRaw : PackageVersionsFunc, getPreferredVersionsRaw : Pre
13711393
step (Step((currentConflict,nextStep,currentRequirement), (currentConflict,currentStep,currentRequirement,compatibleVersions,flags)::priorConflictSteps)) stackpack currentConflict.VersionsToExplore flags
13721394
else
13731395
let getVersionsF packName =
1374-
getVersionsBlock ResolverStrategy.Max (GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName packName) currentStep
1396+
let versionParameters = GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName packName currentRequirement.MinVersionSetting
1397+
getVersionsBlock ResolverStrategy.Max versionParameters currentStep
13751398

13761399
let conflictingPackageName,vr =
13771400
match Seq.tryHead conflictingResolvedPackages with
@@ -1401,13 +1424,17 @@ let Resolve (getVersionsRaw : PackageVersionsFunc, getPreferredVersionsRaw : Pre
14011424
}
14021425

14031426
for openReq in startingStep.OpenRequirements do
1404-
startRequestGetVersions (GetPackageVersionsParameters.ofParams openReq.Sources groupName openReq.Name)
1427+
let versionParamters = GetPackageVersionsParameters.ofParams openReq.Sources groupName openReq.Name openReq.MinVersionSetting
1428+
startRequestGetVersions versionParamters
14051429
|> ignore
14061430

14071431
let currentRequirement = getCurrentRequirement packageFilter startingStep.OpenRequirements (Dictionary())
14081432

14091433
let status =
1410-
let getVersionsF packName = getVersionsBlock ResolverStrategy.Max (GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName packName) startingStep
1434+
let getVersionsF packName =
1435+
let versionParameters = GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName packName currentRequirement.MinVersionSetting
1436+
getVersionsBlock ResolverStrategy.Max versionParameters startingStep
1437+
14111438
ResolutionRaw.ConflictRaw { ResolveStep = startingStep; RequirementSet = Set.empty; Requirement = currentRequirement; GetPackageVersions = getVersionsF }
14121439

14131440

Diff for: src/Paket.Core/PublicAPI.fs

+2-1
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,8 @@ type Dependencies(dependenciesFileName: string) =
720720
|> List.distinct
721721

722722
let versions =
723-
NuGet.GetVersions true alternativeProjectRoot root (GetPackageVersionsParameters.ofParams sources (GroupName "") (PackageName name))
723+
let versionParameters = GetPackageVersionsParameters.ofParams sources (GroupName "") (PackageName name) None
724+
NuGet.GetVersions true alternativeProjectRoot root versionParameters
724725
|> Async.RunSynchronously
725726
|> List.map (fun (v,_) -> v.ToString())
726727
|> List.toArray

Diff for: src/Paket.Core/Versioning/Requirements.fs

+12
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,18 @@ type PackageRequirement =
12201220

12211221
member this.Depth = this.Graph.Count
12221222

1223+
member this.MinVersionSetting =
1224+
match this.VersionRequirement with
1225+
| VersionRequirement(v,_) ->
1226+
match v with
1227+
| Minimum v -> Some v
1228+
| GreaterThan v -> Some v
1229+
| Maximum _ -> None
1230+
| LessThan _ -> None
1231+
| Specific v -> Some v
1232+
| OverrideAll _ -> None
1233+
| Range(_,v,_,_) -> Some v
1234+
12231235
member this.SettingString = (sprintf "%O %s %s %O %s" this.VersionRequirement (if this.ResolverStrategyForTransitives.IsSome then (sprintf "%O" this.ResolverStrategyForTransitives) else "") (if this.ResolverStrategyForDirectDependencies.IsSome then (sprintf "%O" this.ResolverStrategyForDirectDependencies) else "") this.Settings (if this.TransitivePrereleases then "TransitivePrereleases-true" else ""))
12241236

12251237
member this.HasPackageSettings = String.IsNullOrWhiteSpace this.SettingString |> not

Diff for: tests/Paket.Tests/Paket.Tests.fsproj

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
<Compile Include="Resolver\AddingDependenciesSpecs.fs" />
107107
<Compile Include="Resolver\GlobalPessimisticStrategySpecs.fs" />
108108
<Compile Include="Resolver\GlobalOptimisticStrategySpecs.fs" />
109+
<Compile Include="Resolver\GlobalKeepLatestPatchStrategySpecs.fs" />
109110
<Compile Include="Resolver\StrategySpecs.fs" />
110111
<Compile Include="Resolver\PropertyTestGenerators.fs" />
111112
<Compile Include="Resolver\PropertyTests.fs" />

Diff for: tests/Paket.Tests/Resolver/DependencyGroupsAndRestrictions.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module DependencyGroupsAndRestrictions
1+
module Paket.Resolver.DependencyGroupsAndRestrictions
22

33
open Paket
44
open NUnit.Framework
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
module Paket.Resolver.GlobalKeepLatestPatchStrategySpecs
2+
3+
open Paket
4+
open NUnit.Framework
5+
open FsUnit
6+
open TestHelpers
7+
open Paket.Domain
8+
open Paket.PackageResolver
9+
10+
let resolve graph updateMode (cfg : DependenciesFile) =
11+
let groups = [Constants.MainDependencyGroup, None ] |> Map.ofSeq
12+
cfg.Resolve(true,noSha1,VersionsFromGraphAsSeq graph, (fun _ _ -> []),PackageDetailsFromGraph graph,(fun _ _ _ -> None),groups,updateMode).[Constants.MainDependencyGroup].ResolvedPackages.GetModelOrFail()
13+
14+
let graph =
15+
OfSimpleGraph [
16+
"Nancy.Bootstrappers.Windsor","0.23",["Castle.Windsor",VersionRequirement(VersionRange.AtLeast "3.2.1",PreReleaseStatus.No)]
17+
"Castle.Windsor","3.2.1",[]
18+
"Castle.Windsor","3.2.2",[]
19+
"Castle.Windsor","3.3.0",[]
20+
"Castle.Windsor","4.1.0",[]
21+
]
22+
23+
let config1 = sprintf """
24+
strategy %s
25+
source http://www.nuget.org/api/v2
26+
27+
nuget Nancy.Bootstrappers.Windsor ~> 0.23
28+
"""
29+
30+
[<Test>]
31+
let ``should resolve simple config1 with latest-patch``() =
32+
let resolved =
33+
DependenciesFile.FromSource(config1 "latest-patch")
34+
|> resolve graph UpdateMode.UpdateAll
35+
getVersion resolved.[PackageName "Castle.Windsor"] |> shouldEqual "3.2.2"
36+
getVersion resolved.[PackageName "Nancy.Bootstrappers.Windsor"] |> shouldEqual "0.23"
37+
38+
39+
[<Test>]
40+
let ``should resolve simple config1 with latest-minor``() =
41+
let resolved =
42+
DependenciesFile.FromSource(config1 "latest-minor")
43+
|> resolve graph UpdateMode.UpdateAll
44+
getVersion resolved.[PackageName "Castle.Windsor"] |> shouldEqual "3.3.0"
45+
getVersion resolved.[PackageName "Nancy.Bootstrappers.Windsor"] |> shouldEqual "0.23"
46+
47+
let config2 = sprintf """
48+
strategy %s
49+
source http://www.nuget.org/api/v2
50+
51+
nuget Castle.Windsor
52+
nuget Nancy.Bootstrappers.Windsor ~> 0.23
53+
"""
54+
55+
[<Test>]
56+
let ``should resolve simple config2 with latest-patch``() =
57+
let resolved =
58+
DependenciesFile.FromSource(config2 "latest-patch")
59+
|> resolve graph UpdateMode.UpdateAll
60+
getVersion resolved.[PackageName "Castle.Windsor"] |> shouldEqual "3.2.2"
61+
getVersion resolved.[PackageName "Nancy.Bootstrappers.Windsor"] |> shouldEqual "0.23"
62+
63+
64+
[<Test>]
65+
let ``should resolve simple config2 with latest-minor``() =
66+
let resolved =
67+
DependenciesFile.FromSource(config2 "latest-minor")
68+
|> resolve graph UpdateMode.UpdateAll
69+
getVersion resolved.[PackageName "Castle.Windsor"] |> shouldEqual "3.3.0"
70+
getVersion resolved.[PackageName "Nancy.Bootstrappers.Windsor"] |> shouldEqual "0.23"
71+
72+
let config3 = sprintf """
73+
strategy %s
74+
source http://www.nuget.org/api/v2
75+
76+
nuget Nancy.Bootstrappers.Windsor ~> 0.23
77+
nuget Castle.Windsor
78+
"""
79+
80+
[<Test>]
81+
let ``should resolve simple config3 with latest-patch``() =
82+
let resolved =
83+
DependenciesFile.FromSource(config3 "latest-patch")
84+
|> resolve graph UpdateMode.UpdateAll
85+
getVersion resolved.[PackageName "Castle.Windsor"] |> shouldEqual "3.2.2"
86+
getVersion resolved.[PackageName "Nancy.Bootstrappers.Windsor"] |> shouldEqual "0.23"
87+
88+
89+
[<Test>]
90+
let ``should resolve simple config3 with latest-minor``() =
91+
let resolved =
92+
DependenciesFile.FromSource(config3 "latest-minor")
93+
|> resolve graph UpdateMode.UpdateAll
94+
getVersion resolved.[PackageName "Castle.Windsor"] |> shouldEqual "3.3.0"
95+
getVersion resolved.[PackageName "Nancy.Bootstrappers.Windsor"] |> shouldEqual "0.23"
96+
97+
let graph2 =
98+
OfSimpleGraph [
99+
"Nancy.Bootstrappers.Windsor","0.23",["Castle.Windsor",VersionRequirement(VersionRange.AtLeast "3.2.1",PreReleaseStatus.No)]
100+
"Castle.Windsor","3.2.0",["Castle.Core",VersionRequirement(VersionRange.AtLeast "3.2.0",PreReleaseStatus.No)]
101+
"Castle.Windsor","3.2.1",["Castle.Core",VersionRequirement(VersionRange.AtLeast "3.2.0",PreReleaseStatus.No)]
102+
"Castle.Windsor","3.3.0",["Castle.Core",VersionRequirement(VersionRange.AtLeast "3.3.0",PreReleaseStatus.No)]
103+
"Castle.Windsor-NLog","3.2.0.1",["Castle.Core-NLog",VersionRequirement(VersionRange.AtLeast "3.2.0",PreReleaseStatus.No)]
104+
"Castle.Windsor-NLog","3.3.0",["Castle.Core-NLog",VersionRequirement(VersionRange.AtLeast "3.3.0",PreReleaseStatus.No)]
105+
"Castle.Core-NLog","3.2.0",["Castle.Core",VersionRequirement(VersionRange.AtLeast "3.2.0",PreReleaseStatus.No)]
106+
"Castle.Core-NLog","3.3.0",["Castle.Core",VersionRequirement(VersionRange.AtLeast "3.3.0",PreReleaseStatus.No)]
107+
"Castle.Core-NLog","3.3.1",["Castle.Core",VersionRequirement(VersionRange.AtLeast "3.3.1",PreReleaseStatus.No)]
108+
"Castle.Core","3.2.0",[]
109+
"Castle.Core","3.2.1",[]
110+
"Castle.Core","3.2.2",[]
111+
"Castle.Core","3.3.0",[]
112+
"Castle.Core","3.3.1",[]
113+
]
114+
115+
let config5 = sprintf """
116+
strategy %s
117+
source http://www.nuget.org/api/v2
118+
119+
nuget Nancy.Bootstrappers.Windsor !~> 0.23
120+
"""
121+
122+
[<Test>]
123+
let ``should override global strategy with latest-patch``() =
124+
let resolved =
125+
DependenciesFile.FromSource(config5 "latest-patch")
126+
|> resolve graph2 UpdateMode.UpdateAll
127+
getVersion resolved.[PackageName "Castle.Windsor"] |> shouldEqual "3.2.1"
128+
getVersion resolved.[PackageName "Nancy.Bootstrappers.Windsor"] |> shouldEqual "0.23"

Diff for: tests/Paket.Tests/Resolver/GlobalOptimisticStrategySpecs.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module GlobalOptimisticStrategySpecs
1+
module Paket.Resolver.GlobalOptimisticStrategySpecs
22

33
open Paket
44
open NUnit.Framework

Diff for: tests/Paket.Tests/Resolver/ResolverErrorSituationTests.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module ResolverErrorSituationTests
1+
module Paket.Resolver.ResolverErrorSituationTests
22

33
open Paket
44
open NUnit.Framework

Diff for: tests/Paket.Tests/Resolver/StrategySpecs.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module StrategySpecs
1+
module Paket.Resolver.StrategySpecs
22

33
open Paket
44
open NUnit.Framework

0 commit comments

Comments
 (0)