Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
264f738
Merge commit '69c5d73b7605a0609367c36d6fba9786d073998c'
Jun 3, 2026
7fca307
Merge commit '90789c7a0d7d1a9b26a640476d50e6f742b57ae8'
Jun 3, 2026
726c21c
Merge commit '6c2550c3d0dd69fe031fe44a9f34eee232e9be70'
Jun 3, 2026
1a2fe57
Merge commit '1e395b1be7962505e12619a871d6f85439751bc5'
Jun 3, 2026
6bf4d72
Merge commit 'ada60e0cad9bb14bbbc4c7179656cbefd462b9ec'
Jun 3, 2026
8946480
Merged PR 61979: [release/8.0.1xx] Update source-build-externals depe…
wtgodbe Jun 10, 2026
72582fe
Use user-level cache directory for cached registry blobs
lbussell Jun 1, 2026
f98d101
Add digest validation for downloaded and cached registry blobs
lbussell Jun 3, 2026
9a0c38b
Hash data using FileStream
lbussell Jun 5, 2026
4f31529
Merge commit '2dd56c3569c41d7560a52b2e4eb338398e4827a2'
Jun 11, 2026
99a6b4f
Update dependencies from https://dev.azure.com/dnceng/internal/_git/d…
dotnet-bot Jun 17, 2026
420f781
Update dependencies from https://dev.azure.com/dnceng/internal/_git/d…
dotnet-bot Jun 17, 2026
da73ae7
Merged PR 62192: [internal/release/8.0.1xx] Update dependencies from …
Jun 17, 2026
3c78926
Update dependencies from https://dev.azure.com/dnceng/internal/_git/d…
dotnet-bot Jun 18, 2026
482592d
Merged PR 62208: [internal/release/8.0.1xx] Update dependencies from …
Jun 18, 2026
c48afb8
Update dependencies from https://dev.azure.com/dnceng/internal/_git/d…
dotnet-bot Jun 23, 2026
2d56569
Merged PR 62353: [internal/release/8.0.1xx] Update dependencies from …
Jun 24, 2026
248a887
Update dependencies from https://dev.azure.com/dnceng/internal/_git/d…
dotnet-bot Jun 24, 2026
54fcd2a
Merged PR 62390: [internal/release/8.0.1xx] Update dependencies from …
Jun 25, 2026
4fcd3f7
Update dependencies from https://dev.azure.com/dnceng/internal/_git/d…
dotnet-bot Jun 25, 2026
baac56c
Merged PR 62422: [internal/release/8.0.1xx] Update dependencies from …
Jun 25, 2026
f4f493e
Update dependencies from https://dev.azure.com/dnceng/internal/_git/d…
dotnet-bot Jun 26, 2026
82e6875
Merged PR 62433: [internal/release/8.0.1xx] Update dependencies from …
Jun 26, 2026
c0b0a9d
Merge commit '82e6875e6438bd805543ff056c4162763ba7f3bd' into internal…
dotnet-bot Jul 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions NuGet.config
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,27 @@
<clear />
<!--Begin: Package sources managed by Dependency Flow automation. Do not edit the sources below.-->
<!-- Begin: Package sources from dotnet-emsdk -->
<add key="darc-pub-dotnet-emsdk-ac9f809" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-emsdk-ac9f8092/nuget/v3/index.json" />
<!-- End: Package sources from dotnet-emsdk -->
<!-- Begin: Package sources from dotnet-format -->
<add key="darc-pub-dotnet-format-a8be5ff" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-format-a8be5ff9/nuget/v3/index.json" />
<!-- End: Package sources from dotnet-format -->
<!-- Begin: Package sources from dotnet-aspnetcore -->
<add key="darc-int-dotnet-aspnetcore-03ef277" value="https://pkgs.dev.azure.com/dnceng/internal/_packaging/darc-int-dotnet-aspnetcore-03ef277b/nuget/v3/index.json" />
<!-- End: Package sources from dotnet-aspnetcore -->
<!-- Begin: Package sources from DotNet-msbuild-Trusted -->
<add key="darc-pub-DotNet-msbuild-Trusted-7806cbf" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-DotNet-msbuild-Trusted-7806cbf7/nuget/v3/index.json" />
<!-- End: Package sources from DotNet-msbuild-Trusted -->
<!-- Begin: Package sources from dotnet-roslyn-analyzers -->
<!-- End: Package sources from dotnet-roslyn-analyzers -->
<!-- Begin: Package sources from dotnet-runtime -->
<add key="darc-int-dotnet-runtime-18fd75c" value="https://pkgs.dev.azure.com/dnceng/internal/_packaging/darc-int-dotnet-runtime-18fd75c8/nuget/v3/index.json" />
<!-- End: Package sources from dotnet-runtime -->
<!-- Begin: Package sources from dotnet-templating -->
<add key="darc-pub-dotnet-templating-e3c582d" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-templating-e3c582de/nuget/v3/index.json" />
<!-- End: Package sources from dotnet-templating -->
<!-- Begin: Package sources from dotnet-windowsdesktop -->
<add key="darc-int-dotnet-windowsdesktop-580168d" value="https://pkgs.dev.azure.com/dnceng/internal/_packaging/darc-int-dotnet-windowsdesktop-580168d2/nuget/v3/index.json" />
<!-- End: Package sources from dotnet-windowsdesktop -->
<!--End: Package sources managed by Dependency Flow automation. Do not edit the sources above.-->
<add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
Expand All @@ -44,15 +48,18 @@
<!-- Begin: Package sources from dotnet-templating -->
<!-- End: Package sources from dotnet-templating -->
<!-- Begin: Package sources from dotnet-aspnetcore -->
<add key="darc-int-dotnet-aspnetcore-03ef277" value="true" />
<!-- End: Package sources from dotnet-aspnetcore -->
<!-- Begin: Package sources from dotnet-format -->
<!-- Begin: Package sources from DotNet-msbuild-Trusted -->
<!-- End: Package sources from DotNet-msbuild-Trusted -->
<!-- End: Package sources from dotnet-format -->
<!-- End: Package sources from dotnet-aspnetcore -->
<!-- Begin: Package sources from dotnet-runtime -->
<add key="darc-int-dotnet-runtime-18fd75c" value="true" />
<!-- End: Package sources from dotnet-runtime -->
<!-- Begin: Package sources from dotnet-windowsdesktop -->
<add key="darc-int-dotnet-windowsdesktop-580168d" value="true" />
<!-- End: Package sources from dotnet-windowsdesktop -->
<!--End: Package sources managed by Dependency Flow automation. Do not edit the sources above.-->
</disabledPackageSources>
Expand Down
142 changes: 71 additions & 71 deletions eng/Version.Details.xml

