summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/SMAPI.Tests/Utilities/PathUtilitiesTests.cs55
-rw-r--r--src/SMAPI.Toolkit/Utilities/PathUtilities.cs32
2 files changed, 65 insertions, 22 deletions
diff --git a/src/SMAPI.Tests/Utilities/PathUtilitiesTests.cs b/src/SMAPI.Tests/Utilities/PathUtilitiesTests.cs
index 1d6c371d..ea69a9ea 100644
--- a/src/SMAPI.Tests/Utilities/PathUtilitiesTests.cs
+++ b/src/SMAPI.Tests/Utilities/PathUtilitiesTests.cs
@@ -24,6 +24,18 @@ namespace SMAPI.Tests.Utilities
NormalizedOnUnix = @"C:/Program Files (x86)/Steam/steamapps/common/Stardew Valley"
},
+ // Windows absolute path (with trailing slash)
+ new SamplePath
+ {
+ OriginalPath = @"C:\Program Files (x86)\Steam\steamapps\common\Stardew Valley\",
+
+ Segments = new[] { "C:", "Program Files (x86)", "Steam", "steamapps", "common", "Stardew Valley" },
+ SegmentsLimit3 = new [] { "C:", "Program Files (x86)", @"Steam\steamapps\common\Stardew Valley\" },
+
+ NormalizedOnWindows = @"C:\Program Files (x86)\Steam\steamapps\common\Stardew Valley\",
+ NormalizedOnUnix = @"C:/Program Files (x86)/Steam/steamapps/common/Stardew Valley/"
+ },
+
// Windows relative path
new SamplePath
{
@@ -68,10 +80,22 @@ namespace SMAPI.Tests.Utilities
Segments = new [] { "home", ".steam", "steam", "steamapps", "common", "Stardew Valley" },
SegmentsLimit3 = new [] { "home", ".steam", "steam/steamapps/common/Stardew Valley" },
- NormalizedOnWindows = @"home\.steam\steam\steamapps\common\Stardew Valley",
+ NormalizedOnWindows = @"\home\.steam\steam\steamapps\common\Stardew Valley",
NormalizedOnUnix = @"/home/.steam/steam/steamapps/common/Stardew Valley"
},
+ // Linux absolute path (with trailing slash)
+ new SamplePath
+ {
+ OriginalPath = @"/home/.steam/steam/steamapps/common/Stardew Valley/",
+
+ Segments = new [] { "home", ".steam", "steam", "steamapps", "common", "Stardew Valley" },
+ SegmentsLimit3 = new [] { "home", ".steam", "steam/steamapps/common/Stardew Valley/" },
+
+ NormalizedOnWindows = @"\home\.steam\steam\steamapps\common\Stardew Valley\",
+ NormalizedOnUnix = @"/home/.steam/steam/steamapps/common/Stardew Valley/"
+ },
+
// Linux absolute path (with ~)
new SamplePath
{
@@ -199,15 +223,40 @@ namespace SMAPI.Tests.Utilities
ExpectedResult = @"\\adjacent\unc"
)]
[TestCase(
+ @"C:\same\path",
+ @"C:\same\path",
+ ExpectedResult = @"."
+ )]
+ [TestCase(
@"C:\parent",
@"C:\PARENT\child",
- ExpectedResult = @"child" // note: incorrect on Linux and sometimes MacOS, but not worth the complexity of detecting whether the filesystem is case-sensitive for SMAPI's purposes
+ ExpectedResult = @"child"
)]
#else
[TestCase(
@"~/.steam/steam/steamapps/common/Stardew Valley",
@"~/.steam/steam/steamapps/common/Stardew Valley/Mods/Automate",
- ExpectedResult = @"Mods\Automate"
+ ExpectedResult = @"Mods/Automate"
+ )]
+ [TestCase(
+ @"~/.steam/steam/steamapps/common/Stardew Valley/Mods/Automate",
+ @"~/.steam/steam/steamapps/common/Stardew Valley/Content",
+ ExpectedResult = @"../../Content"
+ )]
+ [TestCase(
+ @"~/.steam/steam/steamapps/common/Stardew Valley/Mods/Automate",
+ @"/mnt/another-drive",
+ ExpectedResult = @"/mnt/another-drive"
+ )]
+ [TestCase(
+ @"~/same/path",
+ @"~/same/path",
+ ExpectedResult = @"."
+ )]
+ [TestCase(
+ @"~/parent",
+ @"~/PARENT/child",
+ ExpectedResult = @"child" // note: incorrect on Linux and sometimes MacOS, but not worth the complexity of detecting whether the filesystem is case-sensitive for SMAPI's purposes
)]
#endif
public string GetRelativePath(string sourceDir, string targetPath)
diff --git a/src/SMAPI.Toolkit/Utilities/PathUtilities.cs b/src/SMAPI.Toolkit/Utilities/PathUtilities.cs
index 34940d4f..bd5fafbc 100644
--- a/src/SMAPI.Toolkit/Utilities/PathUtilities.cs
+++ b/src/SMAPI.Toolkit/Utilities/PathUtilities.cs
@@ -45,18 +45,10 @@ namespace StardewModdingAPI.Toolkit.Utilities
[Pure]
public static string NormalizePathSeparators(string path)
{
- string normalized = string.Join(PathUtilities.PreferredPathSeparator, PathUtilities.GetSegments(path));
-
- // keep root
-#if SMAPI_FOR_WINDOWS
- if (path.StartsWith(PathUtilities.WindowsUncRoot))
- normalized = PathUtilities.WindowsUncRoot + normalized;
- else
-#endif
- if (path.StartsWith(PathUtilities.PreferredPathSeparator) || path.StartsWith(PathUtilities.WindowsUncRoot))
- normalized = PathUtilities.PreferredPathSeparator + normalized;
+ if (string.IsNullOrWhiteSpace(path))
+ return path;
- return normalized;
+ return string.Join(PathUtilities.PreferredPathSeparator, path.Split(PathUtilities.PossiblePathSeparators));
}
/// <summary>Get a directory or file path relative to a given source path. If no relative path is possible (e.g. the paths are on different drives), an absolute path is returned.</summary>
@@ -79,16 +71,18 @@ namespace StardewModdingAPI.Toolkit.Utilities
// get relative path
string relative = PathUtilities.NormalizePathSeparators(Uri.UnescapeDataString(from.MakeRelativeUri(to).ToString()));
- // set empty path to './'
+ // normalize
if (relative == "")
- relative = "./";
-
- // fix root
- if (relative.StartsWith("file:") && !targetPath.Contains("file:"))
+ relative = ".";
+ else
{
- relative = relative.Substring("file:".Length);
- if (targetPath.StartsWith(PathUtilities.WindowsUncRoot) && !relative.StartsWith(PathUtilities.WindowsUncRoot))
- relative = PathUtilities.WindowsUncRoot + relative.TrimStart('\\');
+ // trim trailing slash from URL
+ if (relative.EndsWith(PathUtilities.PreferredPathSeparator))
+ relative = relative.Substring(0, relative.Length - PathUtilities.PreferredPathSeparator.Length);
+
+ // fix root
+ if (relative.StartsWith("file:") && !targetPath.Contains("file:"))
+ relative = relative.Substring("file:".Length);
}
return relative;