diff options
-rw-r--r-- | Backend/URL.hs | 12 | ||||
-rw-r--r-- | Backend/Utilities.hs | 25 | ||||
-rw-r--r-- | Backend/WORM.hs | 3 | ||||
-rw-r--r-- | debian/changelog | 3 |
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 |