From bff6ca2634e5f796d83c1632a66ac00adab0be43 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 28 Nov 2011 23:20:31 -0400 Subject: refactor --- Locations.hs | 11 ++++++++++- Remote/Directory.hs | 14 ++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Locations.hs b/Locations.hs index a7a1f0cd1..53a80043a 100644 --- a/Locations.hs +++ b/Locations.hs @@ -20,6 +20,7 @@ module Locations ( gitAnnexJournalDir, gitAnnexJournalLock, isLinkToAnnex, + annexHashes, hashDirMixed, hashDirLower, @@ -58,10 +59,18 @@ annexDir = addTrailingPathSeparator "annex" objectDir :: FilePath objectDir = addTrailingPathSeparator $ annexDir "objects" +{- Two different directory hashes may be used. The mixed case hash + - came first, and is fine, except for the problem of case-strict + - filesystems such as Linux VFAT (mounted with shortname=mixed), + - which do not allow using a directory "XX" when "xx" already exists. + - To support that, some repositories will use a lower case hash. -} +annexHashes :: [Key -> FilePath] +annexHashes = [hashDirMixed, hashDirLower] + {- Annexed file's possible locations relative to the .git directory. - There are two different possibilities, using different hashes. -} annexLocations :: Key -> [FilePath] -annexLocations key = map (annexLocation key) [hashDirMixed, hashDirLower] +annexLocations key = map (annexLocation key) annexHashes annexLocation :: Key -> (Key -> FilePath) -> FilePath annexLocation key hasher = objectDir hasher key f f where diff --git a/Remote/Directory.hs b/Remote/Directory.hs index 891a19ef6..83302b65a 100644 --- a/Remote/Directory.hs +++ b/Remote/Directory.hs @@ -62,20 +62,10 @@ directorySetup u c = do gitConfigSpecialRemote u c' "directory" dir return $ M.delete "directory" c' -{- Where to store a given Key in the Directory. - - - - There are two possible locations to try; this had to be done because - - on Linux, vfat filesystem mounted with shortname=mixed have a - - variant of case insensativity that causes miserable failure when - - hashDirMixed produces eg, "xx" and "XX". The first directory to be - - created wins the namespace, and the second one cannot then be created. - - But unlike behavior with shortname=lower, "XX/foo" won't look in - - "xx/foo". - -} +{- Locations to try to access a given Key in the Directory. -} locations :: FilePath -> Key -> [FilePath] -locations d k = [using hashDirMixed, using hashDirLower] +locations d k = map (\h -> d h k f f) annexHashes where - using h = d h k f f f = keyFile k withCheckedFile :: (FilePath -> IO Bool) -> FilePath -> Key -> (FilePath -> IO Bool) -> IO Bool -- cgit v1.2.3