Skip to content

Commit 6fd3bae

Browse files
authored
Merge pull request #8413 from NuGet/dev
Merge branch 'dev' into master
2 parents 1055731 + b53e196 commit 6fd3bae

26 files changed

Lines changed: 642 additions & 260 deletions

src/DatabaseMigrationTools/DatabaseMigrationTools.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
<PrivateAssets>all</PrivateAssets>
6666
</PackageReference>
6767
<PackageReference Include="NuGet.Services.Validation">
68-
<Version>2.81.0</Version>
68+
<Version>2.82.0</Version>
6969
</PackageReference>
7070
</ItemGroup>
7171
<ItemGroup>

src/GalleryTools/GalleryTools.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,5 @@
107107
</PropertyGroup>
108108
<Import Project="$(SignPath)\sign.targets" Condition="Exists('$(SignPath)\sign.targets')" />
109109
<Import Project="$(SignPath)\sign.microbuild.targets" Condition="Exists('$(SignPath)\sign.microbuild.targets')" />
110+
<Import Project="$(NuGetBuildExtensions)" Condition="'$(NuGetBuildExtensions)' != '' And Exists('$(NuGetBuildExtensions)')" />
110111
</Project>

src/GitHubVulnerabilities2Db/GitHubVulnerabilities2Db.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
<Version>4.3.0-dev-3612825</Version>
9090
</PackageReference>
9191
<PackageReference Include="NuGet.Services.Cursor">
92-
<Version>2.81.0</Version>
92+
<Version>2.82.0</Version>
9393
</PackageReference>
9494
</ItemGroup>
9595
<ItemGroup>

src/NuGetGallery.Core/NuGetGallery.Core.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
<Version>5.8.0</Version>
4848
</PackageReference>
4949
<PackageReference Include="NuGet.Services.FeatureFlags">
50-
<Version>2.81.0</Version>
50+
<Version>2.82.0</Version>
5151
</PackageReference>
5252
<PackageReference Include="WindowsAzure.Storage">
5353
<Version>9.3.3</Version>
@@ -56,13 +56,13 @@
5656

