From 09a66f702d5bc7e0c0f58c9e125ffec5e7fc3141 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 21 Jan 2015 13:54:47 -0400 Subject: [PATCH] Revert "remove absNormPathUnix, using my absPathFrom replacement" This reverts commit a7f05c007b25d71d21ba887cb33144e42e61483b. Consider: relPathDirToFile (absPathFrom "/tmp/repo/xxx" "y/bar") "/tmp/repo/.git/annex/objects/xxx" This needs to always yield "../../../.git/annex/objects/xxx" but on Windows, it is "..\\..\\/tmp/repo/.git/annex/objects/xxx" --- Locations.hs | 4 +++- Utility/Path.hs | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Locations.hs b/Locations.hs index 82c324e2c9..596bf4f85d 100644 --- a/Locations.hs +++ b/Locations.hs @@ -144,9 +144,11 @@ gitAnnexLocation' key r crippled gitAnnexLink :: FilePath -> Key -> Git.Repo -> IO FilePath gitAnnexLink file key r = do currdir <- getCurrentDirectory - let absfile = absPathFrom currdir file + let absfile = fromMaybe whoops $ absNormPathUnix currdir file loc <- gitAnnexLocation' key r False relPathDirToFile (parentDir absfile) loc + where + whoops = error $ "unable to normalize " ++ file {- File used to lock a key's content. -} gitAnnexContentLock :: Key -> Git.Repo -> GitConfig -> IO FilePath diff --git a/Utility/Path.hs b/Utility/Path.hs index 5e035b2214..4ff88f72eb 100644 --- a/Utility/Path.hs +++ b/Utility/Path.hs @@ -5,7 +5,7 @@ - License: BSD-2-clause -} -{-# LANGUAGE CPP #-} +{-# LANGUAGE PackageImports, CPP #-} module Utility.Path where @@ -24,6 +24,7 @@ import System.Posix.Files import Utility.Exception #endif +import qualified "MissingH" System.Path as MissingH import Utility.Monad import Utility.UserInfo @@ -64,6 +65,18 @@ simplifyPath path = dropTrailingPathSeparator $ absPathFrom :: FilePath -> FilePath -> FilePath absPathFrom dir path = simplifyPath (combine dir path) +{- On Windows, this converts the paths to unix-style, in order to run + - MissingH's absNormPath on them. Resulting path will use / separators. -} +absNormPathUnix :: FilePath -> FilePath -> Maybe FilePath +#ifndef mingw32_HOST_OS +absNormPathUnix dir path = MissingH.absNormPath dir path +#else +absNormPathUnix dir path = todos <$> MissingH.absNormPath (fromdos dir) (fromdos path) + where + fromdos = replace "\\" "/" + todos = replace "/" "\\" +#endif + {- takeDirectory "foo/bar/" is "foo/bar". This instead yields "foo" -} parentDir :: FilePath -> FilePath parentDir = takeDirectory . dropTrailingPathSeparator