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:
parent
ae14354686
commit
c0f2b992ed
4 changed files with 24 additions and 19 deletions
|
@ -32,10 +32,8 @@ backend = Backend
|
||||||
|
|
||||||
{- Every unique url has a corresponding key. -}
|
{- Every unique url has a corresponding key. -}
|
||||||
fromUrl :: String -> Maybe Integer -> Annex Key
|
fromUrl :: String -> Maybe Integer -> Annex Key
|
||||||
fromUrl url size = do
|
fromUrl url size = return $ stubKey
|
||||||
n <- genKeyName url
|
{ keyName = genKeyName url
|
||||||
return $ stubKey
|
, keyBackendName = "URL"
|
||||||
{ keyName = n
|
, keySize = size
|
||||||
, keyBackendName = "URL"
|
}
|
||||||
, keySize = size
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,13 +13,18 @@ import Common.Annex
|
||||||
|
|
||||||
{- Generates a keyName from an input string. Takes care of sanitizing it.
|
{- 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.
|
- 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
|
- Otherwise, it's truncated, and its md5 is prepended to ensure a unique
|
||||||
- md5 is prepended to ensure a unique key. -}
|
- key. -}
|
||||||
genKeyName :: String -> Annex String
|
genKeyName :: String -> String
|
||||||
genKeyName s = do
|
genKeyName s
|
||||||
limit <- liftIO . fileNameLengthLimit =<< fromRepo gitAnnexDir
|
-- Avoid making keys longer than the length of a SHA256 checksum.
|
||||||
let s' = preSanitizeKeyName s
|
| bytelen > sha256len =
|
||||||
let truncs = truncateFilePath (limit `div` 2) s'
|
truncateFilePath (sha256len - md5len - 1) s' ++ "-" ++ md5s (Str s)
|
||||||
return $ if s' == truncs
|
| otherwise = s'
|
||||||
then s'
|
where
|
||||||
else truncs ++ "-" ++ md5s (Str s)
|
s' = preSanitizeKeyName s
|
||||||
|
bytelen = length (decodeW8 s')
|
||||||
|
|
||||||
|
sha256len = 64
|
||||||
|
md5len = 32
|
||||||
|
|
||||||
|
|
|
@ -34,9 +34,8 @@ keyValue :: KeySource -> Annex (Maybe Key)
|
||||||
keyValue source = do
|
keyValue source = do
|
||||||
stat <- liftIO $ getFileStatus $ contentLocation source
|
stat <- liftIO $ getFileStatus $ contentLocation source
|
||||||
relf <- getTopFilePath <$> inRepo (toTopFilePath $ keyFilename source)
|
relf <- getTopFilePath <$> inRepo (toTopFilePath $ keyFilename source)
|
||||||
n <- genKeyName relf
|
|
||||||
return $ Just $ stubKey
|
return $ Just $ stubKey
|
||||||
{ keyName = n
|
{ keyName = genKeyName relf
|
||||||
, keyBackendName = name backend
|
, keyBackendName = name backend
|
||||||
, keySize = Just $ fromIntegral $ fileSize stat
|
, keySize = Just $ fromIntegral $ fileSize stat
|
||||||
, keyMtime = Just $ modificationTime stat
|
, keyMtime = Just $ modificationTime stat
|
||||||
|
|
3
debian/changelog
vendored
3
debian/changelog
vendored
|
@ -12,6 +12,9 @@ git-annex (5.20141232) UNRELEASED; urgency=medium
|
||||||
* Check git version at runtime, rather than assuming it will be the same
|
* 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
|
as the git version used at build time when running git-checkattr and
|
||||||
git-branch remove.
|
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
|
-- Joey Hess <id@joeyh.name> Fri, 02 Jan 2015 13:35:13 -0400
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue