Skip to content

Commit 9b746db

Browse files
authored
Allow published symbols to be downloaded after re-upload failures and Blog updates (#7252)
1 parent f7a6770 commit 9b746db

6 files changed

Lines changed: 50 additions & 14 deletions

File tree

src/NuGet.Services.Entities/Extensions/PackageExtensions.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,22 @@ public static class PackageExtensions
1414
/// <returns>The latest symbol package if present, null otherwise</returns>
1515
public static SymbolPackage LatestSymbolPackage(this Package package)
1616
{
17-
return package
18-
.SymbolPackages?
19-
.OrderByDescending(sp => sp.Created)
20-
.FirstOrDefault();
17+
return package.GetSymbolsPackagesInReverseOrder()?.FirstOrDefault();
18+
}
19+
20+
/// <summary>
21+
/// Get the last successfully uploaded symbols package for the given package.
22+
/// </summary>
23+
/// <param name="package"><see cref="Package"/> for which latest symbol package is to be retrieved.</param>
24+
/// <returns>The last available symbol package if present, null otherwise</returns>
25+
public static SymbolPackage LatestAvailableSymbolPackage(this Package package)
26+
{
27+
return package.GetSymbolsPackagesInReverseOrder()?.FirstOrDefault(sp => sp.StatusKey == PackageStatus.Available);
28+
}
29+
30+
private static IOrderedEnumerable<SymbolPackage> GetSymbolsPackagesInReverseOrder(this Package package)
31+
{
32+
return package.SymbolPackages?.OrderByDescending(sp => sp.Created);
2133
}
2234

2335
/// <summary>

src/NuGetGallery/Controllers/ApiController.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,11 @@ protected internal async Task<ActionResult> GetPackageInternal(string id, string
198198
if (isSymbolPackage)
199199
{
200200
package = PackageService.FindPackageByIdAndVersionStrict(id, version);
201+
202+
if (package == null)
203+
{
204+
return new HttpStatusCodeWithBodyResult(HttpStatusCode.NotFound, string.Format(CultureInfo.CurrentCulture, Strings.PackageWithIdAndVersionNotFound, id, version));
205+
}
201206
}
202207
}
203208
else
@@ -235,12 +240,9 @@ protected internal async Task<ActionResult> GetPackageInternal(string id, string
235240

236241
if (isSymbolPackage)
237242
{
238-
var latestSymbolPackage = package?
239-
.SymbolPackages
240-
.OrderByDescending(sp => sp.Created)
241-
.FirstOrDefault();
243+
var latestAvailableSymbolsPackage = package.LatestAvailableSymbolPackage();
242244

243-
if (latestSymbolPackage == null || latestSymbolPackage.StatusKey != PackageStatus.Available)
245+
if (latestAvailableSymbolsPackage == null)
244246
{
245247
return new HttpStatusCodeWithBodyResult(HttpStatusCode.NotFound, string.Format(CultureInfo.CurrentCulture, Strings.SymbolsPackage_PackageNotAvailable, id, version));
246248
}

src/NuGetGallery/ViewModels/DisplayPackageViewModel.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public DisplayPackageViewModel(Package package, User currentUser, PackageDepreca
3535
PackageFileSize = package.PackageFileSize;
3636

3737
LatestSymbolsPackage = package.LatestSymbolPackage();
38+
LatestAvailableSymbolsPackage = LatestSymbolsPackage != null && LatestSymbolsPackage.StatusKey == PackageStatus.Available
39+
? LatestSymbolsPackage
40+
: package.LatestAvailableSymbolPackage();
3841

3942
if (packageHistory.Any())
4043
{
@@ -114,6 +117,7 @@ private DisplayPackageViewModel(Package package, User currentUser, string pushed
114117
public int TotalDaysSinceCreated { get; private set; }
115118
public long PackageFileSize { get; private set; }
116119
public SymbolPackage LatestSymbolsPackage { get; private set; }
120+
public SymbolPackage LatestAvailableSymbolsPackage { get; private set; }
117121

118122
public bool HasSemVer2Version { get; }
119123
public bool HasSemVer2Dependency { get; }

src/NuGetGallery/Views/Packages/DisplayPackage.cshtml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
var absolutePackageUrl = Url.Absolute(Url.Package(Model.Id));
1111

12-
var hasSymbolsPackageAvailable = Model.LatestSymbolsPackage != null && Model.LatestSymbolsPackage.StatusKey == PackageStatus.Available;
12+
var hasSymbolsPackageAvailable = Model.LatestAvailableSymbolsPackage != null;
1313
var showSymbolsPackageStatus = Model.LatestSymbolsPackage != null && Model.LatestSymbolsPackage.StatusKey != PackageStatus.Available;
1414

1515
PackageManagerViewModel[] packageManagers;
@@ -163,6 +163,15 @@
163163
</div>
164164
}
165165

166+
@helper AppendAvailableSymbolsMessage(bool hasSymbolsPackageAvailable)
167+
{
168+
if(hasSymbolsPackageAvailable)
169+
{
170+
<br /><br />
171+
<text><b>Please note:</b> The last successfully published symbols package is still available for debugging and download.</text>
172+
}
173+
}
174+
166175
@* The following two helpers must be on a single line each so no extra whitespace is introduced in the expression when rendered. *@
167176
@* Helpers themselves are needed not to introduce that extra whitespce, which happens if they are inlined. *@
168177
@helper MakeLicenseLink(CompositeLicenseExpressionSegment segment) {<a href="@LicenseExpressionRedirectUrlHelper.GetLicenseExpressionRedirectUrl(segment.Value)">@segment.Value</a>}
@@ -314,7 +323,7 @@
314323
@ViewHelpers.AlertIsSemVer2Package(Model.HasSemVer2Version, Model.HasSemVer2Dependency)
315324
}
316325

317-
@if (showSymbolsPackageStatus)
326+
@if (Model.CanDisplayPrivateMetadata && showSymbolsPackageStatus)
318327
{
319328
if (Model.LatestSymbolsPackage.StatusKey == PackageStatus.Validating)
320329
{
@@ -323,6 +332,8 @@
323332
<strong>The symbols for this package have not been indexed yet.</strong> They are not available
324333
for download from the NuGet.org symbol server. Symbols will be available for download after both validation and indexing are complete.
325334
Symbols validation and indexing may take up to an hour. <a href="https://aka.ms/NuGetSymbolsPackageValidation">Read more</a>.
335+
336+
@AppendAvailableSymbolsMessage(hasSymbolsPackageAvailable)
326337
</text>
327338
)
328339
}
@@ -346,6 +357,8 @@
346357
{
347358
<text>Please contact <a href="mailto:[email protected]">support@nuget.org</a> to help fix your symbols package.</text>
348359
}
360+
361+
@AppendAvailableSymbolsMessage(hasSymbolsPackageAvailable)
349362
</text>)
350363
}
351364
}

src/NuGetGallery/Views/Shared/Gallery/Header.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
}
8989
@DisplayNavigationItem("Documentation", "https://docs.microsoft.com/en-us/nuget/what-is-nuget")
9090
@DisplayNavigationItem("Downloads", Url.Downloads())
91-
@DisplayNavigationItem("Blog", "https://blog.nuget.org/")
91+
@DisplayNavigationItem("Blog", "https://devblogs.microsoft.com/nuget/")
9292
</ul>
9393
@if (ShowAuthInHeader)
9494
{

tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1724,7 +1724,7 @@ public async Task GetPackageReturns404ForSymbolPackageIfPackageIsNotFound()
17241724
[InlineData(PackageStatus.Deleted)]
17251725
[InlineData(PackageStatus.FailedValidation)]
17261726
[InlineData(PackageStatus.Validating)]
1727-
public async Task GetPackageReturns404ForNotAvailableLatestSymbolPackage(PackageStatus status)
1727+
public async Task GetPackageReturnsLastAvailableSymbolPackage(PackageStatus status)
17281728
{
17291729
// Arrange
17301730
const string packageId = "Baz";
@@ -1751,12 +1751,17 @@ public async Task GetPackageReturns404ForNotAvailableLatestSymbolPackage(Package
17511751
controller.MockPackageService
17521752
.Setup(x => x.FindPackageByIdAndVersionStrict(packageId, packageVersion))
17531753
.Returns(package).Verifiable();
1754+
controller.MockSymbolPackageFileService
1755+
.Setup(x => x.CreateDownloadSymbolPackageActionResultAsync(It.IsAny<Uri>(), packageId, packageVersion))
1756+
.Returns(Task.FromResult<ActionResult>(new HttpStatusCodeWithBodyResult(HttpStatusCode.OK, "Test package")))
1757+
.Verifiable();
17541758

17551759
// Act
17561760
var result = (HttpStatusCodeWithBodyResult)await controller.GetPackageInternal(packageId, packageVersion, isSymbolPackage: true);
17571761

17581762
// Assert
1759-
Assert.Equal((int)HttpStatusCode.NotFound, result.StatusCode);
1763+
Assert.Equal((int)HttpStatusCode.OK, result.StatusCode);
1764+
controller.MockSymbolPackageFileService.Verify();
17601765
}
17611766

17621767
[Theory]

0 commit comments

Comments
 (0)