summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Backend/URL.hs12
-rw-r--r--Backend/Utilities.hs25
-rw-r--r--Backend/WORM.hs3
-rw-r--r--debian/changelog3
4 files changed, 24 insertions, 19 deletions
diff --git a/Backend/URL.hs b/Backend/URL.hs
index 2c2988ac0..ac517a5f3 100644
--- a/Backend/URL.hs
+++ b/Backend/URL.hs
@@ -32,10 +32,8 @@ backend = Backend
{- Every unique url has a corresponding key. -}
fromUrl :: String -> Maybe Integer -> Annex Key
-fromUrl url size = do
- n <- genKeyName url
- return $ stubKey
- { keyName = n
- , keyBackendName = "URL"
- , keySize = size
- }
+fromUrl url size = return $ stubKey
+ { keyName = genKeyName url
+ , keyBackendName = "URL"
+ , keySize = size
+ }
diff --git a/Backend/Utilities.hs b/Backend/Utilities.hs
index 24dbfd6d9..6426353e7 100644
--- a/Backend/Utilities.hs
+++ b/Backend/Utilities.hs
@@ -13,13 +13,18 @@ import Common.Annex
{- Generates a keyName from an input string. Takes care of sanitizing it.
- If it's not too long, the full string is used as the keyName.
- - Otherwise, it's truncated at half the filename length limit, and its
- - md5 is prepended to ensure a unique key. -}
-genKeyName :: String -> Annex String
-genKeyName s = do
- limit <- liftIO . fileNameLengthLimit =<< fromRepo gitAnnexDir
- let s' = preSanitizeKeyName s
- let truncs = truncateFilePath (limit `div` 2) s'
- return $ if s' == truncs
- then s'
- else truncs ++ "-" ++ md5s (Str s)
+ - Otherwise, it's truncated, and its md5 is prepended to ensure a unique
+ - key. -}
+genKeyName :: String -> String
+genKeyName s
+ -- Avoid making keys longer than the length of a SHA256 checksum.
+ | bytelen > sha256len =
+ truncateFilePath (sha256len - md5len - 1) s' ++ "-" ++ md5s (Str s)
+ | otherwise = s'
+ where
+ s' = preSanitizeKeyName s
+ bytelen = length (decodeW8 s')
+
+ sha256len = 64
+ md5len = 32
+
diff --git a/Backend/WORM.hs b/Backend/WORM.hs
index de7779bb3..bd5e374e1 100644
--- a/Backend/WORM.hs
+++ b/Backend/WORM.hs
@@ -34,9 +34,8 @@ keyValue :: KeySource -> Annex (Maybe Key)
keyValue source = do
stat <- liftIO $ getFileStatus $ contentLocation source
relf <- getTopFilePath <$> inRepo (toTopFilePath $ keyFilename source)
- n <- genKeyName relf
return $ Just $ stubKey
- { keyName = n
+ { keyName = genKeyName relf
, keyBackendName = name backend
, keySize = Just $ fromIntegral $ fileSize stat
, keyMtime = Just $ modificationTime stat
diff --git a/debian/changelog b/debian/changelog
index 908636f05..40a0a6707 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -12,6 +12,9 @@ git-annex (5.20141232) UNRELEASED; urgency=medium
* Check git version at runtime, rather than assuming it will be the same
as the git version used at build time when running git-checkattr and
git-branch remove.
+ * Generate shorter keys for WORM and URL, avoiding keys that are longer
+ than used for SHA256, so as to not break on systems like Windows that
+ have very small maximum path length limits.
-- Joey Hess <id@joeyh.name> Fri, 02 Jan 2015 13:35:13 -0400