Large diffs are not rendered by default.

34 changes: 17 additions & 17 deletions eng/Versions.props
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,21 @@
</PropertyGroup>
<PropertyGroup>
<!-- Dependencies from https://github.com/dotnet/runtime -->
<MicrosoftNETCoreAppRefPackageVersion>8.0.28</MicrosoftNETCoreAppRefPackageVersion>
<VSRedistCommonNetCoreSharedFrameworkx6480PackageVersion>8.0.28-servicing.26264.13</VSRedistCommonNetCoreSharedFrameworkx6480PackageVersion>
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>8.0.28</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
<MicrosoftNETCoreAppRefPackageVersion>8.0.29</MicrosoftNETCoreAppRefPackageVersion>
<VSRedistCommonNetCoreSharedFrameworkx6480PackageVersion>8.0.29-servicing.26324.3</VSRedistCommonNetCoreSharedFrameworkx6480PackageVersion>
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>8.0.29</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
<MicrosoftNETCoreAppRuntimePackageVersion>$(MicrosoftNETCoreAppRuntimewinx64PackageVersion)</MicrosoftNETCoreAppRuntimePackageVersion>
<MicrosoftExtensionsDependencyModelPackageVersion>8.0.2</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreDotNetHostResolverPackageVersion>8.0.28</MicrosoftNETCoreDotNetHostResolverPackageVersion>
<MicrosoftNETHostModelVersion>8.0.28-servicing.26264.13</MicrosoftNETHostModelVersion>
<MicrosoftNETCoreDotNetHostResolverPackageVersion>8.0.29</MicrosoftNETCoreDotNetHostResolverPackageVersion>
<MicrosoftNETHostModelVersion>8.0.29-servicing.26324.3</MicrosoftNETHostModelVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>8.0.0</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsLoggingVersion>8.0.1</MicrosoftExtensionsLoggingVersion>
<MicrosoftExtensionsLoggingAbstractionsVersion>8.0.3</MicrosoftExtensionsLoggingAbstractionsVersion>
<MicrosoftExtensionsLoggingConsoleVersion>8.0.1</MicrosoftExtensionsLoggingConsoleVersion>
<MicrosoftNETILLinkTasksPackageVersion>8.0.28</MicrosoftNETILLinkTasksPackageVersion>
<MicrosoftNETILLinkTasksPackageVersion>8.0.29</MicrosoftNETILLinkTasksPackageVersion>
<MicrosoftBclAsyncInterfacesPackageVersion>8.0.0</MicrosoftBclAsyncInterfacesPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>8.0.0</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>8.0.28</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>8.0.29</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftWin32SystemEventsPackageVersion>8.0.0</MicrosoftWin32SystemEventsPackageVersion>
<SystemCompositionAttributedModelPackageVersion>8.0.0</SystemCompositionAttributedModelPackageVersion>
<SystemCompositionConventionPackageVersion>8.0.0</SystemCompositionConventionPackageVersion>
Expand All @@ -74,7 +74,7 @@
<SystemConfigurationConfigurationManagerPackageVersion>8.0.1</SystemConfigurationConfigurationManagerPackageVersion>
<SystemDrawingCommonPackageVersion>8.0.0</SystemDrawingCommonPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>8.0.1</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>8.0.3</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>8.0.4</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>8.0.0</SystemSecurityPermissionsPackageVersion>
<SystemServiceProcessServiceControllerVersion>8.0.1</SystemServiceProcessServiceControllerVersion>
<SystemTextJsonPackageVersion>8.0.6</SystemTextJsonPackageVersion>
Expand Down Expand Up @@ -170,13 +170,13 @@
</PropertyGroup>
<PropertyGroup>
<!-- Dependencies from https://github.com/aspnet/AspNetCore -->
<MicrosoftAspNetCoreAppRefPackageVersion>8.0.28</MicrosoftAspNetCoreAppRefPackageVersion>
<MicrosoftAspNetCoreDeveloperCertificatesXPlatPackageVersion>8.0.28-servicing.26269.13</MicrosoftAspNetCoreDeveloperCertificatesXPlatPackageVersion>
<MicrosoftAspNetCoreComponentsSdkAnalyzersPackageVersion>8.0.28-servicing.26269.13</MicrosoftAspNetCoreComponentsSdkAnalyzersPackageVersion>
<MicrosoftAspNetCoreMvcAnalyzersPackageVersion>8.0.28-servicing.26269.13</MicrosoftAspNetCoreMvcAnalyzersPackageVersion>
<MicrosoftAspNetCoreMvcApiAnalyzersPackageVersion>8.0.28-servicing.26269.13</MicrosoftAspNetCoreMvcApiAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzersPackageVersion>8.0.28-servicing.26269.13</MicrosoftAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreTestHostPackageVersion>8.0.28</MicrosoftAspNetCoreTestHostPackageVersion>
<MicrosoftAspNetCoreAppRefPackageVersion>8.0.29</MicrosoftAspNetCoreAppRefPackageVersion>
<MicrosoftAspNetCoreDeveloperCertificatesXPlatPackageVersion>8.0.29-servicing.26325.17</MicrosoftAspNetCoreDeveloperCertificatesXPlatPackageVersion>
<MicrosoftAspNetCoreComponentsSdkAnalyzersPackageVersion>8.0.29-servicing.26325.17</MicrosoftAspNetCoreComponentsSdkAnalyzersPackageVersion>
<MicrosoftAspNetCoreMvcAnalyzersPackageVersion>8.0.29-servicing.26325.17</MicrosoftAspNetCoreMvcAnalyzersPackageVersion>
<MicrosoftAspNetCoreMvcApiAnalyzersPackageVersion>8.0.29-servicing.26325.17</MicrosoftAspNetCoreMvcApiAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzersPackageVersion>8.0.29-servicing.26325.17</MicrosoftAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreTestHostPackageVersion>8.0.29</MicrosoftAspNetCoreTestHostPackageVersion>
</PropertyGroup>
<!-- Dependencies from https://github.com/dotnet/razor -->
<PropertyGroup>
Expand All @@ -186,7 +186,7 @@
</PropertyGroup>
<PropertyGroup>
<!-- Dependencies from https://github.com/dotnet/wpf -->
<MicrosoftNETSdkWindowsDesktopPackageVersion>8.0.28-servicing.26269.2</MicrosoftNETSdkWindowsDesktopPackageVersion>
<MicrosoftNETSdkWindowsDesktopPackageVersion>8.0.29-servicing.26325.4</MicrosoftNETSdkWindowsDesktopPackageVersion>
</PropertyGroup>
<PropertyGroup Label="Manually updated">
<!-- Dependencies from https://github.com/microsoft/MSBuildLocator -->
Expand Down Expand Up @@ -230,7 +230,7 @@
</PropertyGroup>
<PropertyGroup>
<!-- Workloads from dotnet/emsdk -->
<MicrosoftNETWorkloadEmscriptenCurrentManifest80100PackageVersion>8.0.28</MicrosoftNETWorkloadEmscriptenCurrentManifest80100PackageVersion>
<MicrosoftNETWorkloadEmscriptenCurrentManifest80100PackageVersion>8.0.29</MicrosoftNETWorkloadEmscriptenCurrentManifest80100PackageVersion>
<EmscriptenWorkloadManifestVersion>$(MicrosoftNETWorkloadEmscriptenCurrentManifest80100PackageVersion)</EmscriptenWorkloadManifestVersion>
<!-- emsdk workload prerelease version band must match the emsdk feature band -->
<EmscriptenWorkloadFeatureBand>8.0.100$([System.Text.RegularExpressions.Regex]::Match($(EmscriptenWorkloadManifestVersion), `-rtm|-[A-z]*\.*\d*`))</EmscriptenWorkloadFeatureBand>
Expand Down
95 changes: 78 additions & 17 deletions src/Containers/Microsoft.NET.Build.Containers/ContentStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,18 @@ namespace Microsoft.NET.Build.Containers;

