Skip to content

Commit

Permalink
Fix issue with bad performance - references #1387
Browse files Browse the repository at this point in the history
  • Loading branch information
forki committed Jan 14, 2016
1 parent cad4b54 commit cbd9299
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 25 deletions.
3 changes: 3 additions & 0 deletions RELEASE_NOTES.md
@@ -1,3 +1,6 @@
#### 2.42.7 - 13.01.2016
* PERFORMANCE: Fix issue with bad performance - https://github.com/fsprojects/Paket/issues/1387

#### 2.42.6 - 13.01.2016
* BUGFIX: Fix path issue

Expand Down
@@ -0,0 +1,4 @@
git https://github.com/forki/nupkgtest.git 2.0.0 build:"build.cmd", Packages: /source/, OS:windows
git https://github.com/forki/nupkgtest.git 2.0.0 build:"build.sh", Packages: /source/, OS:mono

nuget Argu
2 changes: 1 addition & 1 deletion src/Paket.Core/InstallModel.fs
Expand Up @@ -70,7 +70,7 @@ module InstallFiles =
ContentFiles = Set.union that.ContentFiles installFiles.ContentFiles }


type InstallFiles with
type InstallFiles with
member this.AddReference lib = InstallFiles.addReference lib this
member this.AddTargetsFile targetsFile = InstallFiles.addTargetsFile targetsFile this
member this.AddFrameworkAssemblyReference assemblyName = InstallFiles.addFrameworkAssemblyReference assemblyName this
Expand Down
7 changes: 3 additions & 4 deletions src/Paket.Core/NuGetV2.fs
Expand Up @@ -457,10 +457,11 @@ let GetTargetsFiles(targetFolder) = getFiles targetFolder "build" ".targets file
/// Finds all analyzer files in a nuget package.
let GetAnalyzerFiles(targetFolder) = getFiles targetFolder "analyzers" "analyzer dlls"

let GetPackageDetails root force sources packageName (version:SemVerInfo) : PackageResolver.PackageDetails =
let GetPackageDetails root force (sources:PackageSource list) packageName (version:SemVerInfo) : PackageResolver.PackageDetails =

let getPackageDetails force =
sources
|> List.sortBy (fun x -> x.Url.ToLower().Contains "nuget.org" |> not)
|> List.map (fun source -> async {
try
match source with
Expand All @@ -482,9 +483,7 @@ let GetPackageDetails root force sources packageName (version:SemVerInfo) : Pack
with e ->
verbosefn "Source '%O' exception: %O" source e
return None })
|> Async.Parallel
|> Async.RunSynchronously
|> Array.tryPick id
|> List.tryPick Async.RunSynchronously

let source,nugetObject =
match getPackageDetails force with
Expand Down
32 changes: 14 additions & 18 deletions src/Paket.Core/PackageResolver.fs
Expand Up @@ -153,7 +153,7 @@ type Resolution =
" Please try to relax some conditions."
|> failwithf "%s"

let calcOpenRequirements (exploredPackage:ResolvedPackage,globalFrameworkRestrictions,(versionToExplore,_,_),dependency,closed:Set<PackageRequirement>,stillOpen:Set<PackageRequirement>) =
let calcOpenRequirements (exploredPackage:ResolvedPackage,globalFrameworkRestrictions,(versionToExplore,_),dependency,closed:Set<PackageRequirement>,stillOpen:Set<PackageRequirement>) =
let dependenciesByName =
// there are packages which define multiple dependencies to the same package
// we just take the latest one - see #567
Expand Down Expand Up @@ -218,7 +218,7 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
let knownConflicts = HashSet<_>()
let tryRelaxed = ref false

let getExploredPackage(dependency:PackageRequirement,(version,preferredSource,packageSources)) =
let getExploredPackage(dependency:PackageRequirement,(version,packageSources)) =
let key = dependency.Name,version
match exploredPackages.TryGetValue key with
| true,package ->
Expand All @@ -239,14 +239,7 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra

let newRestrictions = filterRestrictions dependency.Settings.FrameworkRestrictions globalFrameworkRestrictions

let packageDetails : PackageDetails =
match preferredSource with
| None -> getPackageDetailsF packageSources dependency.Name version
| Some preferredSource ->
try
getPackageDetailsF [preferredSource] dependency.Name version
with
| _ -> getPackageDetailsF (List.filter (fun x -> x <> preferredSource) packageSources) dependency.Name version
let packageDetails : PackageDetails = getPackageDetailsF packageSources dependency.Name version

let filteredDependencies = DependencySetFilter.filterByRestrictions newRestrictions packageDetails.DirectDependencies

Expand All @@ -269,7 +262,7 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
exploredPackages.Add(key,explored)
explored

