Insert slash when first argument to joinDrive does not end with one
authorThomas Miedema <thomasmiedema@gmail.com>
Thu, 23 Oct 2014 16:23:56 +0000 (18:23 +0200)
committerThomas Miedema <thomasmiedema@gmail.com>
Mon, 27 Oct 2014 12:29:52 +0000 (13:29 +0100)
Before:
joinDrive "/foo" "bar" == "/foobar"

After:
joinDrive "/foo" "bar" == "/foo/bar"

The first argument to `joinDrive` should arguably always be a drive. On Posix
this means it should be, and thus end with, a single slash. It is currently
undocumented what should happen when it doesn't end with a slash (throw an
exception?). Since it is unlikely anyone is relying on the original behavior,
this change is hopefully ok to make.

The reason for this change is to make `joinDrive` similar in semantics to
`combineAlways`.

System/FilePath/Internal.hs
changelog.md

index e48d01b..1e2cdc9 100644 (file)
@@ -383,12 +383,11 @@ readDriveShareName name = addSlash a b
 -- > Windows: joinDrive "\\\\share" "foo" == "\\\\share\\foo"
 -- > Windows: joinDrive "/:" "foo" == "/:\\foo"
 joinDrive :: FilePath -> FilePath -> FilePath
-joinDrive a b | isPosix = a ++ b
-              | null a = b
+joinDrive a b | null a = b
               | null b = a
               | hasTrailingPathSeparator a = a ++ b
               | otherwise = case a of
-                                [a1,':'] | isLetter a1 -> a ++ b
+                                [a1,':'] | isWindows && isLetter a1 -> a ++ b
                                 _ -> a ++ [pathSeparator] ++ b
 
 -- | Get the drive from a filepath.
index b037c48..f79c011 100644 (file)
@@ -4,6 +4,9 @@
 
   * Bundled with GHC 7.10.1
 
+  * Semantic change: `joinDrive "/foo" "bar"` now returns `"/foo/bar"`,
+    instead of `"/foobar"`.
+
   * Bug fix: `isDrive ""` now retuns `False`, instead of `True`.
 
   * Bug fix: on Windows, `dropTrailingPathSeparator "/"` now returns `"/"`