Browse Source

Support updating a NuGet package in all projects when using the Update-Package PowersShell cmdlet.

pull/16/head
Matt Ward 15 years ago
parent
commit
b1f0cc48f4
  1. 32
      src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs
  2. 181
      src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs
  3. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  4. 5
      src/AddIns/Misc/PackageManagement/Project/Src/IUpdatePackageActionsFactory.cs
  5. 8
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageActionsFactory.cs
  6. 62
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageInAllProjects.cs
  7. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  8. 18
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeUpdatePackageActionsFactory.cs
  9. 211
      src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageInAllProjectsTests.cs

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

@ -51,25 +51,29 @@ namespace ICSharpCode.PackageManagement.Cmdlets @@ -51,25 +51,29 @@ namespace ICSharpCode.PackageManagement.Cmdlets
protected override void ProcessRecord()
{
ThrowErrorIfProjectNotOpen();
if (IsPackageIdMissing()) {
if (HasPackageId()) {
if (HasProjectName()) {
UpdatePackageInSingleProject();
} else {
UpdatePackageInAllProjects();
}
} else {
if (HasProjectName()) {
UpdateAllPackagesInProject();
} else {
UpdateAllPackagesInSolution();
}
} else {
UpdatePackageInSingleProject();
}
}
bool IsPackageIdMissing()
bool HasPackageId()
{
return String.IsNullOrEmpty(Id);
return !String.IsNullOrEmpty(Id);
}
bool HasProjectName()
{
return ProjectName != null;
return !String.IsNullOrEmpty(ProjectName);
}
void UpdateAllPackagesInProject()
@ -138,5 +142,21 @@ namespace ICSharpCode.PackageManagement.Cmdlets @@ -138,5 +142,21 @@ namespace ICSharpCode.PackageManagement.Cmdlets
action.Execute();
}
}
void UpdatePackageInAllProjects()
{
IPackageManagementSolution solution = ConsoleHost.Solution;
IPackageRepository repository = GetActivePackageRepository();
PackageReference packageReference = CreatePackageReference();
IUpdatePackageActions updateActions =
updatePackageActionsFactory.CreateUpdatePackageInAllProjects(packageReference, solution, repository);
RunActions(updateActions);
}
PackageReference CreatePackageReference()
{
return new PackageReference(Id, Version, null);
}
}
}

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

