From dc916464865bb3efca6552bc98971f967c6973bb Mon Sep 17 00:00:00 2001 From: TIYASHA SHIL Date: Sat, 16 May 2026 20:30:43 +0530 Subject: [PATCH] feat: enhance dry run diff view to show friendly names (resolves #51) --- src/Engine.cs | 34 ++++++++++++++++++-- src/Interfaces/ISystemSettingsService.cs | 1 + src/Services/System/SystemSettingsService.cs | 9 ++++++ tests/WinHome.Tests/EngineTest.cs | 6 ++-- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/Engine.cs b/src/Engine.cs index ea72e32..81b466c 100644 --- a/src/Engine.cs +++ b/src/Engine.cs @@ -340,7 +340,7 @@ public async Task PrintDiffAsync(Configuration config) _logger.LogError("\n[-] Items to Remove:"); foreach (var item in itemsToRemove) { - _logger.LogError($" - {item}"); + _logger.LogError($" - {FormatFriendlyName(item)}"); } } @@ -349,7 +349,7 @@ public async Task PrintDiffAsync(Configuration config) _logger.LogSuccess("\n[+] Items to Add:"); foreach (var item in itemsToAdd) { - _logger.LogSuccess($" + {item}"); + _logger.LogSuccess($" + {FormatFriendlyName(item)}"); } } @@ -358,11 +358,39 @@ public async Task PrintDiffAsync(Configuration config) _logger.LogInfo("\n[=] Unchanged Items:"); foreach (var item in unchangedItems) { - _logger.LogInfo($" = {item}"); + _logger.LogInfo($" = {FormatFriendlyName(item)}"); } } } + private string FormatFriendlyName(string item) + { + if (item.StartsWith("reg:")) + { + var parts = item.Substring(4).Split('|', 2); + if (parts.Length == 2) + { + string path = parts[0]; + string name = parts[1]; + string? settingKey = _systemSettings.GetFriendlyName(path, name); + if (settingKey != null) + { + return $"System Setting: {settingKey}"; + } + return $"Registry Tweak: {path} -> {name}"; + } + } + else + { + var parts = item.Split(':', 2); + if (parts.Length == 2) + { + return $"App ({parts[0]}): {parts[1]}"; + } + } + return item; + } + private async Task> BuildStateFromConfig(Configuration config) { var state = new HashSet(); diff --git a/src/Interfaces/ISystemSettingsService.cs b/src/Interfaces/ISystemSettingsService.cs index 0d50c70..d37ce53 100644 --- a/src/Interfaces/ISystemSettingsService.cs +++ b/src/Interfaces/ISystemSettingsService.cs @@ -9,5 +9,6 @@ public interface ISystemSettingsService Task> GetTweaksAsync(Dictionary settings); Task ApplyNonRegistrySettingsAsync(Dictionary settings, bool dryRun); Task> GetCapturedSettingsAsync(); + string? GetFriendlyName(string registryPath, string registryName); } } diff --git a/src/Services/System/SystemSettingsService.cs b/src/Services/System/SystemSettingsService.cs index a8d240c..7a5c20d 100644 --- a/src/Services/System/SystemSettingsService.cs +++ b/src/Services/System/SystemSettingsService.cs @@ -179,6 +179,15 @@ public async Task> GetCapturedSettingsAsync() }); } + public string? GetFriendlyName(string registryPath, string registryName) + { + var match = _catalog.FirstOrDefault(d => + d.RegistryPath.Equals(registryPath, StringComparison.OrdinalIgnoreCase) && + d.RegistryName.Equals(registryName, StringComparison.OrdinalIgnoreCase)); + + return match?.SettingKey; + } + public Task ApplyNonRegistrySettingsAsync(Dictionary settings, bool dryRun) { if (settings == null) return Task.CompletedTask; diff --git a/tests/WinHome.Tests/EngineTest.cs b/tests/WinHome.Tests/EngineTest.cs index bb63892..c12c2ae 100644 --- a/tests/WinHome.Tests/EngineTest.cs +++ b/tests/WinHome.Tests/EngineTest.cs @@ -162,11 +162,11 @@ public async Task PrintDiffAsync_ShouldPrintCorrectDiff() // Assert mockLogger.Verify(l => l.LogError(It.Is(s => s.Contains("Items to Remove"))), Times.Once); - mockLogger.Verify(l => l.LogError(It.Is(s => s.Contains("winget:OldApp"))), Times.Once); + mockLogger.Verify(l => l.LogError(It.Is(s => s.Contains("App (winget): OldApp"))), Times.Once); mockLogger.Verify(l => l.LogSuccess(It.Is(s => s.Contains("Items to Add"))), Times.Once); - mockLogger.Verify(l => l.LogSuccess(It.Is(s => s.Contains("winget:NewApp"))), Times.Once); + mockLogger.Verify(l => l.LogSuccess(It.Is(s => s.Contains("App (winget): NewApp"))), Times.Once); mockLogger.Verify(l => l.LogInfo(It.Is(s => s.Contains("Unchanged Items"))), Times.Once); - mockLogger.Verify(l => l.LogInfo(It.Is(s => s.Contains("winget:UnchangedApp"))), Times.Once); + mockLogger.Verify(l => l.LogInfo(It.Is(s => s.Contains("App (winget): UnchangedApp"))), Times.Once); } } }