Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixes prerelease selection in #3057 #3058

Merged
merged 2 commits into from
Feb 20, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 23 additions & 15 deletions src/Paket.Core/Dependencies/PackageResolver.fs
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ let private getCompatibleVersions
(currentStep:ResolverStep)
groupName
(currentRequirement:PackageRequirement)
rootDependencies
(rootDependencies:IDictionary<PackageName,PackageRequirement>)
(getVersionsF: ResolverStrategy -> PackageVersionsSyncFunc)
globalOverride
globalStrategyForDirectDependencies
Expand All @@ -546,16 +546,26 @@ let private getCompatibleVersions

// we didn't select a version yet so all versions are possible
let isInRange mapF (cache:VersionCache) =
allRequirementsOfCurrentPackage
|> Set.forall (fun r -> (mapF r).VersionRequirement.IsInRange cache.Version)
match rootDependencies.TryGetValue currentRequirement.Name with
| true, p ->
allRequirementsOfCurrentPackage
|> Set.forall (fun r ->
let mapped = mapF r
mapped.VersionRequirement.IsInRange cache.Version ||
mapped.IncludingPrereleases(p.VersionRequirement.PreReleases).VersionRequirement.IsInRange cache.Version)
| _ ->
allRequirementsOfCurrentPackage
|> Set.forall (fun r -> (mapF r).VersionRequirement.IsInRange cache.Version)

let getSingleVersion v =
let sources =
match currentRequirement.Parent with
| PackageRequirementSource.Package(_,_,parentSource) ->
parentSource :: currentRequirement.Sources |> List.distinct
| _ ->
currentRequirement.Sources |> List.sortBy (fun x -> not x.IsLocalFeed, String.containsIgnoreCase "nuget.org" x.Url |> not)
currentRequirement.Sources
|> List.sortBy (fun x -> not x.IsLocalFeed, String.containsIgnoreCase "nuget.org" x.Url |> not)

Seq.singleton (VersionCache.ofParams v sources true)

let availableVersions =
Expand All @@ -564,16 +574,18 @@ let private getCompatibleVersions
let allVersions =
getVersionsF resolverStrategy (GetPackageVersionsParameters.ofParams currentRequirement.Sources groupName currentRequirement.Name)
|> Seq.map (fun (v, sources) -> VersionCache.ofParams v sources false)

match currentRequirement.VersionRequirement.Range with
| Specific v
| OverrideAll v ->
let results =
allVersions
|> Seq.filter (fun cache -> cache.Version = v)
|> Seq.toList
match results with
| [] -> getSingleVersion v
| _ -> List.toSeq results

if Seq.isEmpty results then
getSingleVersion v
else
results
| _ -> allVersions

let compatibleVersions = Seq.filter (isInRange id) availableVersions |> Seq.cache
Expand All @@ -584,7 +596,6 @@ let private getCompatibleVersions
elif Seq.isEmpty compatibleVersions && currentRequirement.TransitivePrereleases && not (currentRequirement.Parent.IsRootRequirement()) then
Seq.filter (isInRange (fun r -> r.IncludingPrereleases(PreReleaseStatus.All))) availableVersions |> Seq.cache, globalOverride
elif Seq.isEmpty compatibleVersions then

let prereleaseStatus (r:PackageRequirement) =
if r.Parent.IsRootRequirement() && r.VersionRequirement <> VersionRequirement.AllReleases then
r.VersionRequirement.PreReleases
Expand Down Expand Up @@ -1061,12 +1072,9 @@ let Resolve (getVersionsRaw : PackageVersionsFunc, getPreferredVersionsRaw : Pre
if flags.ForceBreak then false else
if conflictState.Status.IsDone then false else
if Seq.isEmpty conflictState.VersionsToExplore then
// TODO: maybe this is the wrong place to report this...
//match conflictState.Status with
//| Resolution.Ok _ -> ()
//| _ -> (tracefn " Failed to satisfy %O" currentRequirement)
false else
flags.FirstTrial || Set.isEmpty conflictState.Conflicts
false
else
flags.FirstTrial || Set.isEmpty conflictState.Conflicts

let rec step (stage:Stage) (stackpack:StackPack) compatibleVersions (flags:StepFlags) =

Expand Down
12 changes: 12 additions & 0 deletions tests/Paket.Tests/Resolver/PrereleaseSpecs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,18 @@ let ``should resolve overwritten config4``() =
getVersion resolved.[PackageName "packageA"] |> shouldEqual "1.0.11250"
getVersion resolved.[PackageName "packageB"] |> shouldEqual "2.0.0"

let config5 = """
source "https://www.nuget.org/api/v2"
nuget PackageA prerelease
nuget PackageB prerelease
"""

[<Test>]
let ``should resolve prerelease config5``() =
let cfg = DependenciesFile.FromSource(config5)
let resolved = ResolveWithGraph(cfg,noSha1, VersionsFromGraphAsSeq graph, PackageDetailsFromGraph graph).[Constants.MainDependencyGroup].ResolvedPackages.GetModelOrFail()
getVersion resolved.[PackageName "packageA"] |> shouldEqual "1.0.11250"
getVersion resolved.[PackageName "packageB"] |> shouldEqual "1.0.11204-custom"

[<Test>]
let ``should resolve prerelease config2 but no prerelease for transitive deps``() =
Expand Down