Skip to content

Commit

Permalink
Merge pull request #18482 from sfoslund/FileCopyMnts
Browse files Browse the repository at this point in the history
Allow copying across mounts on workload install
  • Loading branch information
sfoslund authored Jun 25, 2021
2 parents 08da3b4 + 396d2cb commit f2b190a
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 6 deletions.
31 changes: 31 additions & 0 deletions src/Cli/Microsoft.DotNet.InternalAbstractions/DirectoryPath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,5 +80,36 @@ public DirectoryPath GetParentPath()

return new DirectoryPath(parentDirectory.FullName);
}

internal static void MoveDirectory(string sourcePath, string destPath)
{
try
{
Directory.Move(sourcePath, destPath);
}
catch (IOException)
{
// Note: cannot use Directory.Move because it errors when copying across mounts
CopyDirectoryAcrossMounts(sourcePath, destPath);
}
}

private static void CopyDirectoryAcrossMounts(string sourcePath, string destPath)
{
if (!Directory.Exists(destPath))
{
Directory.CreateDirectory(destPath);
}

foreach (var dir in Directory.GetDirectories(sourcePath))
{
CopyDirectoryAcrossMounts(dir, Path.Combine(destPath, Path.GetFileName(dir)));
}

foreach (var file in Directory.GetFiles(sourcePath))
{
new FileInfo(file).CopyTo(Path.Combine(destPath, Path.GetFileName(file)), true);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ public void InstallWorkloadPack(PackInfo packInfo, SdkFeatureBand sdkFeatureBand
Directory.CreateDirectory(tempExtractionDir);
var packFiles = _nugetPackageDownloader.ExtractPackageAsync(packagePath, new DirectoryPath(tempExtractionDir)).GetAwaiter().GetResult();

FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(tempExtractionDir, packInfo.Path));
FileAccessRetrier.RetryOnMoveAccessFailure(() => DirectoryPath.MoveDirectory(tempExtractionDir, packInfo.Path));
}
}
else
Expand Down Expand Up @@ -217,16 +217,16 @@ public void InstallWorkloadManifest(ManifestId manifestId, ManifestVersion manif
{
Directory.Delete(tempBackupDir, true);
}
FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(manifestPath, tempBackupDir));
FileAccessRetrier.RetryOnMoveAccessFailure(() => DirectoryPath.MoveDirectory(manifestPath, tempBackupDir));
}
Directory.CreateDirectory(Path.GetDirectoryName(manifestPath));
FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(Path.Combine(tempExtractionDir, "data"), manifestPath));
FileAccessRetrier.RetryOnMoveAccessFailure(() => DirectoryPath.MoveDirectory(Path.Combine(tempExtractionDir, "data"), manifestPath));
},
rollback: () =>
{
if (!string.IsNullOrEmpty(tempBackupDir) && Directory.Exists(tempBackupDir))
{
FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(tempBackupDir, manifestPath));
FileAccessRetrier.RetryOnMoveAccessFailure(() => DirectoryPath.MoveDirectory(tempBackupDir, manifestPath));
}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ private async Task UpdateAdvertisingManifestAsync(ManifestId manifestId, bool in
Directory.Delete(adManifestPath, true);
}
Directory.CreateDirectory(Path.GetDirectoryName(adManifestPath));
FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(Path.Combine(extractionPath, "data"), adManifestPath));
FileAccessRetrier.RetryOnMoveAccessFailure(() => DirectoryPath.MoveDirectory(Path.Combine(extractionPath, "data"), adManifestPath));

_reporter.WriteLine(string.Format(LocalizableStrings.AdManifestUpdated, manifestId));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ public void GivenManagedInstallItCanErrorsWhenMissingOfflineCache()
INuGetPackageDownloader nugetInstaller = failingInstaller ? new FailingNuGetPackageDownloader(testDirectory) : new MockNuGetPackageDownloader(dotnetRoot, manifestDownload);
var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot });
var sdkFeatureBand = new SdkFeatureBand("6.0.100");
return (dotnetRoot, new NetSdkManagedInstaller(_reporter, sdkFeatureBand, workloadResolver, nugetInstaller, dotnetRoot, packageSourceLocation: packageSourceLocation, tempDirPath: testDirectory), nugetInstaller);
return (dotnetRoot, new NetSdkManagedInstaller(_reporter, sdkFeatureBand, workloadResolver, nugetInstaller, dotnetRoot, packageSourceLocation: packageSourceLocation), nugetInstaller);
}
}
}

0 comments on commit f2b190a

Please sign in to comment.