internal static class ContentStore
{
public static string ArtifactRoot { get; set; } = Path.Combine(Path.GetTempPath(), "Containers");
public static string ArtifactRoot { get; set; } = EnsureCacheDirectory();
public static string ContentRoot
{
get
{
string contentPath = Path.Join(ArtifactRoot, "Content");

Directory.CreateDirectory(contentPath);

CreateCacheDirectory(contentPath);
return contentPath;
}
}

public static string TempPath
{
get
{
string tempPath = Path.Join(ArtifactRoot, "Temp");

Directory.CreateDirectory(tempPath);

return tempPath;
}
}
public static string TempPath { get; } = Directory.CreateTempSubdirectory().FullName;

public static string PathForDescriptor(Descriptor descriptor)
{
Expand Down Expand Up @@ -62,8 +50,81 @@ public static string GetPathForHash(string contentHash)
return Path.Combine(ContentRoot, contentHash);
}

public static string GetTempFile()
public static string GetTempFile() => Path.Join(TempPath, Path.GetRandomFileName());

/// <summary>
/// Gets the path to the user cache directory for SDK container builds, creating it if it does
/// not already exist.
/// </summary>
private static string EnsureCacheDirectory()
{
string userCacheDir = GetUserCacheDirectoryPath();
CreateCacheDirectory(userCacheDir);

string dotnetCacheDir = Path.Join(userCacheDir, "dotnet");
CreateCacheDirectory(dotnetCacheDir);

string containersCacheDir = Path.Join(dotnetCacheDir, "Containers");
CreateCacheDirectory(containersCacheDir);

return containersCacheDir;
}

/// <summary>
/// Creates a cache directory with user-scoped permissions based on the OS.
/// </summary>
/// <remarks>
/// Permissions are only set for the leaf directory. The caller is expected to handle
/// permissions for intermediate directories.
/// </remarks>
private static void CreateCacheDirectory(string path)
{
if (OperatingSystem.IsWindows())
{
Directory.CreateDirectory(path);
}
else
{
// Per XDG_CACHE_HOME spec: if the cache directory doesn't exist, try to create it with
// permissions 0700. If it already exists, don't try to change the permissions.
// See https://specifications.freedesktop.org/basedir/latest/#referencing
Directory.CreateDirectory(path, UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute);
}
}

/// <summary>
/// Gets the user-scoped cache directory, accounting for OS differences.
/// </summary>
private static string GetUserCacheDirectoryPath()
{
return Path.Join(TempPath, Path.GetRandomFileName());
if (OperatingSystem.IsLinux())
{
// See "XDG Base Directory Specification":
// https://specifications.freedesktop.org/basedir/latest/
string? xdgCacheHome = Environment.GetEnvironmentVariable("XDG_CACHE_HOME");
if (!string.IsNullOrEmpty(xdgCacheHome) && Path.IsPathFullyQualified(xdgCacheHome))
{
return xdgCacheHome;
}

// From the spec, if XDG_CACHE_HOME is not set then fall back to ~/.cache
string userHomeDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
return Path.Join(userHomeDirectory, ".cache");
}

if (OperatingSystem.IsMacOS())
{
// See "macOS Library Directory Details":
// https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html
string userHomeDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
return Path.Join(userHomeDirectory, "Library", "Caches");
}

// On other platforms, use the local application data folder.
string localAppData = Environment.GetFolderPath(
Environment.SpecialFolder.LocalApplicationData,
Environment.SpecialFolderOption.DoNotVerify);

return localAppData;
}
}
13 changes: 13 additions & 0 deletions src/Containers/Microsoft.NET.Build.Containers/DigestUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,17 @@ internal static string GetSha(string str)

