From 4fbdf3df235611a94c216b20e116b514ef8cf3e3 Mon Sep 17 00:00:00 2001 From: HardCodeDev Date: Thu, 22 Jan 2026 21:19:16 +0400 Subject: [PATCH 1/3] Add Reset Project command --- .gitignore | 1 + src/ucll/Program.cs | 8 +++ src/ucll/ResetProject/ResetProjectCommand.cs | 65 +++++++++++++++++++ src/ucll/ResetProject/ResetProjectSettings.cs | 12 ++++ 4 files changed, 86 insertions(+) create mode 100644 src/ucll/ResetProject/ResetProjectCommand.cs create mode 100644 src/ucll/ResetProject/ResetProjectSettings.cs diff --git a/.gitignore b/.gitignore index f3eb4dc..973ff0b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.vs/ .idea/ vm/ diff --git a/src/ucll/Program.cs b/src/ucll/Program.cs index 7b938f6..2db3c89 100644 --- a/src/ucll/Program.cs +++ b/src/ucll/Program.cs @@ -95,6 +95,14 @@ .WithExample("uninstall-unused", "--yes") .WithExample("uninstall-unused", "--dry-run"); + config.AddCommand("reset-project") + .WithDescription("Reset Unity project by deleting cache files and folders") + .WithExample("reset-project") + .WithExample("reset-project", "--yes") + .WithExample("reset-project", "--dry-run") + .WithExample("reset-project", "--favorite") + .WithExample("reset-project", "searchPath"); + config.AddCommand("upm-git-url") .WithDescription("Generate a git URL for Unity Package Manager from a Unity project") .WithExample("upm-git-url") diff --git a/src/ucll/ResetProject/ResetProjectCommand.cs b/src/ucll/ResetProject/ResetProjectCommand.cs new file mode 100644 index 0000000..7beb50b --- /dev/null +++ b/src/ucll/ResetProject/ResetProjectCommand.cs @@ -0,0 +1,65 @@ +internal class ResetProjectCommand(UnityHub unityHub) : SearchPathCommand(unityHub) +{ + protected override int ExecuteImpl(ResetProjectSettings settings) + { + string searchPath = ResolveSearchPath(settings.SearchPath, settings.Favorite); + ProjectInfo info = Project.Parse(searchPath); + + var resetTargets = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "Assets", "Packages", "ProjectSettings", + }; + + bool shouldReset = settings.Yes || AnsiConsole.Confirm( + "Do you want to reset this project?", + defaultValue: false); + + if (!shouldReset) + { + throw new UserCancelledException("Resetting cancelled."); + } + + AnsiConsole.WriteLine(); + + try + { + foreach (string item in Directory.GetFileSystemEntries(info.Path)) + { + string itemName = Path.GetFileName(item); + + if (resetTargets.Contains(itemName)) continue; + + if (settings.DryRun) + { + AnsiConsole.MarkupLine($"[dim]Would delete: {Markup.Escape(itemName)}[/]"); + } + else + { + if (Directory.Exists(item)) + { + AnsiConsole.MarkupLine($"[bold]Deleting directory {Markup.Escape(itemName)}...[/]"); + + Directory.Delete(item, true); + + WriteSuccess($"Directory {Markup.Escape(item)} deleted successfully."); + } + else if (File.Exists(item)) + { + AnsiConsole.MarkupLine($"[bold]Deleting file {Markup.Escape(itemName)}...[/]"); + + File.Delete(item); + + WriteSuccess($"File {Markup.Escape(itemName)} deleted successfully."); + } + } + } + } + catch (Exception ex) + { + WriteError($"Failed to reset this project: {ex.Message}"); + } + + WriteSuccess("Resetting process completed."); + return 0; + } +} \ No newline at end of file diff --git a/src/ucll/ResetProject/ResetProjectSettings.cs b/src/ucll/ResetProject/ResetProjectSettings.cs new file mode 100644 index 0000000..f88488f --- /dev/null +++ b/src/ucll/ResetProject/ResetProjectSettings.cs @@ -0,0 +1,12 @@ +using System.ComponentModel; + +internal class ResetProjectSettings : MutatingSettings +{ + [CommandArgument(0, "[searchPath]")] + [Description(Descriptions.SearchPath)] + public string? SearchPath { get; init; } + + [CommandOption("-f|--favorite|--favorites")] + [Description(Descriptions.Favorite)] + public bool Favorite { get; init; } +} \ No newline at end of file From 10ffcc2ce1d170cec9b9fe691ea138b3900e5853 Mon Sep 17 00:00:00 2001 From: HardCodeDev Date: Thu, 22 Jan 2026 21:20:36 +0400 Subject: [PATCH 2/3] Fix directory --- src/ucll/{ => Commands}/ResetProject/ResetProjectCommand.cs | 0 src/ucll/{ => Commands}/ResetProject/ResetProjectSettings.cs | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/ucll/{ => Commands}/ResetProject/ResetProjectCommand.cs (100%) rename src/ucll/{ => Commands}/ResetProject/ResetProjectSettings.cs (100%) diff --git a/src/ucll/ResetProject/ResetProjectCommand.cs b/src/ucll/Commands/ResetProject/ResetProjectCommand.cs similarity index 100% rename from src/ucll/ResetProject/ResetProjectCommand.cs rename to src/ucll/Commands/ResetProject/ResetProjectCommand.cs diff --git a/src/ucll/ResetProject/ResetProjectSettings.cs b/src/ucll/Commands/ResetProject/ResetProjectSettings.cs similarity index 100% rename from src/ucll/ResetProject/ResetProjectSettings.cs rename to src/ucll/Commands/ResetProject/ResetProjectSettings.cs From d62ea6a98d892decb314010bca2014597a26d05a Mon Sep 17 00:00:00 2001 From: HardCodeDev Date: Fri, 23 Jan 2026 19:46:50 +0400 Subject: [PATCH 3/3] Invert ResetProject command logic --- .../ResetProject/ResetProjectCommand.cs | 27 ++++++++++++------- .../ResetProject/ResetProjectSettings.cs | 4 +++ src/ucll/Program.cs | 1 + 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/ucll/Commands/ResetProject/ResetProjectCommand.cs b/src/ucll/Commands/ResetProject/ResetProjectCommand.cs index 7beb50b..eba610c 100644 --- a/src/ucll/Commands/ResetProject/ResetProjectCommand.cs +++ b/src/ucll/Commands/ResetProject/ResetProjectCommand.cs @@ -3,31 +3,37 @@ internal class ResetProjectCommand(UnityHub unityHub) : SearchPathCommand(StringComparer.OrdinalIgnoreCase) + var targetDirs = new HashSet(StringComparer.OrdinalIgnoreCase) { - "Assets", "Packages", "ProjectSettings", + "Library", "obj", "Logs", "Temp", "UserSettings", ".vs", ".idea" + }; + + if (settings.KeepUserSettings) targetDirs.Remove("UserSettings"); + + var targetFilesExtensions = new HashSet(StringComparer.OrdinalIgnoreCase) + { + ".csproj", ".sln", ".user", ".vsconfig" }; bool shouldReset = settings.Yes || AnsiConsole.Confirm( "Do you want to reset this project?", defaultValue: false); - if (!shouldReset) - { - throw new UserCancelledException("Resetting cancelled."); - } + if (!shouldReset) throw new UserCancelledException("Resetting cancelled."); AnsiConsole.WriteLine(); + int deletedDirs = 0, deletedFiles = 0; + try { foreach (string item in Directory.GetFileSystemEntries(info.Path)) { string itemName = Path.GetFileName(item); - if (resetTargets.Contains(itemName)) continue; + if (!targetDirs.Contains(itemName) && !targetFilesExtensions.Contains(Path.GetExtension(itemName))) continue; if (settings.DryRun) { @@ -41,7 +47,8 @@ protected override int ExecuteImpl(ResetProjectSettings settings) Directory.Delete(item, true); - WriteSuccess($"Directory {Markup.Escape(item)} deleted successfully."); + WriteSuccess($"Directory {Markup.Escape(itemName)} deleted successfully."); + deletedDirs++; } else if (File.Exists(item)) { @@ -50,6 +57,7 @@ protected override int ExecuteImpl(ResetProjectSettings settings) File.Delete(item); WriteSuccess($"File {Markup.Escape(itemName)} deleted successfully."); + deletedFiles++; } } } @@ -60,6 +68,7 @@ protected override int ExecuteImpl(ResetProjectSettings settings) } WriteSuccess("Resetting process completed."); + WriteSuccess($"Deleted {deletedDirs} directories and {deletedFiles} files in project root."); return 0; } } \ No newline at end of file diff --git a/src/ucll/Commands/ResetProject/ResetProjectSettings.cs b/src/ucll/Commands/ResetProject/ResetProjectSettings.cs index f88488f..e67794f 100644 --- a/src/ucll/Commands/ResetProject/ResetProjectSettings.cs +++ b/src/ucll/Commands/ResetProject/ResetProjectSettings.cs @@ -9,4 +9,8 @@ internal class ResetProjectSettings : MutatingSettings [CommandOption("-f|--favorite|--favorites")] [Description(Descriptions.Favorite)] public bool Favorite { get; init; } + + [CommandOption("--keep-user-settings")] + [Description("Keep \"UserSettings\" folder")] + public bool KeepUserSettings { get; init; } } \ No newline at end of file diff --git a/src/ucll/Program.cs b/src/ucll/Program.cs index 2db3c89..0bac791 100644 --- a/src/ucll/Program.cs +++ b/src/ucll/Program.cs @@ -101,6 +101,7 @@ .WithExample("reset-project", "--yes") .WithExample("reset-project", "--dry-run") .WithExample("reset-project", "--favorite") + .WithExample("reset-project", "--keep-user-settings") .WithExample("reset-project", "searchPath"); config.AddCommand("upm-git-url")