Skip to content

Commit 193d192

Browse files
authored
Don't include deprecated packages (#355)
1 parent d3f47a2 commit 193d192

File tree

4 files changed

+69
-78
lines changed

4 files changed

+69
-78
lines changed

PackageIndexer/DotnetPackageIndex.cs

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ private static async Task<IReadOnlyList<PackageIdentity>> GetPackagesAsync(
4141
params string[] feedUrls
4242
)
4343
{
44-
var packages = new List<PackageIdentity>();
44+
var packages = new List<(PackageIdentity packageId, bool isDeprecated)>();
4545

4646
foreach (string feedUrl in feedUrls)
4747
{
4848
var feed = new NuGetFeed(feedUrl);
49-
IReadOnlyList<PackageIdentity> feedPackages = await GetPackagesAsync(feed);
49+
IReadOnlyList<(PackageIdentity, bool)> feedPackages = await GetPackagesAsync(feed);
5050
packages.AddRange(feedPackages);
5151
}
5252

@@ -59,17 +59,18 @@ params string[] feedUrls
5959
return latestVersions;
6060
}
6161

62-
private static async Task<IReadOnlyList<PackageIdentity>> GetPackagesAsync(NuGetFeed feed)
62+
private static async Task<IReadOnlyList<(PackageIdentity packageId, bool isDeprecated)>> GetPackagesAsync(NuGetFeed feed)
6363
{
6464
Console.WriteLine($"Getting packages from {feed.FeedUrl}...");
6565

6666
if (feed.FeedUrl == NuGetFeeds.NuGetOrg)
6767
return await GetPackagesFromNuGetOrgAsync(feed);
6868
else
69-
return await GetPackagesFromOtherGalleryAsync(feed);
69+
//return await GetPackagesFromOtherGalleryAsync(feed);
70+
throw new ApplicationException("NuGetOrg should be the only feed.");
7071
}
7172