@ -23,6 +23,7 @@ namespace PackageManagement.Cmdlets.Tests @@ -23,6 +23,7 @@ namespace PackageManagement.Cmdlets.Tests
FakeUpdatePackageActions fakeUpdateAllPackagesInProject;
FakePackageManagementSolution fakeSolution;
FakeUpdatePackageActions fakeUpdateAllPackagesInSolution;
FakeUpdatePackageActions fakeUpdatePackageInAllProjects;
void CreateCmdletWithoutActiveProject()
{
@ -34,6 +35,7 @@ namespace PackageManagement.Cmdlets.Tests @@ -34,6 +35,7 @@ namespace PackageManagement.Cmdlets.Tests
fakeUpdateActionsFactory = cmdlet.FakeUpdatePackageActionsFactory;
fakeUpdateAllPackagesInProject = fakeUpdateActionsFactory.FakeUpdateAllPackagesInProject;
fakeUpdateAllPackagesInSolution = fakeUpdateActionsFactory.FakeUpdateAllPackagesInSolution;
fakeUpdatePackageInAllProjects = fakeUpdateActionsFactory.FakeUpdatePackageInAllProjects;
}
FakeUpdatePackageAction UpdatePackageInSingleProjectAction {
@ -66,6 +68,19 @@ namespace PackageManagement.Cmdlets.Tests @@ -66,6 +68,19 @@ namespace PackageManagement.Cmdlets.Tests
get { return GetUpdatingAllPackagesInSolutionAction(1); }
}
FakeUpdatePackageAction FirstUpdateActionWhenUpdatingPackageInAllProjects {
get { return GetUpdatingPackageInAllProjectsAction(0); }
}
FakeUpdatePackageAction GetUpdatingPackageInAllProjectsAction(int index)
{
return fakeUpdateActionsFactory.FakeUpdatePackageInAllProjects.FakeActions[index];
}
FakeUpdatePackageAction SecondUpdateActionWhenUpdatingPackageInAllProjects {
get { return GetUpdatingPackageInAllProjectsAction(1); }
}
void CreateCmdletWithActivePackageSourceAndProject()
{
CreateCmdletWithoutActiveProject();
@ -129,6 +144,19 @@ namespace PackageManagement.Cmdlets.Tests @@ -129,6 +144,19 @@ namespace PackageManagement.Cmdlets.Tests
fakeUpdateActionsFactory.FakeUpdateAllPackagesInSolution.FakeActions.Add(action);
}
void CreateTwoUpdateActionsWhenUpdatingPackageInAllProjects(string packageId1, string packageId2)
{
CreateUpdateActionWhenUpdatingPackageInAllProjects(packageId1);
CreateUpdateActionWhenUpdatingPackageInAllProjects(packageId2);
}
void CreateUpdateActionWhenUpdatingPackageInAllProjects(string packageId)
{
var action = new FakeUpdatePackageAction(fakeProject);
action.PackageId = packageId;
fakeUpdateActionsFactory.FakeUpdatePackageInAllProjects.FakeActions.Add(action);
}
[Test]
public void ProcessRecord_NoActiveProject_ThrowsNoProjectOpenTerminatingError()
{
@ -394,6 +422,19 @@ namespace PackageManagement.Cmdlets.Tests @@ -394,6 +422,19 @@ namespace PackageManagement.Cmdlets.Tests
Assert.AreEqual(fakeSolution, solution);
}
[Test]
public void ProcessRecord_UpdateAllPackagesInSolutionWhenProjectNameIsEmptyString_CreatesUpdateAllPackagesSolution()
{
CreateCmdletWithActivePackageSourceAndProject();
SetProjectNameParameter(String.Empty);
RunCmdlet();
IPackageManagementSolution solution =
fakeUpdateActionsFactory.SolutionPassedToCreateUpdateAllPackagesInSolution;
Assert.AreEqual(fakeSolution, solution);
}
[Test]
public void ProcessRecord_UpdateAllPackagesInSolutionWhenSourceSpecified_PackageSourceUsedToGetRepository()
{
@ -486,5 +527,145 @@ namespace PackageManagement.Cmdlets.Tests @@ -486,5 +527,145 @@ namespace PackageManagement.Cmdlets.Tests
Assert.AreEqual(cmdlet, runner);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjects_CreatesUpdatePackageInAllProjects()
{
CreateCmdletWithActivePackageSourceAndProject();
SetIdParameter("MyPackage");
RunCmdlet();
IPackageManagementSolution solution =
fakeUpdateActionsFactory.SolutionPassedToCreateUpdatePackageInAllProjects;
Assert.AreEqual(fakeSolution, solution);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjectsWhenSourceSpecified_PackageSourceUsedToGetRepository()
{
CreateCmdletWithActivePackageSourceAndProject();
SetIdParameter("MyPackage");
RunCmdlet();
PackageSource packageSource = fakeConsoleHost.PackageSourcePassedToGetRepository;
PackageSource expectedPackageSource = fakeConsoleHost.PackageSourceToReturnFromGetActivePackageSource;
Assert.AreEqual(expectedPackageSource, packageSource);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjectsWhenSourceSpecified_SourceUsedPassedGetActvePackageSourceFromConsoleHost()
{
CreateCmdletWithActivePackageSourceAndProject();
SetIdParameter("MyPackage");
SetSourceParameter("Test");
RunCmdlet();
string packageSource = fakeConsoleHost.PackageSourcePassedToGetActivePackageSource;
Assert.AreEqual("Test", packageSource);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjects_RepositoryUsedToCreateUpdatePackageInAllProjects()
{
CreateCmdletWithActivePackageSourceAndProject();
SetIdParameter("MyPackage");
RunCmdlet();
IPackageRepository repository = fakeUpdateActionsFactory.SourceRepositoryPassedToCreateUpdatePackageInAllProjects;
IPackageRepository expectedRepository = fakeConsoleHost.FakePackageRepository;
Assert.AreEqual(expectedRepository, repository);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjectsWhenTwoUpdateActionsReturned_TwoUpdateActionsAreExecuted()
{
CreateCmdletWithActivePackageSourceAndProject();
CreateTwoUpdateActionsWhenUpdatingPackageInAllProjects("PackageA", "PackageB");
SetIdParameter("MyPackage");
RunCmdlet();
bool[] executedActions = new bool[] {
FirstUpdateActionWhenUpdatingPackageInAllProjects.IsExecuted,
SecondUpdateActionWhenUpdatingPackageInAllProjects.IsExecuted
};
bool[] expectedExecutedActions = new bool[] {
true,
true
};
CollectionAssert.AreEqual(expectedExecutedActions, executedActions);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjectsAndIgnoreDependenciesIsTrue_ActionDoesNotUpdateDependencies()
{
CreateCmdletWithActivePackageSourceAndProject();
CreateUpdateActionWhenUpdatingPackageInAllProjects("PackageA");
SetIdParameter("PackageA");
EnableIgnoreDependenciesParameter();
RunCmdlet();
bool update = fakeUpdatePackageInAllProjects.UpdateDependencies;
Assert.IsFalse(update);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjectsAndIgnoreDependenciesIsFalse_ActionUpdatesDependencies()
{
CreateCmdletWithActivePackageSourceAndProject();
CreateUpdateActionWhenUpdatingPackageInAllProjects("PackageA");
SetIdParameter("PackageA");
RunCmdlet();
bool update = fakeUpdatePackageInAllProjects.UpdateDependencies;
Assert.IsTrue(update);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjects_ActionsUseCmdletAsScriptRunner()
{
CreateCmdletWithActivePackageSourceAndProject();
SetIdParameter("MyPackage");
RunCmdlet();
IPackageScriptRunner runner = fakeUpdatePackageInAllProjects.PackageScriptRunner;
Assert.AreEqual(cmdlet, runner);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjects_PackageIdPassedToAction()
{
CreateCmdletWithActivePackageSourceAndProject();
SetIdParameter("MyPackage");
RunCmdlet();
PackageReference packageReference =
fakeUpdateActionsFactory.PackageReferencePassedToCreateUpdatePackageInAllProjects;
Assert.AreEqual("MyPackage", packageReference.Id);
}
[Test]
public void ProcessRecord_UpdatePackageInAllProjects_PackageVersionPassedToAction()
{
CreateCmdletWithActivePackageSourceAndProject();
SetIdParameter("MyPackage");
var expectedVersion = new Version("1.0");
SetVersionParameter(expectedVersion);
RunCmdlet();
PackageReference packageReference =
fakeUpdateActionsFactory.PackageReferencePassedToCreateUpdatePackageInAllProjects;
Assert.AreEqual(expectedVersion, packageReference.Version);
}
}
}

1
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -360,6 +360,7 @@ @@ -360,6 +360,7 @@
<Compile Include="Src\UpdatedPackageViewModelFactory.cs" />
<Compile Include="Src\UpdatePackageAction.cs" />
<Compile Include="Src\UpdatePackageActionsFactory.cs" />
<Compile Include="Src\UpdatePackageInAllProjects.cs" />
<Compile Include="Src\ViewModelBase.cs" />
<Compile Include="Src\PackageManagementViewModels.cs" />
<Compile Include="Src\VisualStudio\NotInstalledException.cs" />

5
src/AddIns/Misc/PackageManagement/Project/Src/IUpdatePackageActionsFactory.cs

@ -13,5 +13,10 @@ namespace ICSharpCode.PackageManagement @@ -13,5 +13,10 @@ namespace ICSharpCode.PackageManagement
IUpdatePackageActions CreateUpdateAllPackagesInSolution(
IPackageManagementSolution solution,
IPackageRepository sourceRepository);
IUpdatePackageActions CreateUpdatePackageInAllProjects(
PackageReference packageReference,
IPackageManagementSolution solution,
IPackageRepository sourceRepository);
}
}

8
src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageActionsFactory.cs

@ -19,5 +19,13 @@ namespace ICSharpCode.PackageManagement @@ -19,5 +19,13 @@ namespace ICSharpCode.PackageManagement
{
return new UpdateAllPackagesInSolution(solution, sourceRepository);
}
public IUpdatePackageActions CreateUpdatePackageInAllProjects(
PackageReference packageReference,
IPackageManagementSolution solution,
IPackageRepository sourceRepository)
{
return new UpdatePackageInAllProjects(packageReference, solution, sourceRepository);
}
}
}

62
src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageInAllProjects.cs

@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.PackageManagement.Scripting;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public class UpdatePackageInAllProjects : IUpdatePackageActions
{
IPackageManagementSolution solution;
IPackageRepository sourceRepository;
List<IPackageManagementProject> projects;
PackageReference packageReference;
public UpdatePackageInAllProjects(
PackageReference packageReference,
IPackageManagementSolution solution,
IPackageRepository sourceRepository)
{
this.packageReference = packageReference;
this.solution = solution;
this.sourceRepository = sourceRepository;
}
public bool UpdateDependencies { get; set; }
public IPackageScriptRunner PackageScriptRunner { get; set; }
public IEnumerable<UpdatePackageAction> CreateActions()
{
GetProjects();
foreach (IPackageManagementProject project in projects) {
yield return CreateUpdatePackageAction(project);
}
}
void GetProjects()
{
projects = new List<IPackageManagementProject>();
projects.AddRange(solution.GetProjects(sourceRepository));
}
UpdatePackageAction CreateUpdatePackageAction(IPackageManagementProject project)
{
UpdatePackageAction action = project.CreateUpdatePackageAction();
SetUpdatePackageActionProperties(action);
return action;
}
void SetUpdatePackageActionProperties(UpdatePackageAction action)
{
action.PackageId = packageReference.Id;
action.PackageScriptRunner = PackageScriptRunner;
action.PackageVersion = packageReference.Version;
action.UpdateDependencies = UpdateDependencies;
action.UpdateIfPackageDoesNotExistInProject = false;
}
}
}

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

@ -263,6 +263,7 @@ @@ -263,6 +263,7 @@
<Compile Include="Src\StringToStringCollectionConverterTests.cs" />
<Compile Include="Src\UpdatedPackageViewModelTests.cs" />
<Compile Include="Src\UpdatePackageActionTests.cs" />
<Compile Include="Src\UpdatePackageInAllProjectsTests.cs" />
<Compile Include="Src\ViewModelBaseTests.cs" />
<Compile Include="Src\VisualStudio\PackageTests.cs" />
<Compile Include="Src\VisualStudio\SVsExtensionManagerTests.cs" />

18
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeUpdatePackageActionsFactory.cs

@ -34,5 +34,23 @@ namespace PackageManagement.Tests.Helpers @@ -34,5 +34,23 @@ namespace PackageManagement.Tests.Helpers
SourceRepositoryPassedToCreateUpdateAllPackagesInSolution = sourceRepository;
return FakeUpdateAllPackagesInSolution;
}
public FakeUpdatePackageActions FakeUpdatePackageInAllProjects =
new FakeUpdatePackageActions();
public IPackageManagementSolution SolutionPassedToCreateUpdatePackageInAllProjects;
public IPackageRepository SourceRepositoryPassedToCreateUpdatePackageInAllProjects;
public PackageReference PackageReferencePassedToCreateUpdatePackageInAllProjects;
public IUpdatePackageActions CreateUpdatePackageInAllProjects(
PackageReference packageReference,
IPackageManagementSolution solution,
IPackageRepository sourceRepository)
{
PackageReferencePassedToCreateUpdatePackageInAllProjects = packageReference;
SolutionPassedToCreateUpdatePackageInAllProjects = solution;
SourceRepositoryPassedToCreateUpdatePackageInAllProjects = sourceRepository;
return FakeUpdatePackageInAllProjects;
}
}
}

