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;
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 struct IdePackageFromSourceResult(IPackageSearchMetadata PackageSearchMetadata, PackageSource Source);
public class NugetClientService
@@ -118,8 +118,8 @@ public class NugetClientService
var packagesResult = new List<IdePackageResult>();
foreach (var installedPackage in installedPackages)
{
var isTransitive = installedPackage.ProjectPackageReferences.Any(p => p.IsTransitive);
var installedNugetPackageInfo = new InstalledNugetPackageInfo(isTransitive, installedPackage.ProjectPackageReferences);
var isPrimarilyTransitive = installedPackage.ProjectPackageReferences.Any(p => p.IsTransitive is false) is false;
var installedNugetPackageInfo = new InstalledNugetPackageInfo(isPrimarilyTransitive, installedPackage.ProjectPackageReferences);
var idePackageResult = new IdePackageResult(installedPackage.Name, [], installedNugetPackageInfo);
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");
_ = Task.GodotRun(() => SetSolutionOrProjectNameLabels(slnOrProject));
_ = Task.GodotRun(() => SetDetailsProjects(slnOrProject));
_ = Task.GodotRun(() => PopulateInstalledPackages(slnOrProject));
_ = 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");
await project.MsBuildEvaluationProjectTask;
var installedPackages = await ProjectEvaluation.GetPackageReferencesForProjects([project]);
var idePackageResult = await _nugetClientService.GetPackagesForInstalledPackages(project.ChildNodeBasePath, installedPackages);
var msbuildEvalTask = slnOrProject switch
{
SharpIdeSolutionModel solutionModel => (Task)Task.WhenAll(solutionModel.AllProjects.Select(s => s.MsBuildEvaluationProjectTask)),
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 scene = _packageEntryScene.Instantiate<PackageEntry>();
@@ -143,7 +154,7 @@ public partial class NugetPanel : Control
scene.PackageSelected += OnPackageSelected;
return scene;
}).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();
await this.InvokeAsync(() =>
{

View File

@@ -52,7 +52,7 @@ public partial class PackageEntry : MarginContainer
if (PackageResult is null) return;
_packageNameLabel.Text = PackageResult.PackageId;
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 ?? [])
.GroupBy(t => t.RequestedVersion)
@@ -103,7 +103,7 @@ public partial class PackageEntry : MarginContainer
.Select(p => p.InstalledVersion.ToNormalizedString())
.Distinct()
.ToList();
var text = packageInfo.IsTransitive ? $"({string.Join(", ", versions)})" : string.Join(", ", versions);
var text = packageInfo.IsPrimarilyTransitive ? $"({string.Join(", ", versions)})" : string.Join(", ", versions);
return text;
}
}