72-
private static async Task<IReadOnlyList<PackageIdentity>> GetPackagesFromNuGetOrgAsync(NuGetFeed feed)
73+
private static async Task<IReadOnlyList<(PackageIdentity version, bool isDeprecated)>> GetPackagesFromNuGetOrgAsync(NuGetFeed feed)
7374
{
7475
Console.WriteLine("Fetching owner information...");
7576
Dictionary<string, string[]> ownerInformation = await feed.GetOwnerMappingAsync();
@@ -88,16 +89,16 @@ private static async Task<IReadOnlyList<PackageIdentity>> GetPackagesFromNuGetOr
8889

8990
Console.WriteLine("Getting versions...");
9091

91-
ConcurrentBag<PackageIdentity> identities = [];
92+
ConcurrentBag<(PackageIdentity packageId, bool isDeprecated)> identities = [];
9293

9394
await Parallel.ForEachAsync(packageIds, async (packageId, _) =>
9495
{
95-
IReadOnlyList<NuGetVersion> versions = await feed.GetAllVersionsAsync(packageId);
96+
IReadOnlyList<(NuGetVersion version, bool isDeprecated)> versions = await feed.GetAllVersionsAsync(packageId);
9697

97-
foreach (NuGetVersion version in versions)
98+
foreach ((NuGetVersion version, bool isDeprecated) version in versions)
9899
{
99-
var identity = new PackageIdentity(packageId, version);
100-
identities.Add(identity);
100+
var identity = new PackageIdentity(packageId, version.version);
101+
identities.Add((identity, version.isDeprecated));
101102
}
102103
});
103104

@@ -106,49 +107,53 @@ await Parallel.ForEachAsync(packageIds, async (packageId, _) =>
106107
return identities.ToArray();
107108
}
108109

109-
private static async Task<IReadOnlyList<PackageIdentity>> GetPackagesFromOtherGalleryAsync(NuGetFeed feed)
110-
{
111-
Console.WriteLine("Enumerating feed...");
112-
113-
IReadOnlyList<PackageIdentity> identities = await feed.GetAllPackagesAsync();
114-
115-
identities = identities.Where(i => PackageFilter.Default.IsMatch(i.Id)).ToArray();
116-
117-
Console.WriteLine($"Found {identities.Count:N0} package versions.");
118-
119-
return identities.ToArray();
120-
}
121-
122-
private static IReadOnlyList<PackageIdentity> GetLatestVersions(IReadOnlyList<PackageIdentity> identities, bool usePreviewVersions)
110+
private static IReadOnlyList<PackageIdentity> GetLatestVersions(
111+
IReadOnlyList<(PackageIdentity packageId, bool isDeprecated)> identities,
112+
bool usePreviewVersions
113+
)
123114
{
124115
var result = new List<PackageIdentity>();
125116

126-
IEnumerable<IGrouping<string, PackageIdentity>> groups = identities.GroupBy(i => i.Id);
117+
IEnumerable<IGrouping<string, (PackageIdentity packageId, bool isDeprecated)>> groups = identities.GroupBy(i => i.Item1.Id).OrderBy(g => g.Key);
127118

128-
foreach (IGrouping<string, PackageIdentity> group in groups.OrderBy(g => g.Key))
119+
foreach (IGrouping<string, (PackageIdentity packageId, bool isDeprecated)> group in groups)
129120
{
130121
string packageId = group.Key;
131-
IOrderedEnumerable<PackageIdentity> versions = group.OrderByDescending(p => p.Version, VersionComparer.VersionReleaseMetadata);
122+
IOrderedEnumerable<(PackageIdentity packageId, bool isDeprecated)> versions =
123+
group.OrderByDescending(p => p.packageId.Version, VersionComparer.VersionReleaseMetadata);
132124

133-
PackageIdentity latestStable = versions.FirstOrDefault(i => !i.Version.IsPrerelease);
134-
PackageIdentity latestPrerelease = versions.FirstOrDefault(i => i.Version.IsPrerelease);
125+
(PackageIdentity packageId, bool isDeprecated) latestStable =
126+
versions.FirstOrDefault(i => !i.packageId.Version.IsPrerelease);
127+
(PackageIdentity packageId, bool isDeprecated) latestPrerelease =
128+
versions.FirstOrDefault(i => i.packageId.Version.IsPrerelease);
129+
130+
// If the latest version is deprecated, don't include any version.
131+
if (latestStable.isDeprecated)
132+
latestStable = default;
133+
if (latestPrerelease.isDeprecated)
134+
latestPrerelease = default;
135135

136136
if (latestStable != default && latestPrerelease != default)
137137
{
138-
bool stableIsNewer = VersionComparer.VersionReleaseMetadata.Compare(latestPrerelease.Version, latestStable.Version) <= 0;
138+
bool stableIsNewer = VersionComparer.VersionReleaseMetadata.Compare(
139+
latestPrerelease.packageId.Version,
140+
latestStable.packageId.Version
141+
) <= 0;
139142
if (stableIsNewer)
140143
latestPrerelease = default;
141144
}
142145

143146
// Comment this out for preview-only versions.
144147
if (latestStable != default)
145-
result.Add(latestStable);
148+
{
149+
result.Add(latestStable.packageId);
150+
}
146151

147152
if (usePreviewVersions)
148153
{
149154
// Make sure it's a .NET 9 preview version.
150-
if ((latestPrerelease != default) && latestPrerelease.Version.Major == 9)
151-
result.Add(latestPrerelease);
155+
if ((latestPrerelease != default) && latestPrerelease.packageId.Version.Major == 9)
156+
result.Add(latestPrerelease.packageId);
152157
}
153158
}
154159

PackageIndexer/NuGet/NuGetFeed.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,17 +135,37 @@ string feed
135135
return result;
136136
}
137137

138-
public async Task<IReadOnlyList<NuGetVersion>> GetAllVersionsAsync(string packageId, bool includeUnlisted = false)
138+
public async Task<IReadOnlyList<(NuGetVersion, bool)>> GetAllVersionsAsync(string packageId, bool includeUnlisted = false)
139139
{
140140
SourceCacheContext cache = NullSourceCacheContext.Instance;
141141
ILogger logger = NullLogger.Instance;
142142
CancellationToken cancellationToken = CancellationToken.None;
143143

144144
SourceRepository repository = Repository.Factory.GetCoreV3(FeedUrl);
145-
MetadataResource resource = await repository.GetResourceAsync<MetadataResource>(cancellationToken);
146-
IEnumerable<NuGetVersion> versions = await resource.GetVersions(packageId, includePrerelease: true, includeUnlisted: includeUnlisted, cache, logger, cancellationToken);
147145

148-
return versions.ToArray();
146+
PackageMetadataResource resource = await repository.GetResourceAsync<PackageMetadataResource>();
147+
148+
IEnumerable<IPackageSearchMetadata> packages = await resource.GetMetadataAsync(
149+
packageId,
150+
includePrerelease: true,
151+
includeUnlisted: includeUnlisted,
152+
cache,
153+
logger,
154+
cancellationToken);
155+
156+
List<(NuGetVersion, bool)> versions = new();
157+
158+
foreach (IPackageSearchMetadata package in packages)
159+
{
160+
bool isDeprecated = false;
161+
PackageDeprecationMetadata deprecationMetadata = await package.GetDeprecationMetadataAsync();
162+
if (deprecationMetadata != null)
163+
isDeprecated = true;
164+
165+
versions.Add((package.Identity.Version, isDeprecated));
166+
}
167+
168+
return versions;
149169
}
150170

151171
public async Task<PackageIdentity> ResolvePackageAsync(string packageId, VersionRange range)

PackageIndexer/NuGet/NuGetStore.cs

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ public Task<PackageArchiveReader> GetPackageAsync(PackageIdentity identity)
3030

3131
public async Task<PackageArchiveReader> GetPackageAsync(string id, string version)
3232
{
33-
var path = GetPackagePath(id, version);
33+
string path = GetPackagePath(id, version);
3434
if (File.Exists(path))
3535
return new PackageArchiveReader(path);
3636

3737
var identity = new PackageIdentity(id, NuGetVersion.Parse(version));
38-
var directory = Path.GetDirectoryName(path);
38+
string directory = Path.GetDirectoryName(path);
3939
if (directory is not null)
4040
Directory.CreateDirectory(directory);
4141

42-
await using (var fileStream = File.Create(path))
42+
await using (FileStream fileStream = File.Create(path))
4343
{
44-
var success = false;
44+
bool success = false;
4545

46-
foreach (var feed in _feeds)
46+
foreach (NuGetFeed feed in _feeds)
4747
{
4848
if (await feed.TryCopyPackageStreamAsync(identity, fileStream))
4949
{
@@ -59,43 +59,9 @@ public async Task<PackageArchiveReader> GetPackageAsync(string id, string versio
5959
return new PackageArchiveReader(path);
6060
}
6161

62-
public async Task<PackageArchiveReader> ResolvePackageAsync(string id, VersionRange range)
63-
{
64-
var versions = await GetVersionsAsync(id);
65-
66-
var resolvedVersion = versions.FindBestMatch(range, x => x);
67-
if (resolvedVersion is null)
68-
return null;
69-
70-
if (resolvedVersion != range.MinVersion)
71-
Console.WriteLine($"Resolved {id} {range} -> {resolvedVersion}");
72-
73-
return await GetPackageAsync(id, resolvedVersion.ToNormalizedString());
74-
}
75-
76-
public async Task<IReadOnlyList<NuGetVersion>> GetVersionsAsync(string id)
77-
{
78-
if (!_packageVersionCache.TryGetValue(id, out IReadOnlyList<NuGetVersion> versions))
79-
{
80-
var allVersions = new SortedSet<NuGetVersion>();
81-
82-
foreach (var feed in _feeds)
83-
{
84-
var feedVersions = await feed.GetAllVersionsAsync(id, includeUnlisted: true);
85-
allVersions.UnionWith(feedVersions);
86-
}
87-
88-
versions = allVersions.ToArray();
89-
90-
_packageVersionCache.Add(id, versions);
91-
}
92-
93-
return versions;
94-
}
95-
9662
public void DeleteFromCache(string id, string version)
9763
{
98-
var path = GetPackagePath(id, version);
64+
string path = GetPackagePath(id, version);
9965
if (path is not null)
10066
File.Delete(path);
10167
}

PackageIndexer/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal static class Program
2727
private static async Task<int> Main(string[] args)
2828
{
2929
#if DEBUG
30-
args = [@"c:\users\gewarren\desktop\Package Index 0521", "preview"];
30+
args = [@"c:\users\gewarren\desktop\Package Index 0522.7", "preview"];
3131
#endif
3232

3333
if ((args.Length == 0) || (args.Length > 2))

0 commit comments

Comments
 (0)