public async Task<bool> MirrorAsync(PackageIdentity identity, CancellationToken token)
{
// Publish the package itself.
var publishPackage = true;
if (!_overwriteExisting)
{
publishPackage = !(await _existenceChecker.PackageExistsAsync(identity, token));
}
if (publishPackage)
{
var downloadResult = await _sourceDownloadResource.GetDownloadResourceResultAsync(
identity,
_settings,
_logger,
token);
using (downloadResult)
{
if (downloadResult.Status != DownloadResourceResultStatus.Available)
{
throw new InvalidOperationException($"The NuGet package '{identity}' is not available on the source.");
}
await _packagePusher.PushAsync(downloadResult.PackageStream, token);
}
}
// Publish the symbols package.
var publishSymbolsPackage = _includeSymbols;
if (!_overwriteExisting)
{
publishSymbolsPackage = !(await _existenceChecker.SymbolsPackageExistsAsync(identity, token));
}
if (publishSymbolsPackage)
{
publishSymbolsPackage = await _symbolsPackageDownloader.ProcessAsync(
identity,
async streamResult =>
{
if (!streamResult.IsAvailable)
{
// The package has no symbols package.
return false;
}
await _packagePusher.PushAsync(streamResult.Stream, token);
return true;
},
token);
}
return publishPackage || publishSymbolsPackage;
}
}