Skip to content

Commit 0cea0d1

Browse files
authored
Merge pull request #27 from nexB/privateassets-and-duplicates
Handle PrivateAssets and duplicates correctly
2 parents 0c75cf3 + b5ae4aa commit 0cea0d1

File tree

142 files changed

+77537
-45517
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

142 files changed

+77537
-45517
lines changed

build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ dotnet publish \
1717
--runtime linux-x64 \
1818
--self-contained true \
1919
--configuration Release \
20-
-p:Version=0.9.6-beta1 \
20+
-p:Version=0.9.6-beta2 \
2121
--output build \
2222
src/nuget-inspector/nuget-inspector.csproj

release.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
rm -rf release/
1717
mkdir release
1818

19-
VERSION=0.9.6-beta1
19+
VERSION=0.9.6-beta2
2020

2121
TARGET_BASE=nuget-inspector-$(git describe)
2222

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[bumpversion]
22
commit = False
33
tag = False
4-
current_version = 0.9.6-beta1
4+
current_version = 0.9.6-beta2
55
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\-(?P<release>[a-z]+))?
66
serialize =
77
{major}.{minor}.{patch}-{release}

src/nuget-inspector/Config.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ public static class Config
66
public static bool TRACE_NET = false;
77
public static bool TRACE_DEEP = false;
88
public static bool TRACE_META = false;
9-
public static string NUGET_INSPECTOR_VERSION = "0.9.6-beta1";
9+
public static string NUGET_INSPECTOR_VERSION = "0.9.6-beta2";
1010
}

