diff --git a/src/Paket.Core/DependenciesFile.fs b/src/Paket.Core/DependenciesFile.fs
index 3a1399ce98..50596de73a 100644
--- a/src/Paket.Core/DependenciesFile.fs
+++ b/src/Paket.Core/DependenciesFile.fs
@@ -21,6 +21,10 @@ type InstallOptions =
Redirects = false
Settings = InstallSettings.Default }
+type VersionStrategy = {
+ VersionRequirement : VersionRequirement
+ ResolverStrategy : ResolverStrategy }
+
/// [omit]
module DependenciesFileParser =
@@ -140,9 +144,9 @@ module DependenciesFileParser =
| CopyLocal of bool
| Redirects of bool
- let private (|Remote|Package|Comment|ParserOptions|SourceFile|) (line:string) =
+ let private (|Remote|Package|Empty|ParserOptions|SourceFile|) (line:string) =
match line.Trim() with
- | _ when String.IsNullOrWhiteSpace line -> Comment(line)
+ | _ when String.IsNullOrWhiteSpace line -> Empty(line)
| String.StartsWith "source" _ as trimmed -> Remote(PackageSource.Parse(trimmed))
| String.StartsWith "nuget" trimmed ->
let parts = trimmed.Trim().Replace("\"", "").Split([|' '|],StringSplitOptions.RemoveEmptyEntries) |> Seq.toList
@@ -176,24 +180,26 @@ module DependenciesFileParser =
SourceFile(``parse git source`` trimmed SingleSourceFileOrigin.GitHubLink "github")
| String.StartsWith "http" _ as trimmed ->
SourceFile(``parse http source`` trimmed)
- | String.StartsWith "//" _ -> Comment(line)
- | String.StartsWith "#" _ -> Comment(line)
+ | String.StartsWith "//" _ -> Empty(line)
+ | String.StartsWith "#" _ -> Empty(line)
| _ -> failwithf "Unrecognized token: %s" line
- let parseDependenciesFile fileName (lines:string seq) =
- ((0, InstallOptions.Default, [], [], [],[]), lines)
- ||> Seq.fold(fun (lineNo, options, sources: PackageSource list, packages, sourceFiles: UnresolvedSourceFile list,comments) line ->
+ let parseDependenciesFile fileName (lines:string seq) =
+ let lines = lines |> Seq.toArray
+
+ ((0, InstallOptions.Default, [], [], []), lines)
+ ||> Seq.fold(fun (lineNo, options, sources: PackageSource list, packages, sourceFiles: UnresolvedSourceFile list) line ->
let lineNo = lineNo + 1
try
match line with
- | Remote(newSource) -> lineNo, options, sources @ [newSource], packages, sourceFiles, comments
- | Comment(line) -> lineNo, options, sources, packages, sourceFiles, if line <> "" then (lineNo,line)::comments else comments
- | ParserOptions(ParserOption.ReferencesMode mode) -> lineNo, { options with Strict = mode }, sources, packages, sourceFiles, comments
- | ParserOptions(ParserOption.Redirects mode) -> lineNo, { options with Redirects = mode }, sources, packages, sourceFiles, comments
- | ParserOptions(ParserOption.CopyLocal mode) -> lineNo, { options with Settings = { options.Settings with CopyLocal = mode }}, sources, packages, sourceFiles, comments
- | ParserOptions(ParserOption.ImportTargets mode) -> lineNo, { options with Settings = { options.Settings with ImportTargets = mode }}, sources, packages, sourceFiles, comments
- | ParserOptions(ParserOption.FrameworkRestrictions r) -> lineNo, { options with Settings = { options.Settings with FrameworkRestrictions = r }}, sources, packages, sourceFiles, comments
- | ParserOptions(ParserOption.OmitContent omit) -> lineNo, { options with Settings = { options.Settings with OmitContent = omit }}, sources, packages, sourceFiles, comments
+ | Empty(_) -> lineNo, options, sources , packages, sourceFiles
+ | Remote(newSource) -> lineNo, options, sources @ [newSource], packages, sourceFiles
+ | ParserOptions(ParserOption.ReferencesMode mode) -> lineNo, { options with Strict = mode }, sources, packages, sourceFiles
+ | ParserOptions(ParserOption.Redirects mode) -> lineNo, { options with Redirects = mode }, sources, packages, sourceFiles
+ | ParserOptions(ParserOption.CopyLocal mode) -> lineNo, { options with Settings = { options.Settings with CopyLocal = mode }}, sources, packages, sourceFiles
+ | ParserOptions(ParserOption.ImportTargets mode) -> lineNo, { options with Settings = { options.Settings with ImportTargets = mode }}, sources, packages, sourceFiles
+ | ParserOptions(ParserOption.FrameworkRestrictions r) -> lineNo, { options with Settings = { options.Settings with FrameworkRestrictions = r }}, sources, packages, sourceFiles
+ | ParserOptions(ParserOption.OmitContent omit) -> lineNo, { options with Settings = { options.Settings with OmitContent = omit }}, sources, packages, sourceFiles
| Package(name,version,rest) ->
let prereleases,optionsText =
if rest.Contains ":" then
@@ -216,19 +222,23 @@ module DependenciesFileParser =
ResolverStrategy = parseResolverStrategy version
Parent = DependenciesFile fileName
Settings = InstallSettings.Parse(optionsText)
- VersionRequirement = parseVersionRequirement((version + " " + prereleases).Trim '!') } :: packages, sourceFiles, comments
+ VersionRequirement = parseVersionRequirement((version + " " + prereleases).Trim '!') } :: packages, sourceFiles
| SourceFile(origin, (owner,project, commit), path) ->
- lineNo, options, sources, packages, { Owner = owner; Project = project; Commit = commit; Name = path; Origin = origin} :: sourceFiles, comments
+ lineNo, options, sources, packages, { Owner = owner; Project = project; Commit = commit; Name = path; Origin = origin} :: sourceFiles
with
| exn -> failwithf "Error in paket.dependencies line %d%s %s" lineNo Environment.NewLine exn.Message)
- |> fun (_,options,sources,packages,remoteFiles,comments) ->
+ |> fun (_,options,sources,packages,remoteFiles) ->
fileName,
options,
sources,
packages |> List.rev,
remoteFiles |> List.rev,
- comments
+ lines
+
+ let parseVersionString (version : string) =
+ { VersionRequirement = parseVersionRequirement (version.Trim '!')
+ ResolverStrategy = parseResolverStrategy version }
module DependenciesFileSerializer =
let formatVersionRange strategy (version : VersionRequirement) : string =
@@ -256,23 +266,42 @@ module DependenciesFileSerializer =
let text = prefix + version
if text <> "" && preReleases <> "" then text + " " + preReleases else text + preReleases
+ let sourceString source = "source " + source
+
+ let packageString packageName versionRequirement resolverStrategy (settings:InstallSettings) =
+ let (PackageName name) = packageName
+ let version = formatVersionRange resolverStrategy versionRequirement
+ let s = settings.ToString()
+
+ sprintf "nuget %s%s%s" name (if version <> "" then " " + version else "") (if s <> "" then " " + s else s)
+
/// Allows to parse and analyze paket.dependencies files.
-type DependenciesFile(fileName,options,sources,packages : PackageRequirement list, remoteFiles : UnresolvedSourceFile list, comments) =
+type DependenciesFile(fileName,options,sources,packages : PackageRequirement list, remoteFiles : UnresolvedSourceFile list, textRepresentation:string []) =
let packages = packages |> Seq.toList
let dependencyMap = Map.ofSeq (packages |> Seq.map (fun p -> p.Name, p.VersionRequirement))
+
+ let isPackageLine name (l : string) =
+ let splitted = l.Split(' ') |> Array.map (fun s -> s.ToLower())
+ splitted |> Array.exists ((=) "nuget") && splitted |> Array.exists ((=) name)
+
+ let tryFindPackageLine (packageName:PackageName) =
+ let name = packageName.ToString().ToLower()
+ textRepresentation
+ |> Array.tryFindIndex (isPackageLine name)
member __.DirectDependencies = dependencyMap
member __.Packages = packages
- member __.Comments = comments
member __.HasPackage (name : PackageName) = packages |> List.exists (fun p -> NormalizedPackageName p.Name = NormalizedPackageName name)
+ member __.GetPackage (name : PackageName) = packages |> List.find (fun p -> NormalizedPackageName p.Name = NormalizedPackageName name)
member __.RemoteFiles = remoteFiles
member __.Options = options
member __.FileName = fileName
+ member __.Lines = textRepresentation
member __.Sources = sources
member this.Resolve(force) =
let getSha1 origin owner repo branch = RemoteDownload.getSHA1OfBranch origin owner repo branch |> Async.RunSynchronously
let root = Path.GetDirectoryName this.FileName
- this.Resolve(getSha1,NuGetV2.GetVersions root,NuGetV2.GetPackageDetails root force)
+ this.Resolve(getSha1,NuGetV2.GetVersions root,NuGetV2.GetPackageDetails root force)
member __.Resolve(getSha1,getVersionF, getPackageDetailsF) =
let resolveSourceFile(file:ResolvedSourceFile) : PackageRequirement list =
@@ -303,66 +332,75 @@ type DependenciesFile(fileName,options,sources,packages : PackageRequirement lis
{ ResolvedPackages = PackageResolver.Resolve(getVersionF, getPackageDetailsF, options.Settings.FrameworkRestrictions, remoteDependencies @ packages)
ResolvedSourceFiles = remoteFiles }
- member __.AddAdditionalPackage(packageName:PackageName,version:string,settings) =
- let versionRange = DependenciesFileParser.parseVersionRequirement (version.Trim '!')
- let sources',sources =
- match packages |> List.rev with
- | lastPackage::_ -> lastPackage.Sources,sources
- | [] ->
- [PackageSources.DefaultNugetSource],
- if sources |> List.exists ((=) PackageSources.DefaultNugetSource) then sources else PackageSources.DefaultNugetSource :: sources
-
- let newPackage =
- { Name = packageName
- VersionRequirement = versionRange
- Sources = sources'
- ResolverStrategy = DependenciesFileParser.parseResolverStrategy version
- Settings = settings
- Parent = PackageRequirementSource.DependenciesFile fileName }
+ member __.AddAdditionalPackage(packageName:PackageName,versionRequirement,resolverStrategy,settings) =
+ let packageString = DependenciesFileSerializer.packageString packageName versionRequirement resolverStrategy settings
// Try to find alphabetical matching position to insert the package
let smaller = Seq.takeWhile (fun (p:PackageRequirement) -> p.Name <= packageName) packages |> List.ofSeq
- let bigger = Seq.skipWhile (fun (p:PackageRequirement) -> p.Name <= packageName) packages |> List.ofSeq
- let newPackages = smaller @ [newPackage] @ bigger
+ let newLines =
+ let list = new System.Collections.Generic.List<_>()
+ list.AddRange textRepresentation
+ match smaller with
+ | [] ->
+ match packages with
+ | [] ->
+ if remoteFiles <> [] then
+ list.Insert(0,"")
+
+ list.Insert(0,packageString)
+
+ match sources with
+ | [] ->
+ list.Insert(0,"")
+ list.Insert(0,DependenciesFileSerializer.sourceString Constants.DefaultNugetStream)
+ | _ -> ()
+ | _ -> list.Add packageString
+
+ | _ ->
+ let p = Seq.last smaller
+
+ match tryFindPackageLine p.Name with
+ | None -> list.Add packageString
+ | Some pos -> list.Insert(pos + 1,packageString)
+
+ list |> Seq.toArray
+
+ DependenciesFile(DependenciesFileParser.parseDependenciesFile fileName newLines)
- DependenciesFile(fileName,options,sources,newPackages, remoteFiles, comments)
- member __.AddFixedPackage(packageName:PackageName,version:string,settings) =
- let versionRange = DependenciesFileParser.parseVersionRequirement (version.Trim '!')
- let sources =
- match packages |> List.rev with
- | lastPackage::_ -> lastPackage.Sources
- | [] -> [PackageSources.DefaultNugetSource]
+ member this.AddAdditionalPackage(packageName:PackageName,version:string,settings) =
+ let vr = DependenciesFileParser.parseVersionString version
- let strategy,newVersionRange =
+ this.AddAdditionalPackage(packageName,vr.VersionRequirement,vr.ResolverStrategy,settings)
+
+ member this.AddFixedPackage(packageName:PackageName,version:string,settings) =
+ let vr = DependenciesFileParser.parseVersionString version
+
+ let resolverStrategy,versionRequirement =
match packages |> List.tryFind (fun p -> NormalizedPackageName p.Name = NormalizedPackageName packageName) with
| Some package ->
package.ResolverStrategy,
match package.VersionRequirement.Range with
| OverrideAll(_) -> package.VersionRequirement
- | _ -> versionRange
- | None -> DependenciesFileParser.parseResolverStrategy version,versionRange
-
- let newPackage =
- { Name = packageName
- VersionRequirement = newVersionRange
- Sources = sources
- ResolverStrategy = strategy
- Settings = settings
- Parent = PackageRequirementSource.DependenciesFile fileName }
+ | _ -> vr.VersionRequirement
+ | None -> vr.ResolverStrategy,vr.VersionRequirement
- DependenciesFile(fileName,options,sources,(packages |> List.filter (fun p -> NormalizedPackageName p.Name <> NormalizedPackageName packageName)) @ [newPackage], remoteFiles, comments)
+ this.AddAdditionalPackage(packageName,versionRequirement,resolverStrategy,settings)
member this.AddFixedPackage(packageName:PackageName,version:string) =
this.AddFixedPackage(packageName,version,InstallSettings.Default)
- member __.RemovePackage(packageName:PackageName) =
- let newPackages =
- packages
- |> List.filter (fun p -> NormalizedPackageName p.Name <> NormalizedPackageName packageName)
+ member this.RemovePackage(packageName:PackageName) =
+ match tryFindPackageLine packageName with
+ | None -> this
+ | Some pos ->
+ let removeElementAt index myArr = // TODO: Replace this in F# 4.0
+ [| for i = 0 to Array.length myArr - 1 do
+ if i <> index then yield myArr.[ i ] |]
- DependenciesFile(fileName,options,sources,newPackages,remoteFiles, comments)
+ let newLines = removeElementAt pos textRepresentation
+ DependenciesFile(DependenciesFileParser.parseDependenciesFile fileName newLines)
static member add (dependenciesFile : DependenciesFile) (packageName,version,installSettings) =
dependenciesFile.Add(packageName,version,installSettings)
@@ -389,18 +427,22 @@ type DependenciesFile(fileName,options,sources,packages : PackageRequirement lis
traceWarnfn "%s doesn't contain package %s. ==> Ignored" fileName name
this
- member this.UpdatePackageVersion(packageName, version) =
+ member this.UpdatePackageVersion(packageName, version:string) =
let (PackageName name) = packageName
if this.HasPackage(packageName) then
- let versionRequirement = DependenciesFileParser.parseVersionRequirement version
+ let vr = DependenciesFileParser.parseVersionString version
+
tracefn "Updating %s version to %s in %s" name version fileName
- let packages =
- this.Packages |> List.map (fun p ->
- if NormalizedPackageName p.Name = NormalizedPackageName packageName then
- { p with VersionRequirement = versionRequirement }
- else p)
- DependenciesFile(this.FileName, this.Options, sources, packages, this.RemoteFiles, comments)
- else
+ let newLines =
+ this.Lines |> Array.map (fun l ->
+ let name = packageName.ToString().ToLower()
+ if isPackageLine name l then
+ let p = this.GetPackage packageName
+ DependenciesFileSerializer.packageString packageName vr.VersionRequirement vr.ResolverStrategy p.Settings
+ else l)
+
+ DependenciesFile(DependenciesFileParser.parseDependenciesFile this.FileName newLines)
+ else
traceWarnfn "%s doesn't contain package %s. ==> Ignored" fileName name
this
@@ -414,71 +456,7 @@ type DependenciesFile(fileName,options,sources,packages : PackageRequirement lis
let fi = FileInfo(fileName)
fi.Directory.FullName
- override __.ToString() =
- let sources =
- packages
- |> Seq.map (fun package -> package.Sources,package)
- |> Seq.groupBy fst
-
- let formatNugetSource source =
- "source " + String.quoted source.Url +
- match source.Authentication with
- | Some (PlainTextAuthentication(username,password)) ->
- sprintf " username: \"%s\" password: \"%s\"" username password
- | Some (EnvVarAuthentication(usernameVar,passwordVar)) ->
- sprintf " username: \"%s\" password: \"%s\"" usernameVar.Variable passwordVar.Variable
- | _ -> ""
-
- let all =
- let hasReportedSource = ref false
- let hasReportedFirst = ref false
- let hasReportedSecond = ref false
- [ if options.Strict then yield "references: strict"
- if options.Redirects then yield "redirects: on"
- let optionsString = options.Settings.ToString(true)
- if optionsString <> "" then yield optionsString
- for sources, packages in sources do
- for source in sources do
- hasReportedSource := true
- match source with
- | Nuget source -> yield formatNugetSource source
- | LocalNuget source -> yield "source " + String.quoted source
-
- for _,package in packages do
- if (not !hasReportedFirst) && !hasReportedSource then
- yield ""
- hasReportedFirst := true
-
- let (PackageName name) = package.Name
- let version = DependenciesFileSerializer.formatVersionRange package.ResolverStrategy package.VersionRequirement
- let s = package.Settings.ToString()
-
- yield sprintf "nuget %s%s%s" name (if version <> "" then " " + version else "") (if s <> "" then " " + s else s)
-
- for remoteFile in remoteFiles do
- if (not !hasReportedSecond) && !hasReportedFirst then
- yield ""
- hasReportedSecond := true
-
- yield remoteFile.ToString() ]
-
- let comments = comments |> dict
-
- let withComments =
- let lineNo = ref 1
- [for line in all do
- let rec checkForComment() =
- [match comments.TryGetValue !lineNo with
- | true,line ->
- yield line
- lineNo := !lineNo + 1
- yield! checkForComment()
- | _ -> ()]
- yield! checkForComment()
- yield line
- lineNo := !lineNo + 1]
-
- String.Join(Environment.NewLine, withComments)
+ override __.ToString() = String.Join(Environment.NewLine, textRepresentation)
member this.Save() =
File.WriteAllText(fileName, this.ToString())
diff --git a/src/Paket.Core/Environment.fs b/src/Paket.Core/Environment.fs
index 2ce404a4dc..e42601b64d 100644
--- a/src/Paket.Core/Environment.fs
+++ b/src/Paket.Core/Environment.fs
@@ -90,5 +90,5 @@ module PaketEnv =
let dependenciesFile =
DependenciesFile(
Path.Combine(directory.FullName, Constants.DependenciesFileName),
- InstallOptions.Default, [], [], [], [])
+ InstallOptions.Default, [], [], [], [||])
dependenciesFile.ToString() |> saveFile dependenciesFile.FileName
\ No newline at end of file
diff --git a/src/Paket.Core/FindOutdated.fs b/src/Paket.Core/FindOutdated.fs
index 4768c3ed94..cf22476f53 100644
--- a/src/Paket.Core/FindOutdated.fs
+++ b/src/Paket.Core/FindOutdated.fs
@@ -21,7 +21,7 @@ let private adjustVersionRequirements strict includingPrereleases (dependenciesF
| false,false -> VersionRequirement.AllReleases, ResolverStrategy.Max
{ p with VersionRequirement = requirement; ResolverStrategy = strategy})
- DependenciesFile(dependenciesFile.FileName, dependenciesFile.Options, dependenciesFile.Sources, newPackages, dependenciesFile.RemoteFiles, dependenciesFile.Comments)
+ DependenciesFile(dependenciesFile.FileName, dependenciesFile.Options, dependenciesFile.Sources, newPackages, dependenciesFile.RemoteFiles, dependenciesFile.Lines) // TODO: fix me
let private detectOutdated (oldResolution: PackageResolver.PackageResolution) (newResolution: PackageResolver.PackageResolution) =
[for kv in oldResolution do
diff --git a/src/Paket.Core/NugetConvert.fs b/src/Paket.Core/NugetConvert.fs
index cca9cc6133..308e68983f 100644
--- a/src/Paket.Core/NugetConvert.fs
+++ b/src/Paket.Core/NugetConvert.fs
@@ -292,8 +292,16 @@ let createDependenciesFileR (rootDirectory : DirectoryInfo) nugetEnv mode =
sources
|> lift (fun sources ->
- let packages = packages |> List.map (fun (name,v,restr) -> createPackageRequirement (name, v, restr) sources dependenciesFileName)
- Paket.DependenciesFile(dependenciesFileName, InstallOptions.Default, sources, packages, [], []))
+ let sourceLines = sources |> List.map (fun s -> DependenciesFileSerializer.sourceString(s.ToString()))
+ let packageLines =
+ packages
+ |> List.map (fun (name,v,restr) ->
+ let vr = createPackageRequirement (name, v, restr) sources dependenciesFileName
+ DependenciesFileSerializer.packageString vr.Name vr.VersionRequirement vr.ResolverStrategy vr.Settings)
+
+ let newLines = sourceLines @ [""] @ packageLines |> Seq.toArray
+
+ Paket.DependenciesFile(DependenciesFileParser.parseDependenciesFile dependenciesFileName newLines))
if File.Exists dependenciesFileName then read() else create()
diff --git a/src/Paket.Core/Simplifier.fs b/src/Paket.Core/Simplifier.fs
index c0b7c11c28..92cb09940e 100644
--- a/src/Paket.Core/Simplifier.fs
+++ b/src/Paket.Core/Simplifier.fs
@@ -31,11 +31,12 @@ let simplifyDependenciesFile (dependenciesFile : DependenciesFile, flatLookup, i
let packages = dependenciesFile.Packages |> List.map (fun p -> p.Name)
let! transitive = findTransitive(packages, flatLookup, DependencyNotFoundInLockFile)
- let newPackages =
+ return
dependenciesFile.Packages
- |> List.filter (fun package -> not <| removePackage(package.Name, transitive, dependenciesFile.FileName, interactive))
- let d = dependenciesFile
- return DependenciesFile(d.FileName, d.Options, d.Sources, newPackages, d.RemoteFiles, d.Comments)
+ |> List.fold (fun (d:DependenciesFile) package ->
+ if removePackage(package.Name, transitive, dependenciesFile.FileName, interactive) then
+ d.Remove(package.Name)
+ else d) dependenciesFile
}
let simplifyReferencesFile (refFile, flatLookup, interactive) = trial {
diff --git a/src/Paket/Paket.fsproj b/src/Paket/Paket.fsproj
index a67cf41855..8526e42b4a 100644
--- a/src/Paket/Paket.fsproj
+++ b/src/Paket/Paket.fsproj
@@ -32,7 +32,7 @@
paket.exe
D:\code\Pakettest
D:\code\Paketkopie
- add nuget fake
+ add nuget FSharp.Core
Project
paket.exe
D:\code\Pakettest
diff --git a/tests/Paket.Tests/DependenciesFile/AddPackageSpecs.fs b/tests/Paket.Tests/DependenciesFile/AddPackageSpecs.fs
index 17470fe2f9..39eb93fc0f 100644
--- a/tests/Paket.Tests/DependenciesFile/AddPackageSpecs.fs
+++ b/tests/Paket.Tests/DependenciesFile/AddPackageSpecs.fs
@@ -21,8 +21,8 @@ nuget SignalR = 3.3.2"""
nuget Castle.Windsor-log4net ~> 3.2
nuget Rx-Main ~> 2.0
-nuget FAKE 1.1
-nuget SignalR 3.3.2
+nuget FAKE = 1.1
+nuget SignalR = 3.3.2
nuget xunit"""
cfg.ToString()
@@ -42,10 +42,10 @@ nuget SignalR = 3.3.2"""
let expected = """source http://nuget.org/api/v2
nuget Castle.Windsor-log4net ~> 3.2
-nuget FAKE 1.1
+nuget FAKE = 1.1
nuget Rx-Main ~> 2.0
nuget Rz
-nuget SignalR 3.3.2"""
+nuget SignalR = 3.3.2"""
cfg.ToString()
|> shouldEqual (normalizeLineEndings expected)
@@ -67,7 +67,7 @@ github forki/FsUnit FsUnit.fs"""
nuget Castle.Windsor-log4net ~> 3.2
nuget Rx-Main ~> 2.0
-nuget FAKE 1.1
+nuget FAKE = 1.1
nuget NuGet.CommandLine
nuget xunit
@@ -105,7 +105,6 @@ nuget Castle.Windsor-log4net ~> 3.2"""
let cfg = DependenciesFile.FromCode(config).Add(PackageName "FAKE","1.2")
let expected = """source http://nuget.org/api/v2
-
nuget Castle.Windsor-log4net ~> 3.2
nuget FAKE 1.2"""
@@ -129,13 +128,14 @@ github forki/FsUnit FsUnit.fs"""
[]
let ``should add new packages with nuget package resolution strategy``() =
- let config = """"""
+ let config = ""
let cfg = DependenciesFile.FromCode(config).Add(PackageName "FAKE","!~> 1.2")
let expected = """source https://nuget.org/api/v2
-nuget FAKE !~> 1.2"""
+nuget FAKE !~> 1.2
+"""
cfg.ToString()
|> shouldEqual (normalizeLineEndings expected)
@@ -161,4 +161,64 @@ nuget Rx-Main ~> 2.0
nuget FAKE = 1.1
nuget SignalR = 3.3.2"""
- DependenciesFile.FromCode(config).Add(PackageName "fAKe","") |> ignore
\ No newline at end of file
+ DependenciesFile.FromCode(config).Add(PackageName "fAKe","") |> ignore
+
+[]
+let ``should keep sources stable``() =
+ let before = """source https://www.nuget.org/api/v2
+
+nuget quicksilver
+nuget FsCheck
+
+source https://www.nuget.org/api/v3
+
+nuget NUnit"""
+
+ let expected = """source https://www.nuget.org/api/v2
+
+nuget quicksilver
+nuget FsCheck
+
+source https://www.nuget.org/api/v3
+
+nuget NUnit
+nuget FAKE"""
+
+ DependenciesFile.FromCode(before)
+ .Add(PackageName "FAKE","")
+ .ToString()
+ |> shouldEqual (normalizeLineEndings expected)
+
+[]
+let ``should update packages with new version``() =
+ let config = """source https://nuget.org/api/v2
+
+nuget FAKE 1.1
+"""
+
+ let cfg = DependenciesFile.FromCode(config).UpdatePackageVersion(PackageName "FAKE","1.2")
+
+ let expected = """source https://nuget.org/api/v2
+
+nuget FAKE 1.2
+"""
+
+ cfg.ToString()
+ |> shouldEqual (normalizeLineEndings expected)
+
+[]
+let ``should update packages with nuget package resolution strategy``() =
+ let config = """source https://nuget.org/api/v2
+
+nuget FAKE ~> 1.1
+"""
+
+ let cfg = DependenciesFile.FromCode(config).UpdatePackageVersion(PackageName "FAKE","!~> 1.2")
+
+ let expected = """source https://nuget.org/api/v2
+
+nuget FAKE !~> 1.2
+"""
+
+ cfg.ToString()
+ |> shouldEqual (normalizeLineEndings expected)
\ No newline at end of file
diff --git a/tests/Paket.Tests/DependenciesFile/RemovePackageSpecs.fs b/tests/Paket.Tests/DependenciesFile/RemovePackageSpecs.fs
new file mode 100644
index 0000000000..22a08ff55f
--- /dev/null
+++ b/tests/Paket.Tests/DependenciesFile/RemovePackageSpecs.fs
@@ -0,0 +1,58 @@
+module paket.dependenciesFile.RemovePackageSpecs
+
+open Paket
+open NUnit.Framework
+open FsUnit
+open TestHelpers
+open Paket.Domain
+
+[]
+let ``should remove the right package``() =
+ let config = """source http://nuget.org/api/v2
+
+nuget Castle.Windsor-log4net ~> 3.2
+nuget Rx-Main ~> 2.0
+nuget FAKE = 1.1
+nuget SignalR = 3.3.2"""
+
+ let cfg = DependenciesFile.FromCode(config).Remove(PackageName "FAKE")
+
+ let expected = """source http://nuget.org/api/v2
+
+nuget Castle.Windsor-log4net ~> 3.2
+nuget Rx-Main ~> 2.0
+nuget SignalR = 3.3.2"""
+
+ cfg.ToString()
+ |> shouldEqual (normalizeLineEndings expected)
+
+[]
+let ``should remove only the correct package``() =
+ let config = """source http://nuget.org/api/v2
+
+nuget Castle.Windsor-log4net ~> 3.2
+nuget Castle.Windsor ~> 3.2"""
+
+ let cfg = DependenciesFile.FromCode(config).Remove(PackageName "Castle.Windsor")
+
+ let expected = """source http://nuget.org/api/v2
+
+nuget Castle.Windsor-log4net ~> 3.2"""
+
+ cfg.ToString()
+ |> shouldEqual (normalizeLineEndings expected)
+
+[]
+let ``should keep stable if package doesn't exist``() =
+ let config = """source http://nuget.org/api/v2
+
+nuget Castle.Windsor-log4net ~> 3.2"""
+
+ let cfg = DependenciesFile.FromCode(config).Remove(PackageName "Castle.Windsor")
+
+ let expected = """source http://nuget.org/api/v2
+
+nuget Castle.Windsor-log4net ~> 3.2"""
+
+ cfg.ToString()
+ |> shouldEqual (normalizeLineEndings expected)
\ No newline at end of file
diff --git a/tests/Paket.Tests/DependenciesFile/SaveSpecs.fs b/tests/Paket.Tests/DependenciesFile/SaveSpecs.fs
index c1aa90c7c9..e683a1a3ad 100644
--- a/tests/Paket.Tests/DependenciesFile/SaveSpecs.fs
+++ b/tests/Paket.Tests/DependenciesFile/SaveSpecs.fs
@@ -35,22 +35,6 @@ let ``should serialize strict config``() =
|> shouldEqual (normalizeLineEndings strictConfig)
-let configWithNoRestriction = """source http://nuget.org/api/v2
-
-nuget FAKE >= 0"""
-
-let configWithNoRestriction2 = """source http://nuget.org/api/v2
-
-nuget FAKE"""
-
-
-[]
-let ``should remove >= 0 from config``() =
- let cfg = DependenciesFile.FromCode(configWithNoRestriction)
-
- cfg.ToString()
- |> shouldEqual (normalizeLineEndings configWithNoRestriction2)
-
let contentNoneConfig = """redirects: on
content: none
source http://nuget.org/api/v2
diff --git a/tests/Paket.Tests/Paket.Tests.fsproj b/tests/Paket.Tests/Paket.Tests.fsproj
index 3f2305ac3a..399b162172 100644
--- a/tests/Paket.Tests/Paket.Tests.fsproj
+++ b/tests/Paket.Tests/Paket.Tests.fsproj
@@ -176,6 +176,7 @@
+
diff --git a/tests/Paket.Tests/Simplifier/BasicScenarioSpecs.fs b/tests/Paket.Tests/Simplifier/BasicScenarioSpecs.fs
index 894105ddd9..01225f27ae 100644
--- a/tests/Paket.Tests/Simplifier/BasicScenarioSpecs.fs
+++ b/tests/Paket.Tests/Simplifier/BasicScenarioSpecs.fs
@@ -95,3 +95,12 @@ let ``should remove all transitive dependencies from dep file recursively``() =
depFile.Packages |> List.map (fun p -> p.Name) |> shouldEqual [PackageName"A";PackageName"C"]
refFiles.Head.NugetPackages |> shouldEqual [PackageInstallSettings.Default("A"); PackageInstallSettings.Default("C")]
refFiles.Tail.Head.NugetPackages |> shouldEqual [PackageInstallSettings.Default("C"); PackageInstallSettings.Default("D")]
+
+ let expected = """
+source http://nuget.org/api/v2
+
+nuget A 1.0
+nuget C 1.0"""
+
+ depFile.ToString()
+ |> shouldEqual (normalizeLineEndings expected)