fix non-transitive for solution

This commit is contained in:
Matt Parker
2025-11-03 19:39:50 +10:00
parent d67219cd60
commit e105038cf0
3 changed files with 23 additions and 12 deletions

View File

@@ -9,7 +9,7 @@ using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
namespace SharpIDE.Application.Features.Nuget; namespace SharpIDE.Application.Features.Nuget;
public record InstalledNugetPackageInfo(bool IsTransitive, List<ProjectPackageReference> ProjectPackageReferences); public record InstalledNugetPackageInfo(bool IsPrimarilyTransitive, List<ProjectPackageReference> ProjectPackageReferences);
public record IdePackageResult(string PackageId, List<IdePackageFromSourceResult> PackageFromSources, InstalledNugetPackageInfo? InstalledNugetPackageInfo); public record IdePackageResult(string PackageId, List<IdePackageFromSourceResult> PackageFromSources, InstalledNugetPackageInfo? InstalledNugetPackageInfo);
public record struct IdePackageFromSourceResult(IPackageSearchMetadata PackageSearchMetadata, PackageSource Source); public record struct IdePackageFromSourceResult(IPackageSearchMetadata PackageSearchMetadata, PackageSource Source);
public class NugetClientService public class NugetClientService
@@ -118,8 +118,8 @@ public class NugetClientService
var packagesResult = new List<IdePackageResult>(); var packagesResult = new List<IdePackageResult>();
foreach (var installedPackage in installedPackages) foreach (var installedPackage in installedPackages)
{ {
var isTransitive = installedPackage.ProjectPackageReferences.Any(p => p.IsTransitive); var isPrimarilyTransitive = installedPackage.ProjectPackageReferences.Any(p => p.IsTransitive is false) is false;
var installedNugetPackageInfo = new InstalledNugetPackageInfo(isTransitive, installedPackage.ProjectPackageReferences); var installedNugetPackageInfo = new InstalledNugetPackageInfo(isPrimarilyTransitive, installedPackage.ProjectPackageReferences);
var idePackageResult = new IdePackageResult(installedPackage.Name, [], installedNugetPackageInfo); var idePackageResult = new IdePackageResult(installedPackage.Name, [], installedNugetPackageInfo);
foreach (var source in packageSources) foreach (var source in packageSources)

View File

@@ -73,8 +73,8 @@ public partial class NugetPanel : Control
if (_solution is null) throw new InvalidOperationException("Solution is null but should not be"); if (_solution is null) throw new InvalidOperationException("Solution is null but should not be");
_ = Task.GodotRun(() => SetSolutionOrProjectNameLabels(slnOrProject)); _ = Task.GodotRun(() => SetSolutionOrProjectNameLabels(slnOrProject));
_ = Task.GodotRun(() => SetDetailsProjects(slnOrProject)); _ = Task.GodotRun(() => SetDetailsProjects(slnOrProject));
_ = Task.GodotRun(() => PopulateInstalledPackages(slnOrProject));
_ = Task.GodotRun(PopulateSearchResults); _ = Task.GodotRun(PopulateSearchResults);
_ = Task.GodotRun(PopulateInstalledPackages);
}); });
} }
@@ -130,12 +130,23 @@ public partial class NugetPanel : Control
}); });
} }
private async Task PopulateInstalledPackages() private async Task PopulateInstalledPackages(ISolutionOrProject slnOrProject)
{ {
var project = _solution!.AllProjects.First(s => s.Name == "ProjectA"); var msbuildEvalTask = slnOrProject switch
await project.MsBuildEvaluationProjectTask; {
var installedPackages = await ProjectEvaluation.GetPackageReferencesForProjects([project]); SharpIdeSolutionModel solutionModel => (Task)Task.WhenAll(solutionModel.AllProjects.Select(s => s.MsBuildEvaluationProjectTask)),
var idePackageResult = await _nugetClientService.GetPackagesForInstalledPackages(project.ChildNodeBasePath, installedPackages); SharpIdeProjectModel projectModel => (Task)projectModel.MsBuildEvaluationProjectTask,
_ => throw new InvalidOperationException("Unknown solution or project type")
};
await msbuildEvalTask;
var projects = slnOrProject switch
{
SharpIdeSolutionModel solutionModel => solutionModel.AllProjects.ToList(),
SharpIdeProjectModel projectModel => [projectModel],
_ => throw new InvalidOperationException("Unknown solution or project type")
};
var installedPackages = await ProjectEvaluation.GetPackageReferencesForProjects(projects);
var idePackageResult = await _nugetClientService.GetPackagesForInstalledPackages(slnOrProject.DirectoryPath, installedPackages);
var scenes = idePackageResult.Select(s => var scenes = idePackageResult.Select(s =>
{ {
var scene = _packageEntryScene.Instantiate<PackageEntry>(); var scene = _packageEntryScene.Instantiate<PackageEntry>();
@@ -143,7 +154,7 @@ public partial class NugetPanel : Control
scene.PackageSelected += OnPackageSelected; scene.PackageSelected += OnPackageSelected;
return scene; return scene;
}).ToList(); }).ToList();
var transitiveScenes = scenes.Where(s => s.PackageResult.InstalledNugetPackageInfo!.ProjectPackageReferences.Any(x => x.IsTransitive)).ToList(); var transitiveScenes = scenes.Where(s => s.PackageResult.InstalledNugetPackageInfo!.IsPrimarilyTransitive).ToList();
var directScenes = scenes.Except(transitiveScenes).ToList(); var directScenes = scenes.Except(transitiveScenes).ToList();
await this.InvokeAsync(() => await this.InvokeAsync(() =>
{ {

View File

@@ -52,7 +52,7 @@ public partial class PackageEntry : MarginContainer
if (PackageResult is null) return; if (PackageResult is null) return;
_packageNameLabel.Text = PackageResult.PackageId; _packageNameLabel.Text = PackageResult.PackageId;
var installedPackagedInfo = PackageResult.InstalledNugetPackageInfo; var installedPackagedInfo = PackageResult.InstalledNugetPackageInfo;
if (installedPackagedInfo?.IsTransitive is true && installedPackagedInfo.ProjectPackageReferences.Any(p => p.DependentPackages?.Count is not 0) is true) if (installedPackagedInfo?.IsPrimarilyTransitive is true && installedPackagedInfo.ProjectPackageReferences.Any(p => p.DependentPackages?.Count is not 0) is true)
{ {
var transitiveOriginsGroupedByVersion = installedPackagedInfo.ProjectPackageReferences.SelectMany(s => s.DependentPackages ?? []) var transitiveOriginsGroupedByVersion = installedPackagedInfo.ProjectPackageReferences.SelectMany(s => s.DependentPackages ?? [])
.GroupBy(t => t.RequestedVersion) .GroupBy(t => t.RequestedVersion)
@@ -103,7 +103,7 @@ public partial class PackageEntry : MarginContainer
.Select(p => p.InstalledVersion.ToNormalizedString()) .Select(p => p.InstalledVersion.ToNormalizedString())
.Distinct() .Distinct()
.ToList(); .ToList();
var text = packageInfo.IsTransitive ? $"({string.Join(", ", versions)})" : string.Join(", ", versions); var text = packageInfo.IsPrimarilyTransitive ? $"({string.Join(", ", versions)})" : string.Join(", ", versions);
return text; return text;
} }
} }