diff options
Diffstat (limited to 'Backend')
-rw-r--r-- | Backend/URL.hs | 12 | ||||
-rw-r--r-- | Backend/Utilities.hs | 25 | ||||
-rw-r--r-- | Backend/WORM.hs | 3 |
3 files changed, 21 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 |