Browse Source

Support Update-Package -reinstall for all packages in project.

pull/701/head
Matt Ward 10 years ago
parent
commit
5971f61b14
  1. 22
      src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs
  2. 66
      src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs
  3. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  4. 22
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeOperationAwarePackageRepository.cs
  5. 52
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PackageRepositoryOperationInfo.cs

22
src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs

@ -102,7 +102,11 @@ namespace ICSharpCode.PackageManagement.Cmdlets @@ -102,7 +102,11 @@ namespace ICSharpCode.PackageManagement.Cmdlets
}
} else {
if (HasProjectName()) {
UpdateAllPackagesInProject();
if (Reinstall) {
ReinstallAllPackagesInProject();
} else {
UpdateAllPackagesInProject();
}
} else {
UpdateAllPackagesInSolution();
}
@ -221,6 +225,11 @@ namespace ICSharpCode.PackageManagement.Cmdlets @@ -221,6 +225,11 @@ namespace ICSharpCode.PackageManagement.Cmdlets
{
IPackageManagementProject project = GetProject();
IPackage package = project.FindPackage(Id, null);
ReinstallPackageInProject(project, package);
}
void ReinstallPackageInProject(IPackageManagementProject project, IPackage package)
{
ReinstallPackageAction action = CreateReinstallPackageAction(project, package);
using (IDisposable operation = StartReinstallOperation(action)) {
action.Execute();
@ -242,5 +251,16 @@ namespace ICSharpCode.PackageManagement.Cmdlets @@ -242,5 +251,16 @@ namespace ICSharpCode.PackageManagement.Cmdlets
action.PackageScriptRunner = this;
return action;
}
void ReinstallAllPackagesInProject()
{
// No need to update dependencies since all packages will be reinstalled.
IgnoreDependencies = true;
IPackageManagementProject project = GetProject();
foreach (IPackage package in project.GetPackages()) {
ReinstallPackageInProject(project, package);
}
}
}
}

