From f7759de57ce51bfff5897df490b5147ea3e2da0e Mon Sep 17 00:00:00 2001 From: hatayama Date: Wed, 8 Jul 2026 23:31:38 +0900 Subject: [PATCH] Normalize native CLI PATH entry comparison Compare existing PATH entries by normalized path identity before prepending the native CLI directory. This prevents trailing separators from preserving a duplicate current-process PATH entry while retaining the original text of unrelated entries. --- Assets/Tests/Editor/NativeCliInstallerTests.cs | 14 ++++++++++++++ .../CLI/NativeCliInstallPathResolver.cs | 7 ++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Assets/Tests/Editor/NativeCliInstallerTests.cs b/Assets/Tests/Editor/NativeCliInstallerTests.cs index e9f87194e9..1189c378f4 100644 --- a/Assets/Tests/Editor/NativeCliInstallerTests.cs +++ b/Assets/Tests/Editor/NativeCliInstallerTests.cs @@ -514,6 +514,20 @@ public void BuildPathWithInstallDirectory_OnWindowsMovesExistingNativeInstallDir Assert.That(result, Is.EqualTo("C:\\Users\\ExampleUser\\Programs\\uloop\\bin;C:\\npm")); } + [Test] + public void BuildPathWithInstallDirectory_OnWindowsRemovesTrailingSeparatorDuplicate() + { + // Verifies that a trailing separator does not preserve a duplicate native install directory. + string result = NativeCliInstallPathResolver.BuildPathWithInstallDirectory( + "C:\\npm;C:\\Users\\ExampleUser\\Programs\\uloop\\bin\\;C:\\Tools", + "C:\\Users\\ExampleUser\\Programs\\uloop\\bin", + RuntimePlatform.WindowsEditor); + + Assert.That( + result, + Is.EqualTo("C:\\Users\\ExampleUser\\Programs\\uloop\\bin;C:\\npm;C:\\Tools")); + } + [Test] public void BuildPathWithInstallDirectory_OnMacPrependsMissingNativeInstallDir() { diff --git a/Packages/src/Editor/Infrastructure/CLI/NativeCliInstallPathResolver.cs b/Packages/src/Editor/Infrastructure/CLI/NativeCliInstallPathResolver.cs index 9661180f47..10c7be305c 100644 --- a/Packages/src/Editor/Infrastructure/CLI/NativeCliInstallPathResolver.cs +++ b/Packages/src/Editor/Infrastructure/CLI/NativeCliInstallPathResolver.cs @@ -43,10 +43,15 @@ internal static string BuildPathWithInstallDirectory( new[] { separator }, StringSplitOptions.RemoveEmptyEntries); StringComparison comparison = GetPathComparison(platform); + string normalizedInstallDirectory = NormalizePathForComparison(installDirectory, platform); StringBuilder builder = new(installDirectory); foreach (string entry in entries) { - if (string.Equals(entry, installDirectory, comparison)) + if (!string.IsNullOrWhiteSpace(entry) + && string.Equals( + NormalizePathForComparison(entry, platform), + normalizedInstallDirectory, + comparison)) { continue; }