Browse Source

Open readme.txt when NuGet package is installed.

SharpDevelop will now open the readme.txt file in a NuGet package when
it is explicitly installed or updated. The readme.txt file needs to be
in the root directory of the package. If the NuGet package is being
installed as a dependency of another NuGet package then the readme.txt
will not be opened.
pull/681/head
Matt Ward 10 years ago
parent
commit
da21bcb178
  1. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 6
      src/AddIns/Misc/PackageManagement/Project/Src/InstallPackageAction.cs
  3. 87
      src/AddIns/Misc/PackageManagement/Project/Src/OpenPackageReadmeMonitor.cs
  4. 5
      src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
  5. 6
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageAction.cs
  6. 3
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  7. 2
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs
  8. 41
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableInstallPackageAction.cs
  9. 41
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdatePackageAction.cs
  10. 15
      src/AddIns/Misc/PackageManagement/Test/Src/InstallPackageActionTests.cs
  11. 148
      src/AddIns/Misc/PackageManagement/Test/Src/OpenPackageReadmeMonitorTests.cs
  12. 15
      src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs

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

@ -230,6 +230,7 @@ @@ -230,6 +230,7 @@
<Compile Include="Src\NoPackageSourcesConfiguredException.cs" />
<Compile Include="Src\NuGetExePath.cs" />
<Compile Include="Src\NuGetPackageRestoreCommandLine.cs" />
<Compile Include="Src\OpenPackageReadMeMonitor.cs" />
<Compile Include="Src\PackageLicenseViewModel.cs" />
<Compile Include="Src\PackageManagementServiceProvider.cs" />
<Compile Include="Src\IPackageRepositoryExtensions.cs" />

6
src/AddIns/Misc/PackageManagement/Project/Src/InstallPackageAction.cs

@ -42,8 +42,10 @@ namespace ICSharpCode.PackageManagement @@ -42,8 +42,10 @@ namespace ICSharpCode.PackageManagement
protected override void ExecuteCore()
{
Project.InstallPackage(Package, this);
OnParentPackageInstalled();
using (IDisposable monitor = CreateOpenPackageReadMeMonitor(Package.Id)) {
Project.InstallPackage(Package, this);
OnParentPackageInstalled();
}
}
}
}

87
src/AddIns/Misc/PackageManagement/Project/Src/OpenPackageReadmeMonitor.cs

@ -0,0 +1,87 @@ @@ -0,0 +1,87 @@
// 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 System.IO;
using System.Linq;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public class OpenPackageReadMeMonitor : IDisposable
{
IPackageManagementProject project;
IPackageManagementFileService fileService;
public OpenPackageReadMeMonitor(string packageId, IPackageManagementProject project)
: this(packageId, project, new PackageManagementFileService())
{
}
public OpenPackageReadMeMonitor(
string packageId,
IPackageManagementProject project,
IPackageManagementFileService fileService)
{
PackageId = packageId;
this.project = project;
this.fileService = fileService;
project.PackageInstalled += PackageInstalled;
}
public string PackageId { get; private set; }
public bool IsDisposed { get; private set; }
string ReadMeFile { get; set; }
public void Dispose()
{
if (IsDisposed) {
return;
}
IsDisposed = true;
project.PackageInstalled -= PackageInstalled;
OpenReadMeFile();
}
void PackageInstalled(object sender, PackageOperationEventArgs e)
{
if (e.Package.Id != PackageId) {
return;
}
ReadMeFile = FindReadMeFileInPackage(e.InstallPath, e.Package);
}
string FindReadMeFileInPackage(string installPath, IPackage package)
{
return package.GetFiles()
.Where(file => "readme.txt".Equals(file.Path, StringComparison.OrdinalIgnoreCase))
.Select(file => Path.Combine(installPath, file.Path))
.FirstOrDefault();
}
void OpenReadMeFile()
{
if ((ReadMeFile != null) && fileService.FileExists(ReadMeFile)) {
fileService.OpenFile(ReadMeFile);
}
}
}
}

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

