diff --git a/src/OpenWrap.Commands/CommandDocumentation.resx b/src/OpenWrap.Commands/CommandDocumentation.resx
index 8223091c..99f9839a 100644
--- a/src/OpenWrap.Commands/CommandDocumentation.resx
+++ b/src/OpenWrap.Commands/CommandDocumentation.resx
@@ -253,6 +253,9 @@ Note that the NuPack support is only provided for backward compatibility with le
Lists or queries all packages in a repository.
+
+ Displays package description if present.
+
Specifies the wildcard to be used when listing packages in a repository.
diff --git a/src/OpenWrap.Commands/OpenWrap.Commands.csproj b/src/OpenWrap.Commands/OpenWrap.Commands.csproj
index 0d4d5276..b3fdc0be 100644
--- a/src/OpenWrap.Commands/OpenWrap.Commands.csproj
+++ b/src/OpenWrap.Commands/OpenWrap.Commands.csproj
@@ -65,6 +65,7 @@
+
diff --git a/src/OpenWrap.Commands/Wrap/ListWrapCommand.cs b/src/OpenWrap.Commands/Wrap/ListWrapCommand.cs
index a5290c85..f7fd75e4 100644
--- a/src/OpenWrap.Commands/Wrap/ListWrapCommand.cs
+++ b/src/OpenWrap.Commands/Wrap/ListWrapCommand.cs
@@ -5,6 +5,8 @@
using OpenWrap.Collections;
using OpenWrap.Commands.Remote;
using OpenWrap.Configuration;
+using OpenWrap.PackageManagement;
+using OpenWrap.PackageModel;
using OpenWrap.Repositories;
using OpenWrap.Runtime;
using OpenWrap.Services;
@@ -20,6 +22,9 @@ public class ListWrapCommand : WrapCommand
[CommandInput]
public bool System { get; set; }
+ [CommandInput(IsValueRequired = false)]
+ public bool Detailed { get; set; }
+
string _remote;
bool _remoteSet;
@@ -44,10 +49,17 @@ public override IEnumerable Execute()
yield break;
}
- foreach (var m in PackageManager.ListPackages(repoToList, Query))
+ var currentPackages = CurrentPackages();
+
+ foreach (var m in PackageManager.ListPackages(repoToList, Query, Detailed ? PackageListOptions.Detailed : PackageListOptions.Default, currentPackages))
yield return ToOutput(m);
}
+ IEnumerable CurrentPackages()
+ {
+ return HostEnvironment.ProjectRepository != null ? HostEnvironment.ProjectRepository.PackagesByName.NotNull().SelectMany(x => x) : Enumerable.Empty();
+ }
+
IEnumerable GetRepositoryToList()
{
if (System)
diff --git a/src/OpenWrap.Commands/Wrap/ViewWrapCommand.cs b/src/OpenWrap.Commands/Wrap/ViewWrapCommand.cs
new file mode 100644
index 00000000..7dea07a2
--- /dev/null
+++ b/src/OpenWrap.Commands/Wrap/ViewWrapCommand.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using OpenWrap.PackageManagement;
+using OpenWrap.PackageModel;
+
+namespace OpenWrap.Commands.Wrap
+{
+ [Command(Noun = "wrap", Verb = "view")]
+ public class ViewWrapCommand : WrapCommand
+ {
+ bool? _project;
+
+ [CommandInput(IsRequired = true, Position = 0)]
+ public string Name { get; set; }
+
+ [CommandInput]
+ public Version Version { get; set; }
+
+ [CommandInput]
+ public bool System { get; set; }
+
+ [CommandInput]
+ public bool Project
+ {
+ get { return _project ?? !System; }
+ set { _project = value; }
+ }
+
+ public override IEnumerable Execute()
+ {
+ return Either(VerifyInputs()).Or(ExecuteCore());
+ }
+
+ IEnumerable ExecuteCore()
+ {
+ IPackageInfo item = null;
+
+ if ( System )
+ {
+ item = PackageInfo(HostEnvironment.SystemRepository.PackagesByName[Name]);
+ }
+ if (Project)
+ {
+ item = PackageInfo(HostEnvironment.ProjectRepository.PackagesByName[Name]);
+ }
+
+ if (item == null)
+ yield return new Error("No package found named {1}", Name);
+ else
+ yield return new ViewWrapCommandOutput(item);
+ }
+
+ IEnumerable VerifyInputs()
+ {
+ if (System && !HostEnvironment.SystemRepository.PackagesByName[Name].Any())
+ yield return new Error("Cannot find package named '{0}' in system repository.", Name);
+ if (Project && HostEnvironment.ProjectRepository == null)
+ yield return new Error("Not in a package directory.");
+ if (Project && HostEnvironment.ProjectRepository != null && !HostEnvironment.ProjectRepository.PackagesByName[Name].Any())
+ yield return new Error("Cannot find package named '{0}' in project repository.", Name);
+ }
+
+ IPackageInfo PackageInfo(IEnumerable packageInfos)
+ {
+ if (Version != null)
+ return packageInfos.OrderByDescending(x => x.Version).FirstOrDefault(x => x.Version.Major.Equals(Version.Major) && x.Version.Major.Equals(Version.Major));
+
+ return packageInfos.Last();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/OpenWrap.Tests/Commands/Wrap/listWrapCommand.cs b/src/OpenWrap.Tests/Commands/Wrap/listWrapCommand.cs
index c4c27d24..dcd694b2 100644
--- a/src/OpenWrap.Tests/Commands/Wrap/listWrapCommand.cs
+++ b/src/OpenWrap.Tests/Commands/Wrap/listWrapCommand.cs
@@ -68,5 +68,63 @@ public void packages_are_found_in_any_remote()
.Check(x => x.ShouldHaveAtLeastOne(n => n.Name.Equals("ring-of-power")));
}
}
+ public class listing_packages_with_detailed_option : command_context
+ {
+ public listing_packages_with_detailed_option()
+ {
+ given_project_package("one-ring", "1.1", "desc 1.1");
+ given_project_package("sauron", "2.0");
+ given_dependency("depends: one-ring");
+ given_dependency("depends: sauron");
+ when_executing_command("one*", "-detailed");
+ }
+ [Test]
+ public void correct_description_is_returned()
+ {
+ Results.OfType()
+ .ShouldHaveCountOf(1)
+ .First().ToString().ShouldContain("desc 1.1");
+ }
+ }
+
+ public class listing_packages_will_hightlight_current : command_context
+ {
+ public listing_packages_will_hightlight_current()
+ {
+ given_project_package("one-ring", "1.0");
+ given_remote_package("one-ring", "1.0".ToVersion());
+ given_remote_package("one-ring", "1.1".ToVersion());
+ given_remote_package("one-ring-rules-them-all", "1.1".ToVersion());
+ given_project_package("sauron", "2.0");
+ given_dependency("depends: one-ring");
+ given_dependency("depends: sauron");
+
+ when_executing_command("*n*", "-remote");
+ }
+ [Test]
+ public void correct_version_is_highlighted()
+ {
+ var s = Results.OfType()
+ .ShouldHaveCountOf(2)
+ .First().ToString();
+ Console.WriteLine(s);
+ s.ShouldContain("current: 1.0");
+ }
+
+ [Test]
+ public void current_version_is_still_listed_as_available()
+ {
+ Results.OfType()
+ .ShouldHaveCountOf(2)
+ .First().ToString().ShouldContain("available: 1.0, 1.1");
+ }
+ [Test]
+ public void current_version_list_only_for_installed_package()
+ {
+ Results.OfType()
+ .ShouldHaveCountOf(2)
+ .ElementAt(1).ToString().ShouldNotContain("current: ");
+ }
+ }
}
diff --git a/src/OpenWrap.Tests/Commands/Wrap/viewWrapCommand.cs b/src/OpenWrap.Tests/Commands/Wrap/viewWrapCommand.cs
new file mode 100644
index 00000000..4121b7b2
--- /dev/null
+++ b/src/OpenWrap.Tests/Commands/Wrap/viewWrapCommand.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Linq;
+using NUnit.Framework;
+using OpenWrap.Commands.contexts;
+using OpenWrap.Commands.Wrap;
+using OpenWrap.PackageManagement;
+using OpenWrap.Testing;
+
+namespace viewWrap_specs
+{
+ public class viewing_a_package : command_context
+ {
+ public viewing_a_package()
+ {
+ given_project_package("one-ring", "1.0", string.Empty, "depends: sauron 2.0");
+ given_project_package("sauron", "2.0");
+
+ when_executing_command("one-ring");
+ }
+ [Test]
+ public void matching_package_is_returned()
+ {
+ var s = Results.OfType()
+ .ShouldHaveCountOf(1)
+ .First().ToString();
+ Console.WriteLine(s);
+ s.ShouldContain("name: one-ring");
+ }
+ [Test]
+ public void displays_dependencies()
+ {
+ Results.OfType()
+ .ShouldHaveCountOf(1)
+ .First().ToString().ShouldContain("dependencies: sauron 2.0");
+ }
+
+ }
+
+ public class viewing_a_package_version : command_context
+ {
+ public viewing_a_package_version()
+ {
+ given_project_package("one-ring", "0.1.0");
+ given_project_package("one-ring", "0.1.1");
+ given_project_package("sauron", "2.0");
+
+ when_executing_command("one-ring", "-version", "0.1");
+ }
+ [Test]
+ public void matching_package_is_returned()
+ {
+ Results.OfType()
+ .ShouldHaveCountOf(1)
+ .First().ToString().ShouldContain("version: 0.1.1");
+ }
+ }
+
+ public class viewing_a_system_package : command_context
+ {
+ public viewing_a_system_package()
+ {
+ given_project_package("one-ring", "1.0");
+ given_system_package("one-ring", "1.0");
+ given_system_package("one-ring", "2.0");
+
+ when_executing_command("one-ring", "-system");
+ }
+ [Test]
+ public void matching_package_is_returned()
+ {
+ Results.OfType()
+ .ShouldHaveCountOf(1)
+ .First().ToString().ShouldContain("version: 2.0");
+ }
+ }
+}
diff --git a/src/OpenWrap.Tests/Commands/add_wrap/hooks/successful_add_triggers_dependent_removal.cs b/src/OpenWrap.Tests/Commands/add_wrap/hooks/successful_add_triggers_dependent_removal.cs
index 094f3b6d..1b5544a1 100644
--- a/src/OpenWrap.Tests/Commands/add_wrap/hooks/successful_add_triggers_dependent_removal.cs
+++ b/src/OpenWrap.Tests/Commands/add_wrap/hooks/successful_add_triggers_dependent_removal.cs
@@ -12,7 +12,7 @@ class successful_add_triggers_dependent_removal : contexts.add_wrap_with_hooks
public successful_add_triggers_dependent_removal()
{
given_project_repository();
- given_project_package("one-ring", "1.0.0", "depends: fire = 1.0");
+ given_project_package("one-ring", "1.0.0", string.Empty, "depends: fire = 1.0");
given_project_package("fire", "1.0");
given_dependency("depends: one-ring");
diff --git a/src/OpenWrap.Tests/Commands/contexts/command_context.cs b/src/OpenWrap.Tests/Commands/contexts/command_context.cs
index 6598a59f..be4d5786 100644
--- a/src/OpenWrap.Tests/Commands/contexts/command_context.cs
+++ b/src/OpenWrap.Tests/Commands/contexts/command_context.cs
@@ -77,7 +77,13 @@ protected void given_dependency(string dependency)
protected void given_project_package(string name, string version, params string[] dependencies)
{
given_project_repository(new InMemoryRepository("Project repository"));
- AddPackage(Environment.ProjectRepository, name, version, dependencies);
+ AddPackage(Environment.ProjectRepository, name, version, dependencies, string.Empty);
+ }
+
+ protected void given_project_package(string name, string version, string description, params string[] dependencies)
+ {
+ given_project_repository(new InMemoryRepository("Project repository"));
+ AddPackage(Environment.ProjectRepository, name, version, dependencies, description);
}
protected void given_project_repository()
@@ -99,20 +105,21 @@ protected void given_current_directory_repository(CurrentDirectoryRepository rep
protected void given_remote_package(string name, Version version, params string[] dependencies)
{
// note Version is a version type because of overload resolution...
- AddPackage(Environment.RemoteRepository, name, version.ToString(), dependencies);
+ AddPackage(Environment.RemoteRepository, name, version.ToString(), dependencies, string.Empty);
}
protected void given_remote_package(string repositoryName, string name, Version version, params string[] dependencies)
{
- AddPackage(Environment.RemoteRepositories.First(x=>x.Name == repositoryName), name, version.ToString(), dependencies);
+ AddPackage(Environment.RemoteRepositories.First(x => x.Name == repositoryName), name, version.ToString(), dependencies, string.Empty);
}
protected void given_system_package(string name, string version, params string[] dependencies)
{
- AddPackage(Environment.SystemRepository, name, version, dependencies);
+ AddPackage(Environment.SystemRepository, name, version, dependencies, string.Empty);
}
- static void AddPackage(IPackageRepository repository, string name, string version, string[] dependencies)
+
+ static void AddPackage(IPackageRepository repository, string name, string version, string[] dependencies, string description)
{
if (repository is InMemoryRepository)
{
@@ -121,6 +128,7 @@ static void AddPackage(IPackageRepository repository, string name, string versio
Name = name,
Source = repository,
Version = version.ToVersion(),
+ Description = description,
Dependencies = dependencies.SelectMany(x => DependsParser.ParseDependsInstruction(x).Dependencies).ToList()
});
return;
@@ -140,7 +148,7 @@ protected void given_currentdirectory_package(string packageName, string version
protected void given_currentdirectory_package(string packageName, Version version, params string[] dependencies)
{
if (Environment.CurrentDirectoryRepository is InMemoryRepository)
- AddPackage(Environment.CurrentDirectoryRepository, packageName, version.ToString(), dependencies);
+ AddPackage(Environment.CurrentDirectoryRepository, packageName, version.ToString(), dependencies,string.Empty);
else
{
var localFile = Environment.CurrentDirectory.GetFile(PackageNameUtility.PackageFileName(packageName, version.ToString())).MustExist();
diff --git a/src/OpenWrap.Tests/OpenWrap.Tests.csproj b/src/OpenWrap.Tests/OpenWrap.Tests.csproj
index ebd70359..95e8b7a2 100644
--- a/src/OpenWrap.Tests/OpenWrap.Tests.csproj
+++ b/src/OpenWrap.Tests/OpenWrap.Tests.csproj
@@ -135,7 +135,9 @@
-
+
+
+
@@ -150,7 +152,6 @@
-
@@ -190,9 +191,7 @@
..\..\..\..\..\..\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\Microsoft.Build.Engine.dll
-
- False
- false
+
..\..\lib\nunit-2.5.5\nunit.framework.dll
diff --git a/src/OpenWrap/OpenWrap.csproj b/src/OpenWrap/OpenWrap.csproj
index 29fe8698..15934c3c 100644
--- a/src/OpenWrap/OpenWrap.csproj
+++ b/src/OpenWrap/OpenWrap.csproj
@@ -127,6 +127,7 @@
+
diff --git a/src/OpenWrap/PackageManagement/DefaultPackageManager.cs b/src/OpenWrap/PackageManagement/DefaultPackageManager.cs
index 25aa9a14..cb45aa6d 100644
--- a/src/OpenWrap/PackageManagement/DefaultPackageManager.cs
+++ b/src/OpenWrap/PackageManagement/DefaultPackageManager.cs
@@ -255,9 +255,9 @@ public IPackageCleanResult CleanSystemPackages(IPackageRepository systemReposito
return new PackageCleanResultIterator(CleanSystemPackagesCore(toClean, x => packageName.EqualsNoCase(packageName)));
}
- public IPackageListResult ListPackages(IEnumerable repositories, string query = null, PackageListOptions options = PackageListOptions.Default)
+ public IPackageListResult ListPackages(IEnumerable repositories, string query = null, PackageListOptions options = PackageListOptions.Default, IEnumerable currentPackages = null)
{
- return new PackageListResultIterator(ListPackagesCore(repositories, query));
+ return new PackageListResultIterator(ListPackagesCore(repositories, query, options, currentPackages));
}
public IPackageRemoveResult RemoveProjectPackage(PackageRequest packageToRemove,
@@ -377,7 +377,7 @@ static IPackageInfo GetExistingPackage(ISupportPublishing destinationRepository,
: null;
}
- static IEnumerable ListPackagesCore(IEnumerable repositories, string query)
+ static IEnumerable ListPackagesCore(IEnumerable repositories, string query, PackageListOptions options, IEnumerable list)
{
var packages = repositories.SelectMany(x => x.PackagesByName.NotNull());
if (query != null)
@@ -386,7 +386,7 @@ static IEnumerable ListPackagesCore(IEnumerable queryRegex.IsMatch(x.Key));
}
foreach (var x in packages)
- yield return new PackageFoundResult(x);
+ yield return new PackageFoundResult(x, options, list ?? Enumerable.Empty());
}
static PackageOperationResult PackageConflict(ResolvedPackage resolvedPackage)
diff --git a/src/OpenWrap/PackageManagement/IPackageManager.cs b/src/OpenWrap/PackageManagement/IPackageManager.cs
index 0eca72d6..7eabd0be 100644
--- a/src/OpenWrap/PackageManagement/IPackageManager.cs
+++ b/src/OpenWrap/PackageManagement/IPackageManager.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Linq;
using OpenWrap.PackageModel;
using OpenWrap.Repositories;
@@ -54,7 +55,7 @@ IPackageCleanResult CleanProjectPackages(IEnumerable project
IPackageCleanResult CleanSystemPackages(IPackageRepository systemRepository, PackageCleanOptions options = PackageCleanOptions.Default);
IPackageCleanResult CleanSystemPackages(IPackageRepository systemRepository, string packageName, PackageCleanOptions options = PackageCleanOptions.Default);
- IPackageListResult ListPackages(IEnumerable repositories, string query = null, PackageListOptions options = PackageListOptions.Default);
+ IPackageListResult ListPackages(IEnumerable repositories, string query = null, PackageListOptions options = PackageListOptions.Default, IEnumerable currentPackages = null);
event PackageUpdated PackageUpdated;
event PackageChanged PackageAdded;
diff --git a/src/OpenWrap/PackageManagement/PackageFoundCommandOutput.cs b/src/OpenWrap/PackageManagement/PackageFoundCommandOutput.cs
index cfea3dee..bc3162f5 100644
--- a/src/OpenWrap/PackageManagement/PackageFoundCommandOutput.cs
+++ b/src/OpenWrap/PackageManagement/PackageFoundCommandOutput.cs
@@ -1,5 +1,7 @@
-using System.Linq;
+using System;
+using System.Linq;
using OpenWrap.Commands;
+using OpenWrap.PackageModel;
namespace OpenWrap.PackageManagement
{
@@ -8,7 +10,7 @@ public class PackageFoundCommandOutput : GenericMessage
readonly PackageFoundResult _result;
public PackageFoundCommandOutput(PackageFoundResult result)
- : base(" - {0} (available: {1})", result.Name, result.Packages.Select(x => x.Version + (x.Nuked ? " [nuked]" : string.Empty)).Join(", "))
+ : base(string.Empty)
{
_result = result;
}
@@ -17,5 +19,36 @@ public string Name
{
get { return _result.Name; }
}
+
+ public override string ToString()
+ {
+ var versionInfo = _result.Packages.Select(x => x.Version + (x.Nuked ? " [nuked]" : string.Empty)).Join(", ");
+ var detailedInfo = shouldShowDescription() ? description() : string.Empty;
+
+ var currentInfo = CurrentInfo();
+
+ return string.Format(" - {0} {2}({3}available: {1})", Name, versionInfo, detailedInfo, currentInfo);
+ }
+
+ string CurrentInfo()
+ {
+ var item = _result.CurrentPackages.Where(x => x.Name.Equals(Name)).LastOrDefault();
+
+ if (item == null)
+ return string.Empty;
+
+ return string.Format("current: {0} ", item.Version);
+ }
+
+ string description()
+ {
+ var description = _result.Packages.Last().Description;
+ return !string.IsNullOrEmpty(description) ? string.Format("\r\n{0}\r\n", description) : string.Empty;
+ }
+
+ bool shouldShowDescription()
+ {
+ return _result.Options.Equals(PackageListOptions.Detailed);
+ }
}
}
\ No newline at end of file
diff --git a/src/OpenWrap/PackageManagement/PackageFoundResult.cs b/src/OpenWrap/PackageManagement/PackageFoundResult.cs
index a7ad198c..38592d10 100644
--- a/src/OpenWrap/PackageManagement/PackageFoundResult.cs
+++ b/src/OpenWrap/PackageManagement/PackageFoundResult.cs
@@ -8,14 +8,18 @@ namespace OpenWrap.PackageManagement
{
public class PackageFoundResult : PackageOperationResult
{
- public PackageFoundResult(IGrouping packageInfos)
+ public PackageFoundResult(IGrouping packageInfos, PackageListOptions options, IEnumerable currentPackages)
{
+ Options = options;
+ CurrentPackages = currentPackages;
Name = packageInfos.Key;
Packages = packageInfos.ToList();
}
public string Name { get; private set; }
public List Packages { get; set; }
+ public PackageListOptions Options { get; private set; }
+ public IEnumerable CurrentPackages { get; set; }
public override bool Success
{
diff --git a/src/OpenWrap/PackageManagement/PackageListOptions.cs b/src/OpenWrap/PackageManagement/PackageListOptions.cs
index d8e97d01..af82a01a 100644
--- a/src/OpenWrap/PackageManagement/PackageListOptions.cs
+++ b/src/OpenWrap/PackageManagement/PackageListOptions.cs
@@ -5,6 +5,7 @@ namespace OpenWrap.PackageManagement
[Flags]
public enum PackageListOptions
{
- Default
+ Default,
+ Detailed
}
}
\ No newline at end of file
diff --git a/src/OpenWrap/PackageManagement/ViewWrapCommandOutput.cs b/src/OpenWrap/PackageManagement/ViewWrapCommandOutput.cs
new file mode 100644
index 00000000..cadf84c8
--- /dev/null
+++ b/src/OpenWrap/PackageManagement/ViewWrapCommandOutput.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Linq;
+using OpenWrap.Commands;
+using OpenWrap.PackageModel;
+
+namespace OpenWrap.PackageManagement
+{
+ public class ViewWrapCommandOutput : GenericMessage
+ {
+ readonly IPackageInfo _result;
+
+ public ViewWrapCommandOutput(IPackageInfo result) : base(string.Empty)
+ {
+ _result = result;
+ }
+
+ public override string ToString()
+ {
+ return string.Format("name: {0} \r\ndescription: {1} \r\nversion: {2}\r\ndependencies: {3}",
+ _result.Name,
+ _result.Description,
+ _result.Version,
+ _result.Dependencies.Select(x => x.ToString()).Join(", "));
+ }
+ }
+}
\ No newline at end of file