/// <summary> /// Get the view of PowerShellPackage. Used for Get-Package -Updates command. /// </summary> internal static PowerShellUpdatePackage GetPowerShellPackageUpdateView(IPackageSearchMetadata data, NuGetVersion version, VersionType versionType, NuGetProject project) { var package = new PowerShellUpdatePackage() { Id = data.Identity.Id, Description = data.Summary, ProjectName = project.GetMetadata <string> (NuGetProjectMetadataKeys.Name), AsyncLazyVersions = new AsyncLazy <IEnumerable <NuGetVersion> > (async delegate { var versions = (await data.GetVersionsAsync()) ?? Enumerable.Empty <VersionInfo> (); var results = versions.Select(v => v.Version).OrderByDescending(v => v) .Where(r => r > version) .ToArray(); return(results); }), LicenseUrl = data.LicenseUrl?.AbsoluteUri }; switch (versionType) { case VersionType.Updates: package.AllVersions = true; break; case VersionType.Latest: package.AllVersions = false; break; default: Debug.Fail("Unexpected version type passed."); break; } return(package); }
/// <summary> /// Output package updates to current project(s) found from the current remote source /// </summary> /// <param name="packagesToDisplay"></param> private async Task WriteUpdatePackagesFromRemoteSourceAsync(NuGetProject project) { var installedPackages = await project.GetInstalledPackagesAsync(Token); installedPackages = installedPackages.Where(p => !IsAutoReferenced(p)); VersionType versionType; if (CollapseVersions) { versionType = VersionType.Latest; } else { versionType = VersionType.Updates; } var projectHasUpdates = false; var metadataTasks = installedPackages.Select(installedPackage => Task.Run(async() => { var metadata = await GetLatestPackageFromRemoteSourceAsync(installedPackage.PackageIdentity, IncludePrerelease.IsPresent); if (metadata != null) { await metadata.GetVersionsAsync(); } return(metadata); })); foreach (var task in installedPackages.Zip(metadataTasks, (p, t) => Tuple.Create(t, p))) { var metadata = await task.Item1; if (metadata != null) { var package = PowerShellUpdatePackage.GetPowerShellPackageUpdateView(metadata, task.Item2.PackageIdentity.Version, versionType, project); var versions = package.Versions ?? Enumerable.Empty <NuGetVersion>(); if (versions.Any()) { projectHasUpdates = true; WriteObject(package); } } } if (!projectHasUpdates) { LogCore(MessageLevel.Info, string.Format(CultureInfo.CurrentCulture, Resources.Cmdlet_NoPackageUpdates, project.GetMetadata <string>(NuGetProjectMetadataKeys.Name))); } }
/// <summary> /// Gets package updates for the project found from the current remote source /// </summary> async Task <IEnumerable <PowerShellUpdatePackage> > GetUpdatePackagesFromRemoteSourceAsync(Project project) { var installedPackages = await project.GetInstalledPackagesAsync(Token); installedPackages = installedPackages.Where(p => !IsAutoReferenced(p)); VersionType versionType; if (CollapseVersions) { versionType = VersionType.Latest; } else { versionType = VersionType.Updates; } var packages = new List <PowerShellUpdatePackage> (); var metadataTasks = installedPackages.Select(installedPackage => Task.Run(async() => { var metadata = await GetLatestPackageFromRemoteSourceAsync(installedPackages, installedPackage.PackageIdentity, IncludePrerelease.IsPresent); if (metadata != null) { await metadata.GetVersionsAsync(); } return(metadata); })); foreach (var task in installedPackages.Zip(metadataTasks, (p, t) => Tuple.Create(t, p))) { var metadata = await task.Item1; if (metadata != null) { var package = PowerShellUpdatePackage.GetPowerShellPackageUpdateView(metadata, task.Item2.PackageIdentity.Version, versionType, project.Name); var versions = package.Versions ?? Enumerable.Empty <NuGetVersion> (); if (versions.Any()) { packages.Add(package); } } } return(packages); }
/// <summary> /// Get the view of PowerShellPackage. Used for Get-Package -Updates command. /// </summary> /// <param name="data"></param> /// <param name="version"></param> /// <param name="versionType"></param> /// <returns></returns> internal static PowerShellUpdatePackage GetPowerShellPackageUpdateView(PSSearchMetadata data, NuGetVersion version, VersionType versionType, NuGetProject project) { PowerShellUpdatePackage package = new PowerShellUpdatePackage(); package.Id = data.Identity.Id; package.Description = data.Summary; package.ProjectName = project.GetMetadata <string>(NuGetProjectMetadataKeys.Name); switch (versionType) { case VersionType.updates: { package.Versions = data.Versions.Where(p => p > version).OrderByDescending(v => v); if (package.Versions != null && package.Versions.Any()) { LegacyNuGet.SemanticVersion sVersion; LegacyNuGet.SemanticVersion.TryParse(package.Versions.FirstOrDefault().ToNormalizedString(), out sVersion); package.Version = sVersion; } } break; case VersionType.latest: { NuGetVersion nVersion = data.Versions.Where(p => p > version).OrderByDescending(v => v).FirstOrDefault(); if (nVersion != null) { package.Versions = new List <NuGetVersion>() { nVersion }; LegacyNuGet.SemanticVersion sVersion; LegacyNuGet.SemanticVersion.TryParse(nVersion.ToNormalizedString(), out sVersion); package.Version = sVersion; } } break; } return(package); }
private void WritePackages(Dictionary <PSSearchMetadata, NuGetVersion> remoteUpdates, VersionType versionType, NuGetProject project) { List <PowerShellUpdatePackage> view = new List <PowerShellUpdatePackage>(); foreach (KeyValuePair <PSSearchMetadata, NuGetVersion> pair in remoteUpdates) { PowerShellUpdatePackage package = PowerShellUpdatePackage.GetPowerShellPackageUpdateView(pair.Key, pair.Value, versionType, project); if (package.Versions != null && package.Versions.Any()) { view.Add(package); } } if (view.Any()) { WriteObject(view, enumerateCollection: true); } else { LogCore(MessageLevel.Info, string.Format(Resources.Cmdlet_NoPackageUpdates, project.GetMetadata <string>(NuGetProjectMetadataKeys.Name))); } }
/// <summary> /// Get the view of PowerShellPackage. Used for Get-Package -Updates command. /// </summary> /// <param name="data"></param> /// <param name="version"></param> /// <param name="versionType"></param> /// <returns></returns> internal static PowerShellUpdatePackage GetPowerShellPackageUpdateView(PSSearchMetadata data, NuGetVersion version, VersionType versionType, NuGetProject project) { PowerShellUpdatePackage package = new PowerShellUpdatePackage(); package.Id = data.Identity.Id; package.Description = data.Summary; package.ProjectName = project.GetMetadata<string>(NuGetProjectMetadataKeys.Name); switch (versionType) { case VersionType.updates: { package.Versions = data.Versions.Where(p => p > version).OrderByDescending(v => v); if (package.Versions != null && package.Versions.Any()) { LegacyNuGet.SemanticVersion sVersion; LegacyNuGet.SemanticVersion.TryParse(package.Versions.FirstOrDefault().ToNormalizedString(), out sVersion); package.Version = sVersion; } } break; case VersionType.latest: { NuGetVersion nVersion = data.Versions.Where(p => p > version).OrderByDescending(v => v).FirstOrDefault(); if (nVersion != null) { package.Versions = new List<NuGetVersion>() { nVersion }; LegacyNuGet.SemanticVersion sVersion; LegacyNuGet.SemanticVersion.TryParse(nVersion.ToNormalizedString(), out sVersion); package.Version = sVersion; } } break; } return package; }