@ -161,5 +161,10 @@ namespace ICSharpCode.PackageManagement @@ -161,5 +161,10 @@ namespace ICSharpCode.PackageManagement
}
return PackageId;
}
protected virtual IDisposable CreateOpenPackageReadMeMonitor(string packageId)
{
return new OpenPackageReadMeMonitor(packageId, Project);
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageAction.cs

@ -47,8 +47,10 @@ namespace ICSharpCode.PackageManagement @@ -47,8 +47,10 @@ namespace ICSharpCode.PackageManagement
protected override void ExecuteCore()
{
if (ShouldUpdatePackage()) {
Project.UpdatePackage(Package, this);
OnParentPackageInstalled();
using (IDisposable monitor = CreateOpenPackageReadMeMonitor(Package.Id)) {
Project.UpdatePackage(Package, this);
OnParentPackageInstalled();
}
}
}

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

@ -123,11 +123,13 @@ @@ -123,11 +123,13 @@
<Compile Include="Src\Helpers\SelectedProjectCollectionAssert.cs" />
<Compile Include="Src\Helpers\SolutionHelper.cs" />
<Compile Include="Src\Helpers\TestableInstalledPackageViewModel.cs" />
<Compile Include="Src\Helpers\TestableInstallPackageAction.cs" />
<Compile Include="Src\Helpers\TestablePackageFromRepository.cs" />
<Compile Include="Src\Helpers\TestablePackagesViewModels.cs" />
<Compile Include="Src\Helpers\TestableProjectBehaviour.cs" />
<Compile Include="Src\Helpers\TestableSelectedProjectsForUpdatedPackages.cs" />
<Compile Include="Src\Helpers\TestableSolutionSnapshot.cs" />
<Compile Include="Src\Helpers\TestableUpdatePackageAction.cs" />
<Compile Include="Src\Helpers\TestableUpdatePackagesAction.cs" />
<Compile Include="Src\Helpers\TestableUpdateSolutionPackagesAction.cs" />
<Compile Include="Src\Helpers\TestPackageHelper.cs" />
@ -190,6 +192,7 @@ @@ -190,6 +192,7 @@
<Compile Include="Src\ManagePackagesUserPromptsTests.cs" />
<Compile Include="Src\NuGetPackageRestoreCommandLineTests.cs" />
<Compile Include="Src\OpenMSBuildProjectsTests.cs" />
<Compile Include="Src\OpenPackageReadMeMonitorTests.cs" />
<Compile Include="Src\PackageManagementServiceProviderTests.cs" />
<Compile Include="Src\PackageViewModelOperationLoggerTests.cs" />
<Compile Include="Src\ReducedPackageOperationsTests.cs" />

2
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs

@ -64,9 +64,11 @@ namespace PackageManagement.Tests.Helpers @@ -64,9 +64,11 @@ namespace PackageManagement.Tests.Helpers
}
public string FileNamePassedToOpenFile;
public bool IsOpenFileCalled;
public void OpenFile(string fileName)
{
IsOpenFileCalled = true;
FileNamePassedToOpenFile = fileName;
}

41
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableInstallPackageAction.cs

@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
// 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 ICSharpCode.PackageManagement;
namespace PackageManagement.Tests.Helpers
{
public class TestableInstallPackageAction : InstallPackageAction
{
public TestableInstallPackageAction(
IPackageManagementProject project,
IPackageManagementEvents packageManagementEvents)
: base(project, packageManagementEvents)
{
}
public OpenPackageReadMeMonitor OpenPackageReadMeMonitor;
protected override IDisposable CreateOpenPackageReadMeMonitor(string packageId)
{
OpenPackageReadMeMonitor = base.CreateOpenPackageReadMeMonitor(packageId) as OpenPackageReadMeMonitor;
return OpenPackageReadMeMonitor;
}
}
}

41
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdatePackageAction.cs

@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
// 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 ICSharpCode.PackageManagement;
namespace PackageManagement.Tests.Helpers
{
public class TestableUpdatePackageAction : UpdatePackageAction
{
public TestableUpdatePackageAction(
IPackageManagementProject project,
IPackageManagementEvents packageManagementEvents)
: base(project, packageManagementEvents)
{
}
public OpenPackageReadMeMonitor OpenPackageReadMeMonitor;
protected override IDisposable CreateOpenPackageReadMeMonitor(string packageId)
{
OpenPackageReadMeMonitor = base.CreateOpenPackageReadMeMonitor(packageId) as OpenPackageReadMeMonitor;
return OpenPackageReadMeMonitor;
}
}
}