return Convert.ToHexString(hash).ToLowerInvariant();
}

/// <summary>
/// Returns the encoded (hash) portion of a digest string as raw bytes.
/// </summary>
/// <remarks>
/// <c>GetEncodedValue("sha256:e3b0c4...")</c> returns the bytes for <c>"e3b0c4..."</c>.
/// </remarks>
internal static byte[] GetEncodedValue(string digest)
{
int separatorIndex = digest.IndexOf(':');
string encoded = separatorIndex >= 0 ? digest[(separatorIndex + 1)..] : digest;
return Convert.FromHexString(encoded);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Security.Cryptography;

namespace Microsoft.NET.Build.Containers;

internal sealed class InvalidDigestException : Exception
{
public InvalidDigestException(string message)
: base(message)
{
}

public static void ThrowIfMismatched(ReadOnlySpan<byte> expected, ReadOnlySpan<byte> actual)
{
if (!CryptographicOperations.FixedTimeEquals(expected, actual))
{
string expectedHashString = Convert.ToHexString(expected).ToLowerInvariant();
string actualHashString = Convert.ToHexString(actual).ToLowerInvariant();
throw new InvalidDigestException($"Expected {expectedHashString}, got {actualHashString}.");
}
}
}
31 changes: 27 additions & 4 deletions src/Containers/Microsoft.NET.Build.Containers/Registry/Registry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using NuGet.RuntimeModel;
using System.Diagnostics;
using System.Net.Http.Json;
using System.Security.Cryptography;
using System.Text.Json.Nodes;

namespace Microsoft.NET.Build.Containers;
Expand Down Expand Up @@ -257,19 +258,41 @@ public async Task<string> DownloadBlobAsync(string repository, Descriptor descri
cancellationToken.ThrowIfCancellationRequested();
string localPath = ContentStore.PathForDescriptor(descriptor);

if (File.Exists(localPath))
try
{
// Assume file is up to date and just return it
var fileStream = File.OpenRead(localPath);

var actualHash = SHA256.HashData(fileStream);
var expectedHash = DigestUtils.GetEncodedValue(descriptor.Digest);
InvalidDigestException.ThrowIfMismatched(expectedHash, actualHash);

return localPath;
}
catch (DirectoryNotFoundException)
{
// Cache miss
}
catch (FileNotFoundException)
{
// Cache miss
}
catch (InvalidDigestException exception)
{
// Incorrect digest
_logger.LogTrace(
"Digest validation failed for cached blob {1} ({2}), redownloading from registry.",
localPath, exception.Message);
}

// No local copy, so download one
using Stream responseStream = await _registryAPI.Blob.GetStreamAsync(repository, descriptor.Digest, cancellationToken).ConfigureAwait(false);

string tempTarballPath = ContentStore.GetTempFile();
using (FileStream fs = File.Create(tempTarballPath))
{
await responseStream.CopyToAsync(fs, cancellationToken).ConfigureAwait(false);
await responseStream
.CopyToAndVerifyAsync(fs, descriptor.Digest, cancellationToken)
.ConfigureAwait(false);
}

cancellationToken.ThrowIfCancellationRequested();
Expand Down Expand Up @@ -319,7 +342,7 @@ internal async Task<FinalizeUploadInformation> UploadBlobChunkedAsync(Stream con
// manual because ACR throws an error with the .NET type {"Range":"bytes 0-84521/*","Reason":"the Content-Range header format is invalid"}
// content.Headers.Add("Content-Range", $"0-{contents.Length - 1}");
Debug.Assert(content.Headers.TryAddWithoutValidation("Content-Range", $"{chunkStart}-{chunkStart + bytesRead - 1}"));

NextChunkUploadInformation nextChunk = await _registryAPI.Blob.Upload.UploadChunkAsync(patchUri, content, cancellationToken).ConfigureAwait(false);
patchUri = nextChunk.UploadUri;

Expand Down
Loading
Loading