diff --git a/integrationtests/Paket.IntegrationTests/Paket.IntegrationTests.fsproj b/integrationtests/Paket.IntegrationTests/Paket.IntegrationTests.fsproj index aa767eb03b..10df75d71e 100644 --- a/integrationtests/Paket.IntegrationTests/Paket.IntegrationTests.fsproj +++ b/integrationtests/Paket.IntegrationTests/Paket.IntegrationTests.fsproj @@ -16,6 +16,7 @@ ..\..\ true + true true @@ -207,7 +208,7 @@ - + ..\..\packages\Microsoft.CSharp\lib\netstandard2.0\Microsoft.CSharp.dll @@ -216,7 +217,7 @@ - + ..\..\packages\Microsoft.CSharp\ref\netstandard2.0\Microsoft.CSharp.dll @@ -275,7 +276,7 @@ - + ..\..\packages\Microsoft.Win32.Primitives\ref\netstandard1.3\Microsoft.Win32.Primitives.dll @@ -304,24 +305,6 @@ - - - - ..\..\packages\Microsoft.Win32.Registry\lib\netstandard2.0\Microsoft.Win32.Registry.dll - True - True - - - - - - - ..\..\packages\Microsoft.Win32.Registry\ref\netstandard2.0\Microsoft.Win32.Registry.dll - False - True - - - @@ -515,7 +498,7 @@ - + ..\..\packages\System.Buffers\lib\netstandard2.0\System.Buffers.dll @@ -524,7 +507,7 @@ - + ..\..\packages\System.Buffers\ref\netstandard2.0\System.Buffers.dll @@ -564,7 +547,7 @@ - + ..\..\packages\System.Collections.Concurrent\lib\netstandard1.3\System.Collections.Concurrent.dll @@ -573,7 +556,7 @@ - + ..\..\packages\System.Collections.Concurrent\ref\netstandard1.3\System.Collections.Concurrent.dll @@ -731,7 +714,7 @@ - + ..\..\packages\System.Console\ref\netstandard1.3\System.Console.dll @@ -771,7 +754,7 @@ - + ..\..\packages\System.Diagnostics.DiagnosticSource\lib\netstandard1.3\System.Diagnostics.DiagnosticSource.dll @@ -793,7 +776,7 @@ - + ..\..\packages\System.Diagnostics.Tools\ref\netstandard1.0\System.Diagnostics.Tools.dll @@ -831,7 +814,7 @@ - + ..\..\packages\System.Diagnostics.Tracing\ref\netstandard1.5\System.Diagnostics.Tracing.dll @@ -891,7 +874,7 @@ - + ..\..\packages\System.Globalization.Calendars\ref\netstandard1.3\System.Globalization.Calendars.dll @@ -951,7 +934,7 @@ - + ..\..\packages\System.IO.Compression\ref\netstandard1.3\System.IO.Compression.dll @@ -1087,7 +1070,7 @@ - + ..\..\packages\System.Linq.Expressions\lib\netstandard1.6\System.Linq.Expressions.dll @@ -1096,7 +1079,7 @@ - + ..\..\packages\System.Linq.Expressions\ref\netstandard1.6\System.Linq.Expressions.dll @@ -1143,7 +1126,7 @@ - + ..\..\packages\System.Net.Http\ref\netstandard1.3\System.Net.Http.dll @@ -1172,7 +1155,7 @@ - + ..\..\packages\System.Net.Primitives\ref\netstandard1.3\System.Net.Primitives.dll @@ -1183,7 +1166,7 @@ - + ..\..\packages\System.Net.Requests\ref\netstandard1.3\System.Net.Requests.dll @@ -1214,7 +1197,7 @@ - + ..\..\packages\System.Net.WebHeaderCollection\lib\netstandard1.3\System.Net.WebHeaderCollection.dll @@ -1223,7 +1206,7 @@ - + ..\..\packages\System.Net.WebHeaderCollection\ref\netstandard1.3\System.Net.WebHeaderCollection.dll @@ -1243,7 +1226,7 @@ - + ..\..\packages\System.ObjectModel\lib\netstandard1.3\System.ObjectModel.dll @@ -1252,7 +1235,7 @@ - + ..\..\packages\System.ObjectModel\ref\netstandard1.3\System.ObjectModel.dll @@ -1332,7 +1315,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\ref\netstandard1.0\System.Reflection.Emit.Lightweight.dll @@ -1341,7 +1324,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\lib\netstandard1.3\System.Reflection.Emit.Lightweight.dll @@ -1419,7 +1402,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\lib\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1428,7 +1411,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\ref\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1642,7 +1625,7 @@ - + ..\..\packages\System.Runtime.Numerics\ref\netstandard1.1\System.Runtime.Numerics.dll @@ -1651,7 +1634,7 @@ - + ..\..\packages\System.Runtime.Numerics\lib\netstandard1.3\System.Runtime.Numerics.dll @@ -1711,27 +1694,7 @@ - - - - ..\..\packages\System.Security.AccessControl\lib\netstandard2.0\System.Security.AccessControl.dll - True - True - - - - - - - ..\..\packages\System.Security.AccessControl\ref\netstandard2.0\System.Security.AccessControl.dll - False - True - - - - - - + ..\..\packages\System.Security.Claims\lib\netstandard1.3\System.Security.Claims.dll @@ -1740,7 +1703,7 @@ - + ..\..\packages\System.Security.Claims\ref\netstandard1.3\System.Security.Claims.dll @@ -1807,24 +1770,6 @@ - - - - ..\..\packages\System.Security.Cryptography.Cng\lib\netstandard2.0\System.Security.Cryptography.Cng.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.Cng\ref\netstandard2.0\System.Security.Cryptography.Cng.dll - False - True - - - @@ -1876,24 +1821,6 @@ - - - - ..\..\packages\System.Security.Cryptography.OpenSsl\lib\netstandard2.0\System.Security.Cryptography.OpenSsl.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.OpenSsl\ref\netstandard2.0\System.Security.Cryptography.OpenSsl.dll - False - True - - - @@ -1943,7 +1870,7 @@ - + ..\..\packages\System.Security.Cryptography.X509Certificates\ref\netstandard1.4\System.Security.Cryptography.X509Certificates.dll @@ -1954,7 +1881,7 @@ - + ..\..\packages\System.Security.Principal\lib\netstandard1.0\System.Security.Principal.dll @@ -1963,7 +1890,7 @@ - + ..\..\packages\System.Security.Principal\ref\netstandard1.0\System.Security.Principal.dll @@ -1992,24 +1919,6 @@ - - - - ..\..\packages\System.Security.Principal.Windows\lib\netstandard2.0\System.Security.Principal.Windows.dll - True - True - - - - - - - ..\..\packages\System.Security.Principal.Windows\ref\netstandard2.0\System.Security.Principal.Windows.dll - False - True - - - @@ -2041,7 +1950,7 @@ - + ..\..\packages\System.Text.Encoding.Extensions\ref\netstandard1.3\System.Text.Encoding.Extensions.dll @@ -2157,18 +2066,9 @@ - - - - ..\..\packages\System.Threading.Tasks.Extensions\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - True - True - - - - + ..\..\packages\System.Threading.Tasks.Parallel\ref\netstandard1.1\System.Threading.Tasks.Parallel.dll @@ -2177,7 +2077,7 @@ - + ..\..\packages\System.Threading.Tasks.Parallel\lib\netstandard1.3\System.Threading.Tasks.Parallel.dll @@ -2208,7 +2108,7 @@ - + ..\..\packages\System.Threading.ThreadPool\lib\netstandard1.3\System.Threading.ThreadPool.dll @@ -2217,7 +2117,7 @@ - + ..\..\packages\System.Threading.ThreadPool\ref\netstandard1.3\System.Threading.ThreadPool.dll @@ -2286,7 +2186,7 @@ - + ..\..\packages\System.Xml.XDocument\lib\netstandard1.3\System.Xml.XDocument.dll @@ -2295,7 +2195,7 @@ - + ..\..\packages\System.Xml.XDocument\ref\netstandard1.3\System.Xml.XDocument.dll diff --git a/src/Paket.Core.preview3/Paket.Core.fsproj b/src/Paket.Core.preview3/Paket.Core.fsproj index c9b427fb7e..06ae713508 100644 --- a/src/Paket.Core.preview3/Paket.Core.fsproj +++ b/src/Paket.Core.preview3/Paket.Core.fsproj @@ -1,9 +1,10 @@ - + netstandard2.0 ..\Paket.Core NO_BOOTSTRAPPER;NO_CONFIGURATIONMANAGER;CUSTOM_WEBPROXY;$(DefineConstants) + true @@ -91,6 +92,8 @@ + + diff --git a/src/Paket.Core.preview3/paket.references b/src/Paket.Core.preview3/paket.references index ee433115d8..bea8d8ad3d 100644 --- a/src/Paket.Core.preview3/paket.references +++ b/src/Paket.Core.preview3/paket.references @@ -1,4 +1,5 @@ Newtonsoft.Json +Argu Mono.Cecil Chessie System.Security.Cryptography.ProtectedData diff --git a/src/Paket.Core/CliCommands.fs b/src/Paket.Core/CliCommands.fs new file mode 100644 index 0000000000..bc9486bf18 --- /dev/null +++ b/src/Paket.Core/CliCommands.fs @@ -0,0 +1,758 @@ +module Paket.Commands + +open System + +open Argu + +type AddArgs = + | [] NuGet of package_ID:string + | [] NuGet_Legacy of package_ID:string + + | [] Version of version_constraint:string + | [] Version_Legacy of version_constraint:string + + | [] Project of path:string + | [] Project_Legacy of path:string + + | [] Group of name:string + | [] Group_Legacy of name:string + + | [] Create_New_Binding_Files + | [] Create_New_Binding_Files_Legacy + + | [] Force + | [] Interactive + | [] Redirects + | [] Clean_Redirects + | [] No_Install + | [] No_Resolve + | [] Keep_Major + | [] Keep_Minor + | [] Keep_Patch + | [] Touch_Affected_Refs + | [] Type of packageType:AddArgsDependencyType +with + interface IArgParserTemplate with + member this.Usage = + match this with + | NuGet(_) -> "NuGet package ID" + | NuGet_Legacy(_) -> "[obsolete]" + + | Group(_) -> "add the dependency to a group (default: Main group)" + | Group_Legacy(_) -> "[obsolete]" + + | Version(_) -> "dependency version constraint" + | Version_Legacy(_) -> "[obsolete]" + + | Project(_) -> "add the dependency to a single project only" + | Project_Legacy(_) -> "[obsolete]" + + | Create_New_Binding_Files -> "create binding redirect files if needed" + | Create_New_Binding_Files_Legacy -> "[obsolete]" + + | Force -> "force download and reinstallation of all dependencies" + | Interactive -> "ask for every project whether to add the dependency" + | Redirects -> "create binding redirects" + | Clean_Redirects -> "remove binding redirects that were not created by Paket" + | No_Resolve -> "do not resolve" + | No_Install -> "do not modify projects" + | Keep_Major -> "only allow updates that preserve the major version" + | Keep_Minor -> "only allow updates that preserve the minor version" + | Keep_Patch -> "only allow updates that preserve the patch version" + | Touch_Affected_Refs -> "touch project files referencing affected dependencies to help incremental build tools detecting the change" + | Type _ -> "the type of dependency: nuget|clitool (default: nuget)" +and [] AddArgsDependencyType = + | Nuget + | Clitool + +type AddGithubArgs = + | [] Repository of repository_name:string + | [] Version of version_constraint:string + | [] Group of group_name:string + | [] File of file_name:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Repository(_) -> "repository name / on github" + | Version(_) -> "dependency version constraint" + | Group(_) -> "add the dependency to a group (default: Main group)" + | File(_) -> "only add specified file" +and GithubArgs = + | [] Add of ParseResults +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Add(_) -> "add github repository" + +type AddGitArgs = + | [] Repository of repository_name:string + | [] Version of version_constraint:string + | [] Group of group_name:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Repository(_) -> "repository path or url" + | Version(_) -> "dependency version, can be branch, commit-hash or tag" + | Group(_) -> "add the dependency to a group (default: Main group)" +and GitArgs = + | [] Add of ParseResults +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Add(_) -> "add git repository" + +type ConfigArgs = + | [] AddCredentials of key_or_URL:string + | [] AddToken of key_or_URL:string * token:string + | [] Username of username:string + | [] Password of password:string + | [] AuthType of authType:string + | [] Verify +with + interface IArgParserTemplate with + member this.Usage = + match this with + | AddCredentials(_) -> "add credentials for URL or credential key" + | AddToken(_) -> "add token for URL or credential key" + | Username(_) -> "provide username" + | Password(_) -> "provide password" + | AuthType (_) -> "specify authentication type: basic|ntlm (default: basic)" + | Verify (_) -> "specify in case you want to verify the credentials" + +type ConvertFromNugetArgs = + | [] Force + | [] No_Install + | [] No_Auto_Restore + + | [] Migrate_Credentials of mode:string + | [] Migrate_Credentials_Legacy of mode:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Force -> "force the conversion even if paket.dependencies or paket.references files are present" + | No_Install -> "do not modify projects" + | No_Auto_Restore -> "do not enable automatic package restore" + + | Migrate_Credentials(_) -> "specify mode for NuGet source credential migration: encrypt|plaintext|selective (default: encrypt)" + | Migrate_Credentials_Legacy(_) -> "[obsolete]" + +type FindRefsArgs = + | [] NuGets of package_ID:string list + | [] NuGets_Legacy of package_ID:string list + + | [] Group of name:string + | [] Group_Legacy of name:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | NuGets(_) -> "list of NuGet package IDs" + | NuGets_Legacy(_) -> "[obsolete]" + + | Group(_) -> "specify dependency group (default: Main group)" + | Group_Legacy(_) -> "[obsolete]" + +type InitArgs = + | [] NoArgs +with + interface IArgParserTemplate with + member __.Usage = "" + +type AutoRestoreFlags = On | Off + +type AutoRestoreArgs = + | [] Flags of AutoRestoreFlags +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Flags(_) -> "enable or disable automatic package restore" + +type LanguageFlags = Csx | Fsx + +type InstallArgs = + | [] Force + | [] Redirects + + | [] Create_New_Binding_Files + | [] Create_New_Binding_Files_Legacy + + | [] Clean_Redirects + | [] Keep_Major + | [] Keep_Minor + | [] Keep_Patch + | [] Install_Only_Referenced + | [] Touch_Affected_Refs + | [] Project_Root of path:string + + | [] Generate_Load_Scripts + | Load_Script_Framework of framework:string + | [] Load_Script_Framework_Legacy of framework:string + + | Load_Script_Type of LanguageFlags + | [] Load_Script_Type_Legacy of LanguageFlags +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Force -> "force download and reinstallation of all dependencies" + | Redirects -> "create binding redirects" + + | Create_New_Binding_Files -> "create binding redirect files if needed" + | Create_New_Binding_Files_Legacy -> "[obsolete]" + + | Clean_Redirects -> "remove binding redirects that were not created by Paket" + | Install_Only_Referenced -> "only install dependencies listed in paket.references files, instead of all packages in paket.dependencies" + | Keep_Major -> "only allow updates that preserve the major version" + | Keep_Minor -> "only allow updates that preserve the minor version" + | Keep_Patch -> "only allow updates that preserve the patch version" + | Touch_Affected_Refs -> "touch project files referencing affected dependencies to help incremental build tools detecting the change" + | Project_Root(_) -> "alternative project root (only used for tooling)" + + | Generate_Load_Scripts -> "generate F# and C# include scripts that reference installed packages in a interactive environment like F# Interactive or ScriptCS" + | Load_Script_Framework(_) -> "framework identifier to generate scripts for, such as net45 or netstandard1.6; may be repeated" + | Load_Script_Framework_Legacy(_) -> "[obsolete]" + + | Load_Script_Type(_) -> "language to generate scripts for; may be repeated; may be repeated" + | Load_Script_Type_Legacy(_) -> "[obsolete]" + +type OutdatedArgs = + | [] Force + | [] Ignore_Constraints + + | [] Group of name:string + | [] Group_Legacy of name:string + + | [] Include_Prereleases +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Force -> "force download and reinstallation of all dependencies" + | Ignore_Constraints -> "ignore version constraints in the paket.dependencies file" + + | Group(_) -> "specify dependency group (default: all groups)" + | Group_Legacy(_) -> "[obsolete]" + + | Include_Prereleases -> "consider prerelease versions as updates" + +type RemoveArgs = + | [] NuGet of package_ID:string + | [] NuGet_Legacy of package_ID:string + + | [] Project of path:string + | [] Project_Legacy of path:string + + | [] Group of name:string + | [] Group_Legacy of name:string + + | [] Force + | [] Interactive + | [] No_Install +with + interface IArgParserTemplate with + member this.Usage = + match this with + | NuGet(_) -> "NuGet package ID" + | NuGet_Legacy(_) -> "[obsolete]" + + | Group(_) -> "remove the dependency from a group (default: Main group)" + | Group_Legacy(_) -> "[obsolete]" + + | Project(_) -> "remove the dependency from a single project only" + | Project_Legacy(_) -> "[obsolete]" + + | Force -> "force download and reinstallation of all dependencies" + | Interactive -> "ask for every project whether to remove the dependency" + | No_Install -> "do not modify projects" + +type ClearCacheArgs = + | [] ClearLocal +with + interface IArgParserTemplate with + member this.Usage = + match this with + | ClearLocal -> "Clears local packages folder and paket-files." + +type RestoreArgs = + | [] Force + | [] Install_Only_Referenced + | [] Touch_Affected_Refs + | [] Ignore_Checks + | [] Fail_On_Checks + + | [] Group of name:string + | [] Group_Legacy of name:string + + | [] Project of path:string + | [] Project_Legacy of path:string + + | References_File of path:string + | [] References_File_Legacy of path:string list + + | [] Target_Framework of framework:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Force -> "force download and reinstallation of all dependencies" + + | Group(_) -> "restore dependencies of a single group" + | Group_Legacy(_) -> "[obsolete]" + + | Install_Only_Referenced -> "only restore packages that are referenced by paket.references files" + | Touch_Affected_Refs -> "touch project files referencing affected dependencies to help incremental build tools detecting the change" + | Ignore_Checks -> "do not check if paket.dependencies and paket.lock are in sync" + | Fail_On_Checks -> "abort if any checks fail" + + | Project(_) -> "restore dependencies of a single project" + | Project_Legacy(_) -> "[obsolete]" + + | References_File(_) -> "restore packages from a paket.references file; may be repeated" + | References_File_Legacy(_) -> "[obsolete]" + + | Target_Framework(_) -> "restore only for the specified target framework" + +type SimplifyArgs = + | [] Interactive +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Interactive -> "confirm deletion of every transitive dependency" + +type UpdateArgs = + | [] NuGet of package_id:string + | [] NuGet_Legacy of package_id:string + + | [] Version of version_constraint:string + | [] Version_Legacy of version_constraint:string + + | [] Group of name:string + | [] Group_Legacy of name:string + + | [] Create_New_Binding_Files + | [] Create_New_Binding_Files_Legacy + + | [] Force + | [] Redirects + | [] Clean_Redirects + | [] No_Install + | [] Keep_Major + | [] Keep_Minor + | [] Keep_Patch + | [] Filter + | [] Touch_Affected_Refs +with + interface IArgParserTemplate with + member this.Usage = + match this with + | NuGet(_) -> "NuGet package ID" + | NuGet_Legacy(_) -> "[obsolete]" + + | Group(_) -> "specify dependency group to update (default: all groups)" + | Group_Legacy(_) -> "[obsolete]" + + | Version(_) -> "dependency version constraint" + | Version_Legacy(_) -> "[obsolete]" + + | Create_New_Binding_Files -> "create binding redirect files if needed" + | Create_New_Binding_Files_Legacy -> "[obsolete]" + + | Force -> "force download and reinstallation of all dependencies" + | Redirects -> "create binding redirects" + | Clean_Redirects -> "remove binding redirects that were not created by Paket" + | No_Install -> "do not modify projects" + | Keep_Major -> "only allow updates that preserve the major version" + | Keep_Minor -> "only allow updates that preserve the minor version" + | Keep_Patch -> "only allow updates that preserve the patch version" + | Touch_Affected_Refs -> "touch project files referencing affected dependencies to help incremental build tools detecting the change" + | Filter -> "treat the NuGet package ID as a regex to filter packages" + +type FindPackagesArgs = + | [] Search of package_ID:string + | [] Search_Legacy of package_ID:string + + | [] Source of source_URL:string + | [] Source_Legacy of source_URL:string + + | [] Max_Results of int + | [] Max_Results_Legacy of int +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Search(_) -> "search for NuGet package ID" + | Search_Legacy(_) -> "[obsolete]" + + | Source(_) -> "specify source URL" + | Source_Legacy(_) -> "[obsolete]" + + | Max_Results(_) -> "limit maximum number of results" + | Max_Results_Legacy(_) -> "[obsolete]" + +type FixNuspecArgs = + | [] File of text:string + | [] ReferencesFile of text:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | File _ -> ".nuspec file to fix transitive dependencies within" + | ReferencesFile _ -> "paket.references to use" + +type FixNuspecsArgs = + | [] Files of nuspecPaths:string list + | [] ReferencesFile of referencePath:string + | [] ProjectFile of referencePath:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Files _ -> ".nuspec files to fix transitive dependencies within" + | ReferencesFile _ -> "paket.references to use" + | ProjectFile _ -> "the proejct file to use" + +type GenerateNuspecArgs = + | [] Project of project:string + | [] DependenciesFile of dependenciesPath:string + | [] Output of output:string + interface IArgParserTemplate with + member this.Usage = + match this with + | Project _ -> "generate .nuspec for project" + | DependenciesFile _ -> "paket.dependencies file used to populate .nuspec file" + | Output _ -> "output directory of the .nuspec file" + +type ShowInstalledPackagesArgs = + | [] All + + | [] Project of path:string + | [] Project_Legacy of path:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | All -> "include transitive dependencies" + + | Project(_) -> "specify project to show dependencies for" + | Project_Legacy(_) -> "[obsolete]" + +type ShowGroupsArgs = + | [] NoArgs +with + interface IArgParserTemplate with + member __.Usage = "" + +type FindPackageVersionsArgs = + | [] NuGet of package_ID:string + | [] NuGet_Legacy of package_ID:string + + | [] Source of source_URL:string + | [] Source_Legacy of source_URL:string + + | [] Max_Results of int + | [] Max_Results_Legacy of int +with + interface IArgParserTemplate with + member this.Usage = + match this with + | NuGet(_) -> "NuGet package ID" + | NuGet_Legacy(_) -> "[obsolete]" + + | Source(_) -> "specify source URL" + | Source_Legacy(_) -> "[obsolete]" + + | Max_Results(_) -> "limit maximum number of results" + | Max_Results_Legacy(_) -> "[obsolete]" + +type InfoArgs = + | [] Paket_Dependencies_Dir +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Paket_Dependencies_Dir -> "absolute path of paket.dependencies directory, if exists" + +type PackArgs = + | [] Output of path:string + | [] Output_Legacy of path:string + + | [] Build_Config of configuration:string + | [] Build_Config_Legacy of configuration:string + + | [] Build_Platform of platform:string + | [] Build_Platform_Legacy of platform:string + + | [] Version of version:string + | [] Version_Legacy of version:string + + | [] Template_File of path:string + | [] Template_File_Legacy of path:string + + | [] Exclude_Template of package_ID:string + | [] Exclude_Template_Legacy of package_ID:string + + | Specific_Version of package_ID:string * version:string + | [] Specific_Version_Legacy of package_ID:string * version:string + + | [] Release_Notes of text:string + | [] Release_Notes_Legacy of text:string + + | [] Lock_Dependencies + | [] Lock_Dependencies_Legacy + + | [] Lock_Dependencies_To_Minimum + | [] Lock_Dependencies_To_Minimum_Legacy + + | [] Pin_Project_References + | [] Pin_Project_References_Legacy + + | [] Symbols + | [] Symbols_Legacy + + | [] Include_Referenced_Projects + | [] Include_Referenced_Projects_Legacy + + | [] Project_Url of URL:string + | [] Project_Url_Legacy of URL:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Output(_) -> "output directory for .nupkg files" + | Output_Legacy(_) -> "[obsolete]" + + | Build_Config(_) -> "build configuration that should be packaged (default: Release)" + | Build_Config_Legacy(_) -> "[obsolete]" + + | Build_Platform(_) -> "build platform that should be packaged (default: check all known platform targets)" + | Build_Platform_Legacy(_) -> "[obsolete]" + + | Version(_) -> "version of the package" + | Version_Legacy(_) -> "[obsolete]" + + | Template_File(_) -> "pack a single paket.template file" + | Template_File_Legacy(_) -> "[obsolete]" + + | Exclude_Template(_) -> "exclude paket.template file by package ID; may be repeated" + | Exclude_Template_Legacy(_) -> "[obsolete]" + + | Specific_Version(_) -> "version number to use for package ID; may be repeated" + | Specific_Version_Legacy(_) -> "[obsolete]" + + | Release_Notes(_) -> "release notes" + | Release_Notes_Legacy(_) -> "[obsolete]" + + | Lock_Dependencies -> "use version constraints from paket.lock instead of paket.dependencies" + | Lock_Dependencies_Legacy(_) -> "[obsolete]" + + | Lock_Dependencies_To_Minimum -> "use version constraints from paket.lock instead of paket.dependencies and add them as a minimum version; --lock-dependencies overrides this option" + | Lock_Dependencies_To_Minimum_Legacy(_) -> "[obsolete]" + + | Pin_Project_References -> "pin dependencies generated from project references to exact versions (=) instead of using minimum versions (>=); with --lock-dependencies project references will be pinned even if this option is not specified" + | Pin_Project_References_Legacy(_) -> "[obsolete]" + + | Symbols -> "create symbol and source packages in addition to library and content packages" + | Symbols_Legacy(_) -> "[obsolete]" + + | Include_Referenced_Projects -> "include symbols and source from referenced projects" + | Include_Referenced_Projects_Legacy(_) -> "[obsolete]" + + | Project_Url(_) -> "homepage URL for the package" + | Project_Url_Legacy(_) -> "[obsolete]" + +type PushArgs = + | [] Package of path:string + | [] Package_Legacy of path:string + + | [] Url of url:string + | [] Url_Legacy of url:string + + | [] Api_Key of key:string + | [] Api_Key_Legacy of key:string + + | [] Endpoint of path:string + | [] Endpoint_Legacy of path:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Package(_) -> "path to the .nupkg file" + | Package_Legacy(_) -> "[obsolete]" + + | Url(_) -> "URL of the NuGet feed" + | Url_Legacy(_) -> "[obsolete]" + + | Api_Key(_) -> "API key for the URL (default: value of the NUGET_KEY environment variable)" + | Api_Key_Legacy(_) -> "[obsolete]" + + | Endpoint(_) -> "API endpoint to push to (default: /api/v2/package)" + | Endpoint_Legacy(_) -> "[obsolete]" + +type GenerateLoadScriptsArgs = + | [] Group of name:string + | [] Group_Legacy of name:string list + + | [] Framework of framework:string + | [] Framework_Legacy of framework:string + + | [] Type of LanguageFlags + | [] Type_Legacy of LanguageFlags +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Group(_) -> "groups to generate scripts for (default: all groups); may be repeated" + | Group_Legacy(_) -> "[obsolete]" + + | Framework(_) -> "framework identifier to generate scripts for, such as net45 or netstandard1.6; may be repeated" + | Framework_Legacy(_) -> "[obsolete]" + + | Type(_) -> "language to generate scripts for; may be repeated" + | Type_Legacy(_) -> "[obsolete]" + +type WhyArgs = + | [] NuGet of package_ID:string + | [] NuGet_Legacy of package_ID:string + + | [] Group of name:string + | [] Group_Legacy of name:string + + | [] Details +with + interface IArgParserTemplate with + member this.Usage = + match this with + | NuGet(_) -> "NuGet package ID" + | NuGet_Legacy(_) -> "[obsolete]" + + | Group(_) -> "specify dependency group (default: Main group)" + | Group_Legacy(_) -> "[obsolete]" + + | Details -> "display detailed information with all paths, versions and framework restrictions" + +type RestrictionArgs = + | [] Restriction of restrictionRaw:string +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Restriction(_) -> "The restriction to resolve" + +type Command = + // global options + | Version + | [] Silent + | [] Verbose + | [] Log_File of path:string + | [] From_Bootstrapper + // subcommands + | [] Add of ParseResults + | [] Github of ParseResults + | [] Git of ParseResults + | [] ClearCache of ParseResults + | [] Config of ParseResults + | [] ConvertFromNuget of ParseResults + | [] FindRefs of ParseResults + | [] Init of ParseResults + | [] AutoRestore of ParseResults + | [] Install of ParseResults + | [] Outdated of ParseResults + | [] Remove of ParseResults + | [] Restore of ParseResults + | [] Simplify of ParseResults + | [] Update of ParseResults + | [] FindPackages of ParseResults + | [] FindPackageVersions of ParseResults + | [] FixNuspec of ParseResults + | [] FixNuspecs of ParseResults + | [] GenerateNuspec of ParseResults + | [] ShowInstalledPackages of ParseResults + | [] ShowGroups of ParseResults + | [] Pack of ParseResults + | [] Push of ParseResults + | [] GenerateIncludeScripts of ParseResults + | [] GenerateLoadScripts of ParseResults + | [] Why of ParseResults + | [] Restriction of ParseResults + | [] Info of ParseResults +with + interface IArgParserTemplate with + member this.Usage = + match this with + | Add _ -> "add a new dependency" + | Github _ -> "commands to manipulate GitHub repository references" + | Git _ -> "commands to manipulate git repository references" + | ClearCache _ -> "clear the NuGet and git cache directories" + | Config _ -> "store global configuration values like NuGet credentials" + | ConvertFromNuget _ -> "convert projects from NuGet to Paket" + | FindRefs _ -> "find all project files that have a dependency installed" + | Init _ -> "create an empty paket.dependencies file in the current working directory" + | AutoRestore _ -> "manage automatic package restore during the build process inside Visual Studio" + | Install _ -> "compute dependency graph, download dependencies and update projects" + | Outdated _ -> "find dependencies that have newer versions available" + | Remove _ -> "remove a dependency" + | Restore _ -> "download the computed dependency graph" + | Simplify _ -> "simplify declared dependencies by removing transitive dependencies" + | Update _ -> "update dependencies to their latest version" + | FindPackages _ -> "search for NuGet packages" + | FindPackageVersions _ -> "search for dependency versions" + | FixNuspec _ -> "[obsolete]" + | FixNuspecs _ -> "patch a list of .nuspec files to correct transitive dependencies" + | GenerateNuspec _ -> "generate a default nuspec for a project including its direct dependencies" + | ShowInstalledPackages _ -> "show installed top-level packages" + | ShowGroups _ -> "show groups" + | Pack _ -> "create NuGet packages from paket.template files" + | Push _ -> "push a NuGet package" + | GenerateIncludeScripts _ -> "[obsolete]" + | GenerateLoadScripts _ -> "generate F# and C# include scripts that reference installed packages in a interactive environment like F# Interactive or ScriptCS" + | Why _ -> "determine why a dependency is required" + | Restriction _ -> "resolve a framework restriction and show details" + | Info _ -> "info" + | Log_File _ -> "print output to a file" + | Silent -> "suppress console output" + | Verbose -> "print detailed information to the console" + | Version -> "show Paket version" + | From_Bootstrapper -> "call coming from the '--run' feature of the bootstrapper" + +let commandParser = ArgumentParser.Create(programName = "paket", errorHandler = new ProcessExiter(), checkStructure = false) + +let markdown (subParser : ArgumentParser) (width : int) (additionalText : string) = + let ensureLineBreak (text : string) = if String.IsNullOrEmpty(text) then text else text + Environment.NewLine + Environment.NewLine + let cleanUp (text : string) = text.Trim('\r', '\n') |> ensureLineBreak + + let parentMetadata = subParser.ParentInfo |> Option.get + + let syntax = + subParser.PrintCommandLineSyntax(usageStringCharacterWidth = width) + + let options = subParser.PrintUsage(hideSyntax=true, usageStringCharacterWidth = width) + + let makeSentence t = + let upcase (s:string) = + s.Substring(0,1).ToUpper() + s.Substring(1) + + sprintf "%s." (upcase t) + + System.Text.StringBuilder() + .Append("# paket ") + .AppendLine(parentMetadata.Name.Value) + .AppendLine() + .AppendLine(parentMetadata.Description.Value |> makeSentence) + .AppendLine() + .AppendLine("```sh") + .AppendLine(syntax) + .AppendLine() + .Append(options) + .AppendLine("```") + .AppendLine() + .Append(additionalText |> cleanUp) + .ToString() + +let getAllCommands () = commandParser.GetSubCommandParsers() diff --git a/src/Paket.Core/CliRunner.fs b/src/Paket.Core/CliRunner.fs new file mode 100644 index 0000000000..fc8c77c585 --- /dev/null +++ b/src/Paket.Core/CliRunner.fs @@ -0,0 +1,899 @@ +/// [omit] +module Paket.CliRunner + +open System +open System.Diagnostics +open System.IO + +open Paket.Logging +open Paket.Commands + +open Argu +open PackageSources + +let sw = Stopwatch.StartNew() + +type PaketExiter() = + interface IExiter with + member __.Name = "paket exiter" + member __.Exit (msg,code) = + if code = ErrorCode.HelpText then + tracen msg ; exit 0 + else traceError msg ; exit 1 + +let paketVersion = AssemblyVersionInformation.AssemblyInformationalVersion + +let mutable tracedVersion = false + +let tracePaketVersion silent = + if not silent && not tracedVersion then + tracedVersion <- true + tracefn "Paket version %s" paketVersion + +let processWithValidationEx printUsage silent validateF commandF result = + tracePaketVersion silent + if not (validateF result) then + traceError "Command was:" + traceError (" " + String.Join(" ",Environment.GetCommandLineArgs())) + printUsage result + + Environment.ExitCode <- 1 + else + try + commandF result + finally + sw.Stop() + if not silent then + let realTime = sw.Elapsed + let groupedResults = + Profile.events + |> Seq.groupBy (fun (ev) -> ev.Category) + |> Seq.map (fun (cat, group) -> + let l = group |> Seq.toList + let eventBoundaries = l |> List.collect(fun ev -> [ev.Start; ev.End]) + let mergedSpans = Profile.getCoalescedEventTimeSpans(eventBoundaries |> List.toArray) + let mergedSpanLengths = mergedSpans |> Array.fold (+) (TimeSpan()) + + cat, l.Length, mergedSpanLengths) + |> Seq.toList + let blockedRaw = + groupedResults + |> List.filter (function Profile.Category.ResolverAlgorithmBlocked _, _, _ -> true | _ -> false) + let blocked = + blockedRaw + |> List.map (fun (_,_,t) -> t) + |> Seq.fold (+) (TimeSpan()) + let resolver = + match groupedResults |> List.tryPick (function Profile.Category.ResolverAlgorithm, _, s -> Some s | _ -> None) with + | Some s -> s + | None -> TimeSpan() + tracefn "Performance:" + groupedResults + |> List.sortBy (fun (cat,_,_) -> + match cat with + | Profile.Category.ResolverAlgorithm -> 1 + | Profile.Category.ResolverAlgorithmBlocked b -> 2 + | Profile.Category.ResolverAlgorithmNotBlocked b -> 3 + | Profile.Category.FileIO -> 4 + | Profile.Category.NuGetDownload -> 5 + | Profile.Category.NuGetRequest -> 6 + | Profile.Category.Other -> 7) + |> List.iter (fun (cat, num, elapsed) -> + let reason b = + match b with + | Profile.BlockReason.PackageDetails -> "retrieving package details" + | Profile.BlockReason.GetVersion -> "retrieving package versions" + match cat with + | Profile.Category.ResolverAlgorithm -> + tracefn " - Resolver: %s (%d runs)" (Utils.TimeSpanToReadableString elapsed) num + let realTime = resolver - blocked + tracefn " - Runtime: %s" (Utils.TimeSpanToReadableString realTime) + | Profile.Category.ResolverAlgorithmBlocked b -> + let reason = reason b + tracefn " - Blocked (%s): %s (%d times)" reason (Utils.TimeSpanToReadableString elapsed) num + | Profile.Category.ResolverAlgorithmNotBlocked b -> + let reason = reason b + tracefn " - Not Blocked (%s): %d times" reason num + | Profile.Category.FileIO -> + tracefn " - Disk IO: %s" (Utils.TimeSpanToReadableString elapsed) + | Profile.Category.NuGetDownload -> + let avg = TimeSpan.FromTicks(elapsed.Ticks / int64 num) + tracefn " - Average Download Time: %s" (Utils.TimeSpanToReadableString avg) + tracefn " - Number of downloads: %d" num + | Profile.Category.NuGetRequest -> + let avg = TimeSpan.FromTicks(elapsed.Ticks / int64 num) + tracefn " - Average Request Time: %s" (Utils.TimeSpanToReadableString avg) + tracefn " - Number of Requests: %d" num + | Profile.Category.Other -> + tracefn " - Other: %s" (Utils.TimeSpanToReadableString elapsed) + ) + + tracefn " - Runtime: %s" (Utils.TimeSpanToReadableString realTime) + let omitted = Logging.getOmittedWarningCount() + if not verbose && omitted > 0 then + traceWarnfn "Paket omitted %d warnings similar to the ones above. You can see them in verbose mode." omitted + + +let processWithValidation silent validateF commandF (result : ParseResults<'T>) = + processWithValidationEx (fun (r:ParseResults<'T>) -> r.Parser.PrintUsage() |> traceError) silent validateF commandF result + +let processCommand silent commandF result = + processWithValidation silent (fun _ -> true) commandF result + +type LegacySyntax = + | OmitArgument of string + | ReplaceArgument of newSyntax:string * oldSyntax:string + +let warnObsolete o = + match o with + | OmitArgument o -> sprintf "'%s' is the default argument and should be omitted." o + | ReplaceArgument (n, o) -> sprintf "'%s' has been replaced by '%s'." o n + |> sprintf "Please use the new syntax: %s" + |> traceWarn + +let failObsolete o = + match o with + | OmitArgument o -> sprintf "'%s' is the default argument and must be omitted." o + | ReplaceArgument (n, o) -> sprintf "'%s' has been replaced by '%s'. You cannot mix the two." o n + |> failwithf "You cannot use the old and new syntax at the same time: %s" + +let legacyBool (results : ParseResults<_>) legacySyntax (list : bool*bool) = + match list with + | (true, false) -> + true + | (false, true) -> + warnObsolete legacySyntax + true + | (true, true) -> + failObsolete legacySyntax + | (false, false) -> + false + +let legacyList (results : ParseResults<_>) legacySyntax list = + let some x = + List.isEmpty x |> not + + match list with + | ([], []) -> [] + | (x, []) when some x -> + x + | ([], y) when some y -> + warnObsolete legacySyntax + y + | _ -> + failObsolete legacySyntax + +let legacyOption (results : ParseResults<_>) legacySyntax list = + match list with + | (Some id, None) -> + Some id + | (None, Some id) -> + warnObsolete legacySyntax + Some id + | (Some _, Some _) -> + failObsolete legacySyntax + | (_, _) -> None + +let require arg fail = + match arg with + | Some(id) -> id + | _ -> fail() + +let add (results : ParseResults<_>) = + let packageName = + let arg = (results.TryGetResult <@ AddArgs.NuGet @>, + results.TryGetResult <@ AddArgs.NuGet_Legacy @>) + |> legacyOption results (OmitArgument "nuget") + require arg (fun _ -> results.GetResult <@ AddArgs.NuGet @>) + let version = + let arg = (results.TryGetResult <@ AddArgs.Version @>, + results.TryGetResult <@ AddArgs.Version_Legacy @>) + |> legacyOption results (ReplaceArgument("--version", "version")) + defaultArg arg "" + let force = results.Contains <@ AddArgs.Force @> + let redirects = results.Contains <@ AddArgs.Redirects @> + let createNewBindingFiles = + (results.Contains <@ AddArgs.Create_New_Binding_Files @>, + results.Contains <@ AddArgs.Create_New_Binding_Files_Legacy @>) + |> legacyBool results (ReplaceArgument("--create-new-binding-files", "--createnewbindingfiles")) + let cleanBindingRedirects = results.Contains <@ AddArgs.Clean_Redirects @> + let group = + (results.TryGetResult <@ AddArgs.Group @>, + results.TryGetResult <@ AddArgs.Group_Legacy @>) + |> legacyOption results (ReplaceArgument("--group", "group")) + let noInstall = results.Contains <@ AddArgs.No_Install @> + let noResolve = results.Contains <@ AddArgs.No_Resolve @> + let semVerUpdateMode = + if results.Contains <@ AddArgs.Keep_Patch @> then SemVerUpdateMode.KeepPatch else + if results.Contains <@ AddArgs.Keep_Minor @> then SemVerUpdateMode.KeepMinor else + if results.Contains <@ AddArgs.Keep_Major @> then SemVerUpdateMode.KeepMajor else + SemVerUpdateMode.NoRestriction + let touchAffectedRefs = results.Contains <@ AddArgs.Touch_Affected_Refs @> + let project = + (results.TryGetResult <@ AddArgs.Project @>, + results.TryGetResult <@ AddArgs.Project_Legacy @>) + |> legacyOption results (ReplaceArgument("--project", "project")) + let packageKind = + match results.GetResult (<@ AddArgs.Type @>, defaultValue = AddArgsDependencyType.Nuget) with + | AddArgsDependencyType.Nuget -> Requirements.PackageRequirementKind.Package + | AddArgsDependencyType.Clitool -> Requirements.PackageRequirementKind.DotnetCliTool + + match project with + | Some projectName -> + Dependencies + .Locate() + .AddToProject(group, packageName, version, force, redirects, cleanBindingRedirects, createNewBindingFiles, projectName, noInstall |> not, semVerUpdateMode, touchAffectedRefs, noResolve |> not, packageKind) + | None -> + let interactive = results.Contains <@ AddArgs.Interactive @> + Dependencies + .Locate() + .Add(group, packageName, version, force, redirects, cleanBindingRedirects, createNewBindingFiles, interactive, noInstall |> not, semVerUpdateMode, touchAffectedRefs, noResolve |> not, packageKind) + +let github (results : ParseResults<_>) = + match results.GetResult <@ GithubArgs.Add @> with + | add -> + let group = + add.TryGetResult <@ AddGithubArgs.Group @> + let repository = + add.GetResult <@ AddGithubArgs.Repository @> + let file = + match add.TryGetResult <@ AddGithubArgs.File @> with + | Some f -> f + | None -> "" + let version = + match add.TryGetResult <@ AddGithubArgs.Version @> with + | Some v -> v + | None -> "" + + Dependencies + .Locate() + .AddGithub(group, repository, file, version) + +let git (results : ParseResults<_>) = + match results.GetResult <@ GitArgs.Add @> with + | add -> + let group = + add.TryGetResult <@ AddGitArgs.Group @> + let repository = + add.GetResult <@ AddGitArgs.Repository @> + let version = + match add.TryGetResult <@ AddGitArgs.Version @> with + | Some v -> v + | None -> "" + + Dependencies + .Locate() + .AddGit(group, repository, version) + +let validateConfig (results : ParseResults<_>) = + let credential = results.Contains <@ ConfigArgs.AddCredentials @> + let token = results.Contains <@ ConfigArgs.AddToken @> + match credential, token with + | true, _ -> results.GetResults <@ ConfigArgs.AddCredentials @> |> List.isEmpty |> not + | _, true -> results.GetResults <@ ConfigArgs.AddToken @> |> List.isEmpty |> not + | _ -> false + +let config (results : ParseResults<_>) = + let credentials = results.Contains <@ ConfigArgs.AddCredentials @> + let token = results.Contains <@ ConfigArgs.AddToken @> + match credentials, token with + | true, _ -> + let args = results.GetResults <@ ConfigArgs.AddCredentials @> + let source = args.Item 0 + let username, password = results.GetResult (<@ ConfigArgs.Username @>, ""), results.GetResult (<@ ConfigArgs.Password @>, "") + let authType = results.GetResult (<@ ConfigArgs.AuthType @>, "") + let verify = results.Contains <@ ConfigArgs.Verify @> + + Dependencies(".").AddCredentials(source, username, password, authType, verify) + | _, true -> + let args = results.GetResults <@ ConfigArgs.AddToken @> + let source, token = args.Item 0 + Dependencies(".").AddToken(source, token) + | _ -> () + +let validateAutoRestore (results : ParseResults<_>) = + results.GetAllResults().Length = 1 + +let autoRestore (results : ParseResults<_>) = + match results.GetResult <@ Flags @> with + | On -> Dependencies.Locate().TurnOnAutoRestore() + | Off -> Dependencies.Locate().TurnOffAutoRestore() + +let convert (results : ParseResults<_>) = + let force = results.Contains <@ ConvertFromNugetArgs.Force @> + let noInstall = results.Contains <@ ConvertFromNugetArgs.No_Install @> + let noAutoRestore = results.Contains <@ ConvertFromNugetArgs.No_Auto_Restore @> + let credsMigrationMode = + (results.TryGetResult <@ ConvertFromNugetArgs.Migrate_Credentials @>, + results.TryGetResult <@ ConvertFromNugetArgs.Migrate_Credentials_Legacy @>) + |> legacyOption results (ReplaceArgument("--migrate-credentials", "--creds-migration")) + + Dependencies.ConvertFromNuget(force, noInstall |> not, noAutoRestore |> not, credsMigrationMode) + +let findRefs (results : ParseResults<_>) = + let packages = + let arg = (results.TryGetResult <@ FindRefsArgs.NuGets @>, + results.TryGetResult <@ FindRefsArgs.NuGets_Legacy @>) + |> legacyOption results (OmitArgument "nuget") + require arg (fun _ -> results.GetResult <@ FindRefsArgs.NuGets @>) + let group = + let arg = (results.TryGetResult <@ FindRefsArgs.Group @>, + results.TryGetResult <@ FindRefsArgs.Group_Legacy @>) + |> legacyOption results (ReplaceArgument("--group", "group")) + + defaultArg arg (Constants.MainDependencyGroup.ToString()) + packages |> List.map (fun p -> group,p) + |> Dependencies.Locate().ShowReferencesFor + +let init (results : ParseResults) = + Dependencies.Init(Directory.GetCurrentDirectory()) + +let clearCache (results : ParseResults) = + let clearLocal = results.Contains <@ ClearCacheArgs.ClearLocal @> + Dependencies.ClearCache(clearLocal) + +let install (results : ParseResults<_>) = + let force = results.Contains <@ InstallArgs.Force @> + let withBindingRedirects = results.Contains <@ InstallArgs.Redirects @> + let createNewBindingFiles = + (results.Contains <@ InstallArgs.Create_New_Binding_Files @>, + results.Contains <@ InstallArgs.Create_New_Binding_Files_Legacy @>) + |> legacyBool results (ReplaceArgument("--create-new-binding-files", "--createnewbindingfiles")) + let cleanBindingRedirects = results.Contains <@ InstallArgs.Clean_Redirects @> + let installOnlyReferenced = results.Contains <@ InstallArgs.Install_Only_Referenced @> + let generateLoadScripts = results.Contains <@ InstallArgs.Generate_Load_Scripts @> + let alternativeProjectRoot = results.TryGetResult <@ InstallArgs.Project_Root @> + let providedFrameworks = + (results.GetResults <@ InstallArgs.Load_Script_Framework @>, + results.GetResults <@ InstallArgs.Load_Script_Framework_Legacy @>) + |> legacyList results (ReplaceArgument("--load-script-framework", "load-script-framework")) + let providedScriptTypes = + (results.GetResults <@ InstallArgs.Load_Script_Type @>, + results.GetResults <@ InstallArgs.Load_Script_Type_Legacy @>) + |> legacyList results (ReplaceArgument("--load-script-type", "load-script-type")) + |> List.map (fun l -> l.ToString().ToLowerInvariant()) + let semVerUpdateMode = + if results.Contains <@ InstallArgs.Keep_Patch @> then SemVerUpdateMode.KeepPatch else + if results.Contains <@ InstallArgs.Keep_Minor @> then SemVerUpdateMode.KeepMinor else + if results.Contains <@ InstallArgs.Keep_Major @> then SemVerUpdateMode.KeepMajor else + SemVerUpdateMode.NoRestriction + let touchAffectedRefs = results.Contains <@ InstallArgs.Touch_Affected_Refs @> + + Dependencies.Locate().Install( + force, + withBindingRedirects, + cleanBindingRedirects, + createNewBindingFiles, + installOnlyReferenced, + semVerUpdateMode, + touchAffectedRefs, + generateLoadScripts, + providedFrameworks, + providedScriptTypes, + alternativeProjectRoot) + +let outdated (results : ParseResults<_>) = + let force = results.Contains <@ OutdatedArgs.Force @> + let strict = results.Contains <@ OutdatedArgs.Ignore_Constraints @> |> not + let includePrereleases = results.Contains <@ OutdatedArgs.Include_Prereleases @> + let group = + (results.TryGetResult<@ OutdatedArgs.Group @>, + results.TryGetResult<@ OutdatedArgs.Group_Legacy @>) + |> legacyOption results (ReplaceArgument("--group", "group")) + Dependencies.Locate().ShowOutdated(strict, force, includePrereleases, group) + +let remove (results : ParseResults<_>) = + let packageName = + let arg = (results.TryGetResult <@ RemoveArgs.NuGet @>, + results.TryGetResult <@ RemoveArgs.NuGet_Legacy @>) + |> legacyOption results (OmitArgument("nuget")) + require arg (fun _ -> results.GetResult <@ RemoveArgs.NuGet @>) + let force = results.Contains <@ RemoveArgs.Force @> + let noInstall = results.Contains <@ RemoveArgs.No_Install @> + let group = + (results.TryGetResult <@ RemoveArgs.Group @>, + results.TryGetResult <@ RemoveArgs.Group_Legacy @>) + |> legacyOption results (ReplaceArgument("--group", "group")) + let project = + (results.TryGetResult <@ RemoveArgs.Project @>, + results.TryGetResult <@ RemoveArgs.Project_Legacy @>) + |> legacyOption results (ReplaceArgument("--project", "project")) + + match project with + | Some projectName -> + Dependencies.Locate() + .RemoveFromProject(group, packageName, force, projectName, noInstall |> not) + | None -> + let interactive = results.Contains <@ RemoveArgs.Interactive @> + Dependencies.Locate().Remove(group, packageName, force, interactive, noInstall |> not) + +let restore (results : ParseResults<_>) = + let force = results.Contains <@ RestoreArgs.Force @> + let files = + (results.GetResults<@ RestoreArgs.References_File @>, + (defaultArg (results.TryGetResult<@ RestoreArgs.References_File_Legacy @>) [])) + |> legacyList results (ReplaceArgument("--references-file", "--references-files")) + let project = + (results.TryGetResult <@ RestoreArgs.Project @>, + results.TryGetResult <@ RestoreArgs.Project_Legacy @>) + |> legacyOption results (ReplaceArgument("--project", "project")) + let group = + (results.TryGetResult <@ RestoreArgs.Group @>, + results.TryGetResult <@ RestoreArgs.Group_Legacy @>) + |> legacyOption results (ReplaceArgument("--group", "group")) + let installOnlyReferenced = results.Contains <@ RestoreArgs.Install_Only_Referenced @> + let touchAffectedRefs = results.Contains <@ RestoreArgs.Touch_Affected_Refs @> + let ignoreChecks = results.Contains <@ RestoreArgs.Ignore_Checks @> + let failOnChecks = results.Contains <@ RestoreArgs.Fail_On_Checks @> + let targetFramework = results.TryGetResult <@ RestoreArgs.Target_Framework @> + + match project with + | Some project -> + Dependencies.Locate().Restore(force, group, project, touchAffectedRefs, ignoreChecks, failOnChecks, targetFramework) + | None -> + if List.isEmpty files then + Dependencies.Locate().Restore(force, group, installOnlyReferenced, touchAffectedRefs, ignoreChecks, failOnChecks, targetFramework) + else + Dependencies.Locate().Restore(force, group, files, touchAffectedRefs, ignoreChecks, failOnChecks, targetFramework) + +let simplify (results : ParseResults<_>) = + let interactive = results.Contains <@ SimplifyArgs.Interactive @> + Dependencies.Locate().Simplify(interactive) + +let update (results : ParseResults<_>) = + let createNewBindingFiles = + (results.Contains <@ UpdateArgs.Create_New_Binding_Files @>, + results.Contains <@ UpdateArgs.Create_New_Binding_Files_Legacy @>) + |> legacyBool results (ReplaceArgument("--create-new-binding-files", "--createnewbindingfiles")) + let group = + (results.TryGetResult <@ UpdateArgs.Group @>, + results.TryGetResult <@ UpdateArgs.Group_Legacy @>) + |> legacyOption results (ReplaceArgument("--group", "group")) + + let force = results.Contains <@ UpdateArgs.Force @> + let noInstall = results.Contains <@ UpdateArgs.No_Install @> + let withBindingRedirects = results.Contains <@ UpdateArgs.Redirects @> + let cleanBindingRedirects = results.Contains <@ UpdateArgs.Clean_Redirects @> + let createNewBindingFiles = results.Contains <@ UpdateArgs.Create_New_Binding_Files @> + let semVerUpdateMode = + if results.Contains <@ UpdateArgs.Keep_Patch @> then SemVerUpdateMode.KeepPatch else + if results.Contains <@ UpdateArgs.Keep_Minor @> then SemVerUpdateMode.KeepMinor else + if results.Contains <@ UpdateArgs.Keep_Major @> then SemVerUpdateMode.KeepMajor else + SemVerUpdateMode.NoRestriction + let touchAffectedRefs = results.Contains <@ UpdateArgs.Touch_Affected_Refs @> + let filter = results.Contains <@ UpdateArgs.Filter @> + + let nuget = + (results.TryGetResult <@ UpdateArgs.NuGet @>, + results.TryGetResult <@ UpdateArgs.NuGet_Legacy @>) + |> legacyOption results (OmitArgument "nuget") + + match nuget with + | Some packageName -> + let version = + (results.TryGetResult <@ UpdateArgs.Version @>, + results.TryGetResult <@ UpdateArgs.Version_Legacy @>) + |> legacyOption results (ReplaceArgument("--version", "version")) + + if filter then + Dependencies.Locate().UpdateFilteredPackages(group, packageName, version, force, withBindingRedirects, cleanBindingRedirects, createNewBindingFiles, noInstall |> not, semVerUpdateMode, touchAffectedRefs) + else + Dependencies.Locate().UpdatePackage(group, packageName, version, force, withBindingRedirects, cleanBindingRedirects, createNewBindingFiles, noInstall |> not, semVerUpdateMode, touchAffectedRefs) + | _ -> + match group with + | Some groupName -> + Dependencies.Locate().UpdateGroup(groupName, force, withBindingRedirects, cleanBindingRedirects, createNewBindingFiles, noInstall |> not, semVerUpdateMode, touchAffectedRefs) + | None -> + Dependencies.Locate().Update(force, withBindingRedirects, cleanBindingRedirects, createNewBindingFiles, noInstall |> not, semVerUpdateMode, touchAffectedRefs) + +let pack (results : ParseResults<_>) = + let outputPath = + let arg = (results.TryGetResult <@ PackArgs.Output @>, + results.TryGetResult <@ PackArgs.Output_Legacy @>) + |> legacyOption results (OmitArgument "output") + require arg (fun _ -> results.GetResult <@ PackArgs.Output @>) + let buildConfig = + (results.TryGetResult <@ PackArgs.Build_Config @>, + results.TryGetResult <@ PackArgs.Build_Config_Legacy @>) + |> legacyOption results (ReplaceArgument("--build-config", "buildconfig")) + let buildPlatform = + (results.TryGetResult <@ PackArgs.Build_Platform @>, + results.TryGetResult <@ PackArgs.Build_Platform_Legacy @>) + |> legacyOption results (ReplaceArgument("--build-platform", "buildplatform")) + let version = + (results.TryGetResult <@ PackArgs.Version @>, + results.TryGetResult <@ PackArgs.Version_Legacy @>) + |> legacyOption results (ReplaceArgument("--version", "version")) + let specificVersions = + (results.GetResults <@ PackArgs.Specific_Version @>, + results.GetResults <@ PackArgs.Specific_Version_Legacy @>) + |> legacyList results (ReplaceArgument("--specific-version", "specific-version")) + let releaseNotes = + (results.TryGetResult <@ PackArgs.Release_Notes @>, + results.TryGetResult <@ PackArgs.Release_Notes_Legacy @>) + |> legacyOption results (ReplaceArgument("--release-notes", "releaseNotes")) + let templateFile = + (results.TryGetResult <@ PackArgs.Template_File @>, + results.TryGetResult <@ PackArgs.Template_File_Legacy @>) + |> legacyOption results (ReplaceArgument("--template", "templatefile")) + let excludedTemplates = + (results.GetResults <@ PackArgs.Exclude_Template @>, + results.GetResults <@ PackArgs.Exclude_Template_Legacy @>) + |> legacyList results (ReplaceArgument("--exclude", "exclude")) + let lockDependencies = + (results.Contains <@ PackArgs.Lock_Dependencies @>, + results.Contains <@ PackArgs.Lock_Dependencies_Legacy @>) + |> legacyBool results (ReplaceArgument("--lock-dependencies", "lock-dependencies")) + let minimumFromLockFile = + (results.Contains <@ PackArgs.Lock_Dependencies_To_Minimum @>, + results.Contains <@ PackArgs.Lock_Dependencies_To_Minimum_Legacy @>) + |> legacyBool results (ReplaceArgument("--minimum-from-lock-file", "minimum-from-lock-file")) + let pinProjectReferences = + (results.Contains <@ PackArgs.Pin_Project_References @>, + results.Contains <@ PackArgs.Pin_Project_References_Legacy @>) + |> legacyBool results (ReplaceArgument("--pin-project-references", "pin-project-references")) + let symbols = + (results.Contains <@ PackArgs.Symbols @>, + results.Contains <@ PackArgs.Symbols_Legacy @>) + |> legacyBool results (ReplaceArgument("--symbols", "symbols")) + let includeReferencedProjects = + (results.Contains <@ PackArgs.Include_Referenced_Projects @>, + results.Contains <@ PackArgs.Include_Referenced_Projects_Legacy @>) + |> legacyBool results (ReplaceArgument("--include-referenced-projects", "Include_Referenced_Projects")) + let projectUrl = + (results.TryGetResult <@ PackArgs.Project_Url @>, + results.TryGetResult <@ PackArgs.Project_Url_Legacy @>) + |> legacyOption results (ReplaceArgument("--project-url", "project-url")) + + Dependencies.Locate() + .Pack(outputPath, + ?buildConfig = buildConfig, + ?buildPlatform = buildPlatform, + ?version = version, + specificVersions = specificVersions, + ?releaseNotes = releaseNotes, + ?templateFile = templateFile, + excludedTemplates = excludedTemplates, + workingDir = System.IO.Directory.GetCurrentDirectory(), + lockDependencies = lockDependencies, + minimumFromLockFile = minimumFromLockFile, + pinProjectReferences = pinProjectReferences, + symbols = symbols, + includeReferencedProjects = includeReferencedProjects, + ?projectUrl = projectUrl) + +/// This is source-discovering logic shared between `findPackages` and `findPackageVersions` +let discoverPackageSources explicitSource (dependencies: Dependencies option) = + match explicitSource, dependencies with + | Some source, _ -> + [PackageSource.NuGetV2Source source] + | _, Some dependencies -> + PackageSources.DefaultNuGetSource :: + (dependencies.GetSources() |> Seq.map (fun kv -> kv.Value) |> List.concat) + | _ -> + failwithf "Could not find '%s' at or above current directory, and no explicit source was given as parameter (e.g. 'paket.exe find-packages --source https://www.nuget.org/api/v2')." + Constants.DependenciesFileName + +let findPackages silent (results : ParseResults<_>) = + let maxResults = + let arg = (results.TryGetResult <@ FindPackagesArgs.Max_Results @>, + results.TryGetResult <@ FindPackagesArgs.Max_Results_Legacy @>) + |> legacyOption results (ReplaceArgument("--max", "max")) + defaultArg arg 10000 + let sources = + let dependencies = Dependencies.TryLocate() + let arg = (results.TryGetResult <@ FindPackagesArgs.Source @>, + results.TryGetResult <@ FindPackagesArgs.Source_Legacy @>) + |> legacyOption results (ReplaceArgument("--source", "source")) + discoverPackageSources arg dependencies + + let searchAndPrint searchText = + for p in Dependencies.FindPackagesByName(sources,searchText,maxResults) do + tracefn "%s" p + + let search = + (results.TryGetResult <@ FindPackagesArgs.Search @>, + results.TryGetResult <@ FindPackagesArgs.Search_Legacy @>) + |> legacyOption results (OmitArgument "searchtext") + + match search with + | None -> + let rec repl () = + if not silent then + tracefn " - Please enter search text (:q for exit):" + + match Console.ReadLine() with + | ":q" -> () + | searchText -> + searchAndPrint searchText + repl () + + repl () + + | Some searchText -> searchAndPrint searchText + +#nowarn "44" // because FixNuspecs is deprecated and we have warnaserror + +open Paket.Requirements + +let fixNuspecs silent (results : ParseResults<_>) = + let nuspecFiles = + results.GetResult <@ FixNuspecsArgs.Files @> + |> List.collect (fun s -> s.Split([|';'|], StringSplitOptions.RemoveEmptyEntries) |> Array.toList) + |> List.map (fun s -> s.Trim()) + + match results.TryGetResult <@ FixNuspecsArgs.ProjectFile @> with + | Some projectFile -> + let projectFile = Paket.ProjectFile.LoadFromFile(projectFile) + let refFile = RestoreProcess.FindOrCreateReferencesFile projectFile + Dependencies.FixNuspecs (refFile, nuspecFiles) + | None -> + match results.TryGetResult <@ FixNuspecsArgs.ReferencesFile @> with + | Some referenceFile -> + traceWarnfn "using the references-file argument is obsolete, please use project-file instead" + + Dependencies.FixNuspecs (referenceFile, nuspecFiles) + | None -> failwithf "%s" (results.Parser.PrintUsage()) + + + +// For backwards compatibility +let fixNuspec _silent (results : ParseResults<_>) = + let fileString = results.GetResult <@ FixNuspecArgs.File @> + let refFile = results.GetResult <@ FixNuspecArgs.ReferencesFile @> + let nuspecList = + fileString.Split([|';'|], StringSplitOptions.RemoveEmptyEntries) + |> Array.map (fun s -> s.Trim()) + |> List.ofArray + + Dependencies.FixNuspecs (refFile, nuspecList) + +// separated out from showInstalledPackages to allow Paket.PowerShell to get the types +let getInstalledPackages (results : ParseResults<_>) = + let project = + (results.TryGetResult <@ ShowInstalledPackagesArgs.Project @>, + results.TryGetResult <@ ShowInstalledPackagesArgs.Project_Legacy @>) + |> legacyOption results (ReplaceArgument("--project", "project")) + let showAll = results.Contains <@ ShowInstalledPackagesArgs.All @> + let dependenciesFile = Dependencies.Locate() + match project with + | None -> + if showAll then dependenciesFile.GetInstalledPackages() + else dependenciesFile.GetDirectDependencies() + | Some project -> + match ProjectFile.FindReferencesFile(FileInfo project) with + | None -> [] + | Some referencesFile -> + let referencesFile = ReferencesFile.FromFile referencesFile + if showAll then dependenciesFile.GetInstalledPackages(referencesFile) + else dependenciesFile.GetDirectDependencies(referencesFile) + +let showInstalledPackages (results : ParseResults<_>) = + for groupName,name,version in getInstalledPackages results do + tracefn "%s %s - %s" groupName name version + +let showGroups (results : ParseResults) = + let dependenciesFile = Dependencies.Locate() + for groupName in dependenciesFile.GetGroups() do + tracefn "%s" groupName + +let findPackageVersions (results : ParseResults<_>) = + let maxResults = + let arg = (results.TryGetResult <@ FindPackageVersionsArgs.Max_Results @>, + results.TryGetResult <@ FindPackageVersionsArgs.Max_Results_Legacy @>) + |> legacyOption results (ReplaceArgument("--max", "max")) + defaultArg arg 10000 + let dependencies = Dependencies.TryLocate() + let name = + let arg = (results.TryGetResult <@ FindPackageVersionsArgs.NuGet @>, + results.TryGetResult <@ FindPackageVersionsArgs.NuGet_Legacy @>) + |> legacyOption results (OmitArgument "nuget") + require arg (fun _ -> results.GetResult <@ FindPackageVersionsArgs.NuGet @>) + let sources = + let arg = (results.TryGetResult <@ FindPackageVersionsArgs.Source @>, + results.TryGetResult <@ FindPackageVersionsArgs.Source_Legacy @>) + |> legacyOption results (ReplaceArgument("--source", "source")) + discoverPackageSources arg dependencies + + let root = + match dependencies with + | Some d -> + d.RootPath + | None -> + traceWarnfn "Could not find '%s' at or above current directory. Using current directory as project root." Constants.DependenciesFileName + Directory.GetCurrentDirectory() + + for p in Dependencies.FindPackageVersions(root,sources,name,maxResults) do + tracefn "%s" p + +let push paketVersion (results : ParseResults<_>) = + let fileName = + let arg = (results.TryGetResult <@ PushArgs.Package @>, + results.TryGetResult <@ PushArgs.Package_Legacy @>) + |> legacyOption results (OmitArgument "file") + require arg (fun _ -> results.GetResult <@ PushArgs.Package @>) + let url = + (results.TryGetResult <@ PushArgs.Url @>, + results.TryGetResult <@ PushArgs.Url_Legacy @>) + |> legacyOption results (ReplaceArgument("--url", "url")) + let endpoint = + (results.TryGetResult <@ PushArgs.Endpoint @>, + results.TryGetResult <@ PushArgs.Endpoint_Legacy @>) + |> legacyOption results (ReplaceArgument("--endpoint", "endpoint")) + let apiKey = + (results.TryGetResult <@ PushArgs.Api_Key @>, + results.TryGetResult <@ PushArgs.Api_Key_Legacy @>) + |> legacyOption results (ReplaceArgument("--api-key", "apikey")) + + Dependencies.Push(fileName, + ?url = url, + ?endPoint = endpoint, + ?apiKey = apiKey) + +let generateLoadScripts (results : ParseResults) = + let providedFrameworks = + (results.GetResults <@ GenerateLoadScriptsArgs.Framework @>, + results.GetResults <@ GenerateLoadScriptsArgs.Framework_Legacy @>) + |> legacyList results (ReplaceArgument("--framework", "framework")) + let providedScriptTypes = + (results.GetResults <@ GenerateLoadScriptsArgs.Type @>, + results.GetResults <@ GenerateLoadScriptsArgs.Type_Legacy @>) + |> legacyList results (ReplaceArgument("--type", "type")) + |> List.map (fun l -> l.ToString().ToLowerInvariant()) + let providedGroups = + (results.GetResults<@ GenerateLoadScriptsArgs.Group @>, + (defaultArg (results.TryGetResult<@ GenerateLoadScriptsArgs.Group_Legacy @>) [])) + |> legacyList results (ReplaceArgument("--group", "groups")) + + Dependencies.Locate().GenerateLoadScripts providedGroups providedFrameworks providedScriptTypes + +let info (results : ParseResults) = + if results.Contains <@ InfoArgs.Paket_Dependencies_Dir @> then + match Dependencies.TryLocate() with + | None -> () + | Some deps -> tracefn "%s" deps.RootPath + +let generateNuspec (results:ParseResults) = + let projectFile = results.GetResult <@ GenerateNuspecArgs.Project @> + let dependenciesPath = results.GetResult <@ GenerateNuspecArgs.DependenciesFile @> + let output = defaultArg (results.TryGetResult <@ GenerateNuspecArgs.Output @>) (Directory.GetCurrentDirectory()) + let dependencies = DependenciesFile.ReadFromFile dependenciesPath + let filename, nuspec = Nuspec.FromProject(projectFile,dependencies) + let nuspecString = nuspec.ToString() + File.WriteAllText (Path.Combine (output,filename), nuspecString) + +let why (results: ParseResults) = + let packageName = + let arg = (results.TryGetResult <@ WhyArgs.NuGet @>, + results.TryGetResult <@ WhyArgs.NuGet_Legacy @>) + |> legacyOption results (OmitArgument "nuget") + require arg (fun _ -> results.GetResult <@ WhyArgs.NuGet @>) + |> Domain.PackageName + let groupName = + let arg = (results.TryGetResult <@ WhyArgs.Group @>, + results.TryGetResult <@ WhyArgs.Group_Legacy @>) + |> legacyOption results (ReplaceArgument("--group", "group")) + |> Option.map Domain.GroupName + defaultArg arg Constants.MainDependencyGroup + let dependencies = Dependencies.Locate() + let lockFile = dependencies.GetLockFile() + let directDeps = + dependencies + .GetDependenciesFile() + .GetDependenciesInGroup(groupName) + |> Seq.map (fun pair -> pair.Key) + |> Set.ofSeq + let options = + { Why.WhyOptions.Details = results.Contains <@ WhyArgs.Details @> } + + Why.ohWhy(packageName, directDeps, lockFile, groupName, results.Parser.PrintUsage(), options) + +let restriction (results: ParseResults) = + let restrictionRaw = results.GetResult <@ RestrictionArgs.Restriction @> + let restriction, parseProblems = Requirements.parseRestrictions restrictionRaw + + for problem in parseProblems |> Seq.map (fun x -> x.AsMessage) do + Logging.traceWarnfn "Problem: %s" problem + + Logging.tracefn "Restriction: %s" restrictionRaw + Logging.tracefn "Simplified: %s" (restriction.ToString()) + Logging.tracefn "Frameworks: [ " + for framework in restriction.RepresentedFrameworks do + Logging.tracefn " %s" framework.CompareString + Logging.tracefn "]" + + + +let waitForDebugger () = + while not(System.Diagnostics.Debugger.IsAttached) do + System.Threading.Thread.Sleep(100) + +let handleCommand silent command = + match command with + | Add r -> processCommand silent add r + | Github r -> processCommand silent github r + | Git r -> processCommand silent git r + | ClearCache r -> processCommand silent clearCache r + | Config r -> processWithValidation silent validateConfig config r + | ConvertFromNuget r -> processCommand silent convert r + | FindRefs r -> processCommand silent findRefs r + | Init r -> processCommand silent (init) r + | AutoRestore r -> processWithValidation silent validateAutoRestore autoRestore r + | Install r -> processCommand silent install r + | Outdated r -> processCommand silent outdated r + | Remove r -> processCommand silent remove r + | Restore r -> processCommand silent restore r + | Simplify r -> processCommand silent simplify r + | Update r -> processCommand silent update r + | FindPackages r -> processCommand silent (findPackages silent) r + | FindPackageVersions r -> processCommand silent findPackageVersions r + | FixNuspec r -> + warnObsolete (ReplaceArgument("fix-nuspecs", "fix-nuspec")) + processCommand silent (fixNuspec silent) r + | FixNuspecs r -> processCommand silent (fixNuspecs silent) r + | ShowInstalledPackages r -> processCommand silent showInstalledPackages r + | ShowGroups r -> processCommand silent showGroups r + | Pack r -> processCommand silent pack r + | Push r -> processCommand silent (push paketVersion) r + | GenerateIncludeScripts r -> + warnObsolete (ReplaceArgument("generate-load-scripts", "generate-include-scripts")) + processCommand silent generateLoadScripts r + | GenerateLoadScripts r -> processCommand silent generateLoadScripts r + | GenerateNuspec r -> processCommand silent generateNuspec r + | Why r -> processCommand silent why r + | Restriction r -> processCommand silent restriction r + | Info r -> processCommand silent info r + // global options; list here in order to maintain compiler warnings + // in case of new subcommands added + | Verbose + | Silent + | From_Bootstrapper + | Version + | Log_File _ -> failwithf "internal error: this code should never be reached." + +let runCli(args) = + match args with + | [| _; "restore" |] | [| _; "--from-bootstrapper"; "restore" |] -> + // Global restore fast route, see https://github.com/fsprojects/Argu/issues/90 + processWithValidationEx + ignore + false + (fun _ -> true) + (fun _ -> Dependencies.Locate().Restore()) () + | [| _; "restore"; "--project"; project |] | [| _; "--from-bootstrapper"; "restore"; "--project"; project |] -> + // Project restore fast route, see https://github.com/fsprojects/Argu/issues/90 + processWithValidationEx + ignore + false + (fun _ -> true) + (fun _ -> Dependencies.Locate().Restore(false, None, project, false, false, false, None)) () + | [| _; "install" |] | [| _; "--from-bootstrapper"; "install" |] -> + // Global restore fast route, see https://github.com/fsprojects/Argu/issues/90 + processWithValidationEx + ignore + false + (fun _ -> true) + (fun _ -> Dependencies.Locate().Install(false, false, false, false, false, SemVerUpdateMode.NoRestriction, false, false, [], [], None)) () + | _ -> + let parser = ArgumentParser.Create(programName = "paket", + helpTextMessage = sprintf "Paket version %s%sHelp was requested:" paketVersion Environment.NewLine, + errorHandler = new PaketExiter(), + checkStructure = false) + + let results = parser.ParseCommandLine(raiseOnUsage = true) + let silent = results.Contains <@ Silent @> + tracePaketVersion silent + + if results.Contains <@ Verbose @> then + Logging.verbose <- true + Logging.verboseWarnings <- true + + let version = results.Contains <@ Version @> + if not version then + + use fileTrace = + match results.TryGetResult <@ Log_File @> with + | Some lf -> setLogFile lf + | None -> null + + handleCommand silent (results.GetSubCommand()) diff --git a/src/Paket.Core/Paket.Core.fsproj b/src/Paket.Core/Paket.Core.fsproj index 4db42ce7c1..faccfb889b 100644 --- a/src/Paket.Core/Paket.Core.fsproj +++ b/src/Paket.Core/Paket.Core.fsproj @@ -15,6 +15,7 @@ ..\..\ true + true true @@ -144,6 +145,8 @@ + + @@ -163,6 +166,26 @@ + + + + + ..\..\packages\Argu\lib\net45\Argu.dll + True + True + + + + + + + ..\..\packages\Argu\lib\netstandard2.0\Argu.dll + True + True + + + + @@ -236,7 +259,7 @@ - + ..\..\packages\Microsoft.CSharp\lib\netstandard2.0\Microsoft.CSharp.dll @@ -245,7 +268,7 @@ - + ..\..\packages\Microsoft.CSharp\ref\netstandard2.0\Microsoft.CSharp.dll @@ -293,7 +316,7 @@ - + ..\..\packages\Microsoft.Win32.Primitives\ref\netstandard1.3\Microsoft.Win32.Primitives.dll @@ -508,7 +531,7 @@ - + ..\..\packages\System.Buffers\lib\netstandard2.0\System.Buffers.dll @@ -517,7 +540,7 @@ - + ..\..\packages\System.Buffers\ref\netstandard2.0\System.Buffers.dll @@ -557,7 +580,7 @@ - + ..\..\packages\System.Collections.Concurrent\lib\netstandard1.3\System.Collections.Concurrent.dll @@ -566,7 +589,7 @@ - + ..\..\packages\System.Collections.Concurrent\ref\netstandard1.3\System.Collections.Concurrent.dll @@ -694,6 +717,26 @@ + + + + + ..\..\packages\System.Configuration.ConfigurationManager\lib\netstandard2.0\System.Configuration.ConfigurationManager.dll + True + True + + + + + + + ..\..\packages\System.Configuration.ConfigurationManager\ref\netstandard2.0\System.Configuration.ConfigurationManager.dll + False + True + + + + @@ -704,7 +747,7 @@ - + ..\..\packages\System.Console\ref\netstandard1.3\System.Console.dll @@ -744,7 +787,7 @@ - + ..\..\packages\System.Diagnostics.DiagnosticSource\lib\netstandard1.3\System.Diagnostics.DiagnosticSource.dll @@ -755,7 +798,7 @@ - + ..\..\packages\System.Diagnostics.Tools\ref\netstandard1.0\System.Diagnostics.Tools.dll @@ -793,7 +836,7 @@ - + ..\..\packages\System.Diagnostics.Tracing\ref\netstandard1.5\System.Diagnostics.Tracing.dll @@ -853,7 +896,7 @@ - + ..\..\packages\System.Globalization.Calendars\ref\netstandard1.3\System.Globalization.Calendars.dll @@ -913,7 +956,7 @@ - + ..\..\packages\System.IO.Compression\ref\netstandard1.3\System.IO.Compression.dll @@ -1049,7 +1092,7 @@ - + ..\..\packages\System.Linq.Expressions\lib\netstandard1.6\System.Linq.Expressions.dll @@ -1058,7 +1101,7 @@ - + ..\..\packages\System.Linq.Expressions\ref\netstandard1.6\System.Linq.Expressions.dll @@ -1098,7 +1141,7 @@ - + ..\..\packages\System.Net.Http\ref\netstandard1.3\System.Net.Http.dll @@ -1127,7 +1170,7 @@ - + ..\..\packages\System.Net.Primitives\ref\netstandard1.3\System.Net.Primitives.dll @@ -1138,7 +1181,7 @@ - + ..\..\packages\System.Net.Requests\ref\netstandard1.3\System.Net.Requests.dll @@ -1169,7 +1212,7 @@ - + ..\..\packages\System.Net.WebHeaderCollection\lib\netstandard1.3\System.Net.WebHeaderCollection.dll @@ -1178,7 +1221,7 @@ - + ..\..\packages\System.Net.WebHeaderCollection\ref\netstandard1.3\System.Net.WebHeaderCollection.dll @@ -1198,7 +1241,7 @@ - + ..\..\packages\System.ObjectModel\lib\netstandard1.3\System.ObjectModel.dll @@ -1207,7 +1250,7 @@ - + ..\..\packages\System.ObjectModel\ref\netstandard1.3\System.ObjectModel.dll @@ -1287,7 +1330,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\ref\netstandard1.0\System.Reflection.Emit.Lightweight.dll @@ -1296,7 +1339,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\lib\netstandard1.3\System.Reflection.Emit.Lightweight.dll @@ -1374,7 +1417,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\lib\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1383,7 +1426,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\ref\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1577,7 +1620,7 @@ - + ..\..\packages\System.Runtime.Numerics\ref\netstandard1.1\System.Runtime.Numerics.dll @@ -1586,7 +1629,7 @@ - + ..\..\packages\System.Runtime.Numerics\lib\netstandard1.3\System.Runtime.Numerics.dll @@ -1702,24 +1745,6 @@ - - - - ..\..\packages\System.Security.Cryptography.Cng\lib\netstandard2.0\System.Security.Cryptography.Cng.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.Cng\ref\netstandard2.0\System.Security.Cryptography.Cng.dll - False - True - - - @@ -1771,19 +1796,30 @@ - + + + - - ..\..\packages\System.Security.Cryptography.OpenSsl\lib\netstandard2.0\System.Security.Cryptography.OpenSsl.dll + + ..\..\packages\System.Security.Cryptography.Primitives\lib\net46\System.Security.Cryptography.Primitives.dll True True - + - - ..\..\packages\System.Security.Cryptography.OpenSsl\ref\netstandard2.0\System.Security.Cryptography.OpenSsl.dll + + ..\..\packages\System.Security.Cryptography.Primitives\lib\netstandard1.3\System.Security.Cryptography.Primitives.dll + True + True + + + + + + + ..\..\packages\System.Security.Cryptography.Primitives\ref\netstandard1.3\System.Security.Cryptography.Primitives.dll False True @@ -1793,26 +1829,53 @@ - - ..\..\packages\System.Security.Cryptography.Primitives\lib\net46\System.Security.Cryptography.Primitives.dll + + ..\..\packages\System.Security.Cryptography.ProtectedData\lib\net46\System.Security.Cryptography.ProtectedData.dll True True - + - - ..\..\packages\System.Security.Cryptography.Primitives\lib\netstandard1.3\System.Security.Cryptography.Primitives.dll + + ..\..\packages\System.Security.Cryptography.ProtectedData\lib\net461\System.Security.Cryptography.ProtectedData.dll True True - + - - ..\..\packages\System.Security.Cryptography.Primitives\ref\netstandard1.3\System.Security.Cryptography.Primitives.dll + + ..\..\packages\System.Security.Cryptography.ProtectedData\lib\netstandard1.3\System.Security.Cryptography.ProtectedData.dll + True + True + + + + + + + ..\..\packages\System.Security.Cryptography.ProtectedData\ref\netstandard1.3\System.Security.Cryptography.ProtectedData.dll + False + True + + + + + + + ..\..\packages\System.Security.Cryptography.ProtectedData\lib\netstandard2.0\System.Security.Cryptography.ProtectedData.dll + True + True + + + + + + + ..\..\packages\System.Security.Cryptography.ProtectedData\ref\netstandard2.0\System.Security.Cryptography.ProtectedData.dll False True @@ -1838,7 +1901,7 @@ - + ..\..\packages\System.Security.Cryptography.X509Certificates\ref\netstandard1.4\System.Security.Cryptography.X509Certificates.dll @@ -1878,7 +1941,7 @@ - + ..\..\packages\System.Text.Encoding.Extensions\ref\netstandard1.3\System.Text.Encoding.Extensions.dll @@ -1994,18 +2057,9 @@ - - - - ..\..\packages\System.Threading.Tasks.Extensions\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - True - True - - - - + ..\..\packages\System.Threading.Tasks.Parallel\ref\netstandard1.1\System.Threading.Tasks.Parallel.dll @@ -2014,7 +2068,7 @@ - + ..\..\packages\System.Threading.Tasks.Parallel\lib\netstandard1.3\System.Threading.Tasks.Parallel.dll @@ -2045,7 +2099,7 @@ - + ..\..\packages\System.Threading.ThreadPool\lib\netstandard1.3\System.Threading.ThreadPool.dll @@ -2054,7 +2108,7 @@ - + ..\..\packages\System.Threading.ThreadPool\ref\netstandard1.3\System.Threading.ThreadPool.dll @@ -2123,7 +2177,7 @@ - + ..\..\packages\System.Xml.XDocument\lib\netstandard1.3\System.Xml.XDocument.dll @@ -2132,7 +2186,7 @@ - + ..\..\packages\System.Xml.XDocument\ref\netstandard1.3\System.Xml.XDocument.dll diff --git a/src/Paket.Core/paket.references b/src/Paket.Core/paket.references index 00c24884cd..3a4442bf12 100644 --- a/src/Paket.Core/paket.references +++ b/src/Paket.Core/paket.references @@ -1,4 +1,5 @@ Newtonsoft.Json +Argu FSharp.Core Mono.Cecil Chessie diff --git a/src/Paket/Paket.fsproj b/src/Paket/Paket.fsproj index 80ca609528..edbd4cefed 100644 --- a/src/Paket/Paket.fsproj +++ b/src/Paket/Paket.fsproj @@ -18,6 +18,7 @@ true 2003 + true true @@ -174,7 +175,7 @@ - + ..\..\packages\Microsoft.Win32.Primitives\ref\netstandard1.3\Microsoft.Win32.Primitives.dll @@ -241,7 +242,7 @@ - + ..\..\packages\System.Buffers\lib\netstandard2.0\System.Buffers.dll @@ -250,7 +251,7 @@ - + ..\..\packages\System.Buffers\ref\netstandard2.0\System.Buffers.dll @@ -290,7 +291,7 @@ - + ..\..\packages\System.Collections.Concurrent\lib\netstandard1.3\System.Collections.Concurrent.dll @@ -299,7 +300,7 @@ - + ..\..\packages\System.Collections.Concurrent\ref\netstandard1.3\System.Collections.Concurrent.dll @@ -339,7 +340,7 @@ - + ..\..\packages\System.Console\ref\netstandard1.3\System.Console.dll @@ -379,7 +380,7 @@ - + ..\..\packages\System.Diagnostics.DiagnosticSource\lib\netstandard1.3\System.Diagnostics.DiagnosticSource.dll @@ -390,7 +391,7 @@ - + ..\..\packages\System.Diagnostics.Tools\ref\netstandard1.0\System.Diagnostics.Tools.dll @@ -428,7 +429,7 @@ - + ..\..\packages\System.Diagnostics.Tracing\ref\netstandard1.5\System.Diagnostics.Tracing.dll @@ -468,7 +469,7 @@ - + ..\..\packages\System.Globalization.Calendars\ref\netstandard1.3\System.Globalization.Calendars.dll @@ -528,7 +529,7 @@ - + ..\..\packages\System.IO.Compression\ref\netstandard1.3\System.IO.Compression.dll @@ -664,7 +665,7 @@ - + ..\..\packages\System.Linq.Expressions\lib\netstandard1.6\System.Linq.Expressions.dll @@ -673,7 +674,7 @@ - + ..\..\packages\System.Linq.Expressions\ref\netstandard1.6\System.Linq.Expressions.dll @@ -713,7 +714,7 @@ - + ..\..\packages\System.Net.Http\ref\netstandard1.3\System.Net.Http.dll @@ -742,7 +743,7 @@ - + ..\..\packages\System.Net.Primitives\ref\netstandard1.3\System.Net.Primitives.dll @@ -753,7 +754,7 @@ - + ..\..\packages\System.Net.Requests\ref\netstandard1.3\System.Net.Requests.dll @@ -784,7 +785,7 @@ - + ..\..\packages\System.Net.WebHeaderCollection\lib\netstandard1.3\System.Net.WebHeaderCollection.dll @@ -793,7 +794,7 @@ - + ..\..\packages\System.Net.WebHeaderCollection\ref\netstandard1.3\System.Net.WebHeaderCollection.dll @@ -813,7 +814,7 @@ - + ..\..\packages\System.ObjectModel\lib\netstandard1.3\System.ObjectModel.dll @@ -822,7 +823,7 @@ - + ..\..\packages\System.ObjectModel\ref\netstandard1.3\System.ObjectModel.dll @@ -902,7 +903,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\ref\netstandard1.0\System.Reflection.Emit.Lightweight.dll @@ -911,7 +912,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\lib\netstandard1.3\System.Reflection.Emit.Lightweight.dll @@ -989,7 +990,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\lib\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -998,7 +999,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\ref\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1192,7 +1193,7 @@ - + ..\..\packages\System.Runtime.Numerics\ref\netstandard1.1\System.Runtime.Numerics.dll @@ -1201,7 +1202,7 @@ - + ..\..\packages\System.Runtime.Numerics\lib\netstandard1.3\System.Runtime.Numerics.dll @@ -1268,24 +1269,6 @@ - - - - ..\..\packages\System.Security.Cryptography.Cng\lib\netstandard2.0\System.Security.Cryptography.Cng.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.Cng\ref\netstandard2.0\System.Security.Cryptography.Cng.dll - False - True - - - @@ -1337,24 +1320,6 @@ - - - - ..\..\packages\System.Security.Cryptography.OpenSsl\lib\netstandard2.0\System.Security.Cryptography.OpenSsl.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.OpenSsl\ref\netstandard2.0\System.Security.Cryptography.OpenSsl.dll - False - True - - - @@ -1466,7 +1431,7 @@ - + ..\..\packages\System.Security.Cryptography.X509Certificates\ref\netstandard1.4\System.Security.Cryptography.X509Certificates.dll @@ -1506,7 +1471,7 @@ - + ..\..\packages\System.Text.Encoding.Extensions\ref\netstandard1.3\System.Text.Encoding.Extensions.dll @@ -1622,18 +1587,9 @@ - - - - ..\..\packages\System.Threading.Tasks.Extensions\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - True - True - - - - + ..\..\packages\System.Threading.Tasks.Parallel\ref\netstandard1.1\System.Threading.Tasks.Parallel.dll @@ -1642,7 +1598,7 @@ - + ..\..\packages\System.Threading.Tasks.Parallel\lib\netstandard1.3\System.Threading.Tasks.Parallel.dll @@ -1673,7 +1629,7 @@ - + ..\..\packages\System.Threading.ThreadPool\lib\netstandard1.3\System.Threading.ThreadPool.dll @@ -1682,7 +1638,7 @@ - + ..\..\packages\System.Threading.ThreadPool\ref\netstandard1.3\System.Threading.ThreadPool.dll @@ -1751,7 +1707,7 @@ - + ..\..\packages\System.Xml.XDocument\lib\netstandard1.3\System.Xml.XDocument.dll @@ -1760,7 +1716,7 @@ - + ..\..\packages\System.Xml.XDocument\ref\netstandard1.3\System.Xml.XDocument.dll diff --git a/src/Paket/Program.fs b/src/Paket/Program.fs index 7e3bc771d1..888bf493e3 100644 --- a/src/Paket/Program.fs +++ b/src/Paket/Program.fs @@ -11,846 +11,11 @@ open Paket.Commands open Argu open PackageSources -let sw = Stopwatch.StartNew() - -type PaketExiter() = - interface IExiter with - member __.Name = "paket exiter" - member __.Exit (msg,code) = - if code = ErrorCode.HelpText then - tracen msg ; exit 0 - else traceError msg ; exit 1 - -let paketVersion = AssemblyVersionInformation.AssemblyInformationalVersion - -let mutable tracedVersion = false - -let tracePaketVersion silent = - if not silent && not tracedVersion then - tracedVersion <- true - tracefn "Paket version %s" paketVersion - -let processWithValidationEx printUsage silent validateF commandF result = - tracePaketVersion silent - if not (validateF result) then - traceError "Command was:" - traceError (" " + String.Join(" ",Environment.GetCommandLineArgs())) - printUsage result - - Environment.ExitCode <- 1 - else - try - commandF result - finally - sw.Stop() - if not silent then - let realTime = sw.Elapsed - let groupedResults = - Profile.events - |> Seq.groupBy (fun (ev) -> ev.Category) - |> Seq.map (fun (cat, group) -> - let l = group |> Seq.toList - let eventBoundaries = l |> List.collect(fun ev -> [ev.Start; ev.End]) - let mergedSpans = Profile.getCoalescedEventTimeSpans(eventBoundaries |> List.toArray) - let mergedSpanLengths = mergedSpans |> Array.fold (+) (TimeSpan()) - - cat, l.Length, mergedSpanLengths) - |> Seq.toList - let blockedRaw = - groupedResults - |> List.filter (function Profile.Category.ResolverAlgorithmBlocked _, _, _ -> true | _ -> false) - let blocked = - blockedRaw - |> List.map (fun (_,_,t) -> t) - |> Seq.fold (+) (TimeSpan()) - let resolver = - match groupedResults |> List.tryPick (function Profile.Category.ResolverAlgorithm, _, s -> Some s | _ -> None) with - | Some s -> s - | None -> TimeSpan() - tracefn "Performance:" - groupedResults - |> List.sortBy (fun (cat,_,_) -> - match cat with - | Profile.Category.ResolverAlgorithm -> 1 - | Profile.Category.ResolverAlgorithmBlocked b -> 2 - | Profile.Category.ResolverAlgorithmNotBlocked b -> 3 - | Profile.Category.FileIO -> 4 - | Profile.Category.NuGetDownload -> 5 - | Profile.Category.NuGetRequest -> 6 - | Profile.Category.Other -> 7) - |> List.iter (fun (cat, num, elapsed) -> - let reason b = - match b with - | Profile.BlockReason.PackageDetails -> "retrieving package details" - | Profile.BlockReason.GetVersion -> "retrieving package versions" - match cat with - | Profile.Category.ResolverAlgorithm -> - tracefn " - Resolver: %s (%d runs)" (Utils.TimeSpanToReadableString elapsed) num - let realTime = resolver - blocked - tracefn " - Runtime: %s" (Utils.TimeSpanToReadableString realTime) - | Profile.Category.ResolverAlgorithmBlocked b -> - let reason = reason b - tracefn " - Blocked (%s): %s (%d times)" reason (Utils.TimeSpanToReadableString elapsed) num - | Profile.Category.ResolverAlgorithmNotBlocked b -> - let reason = reason b - tracefn " - Not Blocked (%s): %d times" reason num - | Profile.Category.FileIO -> - tracefn " - Disk IO: %s" (Utils.TimeSpanToReadableString elapsed) - | Profile.Category.NuGetDownload -> - let avg = TimeSpan.FromTicks(elapsed.Ticks / int64 num) - tracefn " - Average Download Time: %s" (Utils.TimeSpanToReadableString avg) - tracefn " - Number of downloads: %d" num - | Profile.Category.NuGetRequest -> - let avg = TimeSpan.FromTicks(elapsed.Ticks / int64 num) - tracefn " - Average Request Time: %s" (Utils.TimeSpanToReadableString avg) - tracefn " - Number of Requests: %d" num - | Profile.Category.Other -> - tracefn " - Other: %s" (Utils.TimeSpanToReadableString elapsed) - ) - - tracefn " - Runtime: %s" (Utils.TimeSpanToReadableString realTime) - let omitted = Logging.getOmittedWarningCount() - if not verbose && omitted > 0 then - traceWarnfn "Paket omitted %d warnings similar to the ones above. You can see them in verbose mode." omitted - - -let processWithValidation silent validateF commandF (result : ParseResults<'T>) = - processWithValidationEx (fun (r:ParseResults<'T>) -> r.Parser.PrintUsage() |> traceError) silent validateF commandF result - -let processCommand silent commandF result = - processWithValidation silent (fun _ -> true) commandF result - -type LegacySyntax = - | OmitArgument of string - | ReplaceArgument of newSyntax:string * oldSyntax:string - -let warnObsolete o = - match o with - | OmitArgument o -> sprintf "'%s' is the default argument and should be omitted." o - | ReplaceArgument (n, o) -> sprintf "'%s' has been replaced by '%s'." o n - |> sprintf "Please use the new syntax: %s" - |> traceWarn - -let failObsolete o = - match o with - | OmitArgument o -> sprintf "'%s' is the default argument and must be omitted." o - | ReplaceArgument (n, o) -> sprintf "'%s' has been replaced by '%s'. You cannot mix the two." o n - |> failwithf "You cannot use the old and new syntax at the same time: %s" - -let legacyBool (results : ParseResults<_>) legacySyntax (list : bool*bool) = - match list with - | (true, false) -> - true - | (false, true) -> - warnObsolete legacySyntax - true - | (true, true) -> - failObsolete legacySyntax - | (false, false) -> - false - -let legacyList (results : ParseResults<_>) legacySyntax list = - let some x = - List.isEmpty x |> not - - match list with - | ([], []) -> [] - | (x, []) when some x -> - x - | ([], y) when some y -> - warnObsolete legacySyntax - y - | _ -> - failObsolete legacySyntax - -let legacyOption (results : ParseResults<_>) legacySyntax list = - match list with - | (Some id, None) -> - Some id - | (None, Some id) -> - warnObsolete legacySyntax - Some id - | (Some _, Some _) -> - failObsolete legacySyntax - | (_, _) -> None - -let require arg fail = - match arg with - | Some(id) -> id - | _ -> fail() - -let add (results : ParseResults<_>) = - let packageName = - let arg = (results.TryGetResult <@ AddArgs.NuGet @>, - results.TryGetResult <@ AddArgs.NuGet_Legacy @>) - |> legacyOption results (OmitArgument "nuget") - require arg (fun _ -> results.GetResult <@ AddArgs.NuGet @>) - let version = - let arg = (results.TryGetResult <@ AddArgs.Version @>, - results.TryGetResult <@ AddArgs.Version_Legacy @>) - |> legacyOption results (ReplaceArgument("--version", "version")) - defaultArg arg "" - let force = results.Contains <@ AddArgs.Force @> - let redirects = results.Contains <@ AddArgs.Redirects @> - let createNewBindingFiles = - (results.Contains <@ AddArgs.Create_New_Binding_Files @>, - results.Contains <@ AddArgs.Create_New_Binding_Files_Legacy @>) - |> legacyBool results (ReplaceArgument("--create-new-binding-files", "--createnewbindingfiles")) - let cleanBindingRedirects = results.Contains <@ AddArgs.Clean_Redirects @> - let group = - (results.TryGetResult <@ AddArgs.Group @>, - results.TryGetResult <@ AddArgs.Group_Legacy @>) - |> legacyOption results (ReplaceArgument("--group", "group")) - let noInstall = results.Contains <@ AddArgs.No_Install @> - let noResolve = results.Contains <@ AddArgs.No_Resolve @> - let semVerUpdateMode = - if results.Contains <@ AddArgs.Keep_Patch @> then SemVerUpdateMode.KeepPatch else - if results.Contains <@ AddArgs.Keep_Minor @> then SemVerUpdateMode.KeepMinor else - if results.Contains <@ AddArgs.Keep_Major @> then SemVerUpdateMode.KeepMajor else - SemVerUpdateMode.NoRestriction - let touchAffectedRefs = results.Contains <@ AddArgs.Touch_Affected_Refs @> - let project = - (results.TryGetResult <@ AddArgs.Project @>, - results.TryGetResult <@ AddArgs.Project_Legacy @>) - |> legacyOption results (ReplaceArgument("--project", "project")) - let packageKind = - match results.GetResult (<@ AddArgs.Type @>, defaultValue = AddArgsDependencyType.Nuget) with - | AddArgsDependencyType.Nuget -> Requirements.PackageRequirementKind.Package - | AddArgsDependencyType.Clitool -> Requirements.PackageRequirementKind.DotnetCliTool - - match project with - | Some projectName -> - Dependencies - .Locate() - .AddToProject(group, packageName, version, force, redirects, cleanBindingRedirects, createNewBindingFiles, projectName, noInstall |> not, semVerUpdateMode, touchAffectedRefs, noResolve |> not, packageKind) - | None -> - let interactive = results.Contains <@ AddArgs.Interactive @> - Dependencies - .Locate() - .Add(group, packageName, version, force, redirects, cleanBindingRedirects, createNewBindingFiles, interactive, noInstall |> not, semVerUpdateMode, touchAffectedRefs, noResolve |> not, packageKind) - -let github (results : ParseResults<_>) = - match results.GetResult <@ GithubArgs.Add @> with - | add -> - let group = - add.TryGetResult <@ AddGithubArgs.Group @> - let repository = - add.GetResult <@ AddGithubArgs.Repository @> - let file = - match add.TryGetResult <@ AddGithubArgs.File @> with - | Some f -> f - | None -> "" - let version = - match add.TryGetResult <@ AddGithubArgs.Version @> with - | Some v -> v - | None -> "" - - Dependencies - .Locate() - .AddGithub(group, repository, file, version) - -let git (results : ParseResults<_>) = - match results.GetResult <@ GitArgs.Add @> with - | add -> - let group = - add.TryGetResult <@ AddGitArgs.Group @> - let repository = - add.GetResult <@ AddGitArgs.Repository @> - let version = - match add.TryGetResult <@ AddGitArgs.Version @> with - | Some v -> v - | None -> "" - - Dependencies - .Locate() - .AddGit(group, repository, version) - -let validateConfig (results : ParseResults<_>) = - let credential = results.Contains <@ ConfigArgs.AddCredentials @> - let token = results.Contains <@ ConfigArgs.AddToken @> - match credential, token with - | true, _ -> results.GetResults <@ ConfigArgs.AddCredentials @> |> List.isEmpty |> not - | _, true -> results.GetResults <@ ConfigArgs.AddToken @> |> List.isEmpty |> not - | _ -> false - -let config (results : ParseResults<_>) = - let credentials = results.Contains <@ ConfigArgs.AddCredentials @> - let token = results.Contains <@ ConfigArgs.AddToken @> - match credentials, token with - | true, _ -> - let args = results.GetResults <@ ConfigArgs.AddCredentials @> - let source = args.Item 0 - let username, password = results.GetResult (<@ ConfigArgs.Username @>, ""), results.GetResult (<@ ConfigArgs.Password @>, "") - let authType = results.GetResult (<@ ConfigArgs.AuthType @>, "") - let verify = results.Contains <@ ConfigArgs.Verify @> - - Dependencies(".").AddCredentials(source, username, password, authType, verify) - | _, true -> - let args = results.GetResults <@ ConfigArgs.AddToken @> - let source, token = args.Item 0 - Dependencies(".").AddToken(source, token) - | _ -> () - -let validateAutoRestore (results : ParseResults<_>) = - results.GetAllResults().Length = 1 - -let autoRestore (results : ParseResults<_>) = - match results.GetResult <@ Flags @> with - | On -> Dependencies.Locate().TurnOnAutoRestore() - | Off -> Dependencies.Locate().TurnOffAutoRestore() - -let convert (results : ParseResults<_>) = - let force = results.Contains <@ ConvertFromNugetArgs.Force @> - let noInstall = results.Contains <@ ConvertFromNugetArgs.No_Install @> - let noAutoRestore = results.Contains <@ ConvertFromNugetArgs.No_Auto_Restore @> - let credsMigrationMode = - (results.TryGetResult <@ ConvertFromNugetArgs.Migrate_Credentials @>, - results.TryGetResult <@ ConvertFromNugetArgs.Migrate_Credentials_Legacy @>) - |> legacyOption results (ReplaceArgument("--migrate-credentials", "--creds-migration")) - - Dependencies.ConvertFromNuget(force, noInstall |> not, noAutoRestore |> not, credsMigrationMode) - -let findRefs (results : ParseResults<_>) = - let packages = - let arg = (results.TryGetResult <@ FindRefsArgs.NuGets @>, - results.TryGetResult <@ FindRefsArgs.NuGets_Legacy @>) - |> legacyOption results (OmitArgument "nuget") - require arg (fun _ -> results.GetResult <@ FindRefsArgs.NuGets @>) - let group = - let arg = (results.TryGetResult <@ FindRefsArgs.Group @>, - results.TryGetResult <@ FindRefsArgs.Group_Legacy @>) - |> legacyOption results (ReplaceArgument("--group", "group")) - - defaultArg arg (Constants.MainDependencyGroup.ToString()) - packages |> List.map (fun p -> group,p) - |> Dependencies.Locate().ShowReferencesFor - -let init (results : ParseResults) = - Dependencies.Init(Directory.GetCurrentDirectory()) - -let clearCache (results : ParseResults) = - let clearLocal = results.Contains <@ ClearCacheArgs.ClearLocal @> - Dependencies.ClearCache(clearLocal) - -let install (results : ParseResults<_>) = - let force = results.Contains <@ InstallArgs.Force @> - let withBindingRedirects = results.Contains <@ InstallArgs.Redirects @> - let createNewBindingFiles = - (results.Contains <@ InstallArgs.Create_New_Binding_Files @>, - results.Contains <@ InstallArgs.Create_New_Binding_Files_Legacy @>) - |> legacyBool results (ReplaceArgument("--create-new-binding-files", "--createnewbindingfiles")) - let cleanBindingRedirects = results.Contains <@ InstallArgs.Clean_Redirects @> - let installOnlyReferenced = results.Contains <@ InstallArgs.Install_Only_Referenced @> - let generateLoadScripts = results.Contains <@ InstallArgs.Generate_Load_Scripts @> - let alternativeProjectRoot = results.TryGetResult <@ InstallArgs.Project_Root @> - let providedFrameworks = - (results.GetResults <@ InstallArgs.Load_Script_Framework @>, - results.GetResults <@ InstallArgs.Load_Script_Framework_Legacy @>) - |> legacyList results (ReplaceArgument("--load-script-framework", "load-script-framework")) - let providedScriptTypes = - (results.GetResults <@ InstallArgs.Load_Script_Type @>, - results.GetResults <@ InstallArgs.Load_Script_Type_Legacy @>) - |> legacyList results (ReplaceArgument("--load-script-type", "load-script-type")) - |> List.map (fun l -> l.ToString().ToLowerInvariant()) - let semVerUpdateMode = - if results.Contains <@ InstallArgs.Keep_Patch @> then SemVerUpdateMode.KeepPatch else - if results.Contains <@ InstallArgs.Keep_Minor @> then SemVerUpdateMode.KeepMinor else - if results.Contains <@ InstallArgs.Keep_Major @> then SemVerUpdateMode.KeepMajor else - SemVerUpdateMode.NoRestriction - let touchAffectedRefs = results.Contains <@ InstallArgs.Touch_Affected_Refs @> - - Dependencies.Locate().Install( - force, - withBindingRedirects, - cleanBindingRedirects, - createNewBindingFiles, - installOnlyReferenced, - semVerUpdateMode, - touchAffectedRefs, - generateLoadScripts, - providedFrameworks, - providedScriptTypes, - alternativeProjectRoot) - -let outdated (results : ParseResults<_>) = - let force = results.Contains <@ OutdatedArgs.Force @> - let strict = results.Contains <@ OutdatedArgs.Ignore_Constraints @> |> not - let includePrereleases = results.Contains <@ OutdatedArgs.Include_Prereleases @> - let group = - (results.TryGetResult<@ OutdatedArgs.Group @>, - results.TryGetResult<@ OutdatedArgs.Group_Legacy @>) - |> legacyOption results (ReplaceArgument("--group", "group")) - Dependencies.Locate().ShowOutdated(strict, force, includePrereleases, group) - -let remove (results : ParseResults<_>) = - let packageName = - let arg = (results.TryGetResult <@ RemoveArgs.NuGet @>, - results.TryGetResult <@ RemoveArgs.NuGet_Legacy @>) - |> legacyOption results (OmitArgument("nuget")) - require arg (fun _ -> results.GetResult <@ RemoveArgs.NuGet @>) - let force = results.Contains <@ RemoveArgs.Force @> - let noInstall = results.Contains <@ RemoveArgs.No_Install @> - let group = - (results.TryGetResult <@ RemoveArgs.Group @>, - results.TryGetResult <@ RemoveArgs.Group_Legacy @>) - |> legacyOption results (ReplaceArgument("--group", "group")) - let project = - (results.TryGetResult <@ RemoveArgs.Project @>, - results.TryGetResult <@ RemoveArgs.Project_Legacy @>) - |> legacyOption results (ReplaceArgument("--project", "project")) - - match project with - | Some projectName -> - Dependencies.Locate() - .RemoveFromProject(group, packageName, force, projectName, noInstall |> not) - | None -> - let interactive = results.Contains <@ RemoveArgs.Interactive @> - Dependencies.Locate().Remove(group, packageName, force, interactive, noInstall |> not) - -let restore (results : ParseResults<_>) = - let force = results.Contains <@ RestoreArgs.Force @> - let files = - (results.GetResults<@ RestoreArgs.References_File @>, - (defaultArg (results.TryGetResult<@ RestoreArgs.References_File_Legacy @>) [])) - |> legacyList results (ReplaceArgument("--references-file", "--references-files")) - let project = - (results.TryGetResult <@ RestoreArgs.Project @>, - results.TryGetResult <@ RestoreArgs.Project_Legacy @>) - |> legacyOption results (ReplaceArgument("--project", "project")) - let group = - (results.TryGetResult <@ RestoreArgs.Group @>, - results.TryGetResult <@ RestoreArgs.Group_Legacy @>) - |> legacyOption results (ReplaceArgument("--group", "group")) - let installOnlyReferenced = results.Contains <@ RestoreArgs.Install_Only_Referenced @> - let touchAffectedRefs = results.Contains <@ RestoreArgs.Touch_Affected_Refs @> - let ignoreChecks = results.Contains <@ RestoreArgs.Ignore_Checks @> - let failOnChecks = results.Contains <@ RestoreArgs.Fail_On_Checks @> - let targetFramework = results.TryGetResult <@ RestoreArgs.Target_Framework @> - - match project with - | Some project -> - Dependencies.Locate().Restore(force, group, project, touchAffectedRefs, ignoreChecks, failOnChecks, targetFramework) - | None -> - if List.isEmpty files then - Dependencies.Locate().Restore(force, group, installOnlyReferenced, touchAffectedRefs, ignoreChecks, failOnChecks, targetFramework) - else - Dependencies.Locate().Restore(force, group, files, touchAffectedRefs, ignoreChecks, failOnChecks, targetFramework) - -let simplify (results : ParseResults<_>) = - let interactive = results.Contains <@ SimplifyArgs.Interactive @> - Dependencies.Locate().Simplify(interactive) - -let update (results : ParseResults<_>) = - let createNewBindingFiles = - (results.Contains <@ UpdateArgs.Create_New_Binding_Files @>, - results.Contains <@ UpdateArgs.Create_New_Binding_Files_Legacy @>) - |> legacyBool results (ReplaceArgument("--create-new-binding-files", "--createnewbindingfiles")) - let group = - (results.TryGetResult <@ UpdateArgs.Group @>, - results.TryGetResult <@ UpdateArgs.Group_Legacy @>) - |> legacyOption results (ReplaceArgument("--group", "group")) - - let force = results.Contains <@ UpdateArgs.Force @> - let noInstall = results.Contains <@ UpdateArgs.No_Install @> - let withBindingRedirects = results.Contains <@ UpdateArgs.Redirects @> - let cleanBindingRedirects = results.Contains <@ UpdateArgs.Clean_Redirects @> - let createNewBindingFiles = results.Contains <@ UpdateArgs.Create_New_Binding_Files @> - let semVerUpdateMode = - if results.Contains <@ UpdateArgs.Keep_Patch @> then SemVerUpdateMode.KeepPatch else - if results.Contains <@ UpdateArgs.Keep_Minor @> then SemVerUpdateMode.KeepMinor else - if results.Contains <@ UpdateArgs.Keep_Major @> then SemVerUpdateMode.KeepMajor else - SemVerUpdateMode.NoRestriction - let touchAffectedRefs = results.Contains <@ UpdateArgs.Touch_Affected_Refs @> - let filter = results.Contains <@ UpdateArgs.Filter @> - - let nuget = - (results.TryGetResult <@ UpdateArgs.NuGet @>, - results.TryGetResult <@ UpdateArgs.NuGet_Legacy @>) - |> legacyOption results (OmitArgument "nuget") - - match nuget with - | Some packageName -> - let version = - (results.TryGetResult <@ UpdateArgs.Version @>, - results.TryGetResult <@ UpdateArgs.Version_Legacy @>) - |> legacyOption results (ReplaceArgument("--version", "version")) - - if filter then - Dependencies.Locate().UpdateFilteredPackages(group, packageName, version, force, withBindingRedirects, cleanBindingRedirects, createNewBindingFiles, noInstall |> not, semVerUpdateMode, touchAffectedRefs) - else - Dependencies.Locate().UpdatePackage(group, packageName, version, force, withBindingRedirects, cleanBindingRedirects, createNewBindingFiles, noInstall |> not, semVerUpdateMode, touchAffectedRefs) - | _ -> - match group with - | Some groupName -> - Dependencies.Locate().UpdateGroup(groupName, force, withBindingRedirects, cleanBindingRedirects, createNewBindingFiles, noInstall |> not, semVerUpdateMode, touchAffectedRefs) - | None -> - Dependencies.Locate().Update(force, withBindingRedirects, cleanBindingRedirects, createNewBindingFiles, noInstall |> not, semVerUpdateMode, touchAffectedRefs) - -let pack (results : ParseResults<_>) = - let outputPath = - let arg = (results.TryGetResult <@ PackArgs.Output @>, - results.TryGetResult <@ PackArgs.Output_Legacy @>) - |> legacyOption results (OmitArgument "output") - require arg (fun _ -> results.GetResult <@ PackArgs.Output @>) - let buildConfig = - (results.TryGetResult <@ PackArgs.Build_Config @>, - results.TryGetResult <@ PackArgs.Build_Config_Legacy @>) - |> legacyOption results (ReplaceArgument("--build-config", "buildconfig")) - let buildPlatform = - (results.TryGetResult <@ PackArgs.Build_Platform @>, - results.TryGetResult <@ PackArgs.Build_Platform_Legacy @>) - |> legacyOption results (ReplaceArgument("--build-platform", "buildplatform")) - let version = - (results.TryGetResult <@ PackArgs.Version @>, - results.TryGetResult <@ PackArgs.Version_Legacy @>) - |> legacyOption results (ReplaceArgument("--version", "version")) - let specificVersions = - (results.GetResults <@ PackArgs.Specific_Version @>, - results.GetResults <@ PackArgs.Specific_Version_Legacy @>) - |> legacyList results (ReplaceArgument("--specific-version", "specific-version")) - let releaseNotes = - (results.TryGetResult <@ PackArgs.Release_Notes @>, - results.TryGetResult <@ PackArgs.Release_Notes_Legacy @>) - |> legacyOption results (ReplaceArgument("--release-notes", "releaseNotes")) - let templateFile = - (results.TryGetResult <@ PackArgs.Template_File @>, - results.TryGetResult <@ PackArgs.Template_File_Legacy @>) - |> legacyOption results (ReplaceArgument("--template", "templatefile")) - let excludedTemplates = - (results.GetResults <@ PackArgs.Exclude_Template @>, - results.GetResults <@ PackArgs.Exclude_Template_Legacy @>) - |> legacyList results (ReplaceArgument("--exclude", "exclude")) - let lockDependencies = - (results.Contains <@ PackArgs.Lock_Dependencies @>, - results.Contains <@ PackArgs.Lock_Dependencies_Legacy @>) - |> legacyBool results (ReplaceArgument("--lock-dependencies", "lock-dependencies")) - let minimumFromLockFile = - (results.Contains <@ PackArgs.Lock_Dependencies_To_Minimum @>, - results.Contains <@ PackArgs.Lock_Dependencies_To_Minimum_Legacy @>) - |> legacyBool results (ReplaceArgument("--minimum-from-lock-file", "minimum-from-lock-file")) - let pinProjectReferences = - (results.Contains <@ PackArgs.Pin_Project_References @>, - results.Contains <@ PackArgs.Pin_Project_References_Legacy @>) - |> legacyBool results (ReplaceArgument("--pin-project-references", "pin-project-references")) - let symbols = - (results.Contains <@ PackArgs.Symbols @>, - results.Contains <@ PackArgs.Symbols_Legacy @>) - |> legacyBool results (ReplaceArgument("--symbols", "symbols")) - let includeReferencedProjects = - (results.Contains <@ PackArgs.Include_Referenced_Projects @>, - results.Contains <@ PackArgs.Include_Referenced_Projects_Legacy @>) - |> legacyBool results (ReplaceArgument("--include-referenced-projects", "Include_Referenced_Projects")) - let projectUrl = - (results.TryGetResult <@ PackArgs.Project_Url @>, - results.TryGetResult <@ PackArgs.Project_Url_Legacy @>) - |> legacyOption results (ReplaceArgument("--project-url", "project-url")) - - Dependencies.Locate() - .Pack(outputPath, - ?buildConfig = buildConfig, - ?buildPlatform = buildPlatform, - ?version = version, - specificVersions = specificVersions, - ?releaseNotes = releaseNotes, - ?templateFile = templateFile, - excludedTemplates = excludedTemplates, - workingDir = System.IO.Directory.GetCurrentDirectory(), - lockDependencies = lockDependencies, - minimumFromLockFile = minimumFromLockFile, - pinProjectReferences = pinProjectReferences, - symbols = symbols, - includeReferencedProjects = includeReferencedProjects, - ?projectUrl = projectUrl) - -/// This is source-discovering logic shared between `findPackages` and `findPackageVersions` -let discoverPackageSources explicitSource (dependencies: Dependencies option) = - match explicitSource, dependencies with - | Some source, _ -> - [PackageSource.NuGetV2Source source] - | _, Some dependencies -> - PackageSources.DefaultNuGetSource :: - (dependencies.GetSources() |> Seq.map (fun kv -> kv.Value) |> List.concat) - | _ -> - failwithf "Could not find '%s' at or above current directory, and no explicit source was given as parameter (e.g. 'paket.exe find-packages --source https://www.nuget.org/api/v2')." - Constants.DependenciesFileName - -let findPackages silent (results : ParseResults<_>) = - let maxResults = - let arg = (results.TryGetResult <@ FindPackagesArgs.Max_Results @>, - results.TryGetResult <@ FindPackagesArgs.Max_Results_Legacy @>) - |> legacyOption results (ReplaceArgument("--max", "max")) - defaultArg arg 10000 - let sources = - let dependencies = Dependencies.TryLocate() - let arg = (results.TryGetResult <@ FindPackagesArgs.Source @>, - results.TryGetResult <@ FindPackagesArgs.Source_Legacy @>) - |> legacyOption results (ReplaceArgument("--source", "source")) - discoverPackageSources arg dependencies - - let searchAndPrint searchText = - for p in Dependencies.FindPackagesByName(sources,searchText,maxResults) do - tracefn "%s" p - - let search = - (results.TryGetResult <@ FindPackagesArgs.Search @>, - results.TryGetResult <@ FindPackagesArgs.Search_Legacy @>) - |> legacyOption results (OmitArgument "searchtext") - - match search with - | None -> - let rec repl () = - if not silent then - tracefn " - Please enter search text (:q for exit):" - - match Console.ReadLine() with - | ":q" -> () - | searchText -> - searchAndPrint searchText - repl () - - repl () - - | Some searchText -> searchAndPrint searchText - -#nowarn "44" // because FixNuspecs is deprecated and we have warnaserror - -open Paket.Requirements - -let fixNuspecs silent (results : ParseResults<_>) = - let nuspecFiles = - results.GetResult <@ FixNuspecsArgs.Files @> - |> List.collect (fun s -> s.Split([|';'|], StringSplitOptions.RemoveEmptyEntries) |> Array.toList) - |> List.map (fun s -> s.Trim()) - - match results.TryGetResult <@ FixNuspecsArgs.ProjectFile @> with - | Some projectFile -> - let projectFile = Paket.ProjectFile.LoadFromFile(projectFile) - let refFile = RestoreProcess.FindOrCreateReferencesFile projectFile - Dependencies.FixNuspecs (refFile, nuspecFiles) - | None -> - match results.TryGetResult <@ FixNuspecsArgs.ReferencesFile @> with - | Some referenceFile -> - traceWarnfn "using the references-file argument is obsolete, please use project-file instead" - - Dependencies.FixNuspecs (referenceFile, nuspecFiles) - | None -> failwithf "%s" (results.Parser.PrintUsage()) - - - -// For backwards compatibility -let fixNuspec _silent (results : ParseResults<_>) = - let fileString = results.GetResult <@ FixNuspecArgs.File @> - let refFile = results.GetResult <@ FixNuspecArgs.ReferencesFile @> - let nuspecList = - fileString.Split([|';'|], StringSplitOptions.RemoveEmptyEntries) - |> Array.map (fun s -> s.Trim()) - |> List.ofArray - - Dependencies.FixNuspecs (refFile, nuspecList) - -// separated out from showInstalledPackages to allow Paket.PowerShell to get the types -let getInstalledPackages (results : ParseResults<_>) = - let project = - (results.TryGetResult <@ ShowInstalledPackagesArgs.Project @>, - results.TryGetResult <@ ShowInstalledPackagesArgs.Project_Legacy @>) - |> legacyOption results (ReplaceArgument("--project", "project")) - let showAll = results.Contains <@ ShowInstalledPackagesArgs.All @> - let dependenciesFile = Dependencies.Locate() - match project with - | None -> - if showAll then dependenciesFile.GetInstalledPackages() - else dependenciesFile.GetDirectDependencies() - | Some project -> - match ProjectFile.FindReferencesFile(FileInfo project) with - | None -> [] - | Some referencesFile -> - let referencesFile = ReferencesFile.FromFile referencesFile - if showAll then dependenciesFile.GetInstalledPackages(referencesFile) - else dependenciesFile.GetDirectDependencies(referencesFile) - -let showInstalledPackages (results : ParseResults<_>) = - for groupName,name,version in getInstalledPackages results do - tracefn "%s %s - %s" groupName name version - -let showGroups (results : ParseResults) = - let dependenciesFile = Dependencies.Locate() - for groupName in dependenciesFile.GetGroups() do - tracefn "%s" groupName - -let findPackageVersions (results : ParseResults<_>) = - let maxResults = - let arg = (results.TryGetResult <@ FindPackageVersionsArgs.Max_Results @>, - results.TryGetResult <@ FindPackageVersionsArgs.Max_Results_Legacy @>) - |> legacyOption results (ReplaceArgument("--max", "max")) - defaultArg arg 10000 - let dependencies = Dependencies.TryLocate() - let name = - let arg = (results.TryGetResult <@ FindPackageVersionsArgs.NuGet @>, - results.TryGetResult <@ FindPackageVersionsArgs.NuGet_Legacy @>) - |> legacyOption results (OmitArgument "nuget") - require arg (fun _ -> results.GetResult <@ FindPackageVersionsArgs.NuGet @>) - let sources = - let arg = (results.TryGetResult <@ FindPackageVersionsArgs.Source @>, - results.TryGetResult <@ FindPackageVersionsArgs.Source_Legacy @>) - |> legacyOption results (ReplaceArgument("--source", "source")) - discoverPackageSources arg dependencies - - let root = - match dependencies with - | Some d -> - d.RootPath - | None -> - traceWarnfn "Could not find '%s' at or above current directory. Using current directory as project root." Constants.DependenciesFileName - Directory.GetCurrentDirectory() - - for p in Dependencies.FindPackageVersions(root,sources,name,maxResults) do - tracefn "%s" p - -let push paketVersion (results : ParseResults<_>) = - let fileName = - let arg = (results.TryGetResult <@ PushArgs.Package @>, - results.TryGetResult <@ PushArgs.Package_Legacy @>) - |> legacyOption results (OmitArgument "file") - require arg (fun _ -> results.GetResult <@ PushArgs.Package @>) - let url = - (results.TryGetResult <@ PushArgs.Url @>, - results.TryGetResult <@ PushArgs.Url_Legacy @>) - |> legacyOption results (ReplaceArgument("--url", "url")) - let endpoint = - (results.TryGetResult <@ PushArgs.Endpoint @>, - results.TryGetResult <@ PushArgs.Endpoint_Legacy @>) - |> legacyOption results (ReplaceArgument("--endpoint", "endpoint")) - let apiKey = - (results.TryGetResult <@ PushArgs.Api_Key @>, - results.TryGetResult <@ PushArgs.Api_Key_Legacy @>) - |> legacyOption results (ReplaceArgument("--api-key", "apikey")) - - Dependencies.Push(fileName, - ?url = url, - ?endPoint = endpoint, - ?apiKey = apiKey) - -let generateLoadScripts (results : ParseResults) = - let providedFrameworks = - (results.GetResults <@ GenerateLoadScriptsArgs.Framework @>, - results.GetResults <@ GenerateLoadScriptsArgs.Framework_Legacy @>) - |> legacyList results (ReplaceArgument("--framework", "framework")) - let providedScriptTypes = - (results.GetResults <@ GenerateLoadScriptsArgs.Type @>, - results.GetResults <@ GenerateLoadScriptsArgs.Type_Legacy @>) - |> legacyList results (ReplaceArgument("--type", "type")) - |> List.map (fun l -> l.ToString().ToLowerInvariant()) - let providedGroups = - (results.GetResults<@ GenerateLoadScriptsArgs.Group @>, - (defaultArg (results.TryGetResult<@ GenerateLoadScriptsArgs.Group_Legacy @>) [])) - |> legacyList results (ReplaceArgument("--group", "groups")) - - Dependencies.Locate().GenerateLoadScripts providedGroups providedFrameworks providedScriptTypes - -let info (results : ParseResults) = - if results.Contains <@ InfoArgs.Paket_Dependencies_Dir @> then - match Dependencies.TryLocate() with - | None -> () - | Some deps -> tracefn "%s" deps.RootPath - -let generateNuspec (results:ParseResults) = - let projectFile = results.GetResult <@ GenerateNuspecArgs.Project @> - let dependenciesPath = results.GetResult <@ GenerateNuspecArgs.DependenciesFile @> - let output = defaultArg (results.TryGetResult <@ GenerateNuspecArgs.Output @>) (Directory.GetCurrentDirectory()) - let dependencies = DependenciesFile.ReadFromFile dependenciesPath - let filename, nuspec = Nuspec.FromProject(projectFile,dependencies) - let nuspecString = nuspec.ToString() - File.WriteAllText (Path.Combine (output,filename), nuspecString) - -let why (results: ParseResults) = - let packageName = - let arg = (results.TryGetResult <@ WhyArgs.NuGet @>, - results.TryGetResult <@ WhyArgs.NuGet_Legacy @>) - |> legacyOption results (OmitArgument "nuget") - require arg (fun _ -> results.GetResult <@ WhyArgs.NuGet @>) - |> Domain.PackageName - let groupName = - let arg = (results.TryGetResult <@ WhyArgs.Group @>, - results.TryGetResult <@ WhyArgs.Group_Legacy @>) - |> legacyOption results (ReplaceArgument("--group", "group")) - |> Option.map Domain.GroupName - defaultArg arg Constants.MainDependencyGroup - let dependencies = Dependencies.Locate() - let lockFile = dependencies.GetLockFile() - let directDeps = - dependencies - .GetDependenciesFile() - .GetDependenciesInGroup(groupName) - |> Seq.map (fun pair -> pair.Key) - |> Set.ofSeq - let options = - { Why.WhyOptions.Details = results.Contains <@ WhyArgs.Details @> } - - Why.ohWhy(packageName, directDeps, lockFile, groupName, results.Parser.PrintUsage(), options) - -let restriction (results: ParseResults) = - let restrictionRaw = results.GetResult <@ RestrictionArgs.Restriction @> - let restriction, parseProblems = Requirements.parseRestrictions restrictionRaw - - for problem in parseProblems |> Seq.map (fun x -> x.AsMessage) do - Logging.traceWarnfn "Problem: %s" problem - - Logging.tracefn "Restriction: %s" restrictionRaw - Logging.tracefn "Simplified: %s" (restriction.ToString()) - Logging.tracefn "Frameworks: [ " - for framework in restriction.RepresentedFrameworks do - Logging.tracefn " %s" framework.CompareString - Logging.tracefn "]" - - let waitForDebugger () = while not(System.Diagnostics.Debugger.IsAttached) do System.Threading.Thread.Sleep(100) -let handleCommand silent command = - match command with - | Add r -> processCommand silent add r - | Github r -> processCommand silent github r - | Git r -> processCommand silent git r - | ClearCache r -> processCommand silent clearCache r - | Config r -> processWithValidation silent validateConfig config r - | ConvertFromNuget r -> processCommand silent convert r - | FindRefs r -> processCommand silent findRefs r - | Init r -> processCommand silent (init) r - | AutoRestore r -> processWithValidation silent validateAutoRestore autoRestore r - | Install r -> processCommand silent install r - | Outdated r -> processCommand silent outdated r - | Remove r -> processCommand silent remove r - | Restore r -> processCommand silent restore r - | Simplify r -> processCommand silent simplify r - | Update r -> processCommand silent update r - | FindPackages r -> processCommand silent (findPackages silent) r - | FindPackageVersions r -> processCommand silent findPackageVersions r - | FixNuspec r -> - warnObsolete (ReplaceArgument("fix-nuspecs", "fix-nuspec")) - processCommand silent (fixNuspec silent) r - | FixNuspecs r -> processCommand silent (fixNuspecs silent) r - | ShowInstalledPackages r -> processCommand silent showInstalledPackages r - | ShowGroups r -> processCommand silent showGroups r - | Pack r -> processCommand silent pack r - | Push r -> processCommand silent (push paketVersion) r - | GenerateIncludeScripts r -> - warnObsolete (ReplaceArgument("generate-load-scripts", "generate-include-scripts")) - processCommand silent generateLoadScripts r - | GenerateLoadScripts r -> processCommand silent generateLoadScripts r - | GenerateNuspec r -> processCommand silent generateNuspec r - | Why r -> processCommand silent why r - | Restriction r -> processCommand silent restriction r - | Info r -> processCommand silent info r - // global options; list here in order to maintain compiler warnings - // in case of new subcommands added - | Verbose - | Silent - | From_Bootstrapper - | Version - | Log_File _ -> failwithf "internal error: this code should never be reached." - let main() = let waitDebuggerEnvVar = Environment.GetEnvironmentVariable ("PAKET_WAIT_DEBUGGER") if waitDebuggerEnvVar = "1" then @@ -863,52 +28,8 @@ let main() = use consoleTrace = Logging.event.Publish |> Observable.subscribe Logging.traceToConsole try - let args = Environment.GetCommandLineArgs() - match args with - | [| _; "restore" |] | [| _; "--from-bootstrapper"; "restore" |] -> - // Global restore fast route, see https://github.com/fsprojects/Argu/issues/90 - processWithValidationEx - ignore - false - (fun _ -> true) - (fun _ -> Dependencies.Locate().Restore()) () - | [| _; "restore"; "--project"; project |] | [| _; "--from-bootstrapper"; "restore"; "--project"; project |] -> - // Project restore fast route, see https://github.com/fsprojects/Argu/issues/90 - processWithValidationEx - ignore - false - (fun _ -> true) - (fun _ -> Dependencies.Locate().Restore(false, None, project, false, false, false, None)) () - | [| _; "install" |] | [| _; "--from-bootstrapper"; "install" |] -> - // Global restore fast route, see https://github.com/fsprojects/Argu/issues/90 - processWithValidationEx - ignore - false - (fun _ -> true) - (fun _ -> Dependencies.Locate().Install(false, false, false, false, false, SemVerUpdateMode.NoRestriction, false, false, [], [], None)) () - | _ -> - let parser = ArgumentParser.Create(programName = "paket", - helpTextMessage = sprintf "Paket version %s%sHelp was requested:" paketVersion Environment.NewLine, - errorHandler = new PaketExiter(), - checkStructure = false) - - let results = parser.ParseCommandLine(raiseOnUsage = true) - let silent = results.Contains <@ Silent @> - tracePaketVersion silent - - if results.Contains <@ Verbose @> then - Logging.verbose <- true - Logging.verboseWarnings <- true - - let version = results.Contains <@ Version @> - if not version then - - use fileTrace = - match results.TryGetResult <@ Log_File @> with - | Some lf -> setLogFile lf - | None -> null - - handleCommand silent (results.GetSubCommand()) + let args = Environment.GetCommandLineArgs() + Paket.CliRunner.runCli args with | exn when not (exn :? System.NullReferenceException) -> Environment.ExitCode <- 1 diff --git a/tests/Paket.Bootstrapper.Tests/Paket.Bootstrapper.Tests.csproj b/tests/Paket.Bootstrapper.Tests/Paket.Bootstrapper.Tests.csproj index 8c1b03ba76..e062481036 100644 --- a/tests/Paket.Bootstrapper.Tests/Paket.Bootstrapper.Tests.csproj +++ b/tests/Paket.Bootstrapper.Tests/Paket.Bootstrapper.Tests.csproj @@ -12,6 +12,7 @@ v4.5 512 + true true @@ -133,7 +134,7 @@ - + ..\..\packages\Microsoft.Win32.Primitives\ref\netstandard1.3\Microsoft.Win32.Primitives.dll @@ -162,24 +163,6 @@ - - - - ..\..\packages\Microsoft.Win32.Registry\lib\netstandard2.0\Microsoft.Win32.Registry.dll - True - True - - - - - - - ..\..\packages\Microsoft.Win32.Registry\ref\netstandard2.0\Microsoft.Win32.Registry.dll - False - True - - - @@ -322,7 +305,7 @@ - + ..\..\packages\System.Buffers\lib\netstandard2.0\System.Buffers.dll @@ -331,7 +314,7 @@ - + ..\..\packages\System.Buffers\ref\netstandard2.0\System.Buffers.dll @@ -371,7 +354,7 @@ - + ..\..\packages\System.Collections.Concurrent\lib\netstandard1.3\System.Collections.Concurrent.dll @@ -380,7 +363,7 @@ - + ..\..\packages\System.Collections.Concurrent\ref\netstandard1.3\System.Collections.Concurrent.dll @@ -538,7 +521,7 @@ - + ..\..\packages\System.Console\ref\netstandard1.3\System.Console.dll @@ -578,7 +561,7 @@ - + ..\..\packages\System.Diagnostics.DiagnosticSource\lib\netstandard1.3\System.Diagnostics.DiagnosticSource.dll @@ -600,7 +583,7 @@ - + ..\..\packages\System.Diagnostics.Tools\ref\netstandard1.0\System.Diagnostics.Tools.dll @@ -649,7 +632,7 @@ - + ..\..\packages\System.Diagnostics.Tracing\ref\netstandard1.5\System.Diagnostics.Tracing.dll @@ -709,7 +692,7 @@ - + ..\..\packages\System.Globalization.Calendars\ref\netstandard1.3\System.Globalization.Calendars.dll @@ -778,7 +761,7 @@ - + ..\..\packages\System.IO.Compression\ref\netstandard1.3\System.IO.Compression.dll @@ -917,7 +900,7 @@ - + ..\..\packages\System.Linq.Expressions\lib\netstandard1.6\System.Linq.Expressions.dll @@ -926,7 +909,7 @@ - + ..\..\packages\System.Linq.Expressions\ref\netstandard1.6\System.Linq.Expressions.dll @@ -973,7 +956,7 @@ - + ..\..\packages\System.Net.Http\ref\netstandard1.3\System.Net.Http.dll @@ -1002,7 +985,7 @@ - + ..\..\packages\System.Net.Primitives\ref\netstandard1.3\System.Net.Primitives.dll @@ -1042,7 +1025,7 @@ - + ..\..\packages\System.ObjectModel\lib\netstandard1.3\System.ObjectModel.dll @@ -1051,7 +1034,7 @@ - + ..\..\packages\System.ObjectModel\ref\netstandard1.3\System.ObjectModel.dll @@ -1131,7 +1114,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\ref\netstandard1.0\System.Reflection.Emit.Lightweight.dll @@ -1140,7 +1123,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\lib\netstandard1.3\System.Reflection.Emit.Lightweight.dll @@ -1218,7 +1201,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\lib\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1227,7 +1210,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\ref\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1441,7 +1424,7 @@ - + ..\..\packages\System.Runtime.Numerics\ref\netstandard1.1\System.Runtime.Numerics.dll @@ -1450,7 +1433,7 @@ - + ..\..\packages\System.Runtime.Numerics\lib\netstandard1.3\System.Runtime.Numerics.dll @@ -1461,27 +1444,7 @@ - - - - ..\..\packages\System.Security.AccessControl\lib\netstandard2.0\System.Security.AccessControl.dll - True - True - - - - - - - ..\..\packages\System.Security.AccessControl\ref\netstandard2.0\System.Security.AccessControl.dll - False - True - - - - - - + ..\..\packages\System.Security.Claims\lib\netstandard1.3\System.Security.Claims.dll @@ -1490,7 +1453,7 @@ - + ..\..\packages\System.Security.Claims\ref\netstandard1.3\System.Security.Claims.dll @@ -1557,24 +1520,6 @@ - - - - ..\..\packages\System.Security.Cryptography.Cng\lib\netstandard2.0\System.Security.Cryptography.Cng.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.Cng\ref\netstandard2.0\System.Security.Cryptography.Cng.dll - False - True - - - @@ -1626,24 +1571,6 @@ - - - - ..\..\packages\System.Security.Cryptography.OpenSsl\lib\netstandard2.0\System.Security.Cryptography.OpenSsl.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.OpenSsl\ref\netstandard2.0\System.Security.Cryptography.OpenSsl.dll - False - True - - - @@ -1693,7 +1620,7 @@ - + ..\..\packages\System.Security.Cryptography.X509Certificates\ref\netstandard1.4\System.Security.Cryptography.X509Certificates.dll @@ -1704,7 +1631,7 @@ - + ..\..\packages\System.Security.Principal\lib\netstandard1.0\System.Security.Principal.dll @@ -1713,7 +1640,7 @@ - + ..\..\packages\System.Security.Principal\ref\netstandard1.0\System.Security.Principal.dll @@ -1742,24 +1669,6 @@ - - - - ..\..\packages\System.Security.Principal.Windows\lib\netstandard2.0\System.Security.Principal.Windows.dll - True - True - - - - - - - ..\..\packages\System.Security.Principal.Windows\ref\netstandard2.0\System.Security.Principal.Windows.dll - False - True - - - @@ -1791,7 +1700,7 @@ - + ..\..\packages\System.Text.Encoding.Extensions\ref\netstandard1.3\System.Text.Encoding.Extensions.dll @@ -1907,15 +1816,6 @@ - - - - ..\..\packages\System.Threading.Tasks.Extensions\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - True - True - - - @@ -1938,7 +1838,7 @@ - + ..\..\packages\System.Threading.ThreadPool\lib\netstandard1.3\System.Threading.ThreadPool.dll @@ -1947,7 +1847,7 @@ - + ..\..\packages\System.Threading.ThreadPool\ref\netstandard1.3\System.Threading.ThreadPool.dll @@ -2019,7 +1919,7 @@ - + ..\..\packages\System.Xml.XDocument\lib\netstandard1.3\System.Xml.XDocument.dll @@ -2028,7 +1928,7 @@ - + ..\..\packages\System.Xml.XDocument\ref\netstandard1.3\System.Xml.XDocument.dll diff --git a/tests/Paket.Tests/Paket.Tests.fsproj b/tests/Paket.Tests/Paket.Tests.fsproj index ae16008a40..2dcfae840d 100644 --- a/tests/Paket.Tests/Paket.Tests.fsproj +++ b/tests/Paket.Tests/Paket.Tests.fsproj @@ -14,6 +14,7 @@ ..\..\ true + true true @@ -524,7 +525,7 @@ - + ..\..\packages\Microsoft.CSharp\lib\netstandard2.0\Microsoft.CSharp.dll @@ -533,7 +534,7 @@ - + ..\..\packages\Microsoft.CSharp\ref\netstandard2.0\Microsoft.CSharp.dll @@ -592,7 +593,7 @@ - + ..\..\packages\Microsoft.Win32.Primitives\ref\netstandard1.3\Microsoft.Win32.Primitives.dll @@ -621,24 +622,6 @@ - - - - ..\..\packages\Microsoft.Win32.Registry\lib\netstandard2.0\Microsoft.Win32.Registry.dll - True - True - - - - - - - ..\..\packages\Microsoft.Win32.Registry\ref\netstandard2.0\Microsoft.Win32.Registry.dll - False - True - - - @@ -832,7 +815,7 @@ - + ..\..\packages\System.Buffers\lib\netstandard2.0\System.Buffers.dll @@ -841,7 +824,7 @@ - + ..\..\packages\System.Buffers\ref\netstandard2.0\System.Buffers.dll @@ -881,7 +864,7 @@ - + ..\..\packages\System.Collections.Concurrent\lib\netstandard1.3\System.Collections.Concurrent.dll @@ -890,7 +873,7 @@ - + ..\..\packages\System.Collections.Concurrent\ref\netstandard1.3\System.Collections.Concurrent.dll @@ -1068,7 +1051,7 @@ - + ..\..\packages\System.Console\ref\netstandard1.3\System.Console.dll @@ -1108,7 +1091,7 @@ - + ..\..\packages\System.Diagnostics.DiagnosticSource\lib\netstandard1.3\System.Diagnostics.DiagnosticSource.dll @@ -1130,7 +1113,7 @@ - + ..\..\packages\System.Diagnostics.Tools\ref\netstandard1.0\System.Diagnostics.Tools.dll @@ -1168,7 +1151,7 @@ - + ..\..\packages\System.Diagnostics.Tracing\ref\netstandard1.5\System.Diagnostics.Tracing.dll @@ -1228,7 +1211,7 @@ - + ..\..\packages\System.Globalization.Calendars\ref\netstandard1.3\System.Globalization.Calendars.dll @@ -1297,7 +1280,7 @@ - + ..\..\packages\System.IO.Compression\ref\netstandard1.3\System.IO.Compression.dll @@ -1436,7 +1419,7 @@ - + ..\..\packages\System.Linq.Expressions\lib\netstandard1.6\System.Linq.Expressions.dll @@ -1445,7 +1428,7 @@ - + ..\..\packages\System.Linq.Expressions\ref\netstandard1.6\System.Linq.Expressions.dll @@ -1492,7 +1475,7 @@ - + ..\..\packages\System.Net.Http\ref\netstandard1.3\System.Net.Http.dll @@ -1521,7 +1504,7 @@ - + ..\..\packages\System.Net.Primitives\ref\netstandard1.3\System.Net.Primitives.dll @@ -1532,7 +1515,7 @@ - + ..\..\packages\System.Net.Requests\ref\netstandard1.3\System.Net.Requests.dll @@ -1563,7 +1546,7 @@ - + ..\..\packages\System.Net.WebHeaderCollection\lib\netstandard1.3\System.Net.WebHeaderCollection.dll @@ -1572,7 +1555,7 @@ - + ..\..\packages\System.Net.WebHeaderCollection\ref\netstandard1.3\System.Net.WebHeaderCollection.dll @@ -1592,7 +1575,7 @@ - + ..\..\packages\System.ObjectModel\lib\netstandard1.3\System.ObjectModel.dll @@ -1601,7 +1584,7 @@ - + ..\..\packages\System.ObjectModel\ref\netstandard1.3\System.ObjectModel.dll @@ -1681,7 +1664,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\ref\netstandard1.0\System.Reflection.Emit.Lightweight.dll @@ -1690,7 +1673,7 @@ - + ..\..\packages\System.Reflection.Emit.Lightweight\lib\netstandard1.3\System.Reflection.Emit.Lightweight.dll @@ -1768,7 +1751,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\lib\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1777,7 +1760,7 @@ - + ..\..\packages\System.Reflection.TypeExtensions\ref\netstandard2.0\System.Reflection.TypeExtensions.dll @@ -1991,7 +1974,7 @@ - + ..\..\packages\System.Runtime.Numerics\ref\netstandard1.1\System.Runtime.Numerics.dll @@ -2000,7 +1983,7 @@ - + ..\..\packages\System.Runtime.Numerics\lib\netstandard1.3\System.Runtime.Numerics.dll @@ -2060,27 +2043,7 @@ - - - - ..\..\packages\System.Security.AccessControl\lib\netstandard2.0\System.Security.AccessControl.dll - True - True - - - - - - - ..\..\packages\System.Security.AccessControl\ref\netstandard2.0\System.Security.AccessControl.dll - False - True - - - - - - + ..\..\packages\System.Security.Claims\lib\netstandard1.3\System.Security.Claims.dll @@ -2089,7 +2052,7 @@ - + ..\..\packages\System.Security.Claims\ref\netstandard1.3\System.Security.Claims.dll @@ -2156,24 +2119,6 @@ - - - - ..\..\packages\System.Security.Cryptography.Cng\lib\netstandard2.0\System.Security.Cryptography.Cng.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.Cng\ref\netstandard2.0\System.Security.Cryptography.Cng.dll - False - True - - - @@ -2225,24 +2170,6 @@ - - - - ..\..\packages\System.Security.Cryptography.OpenSsl\lib\netstandard2.0\System.Security.Cryptography.OpenSsl.dll - True - True - - - - - - - ..\..\packages\System.Security.Cryptography.OpenSsl\ref\netstandard2.0\System.Security.Cryptography.OpenSsl.dll - False - True - - - @@ -2348,7 +2275,7 @@ - + ..\..\packages\System.Security.Cryptography.X509Certificates\ref\netstandard1.4\System.Security.Cryptography.X509Certificates.dll @@ -2359,7 +2286,7 @@ - + ..\..\packages\System.Security.Principal\lib\netstandard1.0\System.Security.Principal.dll @@ -2368,7 +2295,7 @@ - + ..\..\packages\System.Security.Principal\ref\netstandard1.0\System.Security.Principal.dll @@ -2397,24 +2324,6 @@ - - - - ..\..\packages\System.Security.Principal.Windows\lib\netstandard2.0\System.Security.Principal.Windows.dll - True - True - - - - - - - ..\..\packages\System.Security.Principal.Windows\ref\netstandard2.0\System.Security.Principal.Windows.dll - False - True - - - @@ -2446,7 +2355,7 @@ - + ..\..\packages\System.Text.Encoding.Extensions\ref\netstandard1.3\System.Text.Encoding.Extensions.dll @@ -2562,18 +2471,9 @@ - - - - ..\..\packages\System.Threading.Tasks.Extensions\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - True - True - - - - + ..\..\packages\System.Threading.Tasks.Parallel\ref\netstandard1.1\System.Threading.Tasks.Parallel.dll @@ -2582,7 +2482,7 @@ - + ..\..\packages\System.Threading.Tasks.Parallel\lib\netstandard1.3\System.Threading.Tasks.Parallel.dll @@ -2613,7 +2513,7 @@ - + ..\..\packages\System.Threading.ThreadPool\lib\netstandard1.3\System.Threading.ThreadPool.dll @@ -2622,7 +2522,7 @@ - + ..\..\packages\System.Threading.ThreadPool\ref\netstandard1.3\System.Threading.ThreadPool.dll @@ -2691,7 +2591,7 @@ - + ..\..\packages\System.Xml.XDocument\lib\netstandard1.3\System.Xml.XDocument.dll @@ -2700,7 +2600,7 @@ - + ..\..\packages\System.Xml.XDocument\ref\netstandard1.3\System.Xml.XDocument.dll