15
src/AddIns/Misc/PackageManagement/Test/Src/InstallPackageActionTests.cs

@ -31,14 +31,14 @@ namespace PackageManagement.Tests @@ -31,14 +31,14 @@ namespace PackageManagement.Tests
{
FakePackageManagementEvents fakePackageManagementEvents;
FakePackageManagementProject fakeProject;
InstallPackageAction action;
TestableInstallPackageAction action;
InstallPackageHelper installPackageHelper;
void CreateAction()
{
fakePackageManagementEvents = new FakePackageManagementEvents();
fakeProject = new FakePackageManagementProject();
action = new InstallPackageAction(fakeProject, fakePackageManagementEvents);
action = new TestableInstallPackageAction(fakeProject, fakePackageManagementEvents);
installPackageHelper = new InstallPackageHelper(action);
}
@ -416,5 +416,16 @@ namespace PackageManagement.Tests @@ -416,5 +416,16 @@ namespace PackageManagement.Tests
Assert.AreEqual("Unable to find package 'UnknownId'.", ex.Message);
}
[Test]
public void Execute_PackageInstalledSuccessfully_OpenPackageReadmeMonitorCreated()
{
CreateAction();
installPackageHelper.TestPackage.Id = "Test";
installPackageHelper.InstallTestPackage();
Assert.AreEqual("Test", action.OpenPackageReadMeMonitor.PackageId);
Assert.IsTrue(action.OpenPackageReadMeMonitor.IsDisposed);
}
}
}

148
src/AddIns/Misc/PackageManagement/Test/Src/OpenPackageReadmeMonitorTests.cs

