summaryrefslogtreecommitdiff
path: root/src/Erebos
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-05-11 21:01:49 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-05-11 21:01:49 +0200
commit98922becf64e361d87d8092c59d3c53362d21c2d (patch)
tree43979849d4ad5726d2c18ed9e3fa6434038e75a9 /src/Erebos
parenta3c365ca6afd3d41119679d51ca16ce7a7e47578 (diff)
Treat references from dir object as weakHEADmaster
Diffstat (limited to 'src/Erebos')
-rw-r--r--src/Erebos/Object.hs2
-rw-r--r--src/Erebos/Object/Internal.hs33
2 files changed, 14 insertions, 21 deletions
diff --git a/src/Erebos/Object.hs b/src/Erebos/Object.hs
index 06eaad7..255c86d 100644
--- a/src/Erebos/Object.hs
+++ b/src/Erebos/Object.hs
@@ -11,7 +11,7 @@ module Erebos.Object (
storeRawBytes, lazyLoadBytes,
RecItem, RecItem'(..),
- DirItem, DirItem'(..),
+ DirItem(..),
Ref, PartialRef, RefDigest,
refDigest, refFromDigest,
diff --git a/src/Erebos/Object/Internal.hs b/src/Erebos/Object/Internal.hs
index 758c5f9..799d185 100644
--- a/src/Erebos/Object/Internal.hs
+++ b/src/Erebos/Object/Internal.hs
@@ -10,7 +10,7 @@ module Erebos.Object.Internal (
Object, PartialObject, Object'(..),
RecItem, RecItem'(..),
- DirItem, DirItem'(..),
+ DirItem(..),
serializeObject, deserializeObject, deserializeObjects,
ioLoadObject, ioLoadBytes,
storeRawBytes, lazyLoadBytes,
@@ -136,10 +136,7 @@ copyObject' _ (Blob bs) = return $ return $ Blob bs
copyObject' st (Rec rs) = fmap Rec . sequence <$> mapM (\( n, item ) -> fmap ( n, ) <$> copyRecItem' st item) rs
copyObject' _ (OnDemand size dgst) = return $ return $ OnDemand size dgst
copyObject' _ (Chunked size dgsts) = return $ return $ Chunked size dgsts
-copyObject' st (Dir items) = fmap Dir . sequence <$> mapM copyItem items
- where
- copyItem (DirItem d m f) = do d' <- copyRef' st d; m' <- copyRef' st m;
- return $ DirItem <$> d' <*> m' <*> pure f
+copyObject' _ (Dir items) = return $ return $ Dir items
copyObject' _ ZeroObject = return $ return ZeroObject
copyObject' _ (UnknownObject otype content) = return $ return $ UnknownObject otype content
@@ -164,7 +161,7 @@ data Object' c
| Rec [ ( ByteString, RecItem' c ) ]
| OnDemand Word64 RefDigest
| Chunked Word64 [ RefDigest ]
- | Dir [ DirItem' c ]
+ | Dir [ DirItem ]
| ZeroObject
| UnknownObject ByteString ByteString
deriving (Show)
@@ -187,15 +184,13 @@ data RecItem' c
type RecItem = RecItem' Complete
-data DirItem' c = DirItem
- { dirItemData :: Ref' c
- , dirItemMetadata :: Ref' c
+data DirItem = DirItem
+ { dirItemData :: RefDigest
+ , dirItemMetadata :: RefDigest
, dirItemFilename :: Text
}
deriving (Show)
-type DirItem = DirItem' Complete
-
serializeObject :: Object' c -> BL.ByteString
serializeObject = \case
@@ -210,7 +205,7 @@ serializeObject = \case
let cnt = BC.unlines $ BC.pack (show size) : map showRefDigest dgsts
in BL.fromChunks [ BC.pack "chunked ", BC.pack (show $ B.length cnt), BC.singleton '\n', cnt ]
Dir items ->
- let cnt = BL.fromChunks $ map (\(DirItem d m f) -> BC.concat [ showRef d, BC.singleton ' ', showRef m, BC.singleton ' ', serializeText f, BC.singleton '\n' ]) items
+ let cnt = BL.fromChunks $ map (\(DirItem d m f) -> BC.concat [ showRefDigest d, BC.singleton ' ', showRefDigest m, BC.singleton ' ', serializeText f, BC.singleton '\n' ]) items
in BL.fromChunks [ BC.pack "dir ", BC.pack (show $ BL.length cnt), BC.singleton '\n' ] `BL.append` cnt
ZeroObject -> BL.empty
UnknownObject otype cnt -> BL.fromChunks [ otype, BC.singleton ' ', BC.pack (show $ B.length cnt), BC.singleton '\n', cnt ]
@@ -368,7 +363,7 @@ parseChunked _ body = do
parseDir :: Storage' c -> ByteString -> Maybe (Object' c)
parseDir st body = Dir <$> parseDirBody st body
-parseDirBody :: Storage' c -> ByteString -> Maybe [ DirItem' c ]
+parseDirBody :: Storage' c -> ByteString -> Maybe [ DirItem ]
parseDirBody _ body | B.null body = Just []
parseDirBody st body = do
space1 <- BC.elemIndex ' ' body
@@ -377,8 +372,8 @@ parseDirBody st body = do
let dataRefB = B.take space1 body
metaRefB = B.take space2 $ B.drop (space1 + 1) body
filename = decodeUtf8With lenientDecode filenameB
- dataRef <- Ref st <$> readRefDigest dataRefB
- metaRef <- Ref st <$> readRefDigest metaRefB
+ dataRef <- readRefDigest dataRefB
+ metaRef <- readRefDigest metaRefB
(DirItem dataRef metaRef filename :) <$> parseDirBody st remainingBody
@@ -442,7 +437,7 @@ data Store
| StoreRec (forall c. StorageCompleteness c => Storage' c -> [ IO [ ( ByteString, RecItem' c ) ]])
| StoreOnDemand Word64 RefDigest
| StoreChunked Word64 [ RefDigest ]
- | StoreDir (forall c. StorageCompleteness c => Storage' c -> IO [ DirItem' c ])
+ | StoreDir [ DirItem ]
| StoreZero
| StoreUnknown ByteString ByteString
@@ -454,7 +449,7 @@ evalStoreObject _ (StoreBlob x) = return $ Blob x
evalStoreObject s (StoreRec f) = Rec . concat <$> sequence (f s)
evalStoreObject _ (StoreOnDemand size dgst) = return $ OnDemand size dgst
evalStoreObject _ (StoreChunked size dgsts) = return $ Chunked size dgsts
-evalStoreObject s (StoreDir f) = Dir <$> f s
+evalStoreObject _ (StoreDir items) = return $ Dir items
evalStoreObject _ StoreZero = return ZeroObject
evalStoreObject _ (StoreUnknown otype content) = return $ UnknownObject otype content
@@ -493,9 +488,7 @@ instance Storable Object where
return xs'
store' (OnDemand size dgst) = StoreOnDemand size dgst
store' (Chunked size dgsts) = StoreChunked size dgsts
- store' (Dir items) = StoreDir $ \st -> do
- Dir items' <- copyObject st (Dir items)
- return items'
+ store' (Dir items) = StoreDir items
store' ZeroObject = StoreZero
store' (UnknownObject otype content) = StoreUnknown otype content