Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
We only fix the package dependencies for non-related packages during …
…selective UpdateProcess
  • Loading branch information
forki committed Nov 30, 2014
commit 51a2545550b7d453af96a29d28b7c527abbb30fd
23 changes: 17 additions & 6 deletions src/Paket.Core/LockFile.fs
Original file line number Diff line number Diff line change
Expand Up @@ -218,15 +218,22 @@ module LockFileParser =

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

member __.SourceFiles = remoteFiles
member __.ResolvedPackages = resolution
member __.FileName = fileName
member __.Options = options

/// Checks if the first package is a dependency of the second package
member this.IsDependencyOf(dependentPackage,package) =
let start = NormalizedPackageName package
let dependentPackage
let current = resolution.[start]

if then true else
current.Dependencies
|> Seq.exists (fun (d,_,_) -> this.IsDependencyOf(dependentPackage,d))

/// Updates the Lock file with the analyzed dependencies from the paket.dependencies file.
member __.Save() =
let output =
Expand All @@ -237,17 +244,21 @@ type LockFile(fileName:string,options,resolution:PackageResolution,remoteFiles:R
File.WriteAllText(fileName, output)
tracefn "Locked version resolutions written to %s" fileName

/// Parses a paket.lock file from lines
/// Parses a paket.lock file from file
static member LoadFrom(lockFileName) : LockFile =
LockFileParser.Parse(File.ReadAllLines lockFileName)
LockFile.Parse(lockFileName, File.ReadAllLines lockFileName)

/// Parses a paket.lock file from lines
static member Parse(lockFileName,lines) : LockFile =
LockFileParser.Parse lines
|> 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)

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

let rec addPackage directly (packageName:PackageName) =
let identity = NormalizedPackageName packageName
match lowerCaseResolution.TryFind identity with
match resolution.TryFind identity with
| Some package ->
if usedPackages.Add packageName then
if not this.Options.Strict then
Expand Down
13 changes: 6 additions & 7 deletions src/Paket.Core/UpdateProcess.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module Paket.UpdateProcess
open Paket
open System.IO
open Paket.Domain
open Paket.PackageResolver

/// Update command
let Update(dependenciesFileName, forceResolution, force, hard) =
Expand All @@ -26,14 +27,12 @@ let Update(dependenciesFileName, forceResolution, force, hard) =
InstallProcess.Install(sources, force, hard, lockFile)

let private fixOldDependencies (oldLockFile:LockFile) (dependenciesFile:DependenciesFile) (package:PackageName) =
let packageKeys = dependenciesFile.DirectDependencies |> Seq.map (fun kv -> NormalizedPackageName kv.Key) |> Set.ofSeq
oldLockFile.ResolvedPackages
oldLockFile.ResolvedPackages
|> Seq.map (fun kv -> kv.Value)
|> Seq.filter (fun p -> not <| oldLockFile.IsDependencyOf(p.Name,package))
|> Seq.fold
(fun (dependenciesFile : DependenciesFile) kv ->
let resolvedPackage = kv.Value
let name = NormalizedPackageName resolvedPackage.Name
if name = NormalizedPackageName package || not <| packageKeys.Contains name then dependenciesFile else
dependenciesFile.AddFixedPackage(resolvedPackage.Name, "= " + resolvedPackage.Version.ToString()))
(fun (dependenciesFile : DependenciesFile) resolvedPackage ->
dependenciesFile.AddFixedPackage(resolvedPackage.Name, "= " + resolvedPackage.Version.ToString()))
dependenciesFile

let updateWithModifiedDependenciesFile(dependenciesFile:DependenciesFile,packageName:PackageName, force) =
Expand Down
2 changes: 1 addition & 1 deletion tests/Paket.Tests/Lockfile/GenerateAuthModeSpecs.fs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module paket.lockFile.GenerateAuthModeSpecs
module Paket.LockFile.GenerateAuthModeSpecs

open Paket
open NUnit.Framework
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module paket.lockFile.GenerateContentNoneOptionSpecs
module Paket.LockFile.GenerateContentNoneOptionSpecs

open Paket
open NUnit.Framework
Expand Down
2 changes: 1 addition & 1 deletion tests/Paket.Tests/Lockfile/GenerateStrictModeSpecs.fs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module paket.lockFile.GenerateStrictModeSpecs
module Paket.LockFile.GenerateStrictModeSpecs

open Paket
open NUnit.Framework
Expand Down
50 changes: 50 additions & 0 deletions tests/Paket.Tests/Lockfile/QuerySpecs.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
module Paket.LockFile.QuerySpecs

open Paket
open NUnit.Framework
open FsUnit
open TestHelpers
open Paket.Domain

let data = """NUGET
remote: https://nuget.org/api/v2
specs:
Castle.Windsor (2.1)
Castle.Windsor-log4net (3.3)
Castle.Windsor (>= 2.0)
log4net (>= 1.0)
Rx-Core (2.1)
Rx-Main (2.0)
Rx-Core (>= 2.1)
log (1.2)
log4net (1.1)
log (>= 1.0)
GITHUB
remote: fsharp/FAKE
specs:
src/app/FAKE/Cli.fs (7699e40e335f3cc54ab382a8969253fecc1e08a9)
src/app/Fake.Deploy.Lib/FakeDeployAgentHelper.fs (Globbing)
"""

let lockFile = LockFile.Parse("Test",toLines data)


[<Test>]
let ``should detect itself as dependency``() =
lockFile.IsDependencyOf(PackageName "Rx-Core",PackageName "Rx-Core")
|> shouldEqual true

[<Test>]
let ``should detect direct dependencies``() =
lockFile.IsDependencyOf(PackageName "Rx-Core",PackageName "Rx-Main")
|> shouldEqual true

[<Test>]
let ``should detect indirect dependencies``() =
lockFile.IsDependencyOf(PackageName "log",PackageName "Castle.Windsor-log4net")
|> shouldEqual true

[<Test>]
let ``should detect when packages are unrelated``() =
lockFile.IsDependencyOf(PackageName "log",PackageName "Rx-Core")
|> shouldEqual false
3 changes: 2 additions & 1 deletion tests/Paket.Tests/Paket.Tests.fsproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
Expand Down Expand Up @@ -158,6 +158,7 @@
<Compile Include="Lockfile\GenerateAuthModeSpecs.fs" />
<Compile Include="Lockfile\GeneratorWithMutlipleSourcesSpecs.fs" />
<Compile Include="Lockfile\ParserSpecs.fs" />
<Compile Include="Lockfile\QuerySpecs.fs" />
<Compile Include="Lockfile\ParserWithMultipleSourcesSpecs.fs" />
<Compile Include="ReferencesFile\ReferencesFileSpecs.fs" />
<Compile Include="Simplifier\BasicScenarioSpecs.fs" />
Expand Down