summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-01-06 17:58:57 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-01-06 17:58:57 -0400
commit9504153169360a3c5a2c83b807d3d0be4d82aa28 (patch)
tree59e9edc6f5e999f13c995bb3c35f27e4f06edc6f
parent27195fc7ecb70e185e9a78f8bd3d758bfe262a22 (diff)
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.
-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