cvium 4 éve
szülő
commit
bc661c16e1

+ 8 - 18
Emby.Server.Implementations/Library/PathExtensions.cs

@@ -103,28 +103,18 @@ namespace Emby.Server.Implementations.Library
 
             // We have to ensure that the sub path ends with a directory separator otherwise we'll get weird results
             // when the sub path matches a similar but in-complete subpath
-            if (!subPath.EndsWith(newDirectorySeparatorChar))
+            var oldSubPathEndsWithSeparator = subPath[^1] == newDirectorySeparatorChar;
+            if (!path.StartsWith(subPath, StringComparison.OrdinalIgnoreCase)
+                || (!oldSubPathEndsWithSeparator && path[subPath.Length] != newDirectorySeparatorChar))
             {
-                subPath += newDirectorySeparatorChar;
-            }
-
-            if (newSubPath.Contains(oldDirectorySeparatorChar, StringComparison.Ordinal))
-            {
-                newSubPath = newSubPath.Replace(oldDirectorySeparatorChar, newDirectorySeparatorChar);
-            }
-
-            if (!newSubPath.EndsWith(newDirectorySeparatorChar))
-            {
-                newSubPath += newDirectorySeparatorChar;
-            }
-
-            if (!path.Contains(subPath, StringComparison.OrdinalIgnoreCase))
-            {
-                newPath = null;
                 return false;
             }
 
-            newPath = path.Replace(subPath, newSubPath, StringComparison.OrdinalIgnoreCase);
+            var newSubPathTrimmed = newSubPath.AsSpan().TrimEnd(newDirectorySeparatorChar);
+            // Ensure that the path with the old subpath removed starts with a leading dir separator
+            int idx = oldSubPathEndsWithSeparator ? subPath.Length - 1 : subPath.Length;
+            newPath = string.Concat(newSubPathTrimmed, path.AsSpan(idx));
+
             return true;
         }
     }

+ 13 - 10
tests/Jellyfin.Server.Implementations.Tests/Library/PathExtensionsTests.cs

@@ -26,15 +26,16 @@ namespace Jellyfin.Server.Implementations.Tests.Library
         }
 
         [Theory]
-        [InlineData("C:/Users/jeff/myfile.mkv", "C:/Users/jeff", "/home/jeff", true, "/home/jeff/myfile.mkv")]
-        [InlineData("C:/Users/jeff/myfile.mkv", "C:/Users/jeff/", "/home/jeff", true, "/home/jeff/myfile.mkv")]
-        [InlineData("/home/jeff/music/jeff's band/consistently inconsistent.mp3", "/home/jeff/music/not jeff's band", "/home/not jeff", false, null)]
-        [InlineData("/home/jeff/music/jeff's band/consistently inconsistent.mp3", "/home/jeff/music/jeff's band", "/home/not jeff", true, "/home/not jeff/consistently inconsistent.mp3")]
-        [InlineData("C:\\Users\\jeff\\myfile.mkv", "C:\\Users/jeff", "/home/jeff", true, "/home/jeff/myfile.mkv")]
-        public void TryReplaceSubPath_ValidArgs_Correct(string path, string subPath, string newSubPath, bool succeeded, string? expectedResult)
+        [InlineData("C:/Users/jeff/myfile.mkv", "C:/Users/jeff", "/home/jeff", "/home/jeff/myfile.mkv")]
+        [InlineData("C:/Users/jeff/myfile.mkv", "C:/Users/jeff/", "/home/jeff", "/home/jeff/myfile.mkv")]
+        [InlineData("/home/jeff/music/jeff's band/consistently inconsistent.mp3", "/home/jeff/music/jeff's band", "/home/not jeff", "/home/not jeff/consistently inconsistent.mp3")]
+        [InlineData("C:\\Users\\jeff\\myfile.mkv", "C:\\Users/jeff", "/home/jeff", "/home/jeff/myfile.mkv")]
+        [InlineData("C:\\Users\\jeff\\myfile.mkv", "C:\\Users/jeff", "/home/jeff/", "/home/jeff/myfile.mkv")]
+        [InlineData("C:\\Users\\jeff\\myfile.mkv", "C:\\Users/jeff/", "/home/jeff/", "/home/jeff/myfile.mkv")]
+        [InlineData("C:\\Users\\jeff\\myfile.mkv", "C:\\Users/jeff/", "/", "/myfile.mkv")]
+        public void TryReplaceSubPath_ValidArgs_Correct(string path, string subPath, string newSubPath, string? expectedResult)
         {
-            var status = PathExtensions.TryReplaceSubPath(path, subPath, newSubPath, out var result);
-            Assert.Equal(succeeded, status);
+            Assert.True(PathExtensions.TryReplaceSubPath(path, subPath, newSubPath, out var result));
             Assert.Equal(expectedResult, result);
         }
 
@@ -43,9 +44,11 @@ namespace Jellyfin.Server.Implementations.Tests.Library
         [InlineData("/my/path", "", "")]
         [InlineData("", "/another/path", "")]
         [InlineData("", "", "/new/subpath")]
-        public void TryReplaceSubPath_EmptyString_ThrowsArgumentNullException(string path, string subPath, string newSubPath)
+        [InlineData("/home/jeff/music/jeff's band/consistently inconsistent.mp3", "/home/jeff/music/not jeff's band", "/home/not jeff")]
+        public void TryReplaceSubPath_InvalidInput_ReturnsFalseAndNull(string path, string subPath, string newSubPath)
         {
-            Assert.Throws<ArgumentNullException>(() => PathExtensions.TryReplaceSubPath(path, subPath, newSubPath, out _));
+            Assert.False(PathExtensions.TryReplaceSubPath(path, subPath, newSubPath, out var result));
+            Assert.Null(result);
         }
     }
 }