Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions src/Cli/dotnet/Commands/CliCommandStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -2691,4 +2691,7 @@ Proceed?</value>
<data name="DurationColon" xml:space="preserve">
<value>duration:</value>
</data>
<data name="WorkloadCleanAllComplete" xml:space="preserve">
<value>Successfully removed all workload sets, manifests, and installation state.</value>
</data>
</root>
91 changes: 91 additions & 0 deletions src/Cli/dotnet/Commands/Workload/Install/FileBasedInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,7 @@ public void GarbageCollect(Func<string, IWorkloadResolver> getResolverForWorkloa
if (cleanAllPacks)
{
DeleteAllWorkloadInstallationRecords();
DeleteAllWorkloadSetsAndManifests();
}

}
Expand Down Expand Up @@ -621,6 +622,96 @@ private void DeleteAllWorkloadInstallationRecords()
}
}

/// <summary>
/// Deletes all workload sets, manifests, and install state files across all feature bands.
/// This is used by 'dotnet workload clean --all' to completely reset workloads to a clean state.
/// </summary>
private void DeleteAllWorkloadSetsAndManifests()
{
Reporter.Verbose.WriteLine("Removing all workload sets and manifests...");

// Delete all workload sets and manifests from sdk-manifests directory
string sdkManifestsRoot = Path.Combine(_workloadRootDir, "sdk-manifests");
if (Directory.Exists(sdkManifestsRoot))
{
// Iterate through all feature band directories
foreach (var featureBandDir in Directory.GetDirectories(sdkManifestsRoot))
{
string featureBand = Path.GetFileName(featureBandDir);

// Delete workload sets directory for this feature band
string workloadSetsDir = Path.Combine(featureBandDir, SdkDirectoryWorkloadManifestProvider.WorkloadSetsFolderName);
if (Directory.Exists(workloadSetsDir))
{
Reporter.Verbose.WriteLine($"Deleting workload sets directory: {workloadSetsDir}");
Directory.Delete(workloadSetsDir, true);
}

// Delete all manifest directories for this feature band (except workloadsets folder)
foreach (var manifestDir in Directory.GetDirectories(featureBandDir))
{
string dirName = Path.GetFileName(manifestDir);
if (!string.Equals(dirName, SdkDirectoryWorkloadManifestProvider.WorkloadSetsFolderName, StringComparison.OrdinalIgnoreCase))
{
Reporter.Verbose.WriteLine($"Deleting manifest directory: {manifestDir}");
Directory.Delete(manifestDir, true);
}
}

// Delete the feature band directory if it's now empty
if (Directory.Exists(featureBandDir) && !Directory.GetFileSystemEntries(featureBandDir).Any())
{
Directory.Delete(featureBandDir);
}
}
}

// Delete all install state files
string metadataWorkloadsRoot = Path.Combine(_workloadRootDir, "metadata", "workloads");
if (Directory.Exists(metadataWorkloadsRoot))
{
foreach (var archDir in Directory.GetDirectories(metadataWorkloadsRoot))
{
foreach (var featureBandDir in Directory.GetDirectories(archDir))
{
string installStateDir = Path.Combine(featureBandDir, "InstallState");
if (Directory.Exists(installStateDir))
{
string defaultJsonPath = Path.Combine(installStateDir, "default.json");
if (File.Exists(defaultJsonPath))
{
Reporter.Verbose.WriteLine($"Deleting install state file: {defaultJsonPath}");
File.Delete(defaultJsonPath);
}

// Delete InstallState directory if it's now empty
if (Directory.Exists(installStateDir) && !Directory.GetFileSystemEntries(installStateDir).Any())
{
Directory.Delete(installStateDir);
}
}
}
}
}

// Also delete installation records for workload sets and manifests
string installedWorkloadSetsDir = Path.Combine(_workloadMetadataDir, InstalledWorkloadSetsDir);
if (Directory.Exists(installedWorkloadSetsDir))
{
Reporter.Verbose.WriteLine($"Deleting workload sets installation records: {installedWorkloadSetsDir}");
Directory.Delete(installedWorkloadSetsDir, true);
}

string installedManifestsDir = Path.Combine(_workloadMetadataDir, InstalledManifestsDir);
if (Directory.Exists(installedManifestsDir))
{
Reporter.Verbose.WriteLine($"Deleting manifest installation records: {installedManifestsDir}");
Directory.Delete(installedManifestsDir, true);
}

_reporter.WriteLine(CliCommandStrings.WorkloadCleanAllComplete);
}

string GetWorkloadHistoryDirectory()
{
return Path.Combine(_workloadMetadataDir, RuntimeInformation.ProcessArchitecture.ToString(), _sdkFeatureBand.ToString(), HistoryDir);
Expand Down
5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.pt-BR.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.ru.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.tr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hans.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hant.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ public void WhenSolutionFilterWithTrailingCommaIsPassedItListsProjects(string so
$"{new string('-', CliCommandStrings.ProjectsHeader.Length)}",
$"{Path.Combine("App", "App.csproj")}",
$"{Path.Combine("Lib", "Lib.csproj")}" };
var projectDirectory = _testAssetsManager
var projectDirectory = TestAssetsManager
.CopyTestAsset("TestAppWithTrailingCommaSlnf", identifier: "GivenDotnetSlnList-TrailingComma")
.WithSource()
.Path;
Expand All @@ -328,7 +328,7 @@ public void WhenSolutionFilterWithCommentsIsPassedItListsProjects(string solutio
string[] expectedOutput = { $"{CliCommandStrings.ProjectsHeader}",
$"{new string('-', CliCommandStrings.ProjectsHeader.Length)}",
$"{Path.Combine("App", "App.csproj")}" };
var projectDirectory = _testAssetsManager
var projectDirectory = TestAssetsManager
.CopyTestAsset("TestAppWithTrailingCommaSlnf", identifier: "GivenDotnetSlnList-Comments")
.WithSource()
.Path;
Expand Down
Loading