Skip to content

Commit 57d6303

Browse files
committed
Merge pull request #410 from fsprojects/update
Selective update should only update dependent packages
2 parents a3b570a + 374faa1 commit 57d6303

9 files changed

Lines changed: 98 additions & 76 deletions

File tree

‎nuget/Paket.0.17.2.nuspec‎

Lines changed: 0 additions & 22 deletions
This file was deleted.

‎nuget/Paket.Core.0.17.2.nuspec‎

Lines changed: 0 additions & 24 deletions
This file was deleted.

‎src/Paket.Core/LockFile.fs‎

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -218,15 +218,35 @@ module LockFileParser =
218218

219219
/// Allows to parse and analyze paket.lock files.
220220
type LockFile(fileName:string,options,resolution:PackageResolution,remoteFiles:ResolvedSourceFile list) =
221-
let lowerCaseResolution =
222-
resolution
223-
|> Map.fold (fun resolution name p -> Map.add name p resolution) Map.empty
224221

225222
member __.SourceFiles = remoteFiles
226223
member __.ResolvedPackages = resolution
227224
member __.FileName = fileName
228225
member __.Options = options
229226

227+
/// Gets all dependencies of the given package
228+
member this.GetAllDependenciesOf(package) =
229+
let usedPackages = HashSet<_>()
230+
231+
let rec addPackage (packageName:PackageName) =
232+
let identity = NormalizedPackageName packageName
233+
match resolution.TryFind identity with
234+
| Some package ->
235+
if usedPackages.Add packageName then
236+
if not this.Options.Strict then
237+
for d,_,_ in package.Dependencies do
238+
addPackage d
239+
| None ->
240+
failwithf "Package %O was referenced, but it was not found in the paket.lock file." packageName
241+
242+
addPackage package
243+
244+
usedPackages
245+
246+
/// Checks if the first package is a dependency of the second package
247+
member this.IsDependencyOf(dependentPackage,package) =
248+
this.GetAllDependenciesOf(package).Contains dependentPackage
249+
230250
/// Updates the Lock file with the analyzed dependencies from the paket.dependencies file.
231251
member __.Save() =
232252
let output =
@@ -244,26 +264,22 @@ type LockFile(fileName:string,options,resolution:PackageResolution,remoteFiles:R
244264
lockFile.Save()
245265
lockFile
246266

247-
/// Parses a paket.lock file from lines
267+
/// Parses a paket.lock file from file
248268
static member LoadFrom(lockFileName) : LockFile =
249-
LockFileParser.Parse(File.ReadAllLines lockFileName)
269+
LockFile.Parse(lockFileName, File.ReadAllLines lockFileName)
270+
271+
/// Parses a paket.lock file from lines
272+
static member Parse(lockFileName,lines) : LockFile =
273+
LockFileParser.Parse lines
250274
|> fun state -> LockFile(lockFileName, state.Options ,state.Packages |> Seq.fold (fun map p -> Map.add (NormalizedPackageName p.Name) p map) Map.empty, List.rev state.SourceFiles)
251275

252276
member this.GetPackageHull(referencesFile:ReferencesFile) =
253277
let usedPackages = HashSet<_>()
254278

255-
let rec addPackage directly (packageName:PackageName) =
256-
let identity = NormalizedPackageName packageName
257-
match lowerCaseResolution.TryFind identity with
258-
| Some package ->
259-
if usedPackages.Add packageName then
260-
if not this.Options.Strict then
261-
for d,_,_ in package.Dependencies do
262-
addPackage false d
263-
| None ->
264-
failwithf "%s references package %O, but it was not found in the paket.lock file." referencesFile.FileName packageName
265-
266279
referencesFile.NugetPackages
267-
|> List.iter (addPackage true)
280+
|> List.iter (fun package ->
281+
try
282+
usedPackages.UnionWith(this.GetAllDependenciesOf(package))
283+
with exn -> failwithf "%s - in %s" exn.Message referencesFile.FileName)
268284

269-
usedPackages
285+
usedPackages

‎src/Paket.Core/UpdateProcess.fs‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ module Paket.UpdateProcess
44
open Paket
55
open System.IO
66
open Paket.Domain
7+
open Paket.PackageResolver
78

89
/// Update command
910
let Update(dependenciesFileName, forceResolution, force, hard) =
@@ -22,14 +23,14 @@ let Update(dependenciesFileName, forceResolution, force, hard) =
2223
InstallProcess.Install(sources, force, hard, lockFile)
2324

2425
let private fixOldDependencies (dependenciesFile:DependenciesFile) (package:PackageName) (oldLockFile:LockFile) =
25-
let packageKeys = dependenciesFile.DirectDependencies |> Seq.map (fun kv -> NormalizedPackageName kv.Key) |> Set.ofSeq
26-
oldLockFile.ResolvedPackages
26+
let allDependencies = oldLockFile.GetAllDependenciesOf package
27+
28+
oldLockFile.ResolvedPackages
29+
|> Seq.map (fun kv -> kv.Value)
30+
|> Seq.filter (fun p -> not <| allDependencies.Contains p.Name)
2731
|> Seq.fold
28-
(fun (dependenciesFile : DependenciesFile) kv ->
29-
let resolvedPackage = kv.Value
30-
let name = NormalizedPackageName resolvedPackage.Name
31-
if name = NormalizedPackageName package || not <| packageKeys.Contains name then dependenciesFile else
32-
dependenciesFile.AddFixedPackage(resolvedPackage.Name, "= " + resolvedPackage.Version.ToString()))
32+
(fun (dependenciesFile : DependenciesFile) resolvedPackage ->
33+
dependenciesFile.AddFixedPackage(resolvedPackage.Name, "= " + resolvedPackage.Version.ToString()))
3334
dependenciesFile
3435

3536
let private update (lockFileName) force (createDependenciesFile:LockFile -> DependenciesFile) =
@@ -71,4 +72,4 @@ let UpdatePackage(dependenciesFileName, packageName : PackageName, newVersion, f
7172

7273
fixOldDependencies dependenciesFile packageName
7374
|> update lockFileName.FullName force
74-
InstallProcess.Install(sources, force, hard, lockFile)
75+
InstallProcess.Install(sources, force, hard, lockFile)

‎tests/Paket.Tests/Lockfile/GenerateAuthModeSpecs.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module paket.lockFile.GenerateAuthModeSpecs
1+
module Paket.LockFile.GenerateAuthModeSpecs
22

33
open Paket
44
open NUnit.Framework

‎tests/Paket.Tests/Lockfile/GenerateContentNoneOptionSpecs.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module paket.lockFile.GenerateContentNoneOptionSpecs
1+
module Paket.LockFile.GenerateContentNoneOptionSpecs
22

33
open Paket
44
open NUnit.Framework

‎tests/Paket.Tests/Lockfile/GenerateStrictModeSpecs.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module paket.lockFile.GenerateStrictModeSpecs
1+
module Paket.LockFile.GenerateStrictModeSpecs
22

33
open Paket
44
open NUnit.Framework
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
module Paket.LockFile.QuerySpecs
2+
3+
open Paket
4+
open NUnit.Framework
5+
open FsUnit
6+
open TestHelpers
7+
open Paket.Domain
8+
9+
let data = """NUGET
10+
remote: https://nuget.org/api/v2
11+
specs:
12+
Castle.Windsor (2.1)
13+
Castle.Windsor-log4net (3.3)
14+
Castle.Windsor (>= 2.0)
15+
log4net (>= 1.0)
16+
Rx-Core (2.1)
17+
Rx-Main (2.0)
18+
Rx-Core (>= 2.1)
19+
log (1.2)
20+
log4net (1.1)
21+
log (>= 1.0)
22+
GITHUB
23+
remote: fsharp/FAKE
24+
specs:
25+
src/app/FAKE/Cli.fs (7699e40e335f3cc54ab382a8969253fecc1e08a9)
26+
src/app/Fake.Deploy.Lib/FakeDeployAgentHelper.fs (Globbing)
27+
"""
28+
29+
let lockFile = LockFile.Parse("Test",toLines data)
30+
31+
32+
[<Test>]
33+
let ``should detect itself as dependency``() =
34+
lockFile.IsDependencyOf(PackageName "Rx-Core",PackageName "Rx-Core")
35+
|> shouldEqual true
36+
37+
[<Test>]
38+
let ``should detect direct dependencies``() =
39+
lockFile.IsDependencyOf(PackageName "Rx-Core",PackageName "Rx-Main")
40+
|> shouldEqual true
41+
42+
[<Test>]
43+
let ``should detect indirect dependencies``() =
44+
lockFile.IsDependencyOf(PackageName "log",PackageName "Castle.Windsor-log4net")
45+
|> shouldEqual true
46+
47+
[<Test>]
48+
let ``should detect when packages are unrelated``() =
49+
lockFile.IsDependencyOf(PackageName "log",PackageName "Rx-Core")
50+
|> shouldEqual false

‎tests/Paket.Tests/Paket.Tests.fsproj‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
44
<PropertyGroup>
@@ -158,6 +158,7 @@
158158
<Compile Include="Lockfile\GenerateAuthModeSpecs.fs" />
159159
<Compile Include="Lockfile\GeneratorWithMutlipleSourcesSpecs.fs" />
160160
<Compile Include="Lockfile\ParserSpecs.fs" />
161+
<Compile Include="Lockfile\QuerySpecs.fs" />
161162
<Compile Include="Lockfile\ParserWithMultipleSourcesSpecs.fs" />
162163
<Compile Include="ReferencesFile\ReferencesFileSpecs.fs" />
163164
<Compile Include="Simplifier\BasicScenarioSpecs.fs" />

0 commit comments

Comments
 (0)