let rec step (relax,filteredVersions:Map<PackageName, ((SemVerInfo * PackageSource option * PackageSource list) list * bool)>,currentResolution:Map<PackageName,ResolvedPackage>,closedRequirements:Set<PackageRequirement>,openRequirements:Set<PackageRequirement>) =
let rec step (relax,filteredVersions:Map<PackageName, ((SemVerInfo * PackageSource list) list * bool)>,currentResolution:Map<PackageName,ResolvedPackage>,closedRequirements:Set<PackageRequirement>,openRequirements:Set<PackageRequirement>) =
if Set.isEmpty openRequirements then Resolution.Ok(cleanupNames currentResolution) else
verbosefn " %d packages in resolution. %d requirements left" currentResolution.Count openRequirements.Count

Expand Down Expand Up @@ -344,23 +337,26 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
| false -> combined

// we didn't select a version yet so all versions are possible
let isInRange mapF (ver,_,_) =
let isInRange mapF (ver,_) =
currentRequirements
|> Seq.forall (fun r -> (mapF r).VersionRequirement.IsInRange ver)

let getSingleVersion v =
match currentRequirement.Parent with
| PackageRequirementSource.Package(_,_,parentSource) ->
Seq.singleton (v,Some parentSource, sources)
| _ -> Seq.singleton (v,Seq.tryHead sources,sources)
let sources = parentSource :: sources |> List.distinct
Seq.singleton (v,sources)
| _ ->
let sources : PackageSource list = sources |> List.sortBy (fun x -> x.Url.ToLower().Contains "nuget.org" |> not)
Seq.singleton (v,sources)

availableVersions :=
match currentRequirement.VersionRequirement.Range with
| OverrideAll v -> getSingleVersion v
| Specific v -> getSingleVersion v
| _ ->
getVersionsF sources resolverStrategy groupName currentRequirement.Name
|> Seq.map (fun (v,s) -> v,None,s)
|> Seq.map (fun (v,s) -> v,s)
|> Seq.cache

let preRelease v =
Expand All @@ -377,7 +373,7 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
else
if Seq.isEmpty !compatibleVersions then
let prereleases = Seq.filter (isInRange (fun r -> r.IncludingPrereleases())) (!availableVersions) |> Seq.toList
let allPrereleases = prereleases |> List.filter (fun (v,_,_) -> v.PreRelease <> None) = prereleases
let allPrereleases = prereleases |> List.filter (fun (v,_) -> v.PreRelease <> None) = prereleases
if allPrereleases then
availableVersions := Seq.ofList prereleases
compatibleVersions := Seq.ofList prereleases
Expand All @@ -389,10 +385,10 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
compatibleVersions := List.toSeq versions
else
compatibleVersions :=
Seq.filter (fun (v,_,_) -> currentRequirement.VersionRequirement.IsInRange(v,currentRequirement.Parent.IsRootRequirement() |> not)) versions
Seq.filter (fun (v,_) -> currentRequirement.VersionRequirement.IsInRange(v,currentRequirement.Parent.IsRootRequirement() |> not)) versions

if Seq.isEmpty !compatibleVersions then
let withPrereleases = Seq.filter (fun (v,_,_) -> currentRequirement.IncludingPrereleases().VersionRequirement.IsInRange(v,currentRequirement.Parent.IsRootRequirement() |> not)) versions
let withPrereleases = Seq.filter (fun (v,_) -> currentRequirement.IncludingPrereleases().VersionRequirement.IsInRange(v,currentRequirement.Parent.IsRootRequirement() |> not)) versions
if relax then
compatibleVersions := withPrereleases
else
Expand Down
4 changes: 2 additions & 2 deletions src/Paket/Paket.fsproj
Expand Up @@ -38,7 +38,7 @@
<StartArguments>pack output D:\code\paketbug\output</StartArguments>
<StartArguments>install</StartArguments>
<StartArguments>restore</StartArguments>
<StartArguments>restore</StartArguments>
<StartArguments>update</StartArguments>
<StartAction>Project</StartAction>
<StartProgram>paket.exe</StartProgram>
<StartWorkingDirectory>c:\code\Paketkopie</StartWorkingDirectory>
Expand All @@ -48,7 +48,7 @@
<StartWorkingDirectory>d:\code\paketrepro</StartWorkingDirectory>
<StartWorkingDirectory>D:\code\Paket\integrationtests\scenarios\i001270-net461\temp</StartWorkingDirectory>
<StartWorkingDirectory>C:\code\restore</StartWorkingDirectory>
<StartWorkingDirectory>D:\code\paket-repro</StartWorkingDirectory>
<StartWorkingDirectory>D:\code\Paket\integrationtests\scenarios\i001387-nugetv3\temp</StartWorkingDirectory>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
Expand Down

0 comments on commit cbd9299

Please sign in to comment.