diff --git a/docs/diff-tool.md b/docs/diff-tool.md index e251516f..e803b25c 100644 --- a/docs/diff-tool.md +++ b/docs/diff-tool.md @@ -316,7 +316,7 @@ DiffTools.UseOrder(DiffTool.DiffEngineViewer); "tempFile.txt" "targetFile.txt" ``` * Scanned paths: - * `$HOME/.dotnet/tools/DiffEngineViewer` + * `%HOME%/.dotnet/tools/DiffEngineViewer` * `%PATH%DiffEngineViewer` #### Linux settings: @@ -330,7 +330,7 @@ DiffTools.UseOrder(DiffTool.DiffEngineViewer); "tempFile.txt" "targetFile.txt" ``` * Scanned paths: - * `$HOME/.dotnet/tools/DiffEngineViewer` + * `%HOME%/.dotnet/tools/DiffEngineViewer` * `%PATH%DiffEngineViewer` ### [Diffinity](https://truehumandesign.se/s_diffinity.php) diff --git a/src/DiffEngine.Tests/SearchDirectoryExpansionTests.cs b/src/DiffEngine.Tests/SearchDirectoryExpansionTests.cs new file mode 100644 index 00000000..2c2bdf10 --- /dev/null +++ b/src/DiffEngine.Tests/SearchDirectoryExpansionTests.cs @@ -0,0 +1,41 @@ +/// +/// Search directories are written in the one syntax that gets expanded. +/// +/// WildcardFileFinder expands with Environment.ExpandEnvironmentVariables, which only understands +/// %NAME%. A directory written shell style with $HOME was passed through untouched, so it named a +/// literal directory called "$HOME" and never matched - which is why a globally installed +/// DiffEngineViewer was invisible on Linux and macOS whenever the bundled copy was absent. +/// +/// +public class SearchDirectoryExpansionTests +{ + [Test] + public async Task NoDefinitionUsesShellStyleExpansion() + { + var shellStyle = Definitions.Tools + .SelectMany( + definition => Directories(definition) + .Where(_ => _.Contains('$')) + .Select(_ => $"{definition.Tool}: {_}")) + .ToList(); + + await Assert.That(shellStyle).IsEmpty(); + } + + static IEnumerable Directories(Definition definition) + { + var support = definition.OsSupport; + foreach (var settings in new[] { support.Windows, support.Linux, support.Osx }) + { + if (settings == null) + { + continue; + } + + foreach (var directory in settings.SearchDirectories) + { + yield return directory; + } + } + } +} diff --git a/src/DiffEngine.Tests/diffTools.include.md b/src/DiffEngine.Tests/diffTools.include.md index f6243f7b..1a99761c 100644 --- a/src/DiffEngine.Tests/diffTools.include.md +++ b/src/DiffEngine.Tests/diffTools.include.md @@ -181,7 +181,7 @@ DiffTools.UseOrder(DiffTool.DiffEngineViewer); "tempFile.txt" "targetFile.txt" ``` * Scanned paths: - * `$HOME/.dotnet/tools/DiffEngineViewer` + * `%HOME%/.dotnet/tools/DiffEngineViewer` * `%PATH%DiffEngineViewer` #### Linux settings: @@ -195,7 +195,7 @@ DiffTools.UseOrder(DiffTool.DiffEngineViewer); "tempFile.txt" "targetFile.txt" ``` * Scanned paths: - * `$HOME/.dotnet/tools/DiffEngineViewer` + * `%HOME%/.dotnet/tools/DiffEngineViewer` * `%PATH%DiffEngineViewer` ### [Diffinity](https://truehumandesign.se/s_diffinity.php) diff --git a/src/DiffEngine/Implementation/DiffEngineViewer.cs b/src/DiffEngine/Implementation/DiffEngineViewer.cs index ac344921..88627735 100644 --- a/src/DiffEngine/Implementation/DiffEngineViewer.cs +++ b/src/DiffEngine/Implementation/DiffEngineViewer.cs @@ -23,11 +23,11 @@ public static Definition DiffEngineViewer() Linux: new( "DiffEngineViewer", launchArguments, - SearchDirectories("$HOME/.dotnet/tools/")), + SearchDirectories("%HOME%/.dotnet/tools/")), Osx: new( "DiffEngineViewer", launchArguments, - SearchDirectories("$HOME/.dotnet/tools/"))), + SearchDirectories("%HOME%/.dotnet/tools/"))), UseShellExecute: false, // Console subsystem, so without this a window flashes on every launch. CreateNoWindow: true,