66
src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using ICSharpCode.PackageManagement;
@ -184,6 +185,16 @@ namespace PackageManagement.Cmdlets.Tests @@ -184,6 +185,16 @@ namespace PackageManagement.Cmdlets.Tests
get { return fakeProject.FakeReinstallPackageActionsCreated.First(); }
}
List<FakeReinstallPackageAction> ReinstallPackageActionsCreated {
get { return fakeProject.FakeReinstallPackageActionsCreated; }
}
FakePackage ProjectHasPackageInstalled(string packageId, string version)
{
FakePackage package = fakeProject.FakeLocalRepository.AddFakePackageWithVersion(packageId, version);
fakeProject.FakePackages.Add(package);
return package;
}
[Test]
public void ProcessRecord_NoActiveProject_ThrowsNoProjectOpenTerminatingError()
{
@ -872,13 +883,12 @@ namespace PackageManagement.Cmdlets.Tests @@ -872,13 +883,12 @@ namespace PackageManagement.Cmdlets.Tests
}
[Test]
public void ProcessRecord_ReinstallWhenPackageIdAndProjectNameSpecifiedAndSourceRepositoryIsOperationAware_UpdateOperationStartedAndDisposedForPackage()
public void ProcessRecord_ReinstallWhenPackageIdAndProjectNameSpecifiedAndSourceRepositoryIsOperationAware_ReinstallOperationStartedAndDisposedForPackage()
{
CreateCmdletWithActivePackageSourceAndProject();
SetIdParameter("Test");
SetProjectNameParameter("MyProject");
fakeProject.FakeLocalRepository.AddFakePackage("Test");
FakeUpdatePackageAction action = CreateUpdateActionWhenUpdatingPackageInAllProjects("Test");
var operationAwareRepository = new FakeOperationAwarePackageRepository();
fakeProject.FakeSourceRepository = operationAwareRepository;
cmdlet.Reinstall = true;
@ -896,7 +906,7 @@ namespace PackageManagement.Cmdlets.Tests @@ -896,7 +906,7 @@ namespace PackageManagement.Cmdlets.Tests
SetProjectNameParameter("MyProject");
cmdlet.Reinstall = true;
cmdlet.IncludePrerelease = true;
FakePackage testPackage = fakeProject.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.2.3");
fakeProject.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.2.3");
RunCmdlet();
@ -912,7 +922,7 @@ namespace PackageManagement.Cmdlets.Tests @@ -912,7 +922,7 @@ namespace PackageManagement.Cmdlets.Tests
SetProjectNameParameter("MyProject");
cmdlet.Reinstall = true;
cmdlet.IncludePrerelease = false;
FakePackage testPackage = fakeProject.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.2.3-alpha1");
fakeProject.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.2.3-alpha1");
RunCmdlet();
@ -928,7 +938,7 @@ namespace PackageManagement.Cmdlets.Tests @@ -928,7 +938,7 @@ namespace PackageManagement.Cmdlets.Tests
SetProjectNameParameter("MyProject");
cmdlet.Reinstall = true;
cmdlet.IgnoreDependencies = true;
FakePackage testPackage = fakeProject.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.2.3");
fakeProject.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.2.3");
RunCmdlet();
@ -936,6 +946,52 @@ namespace PackageManagement.Cmdlets.Tests @@ -936,6 +946,52 @@ namespace PackageManagement.Cmdlets.Tests
Assert.IsFalse(ReinstallPackageInSingleProjectAction.UpdateDependencies);
}
[Test]
public void ProcessRecord_ReinstallAllPackagesInProjectWithTwoPackages_BothPackagesReinstalled()
{
CreateCmdletWithActivePackageSourceAndProject();
SetProjectNameParameter("MyProject");
cmdlet.Reinstall = true;
cmdlet.IgnoreDependencies = false;
FakePackage packageA = ProjectHasPackageInstalled("PackageA", "1.1");
FakePackage packageB = ProjectHasPackageInstalled("PackageB", "1.2");
RunCmdlet();
Assert.AreEqual(2, ReinstallPackageActionsCreated.Count);
Assert.IsTrue(ReinstallPackageActionsCreated[0].IsExecuted);
Assert.IsTrue(ReinstallPackageActionsCreated[1].IsExecuted);
Assert.AreEqual(cmdlet, ReinstallPackageActionsCreated[0].PackageScriptRunner);
Assert.AreEqual(cmdlet, ReinstallPackageActionsCreated[1].PackageScriptRunner);
Assert.AreEqual("PackageA", ReinstallPackageActionsCreated[0].PackageId);
Assert.AreEqual("PackageB", ReinstallPackageActionsCreated[1].PackageId);
Assert.AreEqual(packageA.Version, ReinstallPackageActionsCreated[0].PackageVersion);
Assert.AreEqual(packageB.Version, ReinstallPackageActionsCreated[1].PackageVersion);
Assert.IsFalse(ReinstallPackageActionsCreated[0].AllowPrereleaseVersions);
Assert.IsFalse(ReinstallPackageActionsCreated[1].AllowPrereleaseVersions);
Assert.IsFalse(ReinstallPackageActionsCreated[0].UpdateDependencies);
Assert.IsFalse(ReinstallPackageActionsCreated[1].UpdateDependencies);
}
[Test]
public void ProcessRecord_ReinstallAllPackagesInProjectWhenSourceRepositoryIsOperationAware_ReinstallOperationStartedAndDisposedForEachPackage()
{
CreateCmdletWithActivePackageSourceAndProject();
SetProjectNameParameter("MyProject");
cmdlet.Reinstall = true;
ProjectHasPackageInstalled("PackageA", "1.1");
ProjectHasPackageInstalled("PackageB", "1.2");
var operationAwareRepository = new FakeOperationAwarePackageRepository();
fakeProject.FakeSourceRepository = operationAwareRepository;
cmdlet.Reinstall = true;
RunCmdlet();
Assert.AreEqual(2, operationAwareRepository.OperationsStarted.Count);
operationAwareRepository.OperationsStarted[0].AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Reinstall, "PackageA");
operationAwareRepository.OperationsStarted[1].AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Reinstall, "PackageB");
}
// TODO:
// Need to allow unlisted packages to be reinstalled.
}