211
src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageInAllProjectsTests.cs

@ -0,0 +1,211 @@ @@ -0,0 +1,211 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design;
using ICSharpCode.PackageManagement.Scripting;
using NuGet;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests
{
[TestFixture]
public class UpdatePackageInAllProjectsTests
{
UpdatePackageInAllProjects updatePackageInAllProjects;
FakePackageManagementSolution fakeSolution;
FakePackageRepository fakeSourceRepository;
List<UpdatePackageAction> updateActions;
void CreateUpdatePackageInAllProjects(string packageId)
{
CreateUpdatePackageInAllProjects(packageId, new Version("1.0"));
}
void CreateUpdatePackageInAllProjects(string packageId, Version version)
{
fakeSolution = new FakePackageManagementSolution();
fakeSourceRepository = new FakePackageRepository();
var packageReference = new PackageReference(packageId, version, null);
updatePackageInAllProjects = new UpdatePackageInAllProjects(packageReference, fakeSolution, fakeSourceRepository);
}
void CreateUpdatePackageInAllProjects()
{
CreateUpdatePackageInAllProjects("MyPackageId");
}
void CallCreateActions()
{
IEnumerable<UpdatePackageAction> actions = updatePackageInAllProjects.CreateActions();
updateActions = actions.ToList();
}
UpdatePackageAction FirstUpdateAction {
get { return updateActions[0]; }
}
FakePackageManagementProject AddProjectToSolution(string projectName)
{
return fakeSolution.AddFakeProject(projectName);
}
FakePackageManagementProject FirstProjectInSolution {
get { return fakeSolution.FakeProjects[0]; }
}
[Test]
public void CreateActions_SolutionHasOneProject_ReturnsOneAction()
{
CreateUpdatePackageInAllProjects();
AddProjectToSolution("MyProject");
CallCreateActions();
Assert.AreEqual(1, updateActions.Count);
}
[Test]
public void CreateActions_SolutionHasOneProject_UpdateActionCreatedFromProject()
{
CreateUpdatePackageInAllProjects();
AddProjectToSolution("MyProject");
CallCreateActions();
UpdatePackageAction action = FirstUpdateAction;
UpdatePackageAction expectedAction = FirstProjectInSolution.FirstFakeUpdatePackageActionCreated;
Assert.AreEqual(expectedAction, action);
}
[Test]
public void CreateActions_SolutionHasOneProject_UpdateActionCreatedUsingSourceRepositoryPassedInConstructor()
{
CreateUpdatePackageInAllProjects();
AddProjectToSolution("MyProject");
CallCreateActions();
IPackageRepository repository = fakeSolution.SourceRepositoryPassedToGetProjects;
FakePackageRepository expectedRepository = fakeSourceRepository;
Assert.AreEqual(expectedRepository, repository);
}
[Test]
public void CreateActions_NoPackagesInSolution_NoActionsReturned()
{
CreateUpdatePackageInAllProjects();
CallCreateActions();
Assert.AreEqual(0, updateActions.Count);
}
[Test]
public void CreateActions_TwoProjectsInSolution_ReturnsTwoActions()
{
CreateUpdatePackageInAllProjects();
AddProjectToSolution("MyProject1");
AddProjectToSolution("MyProject2");
CallCreateActions();
Assert.AreEqual(2, updateActions.Count);
}
[Test]
public void CreateActions_OnePackageInSolutionWithTwoProjects_ReturnsTwoActionsCreatedFromProjects()
{
CreateUpdatePackageInAllProjects();
FakePackageManagementProject project1 = AddProjectToSolution("MyProject1");
FakePackageManagementProject project2 = AddProjectToSolution("MyProject2");
CallCreateActions();
var expectedActions = new UpdatePackageAction[] {
project1.FirstFakeUpdatePackageActionCreated,
project2.FirstFakeUpdatePackageActionCreated
};
Assert.AreEqual(expectedActions, updateActions);
}
[Test]
public void CreateActions_SolutionHasOneProject_PackageIdSetInUpdateAction()
{
CreateUpdatePackageInAllProjects("MyPackage");
AddProjectToSolution("MyProject");
CallCreateActions();
string packageId = FirstUpdateAction.PackageId;
Assert.AreEqual("MyPackage", packageId);
}
[Test]
public void CreateActions_SolutionHasOneProject_PackageVersionSetInUpdateAction()
{
var expectedVersion = new Version("1.2.3.4");
CreateUpdatePackageInAllProjects("MyPackage", expectedVersion);
AddProjectToSolution("MyProject");
CallCreateActions();
Version version = FirstUpdateAction.PackageVersion;
Assert.AreEqual(expectedVersion, version);
}
[Test]
public void CreateActions_SolutionHasOneProjectAndScriptRunnerIsSet_UpdateActionUsesSameScriptRunner()
{
CreateUpdatePackageInAllProjects();
AddProjectToSolution("MyProject");
var expectedRunner = new FakePackageScriptRunner();
updatePackageInAllProjects.PackageScriptRunner = expectedRunner;
CallCreateActions();
IPackageScriptRunner runner = FirstUpdateAction.PackageScriptRunner;
Assert.AreEqual(expectedRunner, runner);
}
[Test]
public void CreateActions_SolutionHasOneProject_UpdateActionDoesNotUpdatePackageIfProjectDoesNotHavePackage()
{
CreateUpdatePackageInAllProjects();
AddProjectToSolution("MyProject");
CallCreateActions();
bool updateIfPackageDoesNotExist = FirstUpdateAction.UpdateIfPackageDoesNotExistInProject;
Assert.IsFalse(updateIfPackageDoesNotExist);
}
[Test]
public void CreateActions_SolutionHasOneProjectAndUpdateDependenciesIsFalse_UpdateActionDoesNotUpdateDependencies()
{
CreateUpdatePackageInAllProjects();
AddProjectToSolution("MyProject");
updatePackageInAllProjects.UpdateDependencies = false;
CallCreateActions();
bool updateDependencies = FirstUpdateAction.UpdateDependencies;
Assert.IsFalse(updateDependencies);
}
[Test]
public void CreateActions_SolutionHasOneProjectAndUpdateDependenciesIsTrue_UpdateActionDoesUpdateDependencies()
{
CreateUpdatePackageInAllProjects();
AddProjectToSolution("MyProject");
updatePackageInAllProjects.UpdateDependencies = true;
CallCreateActions();
bool updateDependencies = FirstUpdateAction.UpdateDependencies;
Assert.IsTrue(updateDependencies);
}
}
}
Loading…
Cancel
Save