diff --git a/src/Paket.Core/AddProcess.fs b/src/Paket.Core/AddProcess.fs index 33becfffa0..6ba01c8d6d 100644 --- a/src/Paket.Core/AddProcess.fs +++ b/src/Paket.Core/AddProcess.fs @@ -14,31 +14,31 @@ let private addToProject (project : ProjectFile) package = .AddNuGetReference(package) .Save() -let private add installToProjects addToProjectsF dependenciesFileName package version force hard installAfter = +let private add installToProjects addToProjectsF dependenciesFileName package version options installAfter = let existingDependenciesFile = DependenciesFile.ReadFromFile(dependenciesFileName) let (PackageName name) = package - if (not installToProjects) && existingDependenciesFile.HasPackage package && String.IsNullOrWhiteSpace version then + if (not installToProjects) && existingDependenciesFile.HasPackage package && String.IsNullOrWhiteSpace version then traceWarnfn "%s contains package %s already." dependenciesFileName name else let dependenciesFile = existingDependenciesFile .Add(package,version) - - let lockFile = UpdateProcess.SelectiveUpdate(dependenciesFile,Some(NormalizedPackageName package),force) + + let lockFile = UpdateProcess.SelectiveUpdate(dependenciesFile, Some(NormalizedPackageName package), options.Force) let projects = seq { for p in ProjectFile.FindAllProjects(Path.GetDirectoryName lockFile.FileName) -> p } // lazy sequence in case no project install required dependenciesFile.Save() - + package |> addToProjectsF projects if installAfter then let sources = dependenciesFile.GetAllPackageSources() - InstallProcess.Install(sources, force, hard, false, lockFile) + InstallProcess.Install(sources, { SmartInstallOptions.Default with Common = options }, lockFile) + +// Add a package with the option to add it to a specified project. +let AddToProject(dependenciesFileName, package, version, options : InstallerOptions, projectName, installAfter) = -// add a package with the option to add it to a specified project -let AddToProject(dependenciesFileName, package, version, force, hard, projectName, installAfter) = - - let addToSpecifiedProject (projects : ProjectFile seq) package = + let addToSpecifiedProject (projects : ProjectFile seq) package = match ProjectFile.TryFindProject(projects,projectName) with | Some p -> if package |> notInstalled p then @@ -47,15 +47,15 @@ let AddToProject(dependenciesFileName, package, version, force, hard, projectNam | None -> traceErrorfn "Could not install package in specified project %s. Project not found" projectName - add true addToSpecifiedProject dependenciesFileName package version force hard installAfter - -// add a package with the option to interactively add it to multiple projects -let Add(dependenciesFileName, package, version, force, hard, interactive, installAfter) = - - let addToProjects (projects : ProjectFile seq) package = + add true addToSpecifiedProject dependenciesFileName package version options installAfter + +// Add a package with the option to interactively add it to multiple projects. +let Add(dependenciesFileName, package, version, options : InstallerOptions, interactive, installAfter) = + + let addToProjects (projects : ProjectFile seq) package = if interactive then for project in projects do if package |> notInstalled project && Utils.askYesNo(sprintf " Install to %s?" project.Name) then package |> addToProject project - - add interactive addToProjects dependenciesFileName package version force hard installAfter \ No newline at end of file + + add interactive addToProjects dependenciesFileName package version options installAfter diff --git a/src/Paket.Core/InstallProcess.fs b/src/Paket.Core/InstallProcess.fs index d652672a80..d026390e37 100644 --- a/src/Paket.Core/InstallProcess.fs +++ b/src/Paket.Core/InstallProcess.fs @@ -23,17 +23,17 @@ let findPackageFolder root (PackageName name) = | Some x -> x | None -> failwithf "Package directory for package %s was not found." name -let private findPackagesWithContent (root,usedPackages:Map) = +let private findPackagesWithContent (root,usedPackages:Map) = usedPackages |> Seq.filter (fun kv -> defaultArg kv.Value.Settings.OmitContent false |> not) |> Seq.map (fun kv -> findPackageFolder root kv.Key) - |> Seq.choose (fun packageDir -> - packageDir.GetDirectories("Content") + |> Seq.choose (fun packageDir -> + packageDir.GetDirectories("Content") |> Array.append (packageDir.GetDirectories("content")) |> Array.tryFind (fun _ -> true)) |> Seq.toList -let private copyContentFiles (project : ProjectFile, packagesWithContent) = +let private copyContentFiles (project : ProjectFile, packagesWithContent) = let rules : list<(FileInfo -> bool)> = [ fun f -> f.Name = "_._" @@ -49,7 +49,7 @@ let private copyContentFiles (project : ProjectFile, packagesWithContent) = fromDir.GetDirectories() |> Array.toList |> List.collect (fun subDir -> copyDirContents(subDir, lazy toDir.Force().CreateSubdirectory(subDir.Name))) |> List.append - (fromDir.GetFiles() + (fromDir.GetFiles() |> Array.toList |> List.filter (onBlackList >> not) |> List.map (fun file -> file.CopyTo(Path.Combine(toDir.Force().FullName, file.Name), true))) @@ -64,28 +64,28 @@ let private removeCopiedFiles (project: ProjectFile) = removeEmptyDirHierarchy dir.Parent let removeFilesAndTrimDirs (files: FileInfo list) = - for f in files do - if f.Exists then + for f in files do + if f.Exists then f.Delete() - let dirsPathsDeepestFirst = + let dirsPathsDeepestFirst = files |> Seq.map (fun f -> f.Directory.FullName) |> Seq.distinct |> List.ofSeq |> List.rev - + for dirPath in dirsPathsDeepestFirst do removeEmptyDirHierarchy (DirectoryInfo dirPath) - project.GetPaketFileItems() + project.GetPaketFileItems() |> List.filter (fun fi -> not <| fi.FullName.Contains(Constants.PaketFilesFolderName)) |> removeFilesAndTrimDirs -let CreateInstallModel(root, sources, force, package) = - async { +let CreateInstallModel(root, sources, force, package) = + async { let! (package, files, targetsFiles) = RestoreProcess.ExtractPackage(root, sources, force, package) - let (PackageName name) = package.Name + let (PackageName name) = package.Name let nuspec = Nuspec.Load(root,package.Name) let files = files |> Array.map (fun fi -> fi.FullName) let targetsFiles = targetsFiles |> Array.map (fun fi -> fi.FullName) @@ -93,11 +93,12 @@ let CreateInstallModel(root, sources, force, package) = } /// Restores the given packages from the lock file. -let createModel(root, sources,force, lockFile:LockFile) = +let createModel(root, sources, force, lockFile : LockFile, packages:Set) = let sourceFileDownloads = RemoteDownload.DownloadSourceFiles(root, lockFile.SourceFiles) - - let packageDownloads = + + let packageDownloads = lockFile.ResolvedPackages + |> Map.filter (fun name _ -> packages.Contains name) |> Seq.map (fun kv -> CreateInstallModel(root,sources,force,kv.Value)) |> Async.Parallel @@ -139,17 +140,30 @@ let findAllReferencesFiles root = |> ProjectFile.FindAllProjects |> Array.choose (fun p -> ProjectFile.FindReferencesFile(FileInfo(p.FileName)) |> Option.map (fun r -> p, r)) - |> Array.map (fun (project,file) -> - try + |> Array.map (fun (project,file) -> + try ok <| (project, ReferencesFile.FromFile(file)) - with _ -> + with _ -> fail <| ReferencesFileParseError (FileInfo(file))) |> collect /// Installs all packages from the lock file. -let InstallIntoProjects(sources,force, hard, withBindingRedirects, lockFile:LockFile, projects) = +let InstallIntoProjects(sources, options : SmartInstallOptions, lockFile : LockFile, projects : (ProjectFile * ReferencesFile) list) = + let packagesToInstall = + if options.OnlyReferenced then + projects + |> Seq.ofList + |> Seq.map (fun (_, referencesFile)-> + referencesFile + |> lockFile.GetPackageHull + |> Seq.map (fun p -> NormalizedPackageName p.Key)) + |> Seq.concat + else + lockFile.ResolvedPackages + |> Seq.map (fun kv -> kv.Key) + let root = Path.GetDirectoryName lockFile.FileName - let extractedPackages = createModel(root,sources,force, lockFile) + let extractedPackages = createModel(root, sources, options.Common.Force, lockFile, Set.ofSeq packagesToInstall) let model = extractedPackages @@ -161,29 +175,29 @@ let InstallIntoProjects(sources,force, hard, withBindingRedirects, lockFile:Lock |> Array.map (fun (p,m) -> NormalizedPackageName p.Name,p) |> Map.ofArray - for project : ProjectFile, referenceFile in projects do + for project : ProjectFile, referenceFile in projects do verbosefn "Installing to %s" project.FileName - + let usedPackages = lockFile.GetPackageHull(referenceFile) - |> Seq.map (fun u -> + |> Seq.map (fun u -> let package = packages.[NormalizedPackageName u.Key] - let referenceFileSettings = + let referenceFileSettings = referenceFile.NugetPackages |> List.tryFind (fun x -> NormalizedPackageName x.Name = NormalizedPackageName u.Key) - let copyLocal = + let copyLocal = match referenceFileSettings with | Some s -> s.Settings.CopyLocal | None -> None - let omitContent = + let omitContent = match referenceFileSettings with | Some s -> s.Settings.OmitContent | None -> None - let importTargets = + let importTargets = match referenceFileSettings with | Some s -> s.Settings.ImportTargets | None -> None - let restriktions = + let restriktions = match referenceFileSettings with | Some s -> s.Settings.FrameworkRestrictions | None -> [] @@ -192,12 +206,12 @@ let InstallIntoProjects(sources,force, hard, withBindingRedirects, lockFile:Lock u.Key, { u.Value with Settings = - { u.Value.Settings with - FrameworkRestrictions = + { u.Value.Settings with + FrameworkRestrictions = // TODO: This should filter restriktions @ - u.Value.Settings.FrameworkRestrictions @ - lockFile.Options.Settings.FrameworkRestrictions @ + u.Value.Settings.FrameworkRestrictions @ + lockFile.Options.Settings.FrameworkRestrictions @ package.Settings.FrameworkRestrictions ImportTargets = @@ -241,11 +255,11 @@ let InstallIntoProjects(sources,force, hard, withBindingRedirects, lockFile:Lock |> Seq.map (fun u -> NormalizedPackageName u.Key,u.Value) |> Map.ofSeq - project.UpdateReferences(model,usedPackageSettings,hard) - + project.UpdateReferences(model, usedPackageSettings, options.Common.Hard) + removeCopiedFiles project - let getSingleRemoteFilePath name = + let getSingleRemoteFilePath name = traceVerbose <| sprintf "Filename %s " name lockFile.SourceFiles |> List.iter (fun i -> traceVerbose <| sprintf " %s %s " i.Name (i.FilePath root)) let sourceFile = lockFile.SourceFiles |> List.tryFind (fun f -> Path.GetFileName(f.Name) = name) @@ -255,28 +269,28 @@ let InstallIntoProjects(sources,force, hard, withBindingRedirects, lockFile:Lock let gitRemoteItems = referenceFile.RemoteFiles - |> List.map (fun file -> - { BuildAction = project.DetermineBuildAction file.Name + |> List.map (fun file -> + { BuildAction = project.DetermineBuildAction file.Name Include = createRelativePath project.FileName (getSingleRemoteFilePath file.Name) Link = Some(if file.Link = "." then Path.GetFileName(file.Name) else Path.Combine(file.Link, Path.GetFileName(file.Name))) }) - + let nuGetFileItems = copyContentFiles(project, findPackagesWithContent(root,usedPackages)) - |> List.map (fun file -> + |> List.map (fun file -> { BuildAction = project.DetermineBuildAction file.Name Include = createRelativePath project.FileName file.FullName Link = None }) - project.UpdateFileItems(gitRemoteItems @ nuGetFileItems, hard) + project.UpdateFileItems(gitRemoteItems @ nuGetFileItems, options.Common.Hard) project.Save() - if withBindingRedirects || lockFile.Options.Redirects then + if options.Common.Redirects || lockFile.Options.Redirects then applyBindingRedirects root extractedPackages /// Installs all packages from the lock file. -let Install(sources,force, hard, withBindingRedirects, lockFile:LockFile) = - let root = FileInfo(lockFile.FileName).Directory.FullName +let Install(sources, options : SmartInstallOptions, lockFile : LockFile) = + let root = FileInfo(lockFile.FileName).Directory.FullName let projects = findAllReferencesFiles root |> returnOrFail - InstallIntoProjects(sources,force,hard,withBindingRedirects,lockFile,projects) + InstallIntoProjects(sources, options, lockFile, projects) diff --git a/src/Paket.Core/NugetConvert.fs b/src/Paket.Core/NugetConvert.fs index 2d2d7c2615..db037b13df 100644 --- a/src/Paket.Core/NugetConvert.fs +++ b/src/Paket.Core/NugetConvert.fs @@ -405,4 +405,6 @@ let replaceNugetWithPaket initAutoRestore installAfter result = VSIntegration.TurnOnAutoRestore result.PaketEnv |> returnOrFail if installAfter then - UpdateProcess.Update(result.PaketEnv.DependenciesFile.FileName,true,true,true) \ No newline at end of file + UpdateProcess.Update( + result.PaketEnv.DependenciesFile.FileName, + { InstallerOptions.Default with Force = true; Hard = true; Redirects = true }) diff --git a/src/Paket.Core/Paket.Core.fsproj b/src/Paket.Core/Paket.Core.fsproj index e37fe65567..92813ffe6e 100644 --- a/src/Paket.Core/Paket.Core.fsproj +++ b/src/Paket.Core/Paket.Core.fsproj @@ -109,6 +109,7 @@ + diff --git a/src/Paket.Core/ProcessOptions.fs b/src/Paket.Core/ProcessOptions.fs new file mode 100644 index 0000000000..73e2c215e8 --- /dev/null +++ b/src/Paket.Core/ProcessOptions.fs @@ -0,0 +1,30 @@ +namespace Paket + +// Options for UpdateProcess and InstallProcess. +/// Force - Force the download and reinstallation of all packages +/// Hard - Replace package references within project files even if they are not yet adhering +/// to the Paket's conventions (and hence considered manually managed) +/// Redirects - Create binding redirects for the NuGet packages +type InstallerOptions = + { Force : bool + Hard : bool + Redirects : bool } + + static member Default = + { Force = false + Hard = false + Redirects = false } + + static member createLegacyOptions(force, hard, redirects) = + { InstallerOptions.Default with + Force = force + Hard = hard + Redirects = redirects } + +type SmartInstallOptions = + { Common : InstallerOptions + OnlyReferenced : bool } + + static member Default = + { Common = InstallerOptions.Default + OnlyReferenced = false } diff --git a/src/Paket.Core/PublicAPI.fs b/src/Paket.Core/PublicAPI.fs index b7c96a4462..bb50c74342 100644 --- a/src/Paket.Core/PublicAPI.fs +++ b/src/Paket.Core/PublicAPI.fs @@ -1,11 +1,12 @@ namespace Paket -open System.IO +open Paket.Domain open Paket.Logging +open Paket.PackageSources + open System -open Paket.Domain +open System.IO open Chessie.ErrorHandling -open PackageSources /// Paket API which is optimized for F# Interactive use. type Dependencies(dependenciesFileName: string) = @@ -20,7 +21,7 @@ type Dependencies(dependenciesFileName: string) = let (PackageName name) = p.Name name, p.Version.ToString()) |> Seq.toList - + /// Tries to locate the paket.dependencies file in the current folder or a parent folder. static member Locate(): Dependencies = Dependencies.Locate(Environment.CurrentDirectory) @@ -36,7 +37,7 @@ type Dependencies(dependenciesFileName: string) = if parent = null then if withError then failwithf "Could not find '%s'. To use Paket with this solution, please run 'paket init' first." Constants.DependenciesFileName - else + else Constants.DependenciesFileName else findInPath(parent, withError) @@ -54,7 +55,7 @@ type Dependencies(dependenciesFileName: string) = Utils.RunInLockedAccessMode( directory.FullName, - fun () -> + fun () -> PaketEnv.init directory |> returnOrFail ) @@ -76,7 +77,7 @@ type Dependencies(dependenciesFileName: string) = member this.Simplify(interactive : bool) = Utils.RunInLockedAccessMode( this.RootPath, - fun () -> + fun () -> PaketEnv.fromRootDirectory this.RootDirectory >>= PaketEnv.ensureNotInStrictMode >>= Simplifier.simplify interactive @@ -104,34 +105,60 @@ type Dependencies(dependenciesFileName: string) = member this.Add(package: string): unit = this.Add(package,"") /// Adds the given package with the given version to the dependencies file. - member this.Add(package: string,version: string): unit = this.Add(package, version, false, false, false, true) + member this.Add(package: string,version: string): unit = + this.Add(package, version, force = false, hard = false, redirects = false, interactive = false, installAfter = true) /// Adds the given package with the given version to the dependencies file. member this.Add(package: string,version: string,force: bool,hard: bool,interactive: bool,installAfter: bool): unit = + this.Add(package, version, force, hard, false, interactive, installAfter) + + /// Adds the given package with the given version to the dependencies file. + member this.Add(package: string,version: string,force: bool,hard: bool,redirects: bool,interactive: bool,installAfter: bool): unit = Utils.RunInLockedAccessMode( this.RootPath, - fun () -> AddProcess.Add(dependenciesFileName, PackageName(package.Trim()), version, force, hard, interactive, installAfter)) + fun () -> AddProcess.Add(dependenciesFileName, PackageName(package.Trim()), version, + InstallerOptions.createLegacyOptions(force, hard, redirects), + interactive, installAfter)) /// Adds the given package with the given version to the dependencies file. member this.AddToProject(package: string,version: string,force: bool,hard: bool,projectName: string,installAfter: bool): unit = + this.AddToProject(package, version, force, hard, false, projectName, installAfter) + + /// Adds the given package with the given version to the dependencies file. + member this.AddToProject(package: string,version: string,force: bool,hard: bool,redirects: bool,projectName: string,installAfter: bool): unit = Utils.RunInLockedAccessMode( this.RootPath, - fun () -> AddProcess.AddToProject(dependenciesFileName, PackageName package, version, force, hard, projectName, installAfter)) - + fun () -> AddProcess.AddToProject(dependenciesFileName, PackageName package, version, + InstallerOptions.createLegacyOptions(force, hard, redirects), + projectName, installAfter)) + /// Adds credentials for a Nuget feed member this.AddCredentials(source: string, username: string) : unit = Utils.RunInLockedAccessMode( this.RootPath, fun () -> ConfigFile.askAndAddAuth source username |> returnOrFail ) - + + /// Installs all dependencies. + member this.Install(force: bool, hard: bool) = this.Install(force, hard, false) + /// Installs all dependencies. - member this.Install(force: bool,hard: bool,withBindingRedirects:bool): unit = + member this.Install(force: bool, hard: bool, withBindingRedirects: bool): unit = + this.Install(force, hard, withBindingRedirects, false) + + /// Installs all dependencies. + member this.Install(force: bool, hard: bool, withBindingRedirects: bool, onlyReferenced: bool): unit = + this.Install({ SmartInstallOptions.Default with + Common = { SmartInstallOptions.Default.Common with Force = force; Hard = hard; Redirects = withBindingRedirects } + OnlyReferenced = onlyReferenced }) + + /// Installs all dependencies. + member private this.Install(options: SmartInstallOptions): unit = Utils.RunInLockedAccessMode( this.RootPath, - fun () -> UpdateProcess.SmartInstall(dependenciesFileName,None,force,hard,withBindingRedirects)) + fun () -> UpdateProcess.SmartInstall(dependenciesFileName, None, options)) /// Creates a paket.dependencies file with the given text in the current directory and installs it. - static member Install(dependencies, ?path: string, ?force, ?hard, ?withBindingRedirects) = + static member Install(dependencies, ?path: string, ?force, ?hard, ?withBindingRedirects) = let path = defaultArg path Environment.CurrentDirectory let fileName = Path.Combine(path, Constants.DependenciesFileName) File.WriteAllText(fileName, dependencies) @@ -141,23 +168,21 @@ type Dependencies(dependenciesFileName: string) = hard = defaultArg hard false, withBindingRedirects = defaultArg withBindingRedirects false) - /// Installs all dependencies. - member this.Install(force: bool,hard: bool): unit = this.Install(force,hard,false) - /// Updates all dependencies. - member this.Update(force: bool,hard: bool,withBindingRedirects:bool): unit = + member this.Update(force: bool,hard: bool,withBindingRedirects:bool): unit = Utils.RunInLockedAccessMode( this.RootPath, - fun () -> UpdateProcess.Update(dependenciesFileName,force,hard,withBindingRedirects)) + fun () -> UpdateProcess.Update(dependenciesFileName, InstallerOptions.createLegacyOptions(force, hard, withBindingRedirects))) /// Updates all dependencies. - member this.Update(force: bool,hard: bool): unit = this.Update(force,hard,false) + member this.Update(force: bool, hard: bool): unit = this.Update(force, hard, false) /// Updates the given package. - member this.UpdatePackage(package: string,version: string option,force: bool,hard: bool): unit = + member this.UpdatePackage(package: string, version: string option, force: bool, hard: bool): unit = Utils.RunInLockedAccessMode( this.RootPath, - fun () -> UpdateProcess.UpdatePackage(dependenciesFileName,PackageName package,version,force,hard,false)) + fun () -> UpdateProcess.UpdatePackage(dependenciesFileName, PackageName package, version, + InstallerOptions.createLegacyOptions(force, hard, false))) /// Restores all dependencies. member this.Restore(): unit = this.Restore(false,[]) @@ -166,11 +191,22 @@ type Dependencies(dependenciesFileName: string) = member this.Restore(files: string list): unit = this.Restore(false,files) /// Restores the given paket.references files. - member this.Restore(force,files: string list): unit = + member this.Restore(force, files: string list): unit = Utils.RunInLockedAccessMode( this.RootPath, fun () -> RestoreProcess.Restore(dependenciesFileName,force,files)) + /// Restores packages for all available paket.references files + /// (or all packages if onlyReferenced is false) + member this.Restore(force, onlyReferenced: bool): unit = + let referencesFiles = + this.RootPath + |> ProjectFile.FindAllProjects + |> Array.choose (fun p -> ProjectFile.FindReferencesFile(FileInfo(p.FileName))) + if Array.isEmpty referencesFiles then + traceWarnfn "No paket.references files found for which packages could be installed." + else this.Restore(force, Array.toList referencesFiles) + /// Lists outdated packages. member this.ShowOutdated(strict: bool,includePrereleases: bool): unit = FindOutdated.ShowOutdated strict includePrereleases |> this.Process @@ -182,13 +218,13 @@ type Dependencies(dependenciesFileName: string) = |> List.map (fun (PackageName p,_,newVersion) -> p,newVersion) /// Pulls new paket.targets and bootstrapper and puts them into .paket folder. - member this.TurnOnAutoRestore(): unit = + member this.TurnOnAutoRestore(): unit = Utils.RunInLockedAccessMode( this.RootPath, fun () -> VSIntegration.TurnOnAutoRestore |> this.Process) /// Removes paket.targets file and Import section from project files. - member this.TurnOffAutoRestore(): unit = + member this.TurnOffAutoRestore(): unit = Utils.RunInLockedAccessMode( this.RootPath, fun () -> VSIntegration.TurnOffAutoRestore |> this.Process) @@ -204,12 +240,12 @@ type Dependencies(dependenciesFileName: string) = |> listPackages /// Returns all sources from the dependencies file. - member this.GetSources() = + member this.GetSources() = let dependenciesFile = DependenciesFile.ReadFromFile dependenciesFileName dependenciesFile.Sources /// Returns all system-wide defined NuGet feeds. (Can be used for Autocompletion) - member this.GetDefinedNuGetFeeds() : string list = + member this.GetDefinedNuGetFeeds() : string list = let configured = match NuGetConvert.NugetEnv.readNugetConfig(this.RootDirectory) with | Result.Ok(config,_) -> config.PackageSources |> List.map fst @@ -222,15 +258,15 @@ type Dependencies(dependenciesFileName: string) = member this.GetInstalledPackages(referencesFile:ReferencesFile): (string * string) list = let lockFile = getLockFile() let resolved = lockFile.ResolvedPackages - referencesFile + referencesFile |> lockFile.GetPackageHull - |> Seq.map (fun kv -> + |> Seq.map (fun kv -> let name = kv.Key name.ToString(),resolved.[NormalizedPackageName name].Version.ToString()) |> Seq.toList /// Returns an InstallModel for the given package. - member this.GetInstalledPackageModel(packageName) = + member this.GetInstalledPackageModel(packageName) = match this.GetInstalledVersion(packageName) with | None -> failwithf "Package %s is not installed" packageName | Some version -> @@ -242,7 +278,7 @@ type Dependencies(dependenciesFileName: string) = InstallModel.CreateFromLibs(PackageName packageName, SemVer.Parse version, [], files, [], nuspec) /// Returns all libraries for the given package and framework. - member this.GetLibraries(packageName,frameworkIdentifier:FrameworkIdentifier) = + member this.GetLibraries(packageName,frameworkIdentifier:FrameworkIdentifier) = this .GetInstalledPackageModel(packageName) .GetLibReferences(frameworkIdentifier) @@ -276,7 +312,7 @@ type Dependencies(dependenciesFileName: string) = /// Removes the given package from dependencies file. member this.Remove(package: string): unit = this.Remove(package, false, false, false, true) - + /// Removes the given package from dependencies file. member this.Remove(package: string,force: bool,hard: bool,interactive: bool,installAfter: bool): unit = Utils.RunInLockedAccessMode( @@ -315,7 +351,7 @@ type Dependencies(dependenciesFileName: string) = FindReferences.FindReferencesForPackage (PackageName package) |> this.Process // Packs all paket.template files. - member this.Pack(outputPath, ?buildConfig, ?version, ?releaseNotes, ?templateFile) = + member this.Pack(outputPath, ?buildConfig, ?version, ?releaseNotes, ?templateFile) = let dependenciesFile = DependenciesFile.ReadFromFile dependenciesFileName PackageProcess.Pack(dependenciesFile, outputPath, buildConfig, version, releaseNotes, templateFile) @@ -328,4 +364,4 @@ type Dependencies(dependenciesFileName: string) = if String.IsNullOrEmpty apiKey then failwithf "Could not push package %s. Please specify a NuGet API key via environment variable \"nugetkey\"." packageFileName let maxTrials = defaultArg maxTrials 5 - RemoteUpload.Push maxTrials urlWithEndpoint apiKey packageFileName \ No newline at end of file + RemoteUpload.Push maxTrials urlWithEndpoint apiKey packageFileName diff --git a/src/Paket.Core/RemoveProcess.fs b/src/Paket.Core/RemoveProcess.fs index b07ee4e1be..39d185bc7f 100644 --- a/src/Paket.Core/RemoveProcess.fs +++ b/src/Paket.Core/RemoveProcess.fs @@ -46,7 +46,7 @@ let private remove removeFromProjects dependenciesFileName (package: PackageName if installAfter then let sources = DependenciesFile.ReadFromFile(dependenciesFileName).GetAllPackageSources() - InstallProcess.Install(sources, force, hard, false, lockFile) + InstallProcess.Install(sources, { SmartInstallOptions.Default with Common = { InstallerOptions.Default with Force = force; Hard = hard; Redirects = false }}, lockFile ) // remove a package with the option to remove it from a specified project let RemoveFromProject(dependenciesFileName, package:PackageName, force, hard, projectName, installAfter) = diff --git a/src/Paket.Core/RestoreProcess.fs b/src/Paket.Core/RestoreProcess.fs index e0f79928b5..c087bd7f7e 100644 --- a/src/Paket.Core/RestoreProcess.fs +++ b/src/Paket.Core/RestoreProcess.fs @@ -50,6 +50,14 @@ let internal restore(root, sources, force, lockFile:LockFile, packages:Set Seq.map (fun fileName -> + ReferencesFile.FromFile fileName + |> lockFile.GetPackageHull + |> Seq.map (fun p -> NormalizedPackageName p.Key)) + |> Seq.concat + let Restore(dependenciesFileName,force,referencesFileNames) = let lockFileName = DependenciesFile.FindLockfile dependenciesFileName let root = lockFileName.Directory.FullName @@ -67,11 +75,8 @@ let Restore(dependenciesFileName,force,referencesFileNames) = |> Seq.map (fun kv -> kv.Key) else referencesFileNames - |> List.map (fun fileName -> - ReferencesFile.FromFile fileName - |> lockFile.GetPackageHull - |> Seq.map (fun p -> NormalizedPackageName p.Key)) - |> Seq.concat + |> List.toSeq + |> computePackageHull lockFile restore(root, sources, force, lockFile,Set.ofSeq packages) |> Async.RunSynchronously diff --git a/src/Paket.Core/UpdateProcess.fs b/src/Paket.Core/UpdateProcess.fs index b513ebd9f7..4d4857af4e 100644 --- a/src/Paket.Core/UpdateProcess.fs +++ b/src/Paket.Core/UpdateProcess.fs @@ -9,20 +9,20 @@ open System.Collections.Generic open Chessie.ErrorHandling open Paket.Logging -let addPackagesFromReferenceFiles projects (dependenciesFile:DependenciesFile) = +let addPackagesFromReferenceFiles projects (dependenciesFile : DependenciesFile) = let lockFileName = DependenciesFile.FindLockfile dependenciesFile.FileName let oldLockFile = - if lockFileName.Exists then + if lockFileName.Exists then LockFile.LoadFrom(lockFileName.FullName) else LockFile.Create(lockFileName.FullName, dependenciesFile.Options, Resolution.Ok(Map.empty), []) - + let allExistingPackages = oldLockFile.ResolvedPackages |> Seq.map (fun d -> NormalizedPackageName d.Value.Name) |> Set.ofSeq - let allReferencedPackages = + let allReferencedPackages = projects |> Seq.collect (fun (_,referencesFile) -> referencesFile.NugetPackages) @@ -33,24 +33,24 @@ let addPackagesFromReferenceFiles projects (dependenciesFile:DependenciesFile) = |> allExistingPackages.Contains |> not) - if Seq.isEmpty diff then + if Seq.isEmpty diff then dependenciesFile else let newDependenciesFile = diff - |> Seq.fold (fun (dependenciesFile:DependenciesFile) dep -> - if dependenciesFile.HasPackage dep.Name then + |> Seq.fold (fun (dependenciesFile:DependenciesFile) dep -> + if dependenciesFile.HasPackage dep.Name then dependenciesFile else dependenciesFile.AddAdditionalPackage(dep.Name,"",dep.Settings)) dependenciesFile newDependenciesFile.Save() newDependenciesFile -let SelectiveUpdate(dependenciesFile:DependenciesFile, exclude, force) = +let SelectiveUpdate(dependenciesFile : DependenciesFile, exclude, force) = let lockFileName = DependenciesFile.FindLockfile dependenciesFile.FileName let resolution = - if not lockFileName.Exists then + if not lockFileName.Exists then dependenciesFile.Resolve(force) else let oldLockFile = LockFile.LoadFrom(lockFileName.FullName) @@ -67,36 +67,33 @@ let SelectiveUpdate(dependenciesFile:DependenciesFile, exclude, force) = LockFile.Create(lockFileName.FullName, dependenciesFile.Options, resolution.ResolvedPackages, resolution.ResolvedSourceFiles) /// Smart install command -let SmartInstall(dependenciesFileName, exclude, force, hard, withBindingRedirects) = +let SmartInstall(dependenciesFileName, exclude, options : SmartInstallOptions) = let root = Path.GetDirectoryName dependenciesFileName let projects = InstallProcess.findAllReferencesFiles root |> returnOrFail let dependenciesFile = DependenciesFile.ReadFromFile(dependenciesFileName) - - let lockFile = SelectiveUpdate(dependenciesFile,exclude,force) - + + let lockFile = SelectiveUpdate(dependenciesFile,exclude,options.Common.Force) + InstallProcess.InstallIntoProjects( dependenciesFile.GetAllPackageSources(), - force, - hard, - withBindingRedirects, + options, lockFile, projects) - + /// Update a single package command -let UpdatePackage(dependenciesFileName, packageName : PackageName, newVersion, force, hard, withBindingRedirects) = +let UpdatePackage(dependenciesFileName, packageName : PackageName, newVersion, options : InstallerOptions) = match newVersion with - | Some v -> + | Some v -> DependenciesFile.ReadFromFile(dependenciesFileName) .UpdatePackageVersion(packageName, v) .Save() | None -> tracefn "Updating %s in %s" (packageName.ToString()) dependenciesFileName - SmartInstall(dependenciesFileName,Some(NormalizedPackageName packageName),force,hard,withBindingRedirects) + SmartInstall(dependenciesFileName, Some(NormalizedPackageName packageName), + { SmartInstallOptions.Default with Common = options }) /// Update command -let Update(dependenciesFileName, force, hard, withBindingRedirects) = +let Update(dependenciesFileName, options : InstallerOptions) = let lockFileName = DependenciesFile.FindLockfile dependenciesFileName - if lockFileName.Exists then - lockFileName.Delete() - - SmartInstall(dependenciesFileName,None,force,hard,withBindingRedirects) \ No newline at end of file + if lockFileName.Exists then lockFileName.Delete() + SmartInstall(dependenciesFileName, None, { SmartInstallOptions.Default with Common = options }) diff --git a/src/Paket/Commands.fs b/src/Paket/Commands.fs index c32158e63a..90380de896 100644 --- a/src/Paket/Commands.fs +++ b/src/Paket/Commands.fs @@ -22,9 +22,9 @@ type Command = | [][] ShowInstalledPackages | [][] Pack | [][] Push -with +with interface IArgParserTemplate with - member this.Usage = + member this.Usage = match this with | Add -> "Adds a new package to your paket.dependencies file." | Config -> "Allows to store global configuration values like NuGet credentials." @@ -43,11 +43,11 @@ with | ShowInstalledPackages -> "EXPERIMENTAL: Shows all installed top-level packages." | Pack -> "Packs all paket.template files within this repository" | Push -> "Pushes all `.nupkg` files from the given directory." - - member this.Name = + + member this.Name = let uci,_ = Microsoft.FSharp.Reflection.FSharpValue.GetUnionFields(this, typeof) - (uci.GetCustomAttributes(typeof) - |> Seq.head + (uci.GetCustomAttributes(typeof) + |> Seq.head :?> CustomCommandLineAttribute).Name type GlobalArgs = @@ -64,10 +64,11 @@ type AddArgs = | [] Force | [] Interactive | Hard + | Redirects | No_Install -with +with interface IArgParserTemplate with - member this.Usage = + member this.Usage = match this with | Nuget(_) -> "Nuget package id." | Version(_) -> "Allows to specify version of the package." @@ -75,13 +76,14 @@ with | Force -> "Forces the download and reinstallation of all packages." | Interactive -> "Asks the user for every project if he or she wants to add the package to the projects's paket.references file." | Hard -> "Replaces package references within project files even if they are not yet adhering to the Paket's conventions (and hence considered manually managed)." + | Redirects -> "Creates binding redirects for the NuGet packages." | No_Install -> "Skips paket install --hard process afterward generation of dependencies / references files." -type ConfigArgs = +type ConfigArgs = | [] AddCredentials of string -with +with interface IArgParserTemplate with - member this.Usage = + member this.Usage = match this with | AddCredentials(_) -> "Add credentials for the specified Nuget feed" @@ -90,9 +92,9 @@ type ConvertFromNugetArgs = | No_Install | No_Auto_Restore | Creds_Migration of string -with +with interface IArgParserTemplate with - member this.Usage = + member this.Usage = match this with | Force -> "Forces the conversion, even if a paket.dependencies file or paket.references files are present." | No_Install -> "Skips paket install --hard process afterward generation of dependencies / references files." @@ -101,24 +103,24 @@ with type FindRefsArgs = | [][][] Packages of string -with +with interface IArgParserTemplate with - member this.Usage = + member this.Usage = match this with | Packages(_) -> "List of packages." type InitArgs = | [] NoArg -with +with interface IArgParserTemplate with member __.Usage = "" type AutoRestoreArgs = | [][] On | [][] Off -with +with interface IArgParserTemplate with - member this.Usage = + member this.Usage = match this with | On -> "Turns auto restore on" | Off -> "Turns auto restore off" @@ -127,18 +129,20 @@ type InstallArgs = | [] Force | Hard | Redirects -with + | [] Install_Only_Referenced +with interface IArgParserTemplate with member this.Usage = match this with | Force -> "Forces the download and reinstallation of all packages." - | Hard -> "Replaces package references within project files even if they are not yet adhering to the Paket's conventions (and hence considered manually managed)." + | Hard -> "Replaces package references within project files even if they are not yet adhering to the Paket's conventions (and hence considered manually managed)." | Redirects -> "Creates binding redirects for the NuGet packages." + | Install_Only_Referenced -> "Only install packages that are referenced in paket.references files, instead of all packages in paket.dependencies." type OutdatedArgs = | Ignore_Constraints | [] Include_Prereleases -with +with interface IArgParserTemplate with member this.Usage = match this with @@ -152,7 +156,7 @@ type RemoveArgs = | [] Interactive | Hard | No_Install -with +with interface IArgParserTemplate with member this.Usage = match this with @@ -165,17 +169,19 @@ with type RestoreArgs = | [] Force + | [] Install_Only_Referenced | [] References_Files of string -with +with interface IArgParserTemplate with member this.Usage = match this with | Force -> "Forces the download of all packages." - | References_Files(_) -> "Allows to restore all packages from the given paket.references files. If no paket.references file is given then all packages will be restored." + | Install_Only_Referenced -> "Allows to restore packages that are referenced in paket.references files, instead of all packages in paket.dependencies." + | References_Files(_) -> "Allows to restore all packages from the given paket.references files. This implies --only-referenced." type SimplifyArgs = | [] Interactive -with +with interface IArgParserTemplate with member this.Usage = match this with @@ -187,7 +193,7 @@ type UpdateArgs = | [] Force | Hard | Redirects -with +with interface IArgParserTemplate with member this.Usage = match this with @@ -267,7 +273,7 @@ with | ApiKey(_) -> "Optionally specify your API key on the command line. Otherwise uses the value of the `nugetkey` environment variable." | EndPoint(_) -> "Optionally specify a custom api endpoint to push to. Defaults to `/api/v2/package`" -let cmdLineSyntax (parser:UnionArgParser<_>) commandName = +let cmdLineSyntax (parser:UnionArgParser<_>) commandName = "$ paket " + commandName + " " + parser.PrintCommandLineSyntax() let cmdLineUsageMessage (command : Command) parser = @@ -279,20 +285,20 @@ let cmdLineUsageMessage (command : Command) parser = .AppendLine() .Append(cmdLineSyntax parser command.Name) .ToString() - + let markdown (command : Command) (additionalText : string) = - let replace (pattern : string) (replacement : string) input = + let replace (pattern : string) (replacement : string) input = System.Text.RegularExpressions.Regex.Replace(input, pattern, replacement) - - let syntaxAndOptions (parser : UnionArgParser<_>) = + + let syntaxAndOptions (parser : UnionArgParser<_>) = let options = - parser.Usage() + parser.Usage() |> replace @"\s\t--help.*" "" |> replace @"\t([-\w \[\]|\/\?<>\.]+):" (System.Environment.NewLine + @" `$1`:") let syntax = cmdLineSyntax parser command.Name syntax, options - + let getSyntax = function | Add -> syntaxAndOptions (UnionArgParser.Create()) | Config -> syntaxAndOptions (UnionArgParser.Create()) @@ -311,7 +317,7 @@ let markdown (command : Command) (additionalText : string) = | ShowInstalledPackages -> syntaxAndOptions (UnionArgParser.Create()) | Pack -> syntaxAndOptions (UnionArgParser.Create()) | Push -> syntaxAndOptions (UnionArgParser.Create()) - + let replaceLinks (text : string) = text .Replace("paket.dependencies file","[`paket.dependencies` file](dependencies-file.html)") @@ -319,12 +325,12 @@ let markdown (command : Command) (additionalText : string) = .Replace("paket.template files","[`paket.template` files](template-files.html)") .Replace("paket.references files","[`paket.references` files](references-files.html)") .Replace("paket.references file","[`paket.references` file](references-files.html)") - + let syntax, options = getSyntax command System.Text.StringBuilder() .Append("# paket ") - .AppendLine(command.Name) + .AppendLine(command.Name) .AppendLine() .AppendLine((command :> IArgParserTemplate).Usage) .AppendLine() @@ -340,5 +346,5 @@ let markdown (command : Command) (additionalText : string) = let getAllCommands () = Microsoft.FSharp.Reflection.FSharpType.GetUnionCases(typeof) - |> Array.map (fun uci -> - Microsoft.FSharp.Reflection.FSharpValue.MakeUnion(uci, [||]) :?> Command) \ No newline at end of file + |> Array.map (fun uci -> + Microsoft.FSharp.Reflection.FSharpValue.MakeUnion(uci, [||]) :?> Command) diff --git a/src/Paket/Program.fs b/src/Paket/Program.fs index 3cf29f4b66..75c2d6375e 100644 --- a/src/Paket/Program.fs +++ b/src/Paket/Program.fs @@ -15,42 +15,42 @@ open PackageSources let private stopWatch = new Stopwatch() stopWatch.Start() -let filterGlobalArgs args = - let globalResults = +let filterGlobalArgs args = + let globalResults = UnionArgParser.Create() - .Parse(ignoreMissing = true, - ignoreUnrecognized = true, + .Parse(ignoreMissing = true, + ignoreUnrecognized = true, raiseOnUsage = false) let verbose = globalResults.Contains <@ GlobalArgs.Verbose @> let logFile = globalResults.TryGetResult <@ GlobalArgs.Log_File @> - - let rest = + + let rest = match logFile with - | Some file -> + | Some file -> args |> Array.filter (fun a -> a <> "--log-file" && a <> file) | None -> args - - let rest = - if verbose then + + let rest = + if verbose then rest |> Array.filter (fun a -> a <> "-v" && a <> "--verbose") else rest - + verbose, logFile, rest let v, logFile, args = filterGlobalArgs (Environment.GetCommandLineArgs().[1..]) -let silent = args |> Array.exists ((=) "-s") +let silent = args |> Array.exists ((=) "-s") if not silent then let assembly = Assembly.GetExecutingAssembly() let fvi = FileVersionInfo.GetVersionInfo(assembly.Location); tracefn "Paket version %s" fvi.FileVersion -let processWithValidation<'T when 'T :> IArgParserTemplate> validateF commandF command - args = +let processWithValidation<'T when 'T :> IArgParserTemplate> validateF commandF command + args = let parser = UnionArgParser.Create<'T>() - let results = + let results = parser.Parse - (inputs = args, raiseOnUsage = false, ignoreMissing = true, + (inputs = args, raiseOnUsage = false, ignoreMissing = true, errorHandler = ProcessExiter()) let resultsValid = validateF (results) @@ -62,13 +62,13 @@ let processWithValidation<'T when 'T :> IArgParserTemplate> validateF commandF c Environment.ExitCode <- 1 else parser.Usage(Commands.cmdLineUsageMessage command parser) |> trace - else + else commandF results let elapsedTime = Utils.TimeSpanToReadableString stopWatch.Elapsed if not silent then tracefn "%s - ready." elapsedTime -let processCommand<'T when 'T :> IArgParserTemplate> (commandF : ArgParseResults<'T> -> unit) = +let processCommand<'T when 'T :> IArgParserTemplate> (commandF : ArgParseResults<'T> -> unit) = processWithValidation (fun _ -> true) commandF Logging.verbose <- v @@ -79,6 +79,7 @@ let add (results : ArgParseResults<_>) = let version = defaultArg (results.TryGetResult <@ AddArgs.Version @>) "" let force = results.Contains <@ AddArgs.Force @> let hard = results.Contains <@ AddArgs.Hard @> + let redirects = results.Contains <@ AddArgs.Redirects @> let noInstall = results.Contains <@ AddArgs.No_Install @> match results.TryGetResult <@ AddArgs.Project @> with | Some projectName -> @@ -88,13 +89,13 @@ let add (results : ArgParseResults<_>) = Dependencies.Locate().Add(packageName, version, force, hard, interactive, noInstall |> not) let validateConfig (results : ArgParseResults<_>) = - let args = results.GetResults <@ ConfigArgs.AddCredentials @> + let args = results.GetResults <@ ConfigArgs.AddCredentials @> args.Length > 0 let config (results : ArgParseResults<_>) = - let args = results.GetResults <@ ConfigArgs.AddCredentials @> + let args = results.GetResults <@ ConfigArgs.AddCredentials @> let source = args.Item 0 - let username = + let username = if(args.Length > 1) then args.Item 1 else @@ -116,68 +117,71 @@ let convert (results : ArgParseResults<_>) = let noAutoRestore = results.Contains <@ ConvertFromNugetArgs.No_Auto_Restore @> let credsMigrationMode = results.TryGetResult <@ ConvertFromNugetArgs.Creds_Migration @> Dependencies.ConvertFromNuget(force, noInstall |> not, noAutoRestore |> not, credsMigrationMode) - + let findRefs (results : ArgParseResults<_>) = let packages = results.GetResults <@ FindRefsArgs.Packages @> Dependencies.Locate().ShowReferencesFor(packages) - + let init (results : ArgParseResults) = Dependencies.Init() -let install (results : ArgParseResults<_>) = +let install (results : ArgParseResults<_>) = let force = results.Contains <@ InstallArgs.Force @> let hard = results.Contains <@ InstallArgs.Hard @> let withBindingRedirects = results.Contains <@ InstallArgs.Redirects @> - Dependencies.Locate().Install(force, hard, withBindingRedirects) + let installOnlyReferenced = results.Contains <@ InstallArgs.Install_Only_Referenced @> + Dependencies.Locate().Install(force, hard, withBindingRedirects, installOnlyReferenced) -let outdated (results : ArgParseResults<_>) = +let outdated (results : ArgParseResults<_>) = let strict = results.Contains <@ OutdatedArgs.Ignore_Constraints @> |> not let includePrereleases = results.Contains <@ OutdatedArgs.Include_Prereleases @> Dependencies.Locate().ShowOutdated(strict, includePrereleases) -let remove (results : ArgParseResults<_>) = +let remove (results : ArgParseResults<_>) = let packageName = results.GetResult <@ RemoveArgs.Nuget @> let force = results.Contains <@ RemoveArgs.Force @> let hard = results.Contains <@ RemoveArgs.Hard @> let noInstall = results.Contains <@ RemoveArgs.No_Install @> match results.TryGetResult <@ RemoveArgs.Project @> with - | Some projectName -> + | Some projectName -> Dependencies.Locate() .RemoveFromProject(packageName, force, hard, projectName, noInstall |> not) - | None -> + | None -> let interactive = results.Contains <@ RemoveArgs.Interactive @> Dependencies.Locate().Remove(packageName, force, hard, interactive, noInstall |> not) -let restore (results : ArgParseResults<_>) = +let restore (results : ArgParseResults<_>) = let force = results.Contains <@ RestoreArgs.Force @> let files = results.GetResults <@ RestoreArgs.References_Files @> - Dependencies.Locate().Restore(force, files) + let installOnlyReferenced = results.Contains <@ RestoreArgs.Install_Only_Referenced @> + if List.isEmpty files then Dependencies.Locate().Restore(force, installOnlyReferenced) + else Dependencies.Locate().Restore(force, files) -let simplify (results : ArgParseResults<_>) = +let simplify (results : ArgParseResults<_>) = let interactive = results.Contains <@ SimplifyArgs.Interactive @> Dependencies.Locate().Simplify(interactive) -let update (results : ArgParseResults<_>) = +let update (results : ArgParseResults<_>) = let hard = results.Contains <@ UpdateArgs.Hard @> let force = results.Contains <@ UpdateArgs.Force @> match results.TryGetResult <@ UpdateArgs.Nuget @> with - | Some packageName -> + | Some packageName -> let version = results.TryGetResult <@ UpdateArgs.Version @> Dependencies.Locate().UpdatePackage(packageName, version, force, hard) - | _ -> + | _ -> let withBindingRedirects = results.Contains <@ UpdateArgs.Redirects @> Dependencies.Locate().Update(force, hard, withBindingRedirects) -let pack (results : ArgParseResults<_>) = +let pack (results : ArgParseResults<_>) = let outputPath = results.GetResult <@ PackArgs.Output @> Dependencies.Locate() - .Pack(outputPath, - ?buildConfig = results.TryGetResult <@ PackArgs.BuildConfig @>, - ?version = results.TryGetResult <@ PackArgs.Version @>, + .Pack(outputPath, + ?buildConfig = results.TryGetResult <@ PackArgs.BuildConfig @>, + ?version = results.TryGetResult <@ PackArgs.Version @>, ?releaseNotes = results.TryGetResult <@ PackArgs.ReleaseNotes @>, ?templateFile = results.TryGetResult <@ PackArgs.TemplateFile @>) -let findPackages (results : ArgParseResults<_>) = +let findPackages (results : ArgParseResults<_>) = let maxResults = defaultArg (results.TryGetResult <@ FindPackagesArgs.MaxResults @>) 10000 let silent = results.Contains <@ FindPackagesArgs.Silent @> let sources = @@ -200,7 +204,7 @@ let findPackages (results : ArgParseResults<_>) = tracefn "%s" p match results.TryGetResult <@ FindPackagesArgs.SearchText @> with - | None -> + | None -> let searchText = ref "" while !searchText <> ":q" do if not silent then @@ -210,9 +214,9 @@ let findPackages (results : ArgParseResults<_>) = | Some searchText -> searchAndPrint searchText -let showInstalledPackages (results : ArgParseResults<_>) = +let showInstalledPackages (results : ArgParseResults<_>) = let dependenciesFile = Dependencies.Locate() - let packages = + let packages = match results.TryGetResult <@ ShowInstalledPackagesArgs.Project @> with | None -> if results.Contains <@ ShowInstalledPackagesArgs.All @> then @@ -239,26 +243,26 @@ let findPackageVersions (results : ArgParseResults<_>) = let result = NuGetV3.FindVersionsForPackage(None,source,name,maxResults) |> Async.RunSynchronously - + for p in result do tracefn "%s" p -let push (results : ArgParseResults<_>) = +let push (results : ArgParseResults<_>) = let fileName = results.GetResult <@ PushArgs.FileName @> - Dependencies.Push(fileName, ?url = results.TryGetResult <@ PushArgs.Url @>, + Dependencies.Push(fileName, ?url = results.TryGetResult <@ PushArgs.Url @>, ?endPoint = results.TryGetResult <@ PushArgs.EndPoint @>, ?apiKey = results.TryGetResult <@ PushArgs.ApiKey @>) try let parser = UnionArgParser.Create() - let results = + let results = parser.Parse(inputs = args, - ignoreMissing = true, - ignoreUnrecognized = true, - raiseOnUsage = false) + ignoreMissing = true, + ignoreUnrecognized = true, + raiseOnUsage = false) match results.GetAllResults() with - | [ command ] -> + | [ command ] -> let handler = match command with | Add -> processCommand add @@ -279,17 +283,17 @@ try | Pack -> processCommand pack | Push -> processCommand push - let args = args.[1..] + let args = args.[1..] handler command args - | [] -> + | [] -> Environment.ExitCode <- 1 traceError "Command was:" traceError (" " + String.Join(" ",Environment.GetCommandLineArgs())) parser.Usage("available commands:") |> traceError | _ -> failwith "expected only one command" with -| exn when not (exn :? System.NullReferenceException) -> +| exn when not (exn :? System.NullReferenceException) -> Environment.ExitCode <- 1 traceErrorfn "Paket failed with:%s\t%s" Environment.NewLine exn.Message