@ -0,0 +1,148 @@ @@ -0,0 +1,148 @@
// 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 System.IO;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design;
using NuGet;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests
{
[TestFixture]
public class OpenPackageReadMeMonitorTests
{
FakeFileService fileService;
FakePackageManagementProject project;
OpenPackageReadMeMonitor CreateMonitor(string packageId)
{
fileService = new FakeFileService(null);
project = new FakePackageManagementProject();
return new OpenPackageReadMeMonitor(packageId, project, fileService);
}
FakePackage CreatePackageWithFile(string packageId, string fileName)
{
var package = new FakePackage(packageId);
package.AddFile(fileName);
return package;
}
PackageOperationEventArgs CreatePackageInstallEventWithFile(string installPath, IPackage package)
{
return new PackageOperationEventArgs(package, null, installPath);
}
[Test]
public void Dispose_PackageInstalledWithReadmeTxt_ReadmeTxtIsOpened()
{
const string installPath = @"d:\projects\myproject\packages\Test.1.2.0";
string expectedFileOpened = Path.Combine(installPath, "readme.txt");
using (IDisposable monitor = CreateMonitor("Test")) {
fileService.ExistingFileNames.Add(expectedFileOpened);
FakePackage package = CreatePackageWithFile("Test", "readme.txt");
PackageOperationEventArgs e = CreatePackageInstallEventWithFile(installPath, package);
project.FirePackageInstalledEvent(e);
}
Assert.AreEqual(expectedFileOpened, fileService.FileNamePassedToOpenFile);
}
[Test]
public void Dispose_PackageDependencyIsInstalledWithReadmeTxt_ReadmeTxtIsNotOpened()
{
const string installPath = @"d:\projects\myproject\packages\Test.Dependency.1.2.0";
string expectedFileOpened = Path.Combine(installPath, "readme.txt");
using (IDisposable monitor = CreateMonitor("Test")) {
fileService.ExistingFileNames.Add(expectedFileOpened);
FakePackage package = CreatePackageWithFile("Test.Dependency", "readme.txt");
PackageOperationEventArgs e = CreatePackageInstallEventWithFile(installPath, package);
project.FirePackageInstalledEvent(e);
}
Assert.IsFalse(fileService.IsOpenFileCalled);
}
[Test]
public void Dispose_PackageInstalledWithoutReadmeTxt_ReadmeTxtIsNotOpened()
{
const string installPath = @"d:\projects\myproject\packages\Test.1.2.0";
string expectedFileOpened = Path.Combine(installPath, "readme.txt");
using (IDisposable monitor = CreateMonitor("Test")) {
fileService.ExistingFileNames.Add(expectedFileOpened);
var package = new FakePackage("Test");
PackageOperationEventArgs e = CreatePackageInstallEventWithFile(installPath, package);
project.FirePackageInstalledEvent(e);
}
Assert.IsFalse(fileService.IsOpenFileCalled);
}
[Test]
public void Dispose_PackageDependencyIsInstalledWithReadmeTxtWithDifferentCase_ReadmeTxtIsOpened()
{
const string installPath = @"d:\projects\myproject\packages\Test.1.2.0";
string expectedFileOpened = Path.Combine(installPath, "ReadMe.TXT");
using (IDisposable monitor = CreateMonitor("Test")) {
fileService.ExistingFileNames.Add(expectedFileOpened);
FakePackage package = CreatePackageWithFile("Test", "ReadMe.TXT");
PackageOperationEventArgs e = CreatePackageInstallEventWithFile(installPath, package);
project.FirePackageInstalledEvent(e);
}
Assert.AreEqual(expectedFileOpened, fileService.FileNamePassedToOpenFile);
}
[Test]
public void Dispose_PackageInstalledWithReadmeTxtButFileDoesNotExistOnFileSystem_ReadmeTxtIsNotOpened()
{
const string installPath = @"d:\projects\myproject\packages\Test.1.2.0";
string readmeFileName = Path.Combine(installPath, "readme.txt");
using (IDisposable monitor = CreateMonitor("Test")) {
FakePackage package = CreatePackageWithFile("Test", "readme.txt");
PackageOperationEventArgs e = CreatePackageInstallEventWithFile(installPath, package);
project.FirePackageInstalledEvent(e);
}
Assert.IsFalse(fileService.IsOpenFileCalled);
}
[Test]
public void Constructor_PackageDependencyIsInstalledWithReadmeTxt_ReadmeTxtIsNotOpenedUntilDisposeIsCalled()
{
const string installPath = @"d:\projects\myproject\packages\Test.1.2.0";
string expectedFileOpened = Path.Combine(installPath, "ReadMe.TXT");
OpenPackageReadMeMonitor monitor = CreateMonitor("Test");
fileService.ExistingFileNames.Add(expectedFileOpened);
FakePackage package = CreatePackageWithFile("Test", "ReadMe.TXT");
PackageOperationEventArgs e = CreatePackageInstallEventWithFile(installPath, package);
project.FirePackageInstalledEvent(e);
Assert.IsFalse(fileService.IsOpenFileCalled);
}
}
}

15
src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs

@ -29,7 +29,7 @@ namespace PackageManagement.Tests @@ -29,7 +29,7 @@ namespace PackageManagement.Tests
[TestFixture]
public class UpdatePackageActionTests
{
UpdatePackageAction action;
TestableUpdatePackageAction action;
FakePackageManagementEvents fakePackageManagementEvents;
FakePackageManagementProject fakeProject;
UpdatePackageHelper updatePackageHelper;
@ -38,7 +38,7 @@ namespace PackageManagement.Tests @@ -38,7 +38,7 @@ namespace PackageManagement.Tests
{
fakePackageManagementEvents = new FakePackageManagementEvents();
fakeProject = new FakePackageManagementProject();
action = new UpdatePackageAction(fakeProject, fakePackageManagementEvents);
action = new TestableUpdatePackageAction(fakeProject, fakePackageManagementEvents);
updatePackageHelper = new UpdatePackageHelper(action);
}
@ -378,5 +378,16 @@ namespace PackageManagement.Tests @@ -378,5 +378,16 @@ namespace PackageManagement.Tests
Assert.AreEqual (packageVersion2, fakeProject.PackagePassedToUpdatePackage);
}
[Test]
public void Execute_PackageUpdatedSuccessfully_OpenPackageReadmeMonitorCreated()
{
CreateSolution();
updatePackageHelper.TestPackage.Id = "Test";
updatePackageHelper.UpdateTestPackage();
Assert.AreEqual("Test", action.OpenPackageReadMeMonitor.PackageId);
Assert.IsTrue(action.OpenPackageReadMeMonitor.IsDisposed);
}
}
}

Loading…
Cancel
Save