1
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -119,6 +119,7 @@ @@ -119,6 +119,7 @@
<Compile Include="Src\Helpers\FakeUpdatePackageActions.cs" />
<Compile Include="Src\Helpers\FakeUpdatePackageActionsFactory.cs" />
<Compile Include="Src\Helpers\PackageOperationHelper.cs" />
<Compile Include="Src\Helpers\PackageRepositoryOperationInfo.cs" />
<Compile Include="Src\Helpers\PropertiesHelper.cs" />
<Compile Include="Src\Helpers\SelectedProjectCollectionAssert.cs" />
<Compile Include="Src\Helpers\SolutionHelper.cs" />

22
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeOperationAwarePackageRepository.cs

@ -17,10 +17,9 @@ @@ -17,10 +17,9 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using ICSharpCode.PackageManagement.Design;
using NuGet;
using NUnit.Framework;
using Rhino.Mocks;
namespace PackageManagement.Tests.Helpers
{
@ -29,25 +28,24 @@ namespace PackageManagement.Tests.Helpers @@ -29,25 +28,24 @@ namespace PackageManagement.Tests.Helpers
public string OperationStarted;
public string MainPackageIdForOperationStarted;
IDisposable Operation = MockRepository.GenerateStub<IDisposable>();
PackageRepositoryOperationInfo operationInfo;
public List<PackageRepositoryOperationInfo> OperationsStarted = new List<PackageRepositoryOperationInfo>();
public IDisposable StartOperation(string operationName, string mainPackageId, string mainPackageVersion)
{
operationInfo = new PackageRepositoryOperationInfo(operationName, mainPackageId, mainPackageVersion);
OperationsStarted.Add(operationInfo);
OperationStarted = operationName;
MainPackageIdForOperationStarted = mainPackageId;
return Operation;
}
public void AssertOperationWasStartedAndDisposed(string expectedOperationName, string expectedMainPackageId)
{
Assert.AreEqual(expectedOperationName, OperationStarted);
Assert.AreEqual(expectedMainPackageId, MainPackageIdForOperationStarted);
AssertOperationIsDisposed();
return operationInfo.Operation;
}
void AssertOperationIsDisposed()
public void AssertOperationWasStartedAndDisposed(string expectedOperationName, string expectedMainPackageId)
{
Operation.AssertWasCalled(o => o.Dispose());
operationInfo.AssertOperationWasStartedAndDisposed(expectedOperationName, expectedMainPackageId);
}
}
}

52
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PackageRepositoryOperationInfo.cs

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
// Copyright (c) 2015 AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using NUnit.Framework;
using Rhino.Mocks;
namespace PackageManagement.Tests.Helpers
{
public class PackageRepositoryOperationInfo
{
public PackageRepositoryOperationInfo(string operationName, string packageId, string packageVersion)
{
Operation = MockRepository.GenerateStub<IDisposable>();
Name = operationName;
PackageId = packageId;
PackageVersion = packageVersion;
}
public IDisposable Operation { get; set; }
public string Name { get; set; }
public string PackageId { get; set; }
public string PackageVersion{ get; set; }
public void AssertOperationWasStartedAndDisposed(string expectedOperationName, string expectedMainPackageId)
{
Assert.AreEqual(expectedOperationName, Name);
Assert.AreEqual(expectedMainPackageId, PackageId);
AssertOperationIsDisposed();
}
void AssertOperationIsDisposed()
{
Operation.AssertWasCalled(o => o.Dispose());
}
}
}
Loading…
Cancel
Save