5757
<ItemGroup Condition="'$(TargetFramework)' == 'net472'">
5858
<PackageReference Include="NuGet.Services.Messaging.Email">
59-
<Version>2.81.0</Version>
59+
<Version>2.82.0</Version>
6060
</PackageReference>
6161
<PackageReference Include="NuGet.Services.Validation">
62-
<Version>2.81.0</Version>
62+
<Version>2.82.0</Version>
6363
</PackageReference>
6464
<PackageReference Include="NuGet.Services.Validation.Issues">
65-
<Version>2.81.0</Version>
65+
<Version>2.82.0</Version>
6666
</PackageReference>
6767
<PackageReference Include="NuGet.StrongName.elmah.corelibrary">
6868
<Version>1.2.2</Version>
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.IO;
6+
using System.Threading.Tasks;
7+
using NuGet.Packaging;
8+
using NuGet.Services.Entities;
9+
using NuGetGallery.Packaging;
10+
11+
namespace NuGetGallery
12+
{
13+
public class CoreReadmeFileService : ICoreReadmeFileService
14+
{
15+
private const string ReadmeFileName = "readme";
16+
17+
private readonly ICoreFileStorageService _fileStorageService;
18+
private readonly IContentFileMetadataService _metadata;
19+
20+
public CoreReadmeFileService(ICoreFileStorageService fileStorageService, IContentFileMetadataService metadata)
21+
{
22+
_fileStorageService = fileStorageService ?? throw new ArgumentNullException(nameof(fileStorageService));
23+
_metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
24+
}
25+
26+
/// <summary>
27+
/// Saves the package readme.md file to storage. This method should throw if the package
28+
/// does not have an embedded readme file
29+
/// </summary>
30+
/// <param name="package">The package associated with the readme.</param>
31+
/// <param name="readmeFile">The content of readme file.</param>
32+
private Task SaveReadmeFileAsync(Package package, Stream readmeFile)
33+
{
34+
if (package == null)
35+
{
36+
throw new ArgumentNullException(nameof(package));
37+
}
38+
39+
if (readmeFile == null)
40+
{
41+
throw new ArgumentNullException(nameof(readmeFile));
42+
}
43+
44+
if (package.EmbeddedReadmeType == EmbeddedReadmeFileType.Absent)
45+
{
46+
throw new ArgumentException("Package must have an embedded readme", nameof(package));
47+
}
48+
49+
var fileName = BuildReadmeFileName(package);
50+
51+
return _fileStorageService.SaveFileAsync(_metadata.PackageContentFolderName, fileName, readmeFile, overwrite: true);
52+
}
53+
54+
/// <summary>
55+
/// Save the readme file from package stream. This method should throw if the package
56+
/// does not have an embedded readme file
57+
/// </summary>
58+
/// <param name="package">Package information.</param>
59+
/// <param name="packageStream">Package stream with .nupkg contents.</param>
60+
public async Task ExtractAndSaveReadmeFileAsync(Package package, Stream packageStream)
61+
{
62+
if (package == null)
63+
{
64+
throw new ArgumentNullException(nameof(package));
65+
}
66+
67+
if (packageStream == null)
68+
{
69+
throw new ArgumentNullException(nameof(packageStream));
70+
}
71+
72+
packageStream.Seek(0, SeekOrigin.Begin);
73+
using (var packageArchiveReader = new PackageArchiveReader(packageStream, leaveStreamOpen: true))
74+
{
75+
var packageMetadata = PackageMetadata.FromNuspecReader(packageArchiveReader.GetNuspecReader(), strict: true);
76+
if (string.IsNullOrWhiteSpace(packageMetadata.ReadmeFile))
77+
{
78+
throw new InvalidOperationException("No readme file specified in the nuspec");
79+
}
80+
81+
var filename = FileNameHelper.GetZipEntryPath(packageMetadata.ReadmeFile);
82+
var ReadmeFileEntry = packageArchiveReader.GetEntry(filename); // throws on non-existent file
83+
using (var readmeFileStream = ReadmeFileEntry.Open())
84+
{
85+
await SaveReadmeFileAsync(package, readmeFileStream);
86+
}
87+
}
88+
}
89+
90+
public async Task<string> DownloadReadmeFileAsync(Package package)
91+
{
92+
if (package == null)
93+
{
94+
throw new ArgumentNullException(nameof(package));
95+
}
96+
97+
var fileName = BuildReadmeFileName(package);
98+
99+
using (var readmeFileStream = await _fileStorageService.GetFileAsync(_metadata.PackageContentFolderName, fileName))
100+
{
101+
if (readmeFileStream != null)
102+
{
103+
using (var readMeMdReader = new StreamReader(readmeFileStream))
104+
{
105+
return await readMeMdReader.ReadToEndAsync();
106+
}
107+
}
108+
}
109+
return null;
110+
}
111+
112+
public Task DeleteReadmeFileAsync(string id, string version)
113+
{
114+
if (id == null)
115+
{
116+
throw new ArgumentNullException(nameof(id));
117+
}
118+
119+
if (string.IsNullOrWhiteSpace(id))
120+
{
121+
throw new ArgumentException($"{nameof(id)} cannot be empty", nameof(id));
122+
}
123+
124+
if (version == null)
125+
{
126+
throw new ArgumentNullException(nameof(version));
127+
}
128+
129+
if (string.IsNullOrWhiteSpace(version))
130+
{
131+
throw new ArgumentException($"{nameof(version)} cannot be empty", nameof(version));
132+
}
133+
134+
var normalizedVersion = NuGetVersionFormatter.Normalize(version);
135+
var fileName = BuildReadmeFileName(id, normalizedVersion);
136+
137+
return _fileStorageService.DeleteFileAsync(_metadata.PackageContentFolderName, fileName);
138+
}
139+
140+
private string ReadmePathTemplate => $"{_metadata.PackageContentPathTemplate}/{ReadmeFileName}";
141+
142+
private string BuildReadmeFileName(Package package)
143+
=> FileNameHelper.BuildFileName(package, ReadmePathTemplate, string.Empty);
144+
145+
private string BuildReadmeFileName(string id, string version)
146+
=> FileNameHelper.BuildFileName(id, version, ReadmePathTemplate, string.Empty);
147+
}
148+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.IO;
5+
using System.Threading.Tasks;
6+
using NuGet.Services.Entities;
7+
8+
namespace NuGetGallery
9+
{
10+
/// <summary>
11+
/// Provides readmes file related operations
12+
/// </summary>
13+
public interface ICoreReadmeFileService
14+
{
15+
/// <summary>
16+
/// Save the readme file from package stream. This method should throw if the package
17+
/// does not have an embedded readme file
18+
/// </summary>
19+
/// <param name="package">Package information.</param>
20+
/// <param name="packageStream">Package stream with .nupkg contents.</param>
21+
Task ExtractAndSaveReadmeFileAsync(Package package, Stream packageStream);
22+
23+
/// <summary>
24+
/// Downloads previously saved readme file for a specified package.
25+
/// </summary>
26+
Task<string> DownloadReadmeFileAsync(Package package);
27+
28+
/// <summary>
29+
/// Deletes the readme file for the package from the publicly available storage for the package content.
30+
/// </summary>
31+
/// <param name="id">The package ID. This value is case-insensitive.</param>
32+
/// <param name="version">The package version. This value is case-insensitive and need not be normalized.</param>
33+
/// <returns></returns>
34+
Task DeleteReadmeFileAsync(string id, string version);
35+
}
36+
}

src/NuGetGallery.Services/NuGetGallery.Services.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,10 @@
307307
<Version>5.8.0</Version>
308308
</PackageReference>
309309
<PackageReference Include="NuGet.Services.Configuration">
310-
<Version>2.81.0</Version>
310+
<Version>2.82.0</Version>
311311
</PackageReference>
312312
<PackageReference Include="NuGet.Services.Logging">
313-
<Version>2.81.0</Version>
313+
<Version>2.82.0</Version>
314314
</PackageReference>
315315
<PackageReference Include="NuGet.StrongName.WebBackgrounder">
316316
<Version>0.2.0</Version>

src/NuGetGallery/App_Start/StorageDependent.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public static IEnumerable<StorageDependent> GetAll(IAppConfiguration configurati
9292
Create<SymbolPackageFileService, ISymbolPackageFileService>(configuration.AzureStorage_Packages_ConnectionString, isSingleInstance: false),
9393
Create<UploadFileService, IUploadFileService>(configuration.AzureStorage_Uploads_ConnectionString, isSingleInstance: false),
9494
Create<CoreLicenseFileService, ICoreLicenseFileService>(configuration.AzureStorage_FlatContainer_ConnectionString, isSingleInstance: false),
95+
Create<CoreReadmeFileService, ICoreReadmeFileService>(configuration.AzureStorage_FlatContainer_ConnectionString, isSingleInstance: false),
9596
Create<RevalidationStateService, IRevalidationStateService>(configuration.AzureStorage_Revalidation_ConnectionString, isSingleInstance: false),
9697
Create<EditableFeatureFlagFileStorageService, IFeatureFlagStorageService>(configuration.AzureStorage_Content_ConnectionString, isSingleInstance: true)
9798
};

src/NuGetGallery/Controllers/ApiController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ await AuditingService.SaveAuditRecordAsync(
528528
{
529529
ex.Log();
530530
TelemetryService.TrackSymbolPackagePushFailureEvent(id, normalizedVersion);
531-
throw ex;
531+
throw;
532532
}
533533
}
534534

src/NuGetGallery/Controllers/PackagesController.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2426,8 +2426,9 @@ public virtual async Task<JsonResult> VerifyPackage(VerifyPackageRequest formDat
24262426
}
24272427
catch (Exception ex)
24282428
{
2429+
ex.Log();
24292430
_telemetryService.TrackPackagePushFailureEvent(id: null, version: null);
2430-
throw ex;
2431+
throw;
24312432
}
24322433
}
24332434

0 commit comments

Comments
 (0)