diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 1dac4a3c26..3521197d3d 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,4 +1,4 @@ -#### 7.0.0-alpha011 - 2022-12-07 +#### 7.0.0-alpha013 - 2022-12-08 * Support as .NET 6.0 tool * Auto-Restore after paket install an paket update diff --git a/integrationtests/Paket.IntegrationTests/PaketCoreSpecs.fs b/integrationtests/Paket.IntegrationTests/PaketCoreSpecs.fs index 775a510c63..3d3acfa4d0 100644 --- a/integrationtests/Paket.IntegrationTests/PaketCoreSpecs.fs +++ b/integrationtests/Paket.IntegrationTests/PaketCoreSpecs.fs @@ -1,7 +1,7 @@ module Paket.IntegrationTests.PaketCoreSpecs open Fake -open System +open System open NUnit.Framework open FsUnit open System @@ -26,7 +26,7 @@ let ``#1251 full installer demo``() = // get from references file [GroupName "Main",PackageName "FAKE" GroupName "Main",PackageName "FSharp.Formatting"] - let lockFile,_,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, PackageResolver.UpdateMode.Install, SemVerUpdateMode.NoRestriction, force) + let lockFile,_,_,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, PackageResolver.UpdateMode.Install, SemVerUpdateMode.NoRestriction, force) let model = Paket.InstallProcess.CreateModel(alternativeProjectRoot, Path.GetDirectoryName dependenciesFile.FileName, force, dependenciesFile, lockFile, Set.ofSeq packagesToInstall, Map.empty) |> Map.ofArray lockFile.Groups.[Constants.MainDependencyGroup].Resolution.[PackageName "FAKE"].Version @@ -44,7 +44,7 @@ let ``#1251 install FSharp.Collections.ParallelSeq``() = // get from references file [GroupName "Main",PackageName "FSharp.Collections.ParallelSeq"] - let lockFile,_,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, PackageResolver.UpdateMode.Install, SemVerUpdateMode.NoRestriction, force) + let lockFile,_,_,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, PackageResolver.UpdateMode.Install, SemVerUpdateMode.NoRestriction, force) lockFile.Groups.[Constants.MainDependencyGroup].Resolution.[PackageName "FSharp.Collections.ParallelSeq"].Version |> shouldBeGreaterThan (SemVer.Parse "1.0.1") diff --git a/src/Paket.Core/Installation/InstallProcess.fs b/src/Paket.Core/Installation/InstallProcess.fs index 6ee3d21bae..57e945ffa7 100644 --- a/src/Paket.Core/Installation/InstallProcess.fs +++ b/src/Paket.Core/Installation/InstallProcess.fs @@ -347,7 +347,7 @@ let installForDotnetSDK root (project:ProjectFile) = project.AddImportForPaketTargets(relativePath) /// Installs all packages from the lock file. -let InstallIntoProjects(options : InstallerOptions, forceTouch, dependenciesFile, lockFile : LockFile, projectsAndReferences : (ProjectFile * ReferencesFile) list, updatedGroups) = +let InstallIntoProjects(options : InstallerOptions, forceTouch, dependenciesFile, lockFile : LockFile, projectsAndReferences : (ProjectFile * ReferencesFile) list, updatedGroups, touchedPackages:((GroupName * PackageName) list) option) = let packagesToInstall = if options.OnlyReferenced then projectsAndReferences @@ -361,6 +361,7 @@ let InstallIntoProjects(options : InstallerOptions, forceTouch, dependenciesFile |> Seq.map (fun kv -> kv.Key) |> Set + let touchedProjects = System.Collections.Generic.HashSet() tracefn "Created dependency graph (%d packages in total)" packagesToInstall.Count let root = Path.GetDirectoryName lockFile.FileName let model = CreateModel(options.AlternativeProjectRoot, root, options.Force, dependenciesFile, lockFile, packagesToInstall, updatedGroups) |> Map.ofArray @@ -370,7 +371,6 @@ let InstallIntoProjects(options : InstallerOptions, forceTouch, dependenciesFile let prefix = dependenciesFile.Directory.Length + 1 let norm (s:string) = (s.Substring prefix).Replace('\\', '/') - if projectsAndReferences.Length > 0 then verbosefn " - Installing to %d projects" projectsAndReferences.Length @@ -498,6 +498,18 @@ let InstallIntoProjects(options : InstallerOptions, forceTouch, dependenciesFile else // start the installation process if toolsVersion >= 15.0 then installForDotnetSDK root project + if forceTouch then + touchedProjects.Add project.FileName |> ignore + else + match touchedPackages with + | Some touchedPackages -> + let packageInstalled = + touchedPackages + |> Seq.exists project.HasPackageInstalled + if packageInstalled then + touchedProjects.Add project.FileName |> ignore + | _ -> + touchedProjects.Add project.FileName |> ignore else project.UpdateReferences(model, directDependencies, usedPackages) @@ -589,12 +601,31 @@ let InstallIntoProjects(options : InstallerOptions, forceTouch, dependenciesFile // Lets see if users report issues Paket.RestoreProcess.writeRestoreCache restoreCacheFile { PackagesDownloadedHash = hash; ProjectsRestoredHash = hash } Paket.RestoreProcess.writeGitignore restoreCacheFile - () + for project in touchedProjects do + let di = (FileInfo project).Directory + for objDir in Directory.EnumerateDirectories(di.FullName,"obj", SearchOption.AllDirectories) do + for file in Directory.EnumerateFiles(objDir,"project.assets.json", SearchOption.AllDirectories) do + try + File.Delete file + with + | _ -> () + + for file in Directory.EnumerateFiles(objDir,"*.references", SearchOption.AllDirectories) do + try + File.Delete file + with + | _ -> () + + for file in Directory.EnumerateFiles(objDir,"*.paket.*", SearchOption.AllDirectories) do + try + File.Delete file + with + | _ -> () /// Installs all packages from the lock file. -let Install(options : InstallerOptions, forceTouch, dependenciesFile, lockFile : LockFile, updatedGroups) = +let Install(options : InstallerOptions, forceTouch, dependenciesFile, lockFile : LockFile, updatedGroups, touchedPackages) = let root = FileInfo(lockFile.FileName).Directory.FullName let projects = RestoreProcess.findAllReferencesFiles root |> returnOrFail - InstallIntoProjects(options, forceTouch, dependenciesFile, lockFile, projects, updatedGroups) + InstallIntoProjects(options, forceTouch, dependenciesFile, lockFile, projects, updatedGroups,touchedPackages) diff --git a/src/Paket.Core/Installation/UpdateProcess.fs b/src/Paket.Core/Installation/UpdateProcess.fs index f1073d55d7..69a9cab597 100644 --- a/src/Paket.Core/Installation/UpdateProcess.fs +++ b/src/Paket.Core/Installation/UpdateProcess.fs @@ -229,11 +229,43 @@ let SelectiveUpdate(dependenciesFile : DependenciesFile, alternativeProjectRoot, updateMode semVerUpdateMode let hasChanged = lockFile.Save() - lockFile,hasChanged,updatedGroups + let touchedPackages = + [ + for group1 in oldLockFile.Groups do + for package1 in group1.Value.Resolution do + match lockFile.Groups |> Map.tryFind group1.Key with + | None -> group1.Key, package1.Key + | Some group2 -> + match group2.Resolution |> Map.tryFind package1.Key with + | Some package2 when package2.Version <> package1.Value.Version -> + () + | _ -> + group1.Key, package1.Key + for group1 in lockFile.Groups do + for package1 in group1.Value.Resolution do + match oldLockFile.Groups |> Map.tryFind group1.Key with + | None -> group1.Key, package1.Key + | Some group2 -> + match group2.Resolution |> Map.tryFind package1.Key with + | Some package2 when package2.Version <> package1.Value.Version -> + () + | _ -> + group1.Key, package1.Key + ] + |> List.distinct + |> List.sort + + if not (List.isEmpty touchedPackages) then + tracefn "Updated packages:" + for g,packages in touchedPackages |> List.groupBy fst do + tracefn " Group: %O" g + for p in packages do + tracefn " - %O" p + lockFile,hasChanged,updatedGroups,touchedPackages /// Smart install command let SmartInstall(dependenciesFile:DependenciesFile, updateMode, options : UpdaterOptions) = - let lockFile,hasChanged,updatedGroups = SelectiveUpdate(dependenciesFile, options.Common.AlternativeProjectRoot, updateMode, options.Common.SemVerUpdateMode, options.Common.Force) + let lockFile,hasChanged,updatedGroups,touchedPackages = SelectiveUpdate(dependenciesFile, options.Common.AlternativeProjectRoot, updateMode, options.Common.SemVerUpdateMode, options.Common.Force) let root = Path.GetDirectoryName dependenciesFile.FileName let projectsAndReferences = RestoreProcess.findAllReferencesFiles root |> returnOrFail @@ -241,7 +273,7 @@ let SmartInstall(dependenciesFile:DependenciesFile, updateMode, options : Update if not options.NoInstall then tracefn "Installing into projects:" let forceTouch = hasChanged && options.Common.TouchAffectedRefs - InstallProcess.InstallIntoProjects(options.Common, forceTouch, dependenciesFile, lockFile, projectsAndReferences, updatedGroups) + InstallProcess.InstallIntoProjects(options.Common, forceTouch, dependenciesFile, lockFile, projectsAndReferences, updatedGroups, Some touchedPackages) GarbageCollection.CleanUp(dependenciesFile, lockFile) let shouldGenerateScripts = diff --git a/src/Paket.Core/PackageManagement/AddProcess.fs b/src/Paket.Core/PackageManagement/AddProcess.fs index a0a1b93dcd..91d96afbee 100644 --- a/src/Paket.Core/PackageManagement/AddProcess.fs +++ b/src/Paket.Core/PackageManagement/AddProcess.fs @@ -6,7 +6,7 @@ open System open System.IO open Paket.Domain open Paket.Logging - + let private matchGroupName groupName = match groupName with | None -> Constants.MainDependencyGroup @@ -60,19 +60,19 @@ let private add installToProjects addToProjectsF dependenciesFileName groupName | None -> () | Some lockFile -> let touchedGroups = Map.empty.Add(groupName,"") - InstallProcess.Install(options, false, dependenciesFile, lockFile, touchedGroups) + InstallProcess.Install(options, false, dependenciesFile, lockFile, touchedGroups, Some [groupName, package]) GarbageCollection.CleanUp(dependenciesFile, lockFile) else let updateMode = PackageResolver.UpdateMode.InstallGroup groupName let alternativeProjectRoot = None - let lockFile,hasChanged,updatedGroups = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, updateMode, options.SemVerUpdateMode, options.Force) + let lockFile,hasChanged,updatedGroups,updatedPackages = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, updateMode, options.SemVerUpdateMode, options.Force) dependenciesFile.Save() addToProjectsF projects groupName package if installAfter then let forceTouch = hasChanged && options.TouchAffectedRefs - InstallProcess.Install(options, forceTouch, dependenciesFile, lockFile, updatedGroups) + InstallProcess.Install(options, forceTouch, dependenciesFile, lockFile, updatedGroups, Some updatedPackages) GarbageCollection.CleanUp(dependenciesFile, lockFile) lockFileName.Refresh() @@ -125,9 +125,9 @@ let AddGithub(dependenciesFileName, groupName, repository, file, version, option let updateMode = PackageResolver.UpdateMode.InstallGroup group let alternativeProjectRoot = None - let lockFile,_,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, updateMode, options.SemVerUpdateMode, options.Force) + let lockFile,_,_,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, updateMode, options.SemVerUpdateMode, options.Force) - InstallProcess.Install(options, false, dependenciesFile, lockFile, Map.empty) + InstallProcess.Install(options, false, dependenciesFile, lockFile, Map.empty, None) GarbageCollection.CleanUp(dependenciesFile, lockFile) let AddGit(dependenciesFileName, groupName, repository, version, options) = @@ -142,7 +142,7 @@ let AddGit(dependenciesFileName, groupName, repository, version, options) = let updateMode = PackageResolver.UpdateMode.InstallGroup group let alternativeProjectRoot = None - let lockFile,_,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, updateMode, options.SemVerUpdateMode, options.Force) + let lockFile,_,_,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, updateMode, options.SemVerUpdateMode, options.Force) - InstallProcess.Install(options, false, dependenciesFile, lockFile, Map.empty) + InstallProcess.Install(options, false, dependenciesFile, lockFile, Map.empty, None) GarbageCollection.CleanUp(dependenciesFile, lockFile) \ No newline at end of file diff --git a/src/Paket.Core/PackageManagement/RemoveProcess.fs b/src/Paket.Core/PackageManagement/RemoveProcess.fs index 7cceb84139..50132fd424 100644 --- a/src/Paket.Core/PackageManagement/RemoveProcess.fs +++ b/src/Paket.Core/PackageManagement/RemoveProcess.fs @@ -6,7 +6,7 @@ open System.IO open Paket.Domain open Paket.Logging open InstallProcess - + let private removePackageFromProject (project : ProjectFile) groupName package = project.FindOrCreateReferencesFile() .RemoveNuGetReference(groupName,package) @@ -35,18 +35,18 @@ let private remove removeFromProjects (dependenciesFileName: string) alternative let lockFileName = DependenciesFile.FindLockfile dependenciesFileName LockFile.LoadFrom(lockFileName.FullName) - let dependenciesFile,lockFile,_ = + let dependenciesFile,lockFile,_,updatedPackages = let exisitingDependenciesFile = DependenciesFile.ReadFromFile dependenciesFileName - if stillInstalled then exisitingDependenciesFile,oldLockFile,false else + if stillInstalled then exisitingDependenciesFile,oldLockFile,false,None else let dependenciesFile = exisitingDependenciesFile.Remove(groupName,package) dependenciesFile.Save() - let lockFile,hasChanged,_ = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, PackageResolver.UpdateMode.Install,SemVerUpdateMode.NoRestriction,force) - dependenciesFile,lockFile,hasChanged + let lockFile,hasChanged,_,updatedPackages = UpdateProcess.SelectiveUpdate(dependenciesFile, alternativeProjectRoot, PackageResolver.UpdateMode.Install,SemVerUpdateMode.NoRestriction,force) + dependenciesFile,lockFile,hasChanged,Some updatedPackages if installAfter then let updatedGroups = Map.add groupName 0 Map.empty - InstallProcess.Install(InstallerOptions.CreateLegacyOptions(force, Requirements.BindingRedirectsSettings.Off, false, false, SemVerUpdateMode.NoRestriction, false, false, [], [], None), false, dependenciesFile, lockFile, updatedGroups) + InstallProcess.Install(InstallerOptions.CreateLegacyOptions(force, Requirements.BindingRedirectsSettings.Off, false, false, SemVerUpdateMode.NoRestriction, false, false, [], [], None), false, dependenciesFile, lockFile, updatedGroups, updatedPackages) GarbageCollection.CleanUp(dependenciesFile, lockFile) installAfter