refactor to handle multiple projects

This commit is contained in:
Matt Parker
2025-11-03 19:06:13 +10:00
parent 4c0642a75d
commit 29ce4a3db1
4 changed files with 99 additions and 74 deletions

View File

@@ -26,8 +26,7 @@ public partial class NugetPanel : Control
private readonly PackedScene _packageEntryScene = ResourceLoader.Load<PackedScene>("uid://cqc2xlt81ju8s");
private readonly Texture2D _csprojIcon = ResourceLoader.Load<Texture2D>("uid://cqt30ma6xgder");
private IdePackageResult? _selectedPackage;
// we use this to access the project for the dropdown
private List<SharpIdeProjectModel?> _projects = null!;
@@ -81,7 +80,6 @@ public partial class NugetPanel : Control
private async Task OnPackageSelected(IdePackageResult packageResult)
{
_selectedPackage = packageResult;
await _nugetPackageDetails.SetPackage(packageResult);
}
@@ -113,6 +111,7 @@ public partial class NugetPanel : Control
private async Task PopulateSearchResults()
{
return;
var result = await _nugetClientService.GetTop100Results(_solution!.DirectoryPath);
var scenes = result.Select(s =>
{
@@ -135,7 +134,7 @@ public partial class NugetPanel : Control
{
var project = _solution!.AllProjects.First(s => s.Name == "ProjectA");
await project.MsBuildEvaluationProjectTask;
var installedPackages = await ProjectEvaluation.GetPackageReferencesForProject(project);
var installedPackages = await ProjectEvaluation.GetPackageReferencesForProjects([project]);
var idePackageResult = await _nugetClientService.GetPackagesForInstalledPackages(project.ChildNodeBasePath, installedPackages);
var scenes = idePackageResult.Select(s =>
{
@@ -144,7 +143,7 @@ public partial class NugetPanel : Control
scene.PackageSelected += OnPackageSelected;
return scene;
}).ToList();
var transitiveScenes = scenes.Where(s => s.PackageResult.InstalledNugetPackageInfo!.IsTransitive).ToList();
var transitiveScenes = scenes.Where(s => s.PackageResult.InstalledNugetPackageInfo!.ProjectPackageReferences.Any(x => x.IsTransitive)).ToList();
var directScenes = scenes.Except(transitiveScenes).ToList();
await this.InvokeAsync(() =>
{

View File

@@ -52,9 +52,10 @@ public partial class PackageEntry : MarginContainer
if (PackageResult is null) return;
_packageNameLabel.Text = PackageResult.PackageId;
var installedPackagedInfo = PackageResult.InstalledNugetPackageInfo;
if (installedPackagedInfo?.DependentPackages is not null && installedPackagedInfo.IsTransitive)
var isTransitive = installedPackagedInfo?.ProjectPackageReferences.Any(p => p.IsTransitive) ?? false;
if (isTransitive && installedPackagedInfo?.ProjectPackageReferences.Any(p => p.DependentPackages?.Count is not 0) is true)
{
var transitiveOriginsGroupedByVersion = installedPackagedInfo.DependentPackages
var transitiveOriginsGroupedByVersion = installedPackagedInfo.ProjectPackageReferences.SelectMany(s => s.DependentPackages ?? [])
.GroupBy(t => t.RequestedVersion)
.Select(g => new
{
@@ -67,10 +68,10 @@ public partial class PackageEntry : MarginContainer
{string.Join("\n", transitiveOriginsGroupedByVersion.Select(t => $"{t.RequestedVersion.ToString("p", VersionRangeFormatter.Instance)} by {string.Join(", ", t.PackageNames)}"))}
""";
}
_installedVersionLabel.Text = installedPackagedInfo?.IsTransitive is true ? $"({installedPackagedInfo?.Version.ToNormalizedString()})" : installedPackagedInfo?.Version.ToNormalizedString();
_installedVersionLabel.Text = GetInstalledVersionsText(installedPackagedInfo);
var highestVersionPackageFromSource = PackageResult.PackageFromSources
.MaxBy(p => p.PackageSearchMetadata.Identity.Version);
if (installedPackagedInfo?.Version != highestVersionPackageFromSource.PackageSearchMetadata.Identity.Version)
if (installedPackagedInfo?.ProjectPackageReferences.TrueForAll(s => s.InstalledVersion != highestVersionPackageFromSource.PackageSearchMetadata.Identity.Version) is true)
{
_latestVersionLabel.Text = highestVersionPackageFromSource.PackageSearchMetadata.Identity.Version.ToNormalizedString();
}
@@ -94,4 +95,17 @@ public partial class PackageEntry : MarginContainer
_sourceNamesContainer.AddChild(label);
}
}
private string GetInstalledVersionsText(InstalledNugetPackageInfo? packageInfo)
{
if (packageInfo is null) return string.Empty;
var versions = packageInfo.ProjectPackageReferences
.Select(p => p.InstalledVersion.ToNormalizedString())
.Distinct()
.ToList();
var isTransitive = packageInfo.ProjectPackageReferences.Any(p => p.IsTransitive);
var text = isTransitive ? $"({string.Join(", ", versions)})" : string.Join(", ", versions);
return text;
}
}