src/nuget-inspector/NugetApi.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ public IEnumerable<PackageDependency> GetPackageDependenciesForPackage(PackageId
415415
PackageDownload download;
416416
if (download_by_identity.ContainsKey(identity))
417417
{
418-
if (Config.TRACE)
418+
if (Config.TRACE_NET)
419419
Console.WriteLine($" GetPackageDownload Cache Hit for package '{identity}'");
420420
download = download_by_identity[identity];
421421
if (download.IsEnhanced())
@@ -432,7 +432,7 @@ public IEnumerable<PackageDependency> GetPackageDependenciesForPackage(PackageId
432432
};
433433

434434
download_by_identity[identity] = download;
435-
if (Config.TRACE)
435+
if (Config.TRACE_NET)
436436
Console.WriteLine($" GetPackageDownload Cache miss for package '{identity}'");
437437
}
438438
if (!with_details)

src/nuget-inspector/ProjectFileProcessor.cs

Lines changed: 76 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Microsoft.Build.Evaluation;
2-
//using NuGet.Build.Tasks.Console;
32
using NuGet.Common;
43
using NuGet.Frameworks;
54
using NuGet.LibraryModel;
@@ -68,6 +67,50 @@ public List<Dependency> GetDependenciesFromReferences(List<PackageReference> ref
6867
return dependencies;
6968
}
7069

70+
/// <summary>
71+
/// Return a deduplicated list of PackageReference, selecting the first of each
72+
/// duplicated package names in the original order. This is the dotnet behaviour.
73+
/// </summary>
74+
public static List<PackageReference> DeduplicateReferences(List<PackageReference> references)
75+
{
76+
var by_name = new Dictionary<string, List<PackageReference>>();
77+
78+
List<PackageReference> refs;
79+
foreach (var reference in references)
80+
{
81+
var pid = reference.PackageIdentity;
82+
if (by_name.ContainsKey(pid.Id))
83+
{
84+
refs = by_name[pid.Id];
85+
}
86+
else
87+
{
88+
refs = new List<PackageReference>();
89+
by_name[pid.Id] = refs;
90+
}
91+
refs.Add(reference);
92+
}
93+
94+
var deduped = new List<PackageReference>();
95+
foreach(var dupes in by_name.Values)
96+
{
97+
if (Config.TRACE)
98+
{
99+
if (dupes.Count != 1)
100+
{
101+
string duplicated = string.Join("; ", dupes.Select(d => string.Join(", ", $"{d.PackageIdentity}")));
102+
103+
Console.WriteLine(
104+
"DeduplicateReferences: Remove the duplicate items to ensure a consistent dotnet restore behavior. "
105+
+ $"The duplicate 'PackageReference' items are: {duplicated}");
106+
}
107+
}
108+
deduped.Add(dupes[0]);
109+
}
110+
return deduped;
111+
}
112+
113+
71114
/// <summary>
72115
/// Copied from NuGet.Client/src/NuGet.Core/NuGet.Build.Tasks.Console/MSBuildStaticGraphRestore.cs
73116
/// Copyright (c) .NET Foundation. All rights reserved.
@@ -112,30 +155,35 @@ public List<PackageReference> GetPackageReferences()
112155

113156
foreach (ProjectItem reference in project.GetItems(itemType: "PackageReference"))
114157
{
115-
if (Config.TRACE)
158+
if (Config.TRACE_DEEP)
116159
{
117160
Console.WriteLine($" Project reference: EvaluatedInclude: {reference.EvaluatedInclude}");
118161
foreach (var meta in reference.Metadata)
119-
{
120162
Console.WriteLine($" Metadata: name: '{meta.Name}' value: '{meta.EvaluatedValue}'");
121-
}
122163
}
123-
// var IncludeAssets = reference.Metadata.FirstOrDefault(predicate: meta => meta.Name == "IncludeAssets");
124-
// var IncludeType? = null;
125-
// if (IncludeAssets is not null)
126-
// IncludeType = GetLibraryIncludeFlags(IncludeAssets.EvaluatedValue, LibraryIncludeFlags.All);
127-
128-
// var IncludeType = GetLibraryIncludeFlags(
129-
// reference.GetProperty("IncludeAssets"),
130-
// LibraryIncludeFlags.All) & ~GetLibraryIncludeFlags(
131-
// reference.GetProperty("ExcludeAssets"),
132-
// LibraryIncludeFlags.None),
133-
// LibraryRange = new LibraryRange(
134-
// packageReferenceItem.Identity,
135-
// string.IsNullOrWhiteSpace(version) ? isCentralPackageVersionManagementEnabled ? null : VersionRange.All : VersionRange.Parse(version),
136-
// LibraryDependencyTarget.Package),
137-
// NoWarn = MSBuildStringUtility.GetNuGetLogCodes(packageReferenceItem.GetProperty("NoWarn")).ToList(),
138-
// SuppressParent = GetLibraryIncludeFlags(packageReferenceItem.GetProperty("PrivateAssets"), LibraryIncludeFlagUtils.DefaultSuppressParent),
164+
165+
// Compute the include and exclude flags
166+
LibraryIncludeFlags effective_includes_flag = LibraryIncludeFlags.All;
167+
LibraryIncludeFlags private_assets = LibraryIncludeFlags.None;
168+
169+
foreach (var meta in reference.Metadata)
170+
{
171+
if (meta.Name == "IncludeAssets")
172+
effective_includes_flag &= GetLibraryIncludeFlags(meta.EvaluatedValue, LibraryIncludeFlags.All);
173+
if (meta.Name == "ExcludeAssets")
174+
effective_includes_flag &= ~GetLibraryIncludeFlags(meta.EvaluatedValue, LibraryIncludeFlags.None);
175+
// Private assets is treated as an exclude
176+
if (meta.Name == "PrivateAssets")
177+
private_assets = GetLibraryIncludeFlags(meta.EvaluatedValue, LibraryIncludeFlagUtils.DefaultSuppressParent);
178+
}
179+
// Skip fully private assets for package references
180+
effective_includes_flag &= ~private_assets;
181+
if (effective_includes_flag == LibraryIncludeFlags.None || private_assets == LibraryIncludeFlags.All)
182+
{
183+
if (Config.TRACE)
184+
Console.WriteLine($" Skipping private or excluded asset reference for {reference.EvaluatedInclude}");
185+
continue;
186+
}
139187

140188
var version_metadata = reference.Metadata.FirstOrDefault(predicate: meta => meta.Name == "Version");
141189
VersionRange? version_range;
@@ -148,7 +196,7 @@ public List<PackageReference> GetPackageReferences()
148196
}
149197
else
150198
{
151-
if (Config.TRACE)
199+
if (Config.TRACE_DEEP)
152200
Console.WriteLine($" Project reference without version: {reference.EvaluatedInclude}");
153201
version_range = null;
154202
}
@@ -265,6 +313,7 @@ public DependencyResolution ResolveOneAtATime()
265313
try
266314
{
267315
List<PackageReference> references = GetPackageReferences();
316+
references = DeduplicateReferences(references);
268317
List<Dependency> dependencies = GetDependenciesFromReferences(references);
269318

270319
var deps_helper = new NugetResolverHelper(nugetApi: nugetApi);
@@ -317,6 +366,7 @@ public DependencyResolution ResolveOneAtATimeEnhanced()
317366
try
318367
{
319368
List<PackageReference> references = GetPackageReferences();
369+
references = DeduplicateReferences(references);
320370
List<Dependency> dependencies = GetDependenciesFromReferences(references);
321371
List<PackageIdentity> direct_deps = CollectDirectDeps(dependencies);
322372

@@ -396,6 +446,7 @@ public DependencyResolution ResolveManyAtOnce()
396446
try
397447
{
398448
List<PackageReference> references = GetPackageReferences();
449+
references = DeduplicateReferences(references);
399450
List<Dependency> dependencies = GetDependenciesFromReferences(references);
400451
List<PackageIdentity> direct_deps = CollectDirectDeps(dependencies);
401452

@@ -469,21 +520,21 @@ public DependencyResolution ResolveManyAtOnce()
469520
/// </summary>
470521
private List<PackageIdentity> CollectDirectDeps(List<Dependency> dependencies)
471522
{
472-
if (Config.TRACE)
523+
if (Config.TRACE_DEEP)
473524
Console.WriteLine("ProjectFileProcessor.CollectDirectDeps for dependencies:");
474525

475526
var direct_deps = new List<PackageIdentity>();
476527
foreach (var dep in dependencies)
477528
{
478-
if (Config.TRACE)
529+
if (Config.TRACE_DEEP)
479530
Console.WriteLine($" name: {dep.name} version_range: {dep.version_range}");
480531

481532
PackageSearchMetadataRegistration? psmr = nugetApi.FindPackageVersion(
482533
id: dep.name,
483534
versionRange: dep.version_range,
484535
include_prerelease: false);
485536

486-
if (Config.TRACE)
537+
if (Config.TRACE_DEEP)
487538
Console.WriteLine($" psmr1: '{psmr}' for dep.name: {dep.name} dep.version_range: {dep.version_range}");
488539

489540
if (psmr == null)
@@ -494,7 +545,7 @@ private List<PackageIdentity> CollectDirectDeps(List<Dependency> dependencies)
494545
versionRange: dep.version_range,
495546
include_prerelease: true);
496547

497-
if (Config.TRACE)
548+
if (Config.TRACE_DEEP)
498549
Console.WriteLine($" psmr2: '{psmr}' for dep.name: {dep.name} dep.version_range: {dep.version_range}");
499550
}
500551

src/nuget-inspector/ProjectScanner.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public void FetchMetadata(ScanResult scan_result)
160160
try
161161
{
162162
if (Config.TRACE)
163-
Console.WriteLine($"FetchMetadata for '{package.name}@{package.version}'");
163+
Console.WriteLine($"FetchMetadata for '{dep.name}@{dep.version}'");
164164
dep.Update(nugetApi: NugetApiService);
165165
}
166166
catch (Exception ex)

src/nuget-inspector/nuget-inspector.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
<PackageId>nuget-inspector</PackageId>
2424
<Product>nuget-inspector</Product>
2525
<AssemblyName>nuget-inspector</AssemblyName>
26-
<Version>0.9.6-beta1</Version>
26+
<Version>0.9.6-beta2</Version>
2727
<Authors>nexB Inc.</Authors>
2828
<Company>nexB Inc</Company>
29-
<AssemblyVersion>0.9.6.1</AssemblyVersion>
30-
<FileVersion>0.9.6.1</FileVersion>
29+
<AssemblyVersion>0.9.6.2</AssemblyVersion>
30+
<FileVersion>0.9.6.2</FileVersion>
3131
<Description>A NuGet and Dotnet package dependency resolver</Description>
3232
<PackageProjectUrl>https://github.com/nexB/nuget-inspector</PackageProjectUrl>
3333
<PackageLicenseUrl>Apache-2.0 AND MIT</PackageLicenseUrl>

tests/data/basic/csproj1/CycloneDX.csproj-expected.json

Lines changed: 0 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -348,63 +348,6 @@
348348
"datafile_path": "",
349349
"dependencies": []
350350
},
351-
{
352-
"type": "nuget",
353-
"namespace": "",
354-
"name": "Microsoft.CodeAnalysis.NetAnalyzers",
355-
"version": "6.0.0",
356-
"qualifiers": "",
357-
"subpath": "",
358-
"purl": "pkg:nuget/Microsoft.CodeAnalysis.NetAnalyzers@6.0.0",
359-
"primary_language": "C#",
360-
"description": "Microsoft recommended code quality rules and .NET API usage rules implemented as analyzers using the .NET Compiler Platform (Roslyn).",
361-
"release_date": "",
362-
"parties": [
363-
{
364-
"type": "organization",
365-
"role": "author",
366-
"name": "Microsoft",
367-
"email": "",
368-
"url": ""
369-
}
370-
],
371-
"keywords": [
372-
"Roslyn",
373-
"CodeAnalysis",
374-
"Compiler",
375-
"CSharp",
376-
"VB",
377-
"VisualBasic",
378-
"Diagnostic",
379-
"Analyzers",
380-
"Syntax",
381-
"Semantics"
382-
],
383-
"homepage_url": "https://github.com/dotnet/roslyn-analyzers",
384-
"download_url": "https://api.nuget.org/v3-flatcontainer/microsoft.codeanalysis.netanalyzers/6.0.0/microsoft.codeanalysis.netanalyzers.6.0.0.nupkg",
385-
"size": 3969653,
386-
"sha1": "",
387-
"md5": "",
388-
"sha256": "",
389-
"sha512": "8D16B934642E2A61A6676D3522677961E68271174875F17573E905A926EC1EF57342D3A0156B4EF6E0DD488138616093191C24570601BC194FBC7A12195859F9",
390-
"bug_tracking_url": "",
391-
"code_view_url": "",
392-
"vcs_url": "",
393-
"copyright": "",
394-
"license_expression": "",
395-
"declared_license": "LicenseUrl: https://www.nuget.org/packages/Microsoft.CodeAnalysis.NetAnalyzers/6.0.0/license\nLicenseType: Expression\nLicense: MIT\nLicenseExpression: MIT",
396-
"notice_text": "",
397-
"source_packages": [],
398-
"extra_data": {
399-
"framework": "net6.0"
400-
},
401-
"repository_homepage_url": "https://www.nuget.org/packages/Microsoft.CodeAnalysis.NetAnalyzers/6.0.0?_src=template",
402-
"repository_download_url": "https://api.nuget.org/v3-flatcontainer/microsoft.codeanalysis.netanalyzers/6.0.0/microsoft.codeanalysis.netanalyzers.6.0.0.nupkg",
403-
"api_data_url": "https://api.nuget.org/v3/registration5-gz-semver2/microsoft.codeanalysis.netanalyzers/6.0.0.json",
404-
"datasource_id": "",
405-
"datafile_path": "",
406-
"dependencies": []
407-
},
408351
{
409352
"type": "nuget",
410353
"namespace": "",
@@ -1695,63 +1638,6 @@
16951638
"datafile_path": "",
16961639
"dependencies": []
16971640
},
1698-
{
1699-
"type": "nuget",
1700-
"namespace": "",
1701-
"name": "Microsoft.CodeAnalysis.NetAnalyzers",
1702-
"version": "6.0.0",
1703-
"qualifiers": "",
1704-
"subpath": "",
1705-
"purl": "pkg:nuget/Microsoft.CodeAnalysis.NetAnalyzers@6.0.0",
1706-
"primary_language": "C#",
1707-
"description": "Microsoft recommended code quality rules and .NET API usage rules implemented as analyzers using the .NET Compiler Platform (Roslyn).",
1708-
"release_date": "",
1709-
"parties": [
1710-
{
1711-
"type": "organization",
1712-
"role": "author",
1713-
"name": "Microsoft",
1714-
"email": "",
1715-
"url": ""
1716-
}
1717-
],
1718-
"keywords": [
1719-
"Roslyn",
1720-
"CodeAnalysis",
1721-
"Compiler",
1722-
"CSharp",
1723-
"VB",
1724-
"VisualBasic",
1725-
"Diagnostic",
1726-
"Analyzers",
1727-
"Syntax",
1728-
"Semantics"
1729-
],
1730-
"homepage_url": "https://github.com/dotnet/roslyn-analyzers",
1731-
"download_url": "https://api.nuget.org/v3-flatcontainer/microsoft.codeanalysis.netanalyzers/6.0.0/microsoft.codeanalysis.netanalyzers.6.0.0.nupkg",
1732-
"size": 3969653,
1733-
"sha1": "",
1734-
"md5": "",
1735-
"sha256": "",
1736-
"sha512": "8D16B934642E2A61A6676D3522677961E68271174875F17573E905A926EC1EF57342D3A0156B4EF6E0DD488138616093191C24570601BC194FBC7A12195859F9",
1737-
"bug_tracking_url": "",
1738-
"code_view_url": "",
1739-
"vcs_url": "",
1740-
"copyright": "",
1741-
"license_expression": "",
1742-
"declared_license": "LicenseUrl: https://www.nuget.org/packages/Microsoft.CodeAnalysis.NetAnalyzers/6.0.0/license\nLicenseType: Expression\nLicense: MIT\nLicenseExpression: MIT",
1743-
"notice_text": "",
1744-
"source_packages": [],
1745-
"extra_data": {
1746-
"framework": "net6.0"
1747-
},
1748-
"repository_homepage_url": "https://www.nuget.org/packages/Microsoft.CodeAnalysis.NetAnalyzers/6.0.0?_src=template",
1749-
"repository_download_url": "https://api.nuget.org/v3-flatcontainer/microsoft.codeanalysis.netanalyzers/6.0.0/microsoft.codeanalysis.netanalyzers.6.0.0.nupkg",
1750-
"api_data_url": "https://api.nuget.org/v3/registration5-gz-semver2/microsoft.codeanalysis.netanalyzers/6.0.0.json",
1751-
"datasource_id": "",
1752-
"datafile_path": "",
1753-
"dependencies": []
1754-
},
17551641
{
17561642
"type": "nuget",
17571643
"namespace": "",

0 commit comments

Comments
 (0)