support version spec filter
[teamcity/dotNetPackagesSupport.git] / nuget-extensions / nuget-commands / src / NuGetTeamCityListCommand.cs
1 ´╗┐using System;\r
2 using System.Collections.Generic;\r
3 using System.ComponentModel.Composition;\r
4 using System.Linq;\r
5 using System.Linq.Expressions;\r
6 using JetBrains.TeamCity.NuGet.ExtendedCommands.Util;\r
7 using NuGet;\r
8 using NuGet.Commands;\r
9 \r
10 namespace JetBrains.TeamCity.NuGet.ExtendedCommands\r
11 {\r
12   [Command("TeamCity.List", "Lists packages for given Id with parsable output")]\r
13   public class NuGetTeamCityListCommand : Command\r
14   {\r
15     [Import]\r
16     public IPackageRepositoryFactory RepositoryFactory { get; set; }\r
17 \r
18     [Import]\r
19     public IPackageSourceProvider SourceProvider { get; set; }\r
20 \r
21     [Option("NuGet package Source to search for package")]\r
22     public String Source { get; set; }\r
23 \r
24     [Option("Package Id to check for version update")]\r
25     public string Id { get; set; }\r
26 \r
27     [Option("NuGet Version Spec to constraint versions to be checked. Optional")]\r
28     public string Version { get; set; }\r
29 \r
30     public override void ExecuteCommand()\r
31     {\r
32       System.Console.Out.WriteLine("TeamCity NuGet List command.");\r
33       System.Console.Out.WriteLine("Source: {0}", Source ?? "<null>");\r
34       System.Console.Out.WriteLine("Package Id: {0}", Id ?? "<null>");\r
35       System.Console.Out.WriteLine("Version: {0}", Version ?? "<null>");\r
36       \r
37       System.Console.Out.WriteLine("Checking for latest version...");\r
38       foreach (var p in GetPackages())\r
39       {\r
40         var msg = ServiceMessageFormatter.FormatMessage(\r
41           "nuget-package",\r
42           new ServiceMessageProperty("Id", p.Id),\r
43           new ServiceMessageProperty("Version", p.Version.ToString())          \r
44           );\r
45 \r
46         System.Console.Out.WriteLine(msg);\r
47       }\r
48     }\r
49 \r
50     private IEnumerable<IPackage> GetPackages()\r
51     {\r
52       IPackageRepository packageRepository = RepositoryFactory.CreateRepository(Source);\r
53 \r
54       Expression<Func<IPackage, bool>> exp = p => p.Id == Id;\r
55       IQueryable<IPackage> packages = packageRepository\r
56         .GetPackages()\r
57         .Where(exp);\r
58 \r
59       if (string.IsNullOrWhiteSpace(Version)) return packages;\r
60       var versionSpec = VersionUtility.ParseVersionSpec(Version);\r
61       return packages.Where(versionSpec.ToDelegate());\r
62     }\r
63   }\r
64 }\r