Skip to content

Commit 1532aba

Browse files
authored
Move package metadata extraction (loic-sharma#349)
1 parent aeec00b commit 1532aba

File tree

3 files changed

+179
-190
lines changed

3 files changed

+179
-190
lines changed

src/BaGet.Core/Extensions/PackageArchiveReaderExtensions.cs

+178
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
namespace BaGet.Core
1010
{
11+
using NuGetPackageType = NuGet.Packaging.Core.PackageType;
12+
1113
public static class PackageArchiveReaderExtensions
1214
{
1315
private static readonly string[] OrderedReadmeFileNames = new[]
@@ -41,5 +43,181 @@ public async static Task<Stream> GetReadmeAsync(
4143

4244
throw new InvalidOperationException("Package does not have a readme!");
4345
}
46+
47+
public static Package GetPackageMetadata(this PackageArchiveReader packageReader)
48+
{
49+
var nuspec = packageReader.NuspecReader;
50+
51+
(var repositoryUri, var repositoryType) = GetRepositoryMetadata(nuspec);
52+
53+
return new Package
54+
{
55+
Id = nuspec.GetId(),
56+
Version = nuspec.GetVersion(),
57+
Authors = ParseAuthors(nuspec.GetAuthors()),
58+
Description = nuspec.GetDescription(),
59+
HasReadme = packageReader.HasReadme(),
60+
IsPrerelease = nuspec.GetVersion().IsPrerelease,
61+
Language = nuspec.GetLanguage() ?? string.Empty,
62+
Listed = true,
63+
MinClientVersion = nuspec.GetMinClientVersion()?.ToNormalizedString() ?? string.Empty,
64+
Published = DateTime.UtcNow,
65+
RequireLicenseAcceptance = nuspec.GetRequireLicenseAcceptance(),
66+
SemVerLevel = GetSemVerLevel(nuspec),
67+
Summary = nuspec.GetSummary(),
68+
Title = nuspec.GetTitle(),
69+
IconUrl = ParseUri(nuspec.GetIconUrl()),
70+
LicenseUrl = ParseUri(nuspec.GetLicenseUrl()),
71+
ProjectUrl = ParseUri(nuspec.GetProjectUrl()),
72+
RepositoryUrl = repositoryUri,
73+
RepositoryType = repositoryType,
74+
Dependencies = GetDependencies(nuspec),
75+
Tags = ParseTags(nuspec.GetTags()),
76+
PackageTypes = GetPackageTypes(nuspec),
77+
TargetFrameworks = GetTargetFrameworks(packageReader),
78+
};
79+
}
80+
81+
// Based off https://github.com/NuGet/NuGetGallery/blob/master/src/NuGetGallery.Core/SemVerLevelKey.cs
82+
private static SemVerLevel GetSemVerLevel(NuspecReader nuspec)
83+
{
84+
if (nuspec.GetVersion().IsSemVer2)
85+
{
86+
return SemVerLevel.SemVer2;
87+
}
88+
89+
foreach (var dependencyGroup in nuspec.GetDependencyGroups())
90+
{
91+
foreach (var dependency in dependencyGroup.Packages)
92+
{
93+
if ((dependency.VersionRange.MinVersion != null && dependency.VersionRange.MinVersion.IsSemVer2)
94+
|| (dependency.VersionRange.MaxVersion != null && dependency.VersionRange.MaxVersion.IsSemVer2))
95+
{
96+
return SemVerLevel.SemVer2;
97+
}
98+
}
99+
}
100+
101+
return SemVerLevel.Unknown;
102+
}
103+
104+
private static Uri ParseUri(string uriString)
105+
{
106+
if (string.IsNullOrEmpty(uriString)) return null;
107+
108+
return new Uri(uriString);
109+
}
110+
111+
private static string[] ParseAuthors(string authors)
112+
{
113+
if (string.IsNullOrEmpty(authors)) return new string[0];
114+
115+
return authors.Split(new[] { ',', ';', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
116+
}
117+
118+
private static string[] ParseTags(string tags)
119+
{
120+
if (string.IsNullOrEmpty(tags)) return new string[0];
121+
122+
return tags.Split(new[] { ',', ';', ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
123+
}
124+
125+
private static (Uri repositoryUrl, string repositoryType) GetRepositoryMetadata(NuspecReader nuspec)
126+
{
127+
var repository = nuspec.GetRepositoryMetadata();
128+
129+
if (string.IsNullOrEmpty(repository?.Url) ||
130+
!Uri.TryCreate(repository.Url, UriKind.Absolute, out var repositoryUri))
131+
{
132+
return (null, null);
133+
}
134+
135+
if (repositoryUri.Scheme != Uri.UriSchemeHttps)
136+
{
137+
return (null, null);
138+
}
139+
140+
if (repository.Type.Length > 100)
141+
{
142+
throw new InvalidOperationException("Repository type must be less than or equal 100 characters");
143+
}
144+
145+
return (repositoryUri, repository.Type);
146+
}
147+
148+
private static List<PackageDependency> GetDependencies(NuspecReader nuspec)
149+
{
150+
var dependencies = new List<PackageDependency>();
151+
152+
foreach (var group in nuspec.GetDependencyGroups())
153+
{
154+
var targetFramework = group.TargetFramework.GetShortFolderName();
155+
156+
if (!group.Packages.Any())
157+
{
158+
dependencies.Add(new PackageDependency
159+
{
160+
Id = null,
161+
VersionRange = null,
162+
TargetFramework = targetFramework,
163+
});
164+
}
165+
166+
foreach (var dependency in group.Packages)
167+
{
168+
dependencies.Add(new PackageDependency
169+
{
170+
Id = dependency.Id,
171+
VersionRange = dependency.VersionRange?.ToString(),
172+
TargetFramework = targetFramework,
173+
});
174+
}
175+
}
176+
177+
return dependencies;
178+
}
179+
180+
private static List<PackageType> GetPackageTypes(NuspecReader nuspec)
181+
{
182+
var packageTypes = nuspec
183+
.GetPackageTypes()
184+
.Select(t => new PackageType
185+
{
186+
Name = t.Name,
187+
Version = t.Version.ToString()
188+
})
189+
.ToList();
190+
191+
// Default to the standard "dependency" package type if no types were found.
192+
if (packageTypes.Count == 0)
193+
{
194+
packageTypes.Add(new PackageType
195+
{
196+
Name = NuGetPackageType.Dependency.Name,
197+
Version = NuGetPackageType.Dependency.Version.ToString(),
198+
});
199+
}
200+
201+
return packageTypes;
202+
}
203+
204+
private static List<TargetFramework> GetTargetFrameworks(PackageArchiveReader packageReader)
205+
{
206+
var targetFrameworks = packageReader
207+
.GetSupportedFrameworks()
208+
.Select(f => new TargetFramework
209+
{
210+
Moniker = f.GetShortFolderName()
211+
})
212+
.ToList();
213+
214+
// Default to the "any" framework if no frameworks were found.
215+
if (targetFrameworks.Count == 0)
216+
{
217+
targetFrameworks.Add(new TargetFramework { Moniker = "any" });
218+
}
219+
220+
return targetFrameworks;
221+
}
44222
}
45223
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.IO;
4-
using System.Linq;
53
using System.Threading;
64
using System.Threading.Tasks;
75
using Microsoft.Extensions.Logging;
@@ -10,8 +8,6 @@
108

119
namespace BaGet.Core
1210
{
13-
using NuGetPackageType = NuGet.Packaging.Core.PackageType;
14-
1511
public class PackageIndexingService : IPackageIndexingService
1612
{
1713
private readonly IPackageService _packages;
@@ -45,7 +41,7 @@ public async Task<PackageIndexingResult> IndexAsync(Stream packageStream, Cancel
4541
{
4642
using (var packageReader = new PackageArchiveReader(packageStream, leaveStreamOpen: true))
4743
{
48-
package = GetPackageMetadata(packageReader);
44+
package = packageReader.GetPackageMetadata();
4945
nuspecStream = await packageReader.GetNuspecAsync(cancellationToken);
5046
nuspecStream = await nuspecStream.AsTemporaryFileStreamAsync();
5147

@@ -148,181 +144,5 @@ await _storage.SavePackageContentAsync(
148144

149145
return PackageIndexingResult.Success;
150146
}
151-
152-
private Package GetPackageMetadata(PackageArchiveReader packageReader)
153-
{
154-
var nuspec = packageReader.NuspecReader;
155-
156-
(var repositoryUri, var repositoryType) = GetRepositoryMetadata(nuspec);
157-
158-
return new Package
159-
{
160-
Id = nuspec.GetId(),
161-
Version = nuspec.GetVersion(),
162-
Authors = ParseAuthors(nuspec.GetAuthors()),
163-
Description = nuspec.GetDescription(),
164-
HasReadme = packageReader.HasReadme(),
165-
IsPrerelease = nuspec.GetVersion().IsPrerelease,
166-
Language = nuspec.GetLanguage() ?? string.Empty,
167-
Listed = true,
168-
MinClientVersion = nuspec.GetMinClientVersion()?.ToNormalizedString() ?? string.Empty,
169-
Published = DateTime.UtcNow,
170-
RequireLicenseAcceptance = nuspec.GetRequireLicenseAcceptance(),
171-
SemVerLevel = GetSemVerLevel(nuspec),
172-
Summary = nuspec.GetSummary(),
173-
Title = nuspec.GetTitle(),
174-
IconUrl = ParseUri(nuspec.GetIconUrl()),
175-
LicenseUrl = ParseUri(nuspec.GetLicenseUrl()),
176-
ProjectUrl = ParseUri(nuspec.GetProjectUrl()),
177-
RepositoryUrl = repositoryUri,
178-
RepositoryType = repositoryType,
179-
Dependencies = GetDependencies(nuspec),
180-
Tags = ParseTags(nuspec.GetTags()),
181-
PackageTypes = GetPackageTypes(nuspec),
182-
TargetFrameworks = GetTargetFrameworks(packageReader),
183-
};
184-
}
185-
186-
// Based off https://github.com/NuGet/NuGetGallery/blob/master/src/NuGetGallery.Core/SemVerLevelKey.cs
187-
private SemVerLevel GetSemVerLevel(NuspecReader nuspec)
188-
{
189-
if (nuspec.GetVersion().IsSemVer2)
190-
{
191-
return SemVerLevel.SemVer2;
192-
}
193-
194-
foreach (var dependencyGroup in nuspec.GetDependencyGroups())
195-
{
196-
foreach (var dependency in dependencyGroup.Packages)
197-
{
198-
if ((dependency.VersionRange.MinVersion != null && dependency.VersionRange.MinVersion.IsSemVer2)
199-
|| (dependency.VersionRange.MaxVersion != null && dependency.VersionRange.MaxVersion.IsSemVer2))
200-
{
201-
return SemVerLevel.SemVer2;
202-
}
203-
}
204-
}
205-
206-
return SemVerLevel.Unknown;
207-
}
208-
209-
private Uri ParseUri(string uriString)
210-
{
211-
if (string.IsNullOrEmpty(uriString)) return null;
212-
213-
return new Uri(uriString);
214-
}
215-
216-
private string[] ParseAuthors(string authors)
217-
{
218-
if (string.IsNullOrEmpty(authors)) return new string[0];
219-
220-
return authors.Split(new[] { ',', ';', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
221-
}
222-
223-
private string[] ParseTags(string tags)
224-
{
225-
if (string.IsNullOrEmpty(tags)) return new string[0];
226-
227-
return tags.Split(new[] { ',', ';', ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
228-
}
229-
230-
private (Uri repositoryUrl, string repositoryType) GetRepositoryMetadata(NuspecReader nuspec)
231-
{
232-
var repository = nuspec.GetRepositoryMetadata();
233-
234-
if (string.IsNullOrEmpty(repository?.Url) ||
235-
!Uri.TryCreate(repository.Url, UriKind.Absolute, out var repositoryUri))
236-
{
237-
return (null, null);
238-
}
239-
240-
if (repositoryUri.Scheme != Uri.UriSchemeHttps)
241-
{
242-
return (null, null);
243-
}
244-
245-
if (repository.Type.Length > 100)
246-
{
247-
throw new InvalidOperationException("Repository type must be less than or equal 100 characters");
248-
}
249-
250-
return (repositoryUri, repository.Type);
251-
}
252-
253-
private List<PackageDependency> GetDependencies(NuspecReader nuspec)
254-
{
255-
var dependencies = new List<PackageDependency>();
256-
257-
foreach (var group in nuspec.GetDependencyGroups())
258-
{
259-
var targetFramework = group.TargetFramework.GetShortFolderName();
260-
261-
if (!group.Packages.Any())
262-
{
263-
dependencies.Add(new PackageDependency
264-
{
265-
Id = null,
266-
VersionRange = null,
267-
TargetFramework = targetFramework,
268-
});
269-
}
270-
271-
foreach (var dependency in group.Packages)
272-
{
273-
dependencies.Add(new PackageDependency
274-
{
275-
Id = dependency.Id,
276-
VersionRange = dependency.VersionRange?.ToString(),
277-
TargetFramework = targetFramework,
278-
});
279-
}
280-
}
281-
282-
return dependencies;
283-
}
284-
285-
private List<PackageType> GetPackageTypes(NuspecReader nuspec)
286-
{
287-
var packageTypes = nuspec
288-
.GetPackageTypes()
289-
.Select(t => new PackageType
290-
{
291-
Name = t.Name,
292-
Version = t.Version.ToString()
293-
})
294-
.ToList();
295-
296-
// Default to the standard "dependency" package type if no types were found.
297-
if (packageTypes.Count == 0)
298-
{
299-
packageTypes.Add(new PackageType
300-
{
301-
Name = NuGetPackageType.Dependency.Name,
302-
Version = NuGetPackageType.Dependency.Version.ToString(),
303-
});
304-
}
305-
306-
return packageTypes;
307-
}
308-
309-
private List<TargetFramework> GetTargetFrameworks(PackageArchiveReader packageReader)
310-
{
311-
var targetFrameworks = packageReader
312-
.GetSupportedFrameworks()
313-
.Select(f => new TargetFramework
314-
{
315-
Moniker = f.GetShortFolderName()
316-
})
317-
.ToList();
318-
319-
// Default to the "any" framework if no frameworks were found.
320-
if (targetFrameworks.Count == 0)
321-
{
322-
targetFrameworks.Add(new TargetFramework { Moniker = "any" });
323-
}
324-
325-
return targetFrameworks;
326-
}
327147
}
328148
}

0 commit comments

Comments
 (0)