From 0ef31d05e00696d08adaf3ff4d5300424f88bdc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sat, 30 Jan 2021 22:33:15 +0100 Subject: Storage: encode digest algorithm alongside hash data --- src/Storage/Internal.hs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/Storage') diff --git a/src/Storage/Internal.hs b/src/Storage/Internal.hs index 59eb514..d589c44 100644 --- a/src/Storage/Internal.hs +++ b/src/Storage/Internal.hs @@ -101,7 +101,13 @@ showRef :: Ref' c -> ByteString showRef = showRefDigest . refDigest showRefDigest :: RefDigest -> ByteString -showRefDigest = showHex +showRefDigest x = BC.pack "blake2#" `BC.append` showHex x + +readRefDigest :: ByteString -> Maybe RefDigest +readRefDigest x = case BC.split '#' x of + [alg, dgst] | BA.convert alg == BC.pack "blake2" -> + refDigestFromByteString =<< readHex @ByteString dgst + _ -> Nothing refDigestFromByteString :: ByteArrayAccess ba => ba -> Maybe RefDigest refDigestFromByteString = fmap RefDigest . digestFromByteString @@ -181,8 +187,9 @@ ioLoadBytesFromStorage st dgst = loadCurrent st >>= loadCurrent Storage { stBacking = StorageMemory { memObjs = tobjs } } = M.lookup dgst <$> readMVar tobjs refPath :: FilePath -> RefDigest -> FilePath -refPath spath dgst = intercalate "/" [spath, "objects", pref, rest] - where (pref, rest) = splitAt 2 $ BC.unpack $ showRefDigest dgst +refPath spath rdgst = intercalate "/" [spath, "objects", BC.unpack alg, pref, rest] + where [alg, dgst] = BC.split '#' $ showRefDigest rdgst + (pref, rest) = splitAt 2 $ BC.unpack dgst openFdParents :: FilePath -> OpenMode -> Maybe FileMode -> OpenFileFlags -> IO Fd -- cgit v1.2.3