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.

This commit is contained in:
Joey Hess 2015-01-06 17:58:57 -04:00
parent ae14354686
commit c0f2b992ed
4 changed files with 24 additions and 19 deletions

View file

@ -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
}

View file

@ -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

View file

@ -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

3
debian/changelog vendored
View file

@ -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