mirror of https://github.com/voidlizard/hbs2
wip21
This commit is contained in:
parent
5b73884f00
commit
eecab152a6
|
@ -51,6 +51,7 @@ import Codec.Compression.Zstd.Streaming qualified as ZstdS
|
||||||
import Codec.Compression.Zstd.Streaming (Result(..))
|
import Codec.Compression.Zstd.Streaming (Result(..))
|
||||||
import Codec.Compression.Zstd (maxCLevel)
|
import Codec.Compression.Zstd (maxCLevel)
|
||||||
|
|
||||||
|
import qualified Data.Attoparsec.ByteString as A
|
||||||
import Data.HashPSQ qualified as HPSQ
|
import Data.HashPSQ qualified as HPSQ
|
||||||
import Data.HashPSQ (HashPSQ)
|
import Data.HashPSQ (HashPSQ)
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
|
@ -387,7 +388,7 @@ gitObjectExists what = do
|
||||||
gitRunCommand [qc|git cat-file -e {pretty what}|] <&> isRight
|
gitRunCommand [qc|git cat-file -e {pretty what}|] <&> isRight
|
||||||
|
|
||||||
data UState =
|
data UState =
|
||||||
UHead ByteString
|
UHead Word32 ByteString
|
||||||
|
|
||||||
|
|
||||||
data ES =
|
data ES =
|
||||||
|
@ -421,19 +422,34 @@ enumGitPackObjectsFromLBS lbs action = do
|
||||||
ES _ (Done s) -> do
|
ES _ (Done s) -> do
|
||||||
S.yield s
|
S.yield s
|
||||||
|
|
||||||
void $ flip fix (UHead (LBS.fromChunks chunks)) $ \next -> \case
|
void $ flip fix (UHead 0 (LBS.fromChunks chunks)) $ \next -> \case
|
||||||
UHead chunk -> do
|
UHead off chunk -> do
|
||||||
let s0 = LBS8.dropWhile (=='\n') chunk
|
let (skipped1,s0) = LBS8.span (=='\n') chunk
|
||||||
|
-- read += len skipped
|
||||||
|
|
||||||
unless (LBS.null s0) do
|
unless (LBS.null s0) do
|
||||||
let (hdr,rest) = LBS8.break (=='\n') s0
|
let (hdr,rest) = LBS8.break (=='\n') s0
|
||||||
|
-- read += len hdr
|
||||||
|
|
||||||
iop@(IOp s _) <- unpackIOp (LBS8.words hdr) & orThrow (InvalidGitPack hdr)
|
let o = LBS.drop 1 rest -- skip '\n'. read+1
|
||||||
|
-- read += 1
|
||||||
|
|
||||||
void $ action iop
|
let skipped2 = fromIntegral $ LBS8.length skipped1
|
||||||
|
+ LBS8.length hdr
|
||||||
|
+ 1
|
||||||
|
|
||||||
let o = LBS.drop 1 rest
|
let entryOffset = off + fromIntegral skipped2
|
||||||
let (_, rest2) = LBS.splitAt (fromIntegral s) o
|
|
||||||
next (UHead rest2)
|
iop@(IOp{..}) <- unpackIOp 0 (LBS8.words hdr) & orThrow (InvalidGitPack hdr)
|
||||||
|
|
||||||
|
let (rn, rest2) = LBS.splitAt (fromIntegral iopSize) o
|
||||||
|
-- read += len rn --
|
||||||
|
|
||||||
|
let consumed = fromIntegral $ skipped2 + LBS.length rn
|
||||||
|
|
||||||
|
void $ action (iop { iopOffset = entryOffset })
|
||||||
|
|
||||||
|
next (UHead (off + consumed) rest2)
|
||||||
|
|
||||||
data ExportState =
|
data ExportState =
|
||||||
ExportGetCommit
|
ExportGetCommit
|
||||||
|
@ -452,25 +468,29 @@ data IOpType
|
||||||
| ISetRef GitRef Int (Maybe GitHash)
|
| ISetRef GitRef Int (Maybe GitHash)
|
||||||
deriving (Show, Eq)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
data IOp = IOp Word32 IOpType
|
data IOp =
|
||||||
|
IOp { iopOffset :: Word32
|
||||||
|
, iopSize :: Word32
|
||||||
|
, opType :: IOpType
|
||||||
|
}
|
||||||
deriving (Show, Eq)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
unpackIOp :: [ByteString] -> Maybe IOp
|
unpackIOp :: Word32 -> [ByteString] -> Maybe IOp
|
||||||
unpackIOp = \case
|
unpackIOp off = \case
|
||||||
("C" : s : h : _) -> do
|
("C" : s : h : _) -> do
|
||||||
size <- fromLBS s
|
size <- fromLBS s
|
||||||
hash <- fromLBS' h
|
hash <- fromLBS' h
|
||||||
pure $ IOp size (IGitObject Commit hash)
|
pure $ IOp off size (IGitObject Commit hash)
|
||||||
|
|
||||||
("B" : s : h : _) -> do
|
("B" : s : h : _) -> do
|
||||||
size <- fromLBS s
|
size <- fromLBS s
|
||||||
hash <- fromLBS' h
|
hash <- fromLBS' h
|
||||||
pure $ IOp size (IGitObject Blob hash)
|
pure $ IOp off size (IGitObject Blob hash)
|
||||||
|
|
||||||
("T" : s : h : _) -> do
|
("T" : s : h : _) -> do
|
||||||
size <- fromLBS s
|
size <- fromLBS s
|
||||||
hash <- fromLBS' h
|
hash <- fromLBS' h
|
||||||
pure $ IOp size (IGitObject Tree hash)
|
pure $ IOp off size (IGitObject Tree hash)
|
||||||
|
|
||||||
("R" : s : n : r : rest) -> do
|
("R" : s : n : r : rest) -> do
|
||||||
size <- fromLBS s
|
size <- fromLBS s
|
||||||
|
@ -479,7 +499,7 @@ unpackIOp = \case
|
||||||
hash <- case rest of
|
hash <- case rest of
|
||||||
(h : _) -> Just <$> fromStringMay (LBS8.unpack h)
|
(h : _) -> Just <$> fromStringMay (LBS8.unpack h)
|
||||||
_ -> pure Nothing
|
_ -> pure Nothing
|
||||||
pure $ IOp size (ISetRef refName weight hash)
|
pure $ IOp off size (ISetRef refName weight hash)
|
||||||
|
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
|
|
||||||
|
@ -1023,14 +1043,61 @@ theDict = do
|
||||||
what <- runExceptT (getTreeContents sto r) >>= orThrowPassIO
|
what <- runExceptT (getTreeContents sto r) >>= orThrowPassIO
|
||||||
debug $ yellow "reading" <+> pretty r
|
debug $ yellow "reading" <+> pretty r
|
||||||
enumGitPackObjectsFromLBS what $ \case
|
enumGitPackObjectsFromLBS what $ \case
|
||||||
IOp s (IGitObject t h) -> do
|
IOp o s (IGitObject t h) -> do
|
||||||
putStrLn $ show $ pretty t <+> pretty h <+> pretty s
|
putStrLn $ show $ pretty t <+> pretty h <+> pretty o <+> pretty s
|
||||||
pure True
|
pure True
|
||||||
|
|
||||||
IOp _ (ISetRef ref w h ) -> do
|
IOp _ _ (ISetRef ref w h ) -> do
|
||||||
putStrLn $ show $ "ref" <+> pretty ref <+> pretty w <+> pretty h
|
putStrLn $ show $ "ref" <+> pretty ref <+> pretty w <+> pretty h
|
||||||
pure True
|
pure True
|
||||||
|
|
||||||
|
|
||||||
|
entry $ bindMatch "test:git:cblock:object:cat" $ nil_ $ \case
|
||||||
|
[ HashLike cblock, StringLike g ] -> lift do
|
||||||
|
|
||||||
|
sto <- getStorage
|
||||||
|
h <- fromStringMay @GitHash g & orThrowUser "invalid git hash"
|
||||||
|
|
||||||
|
readCBlock sto cblock $ \case
|
||||||
|
CBlockParents{} -> none
|
||||||
|
CBlockData rs -> do
|
||||||
|
for_ rs $ \r -> do
|
||||||
|
what <- runExceptT (getTreeContents sto r) >>= orThrowPassIO
|
||||||
|
debug $ yellow "reading" <+> pretty r
|
||||||
|
enumGitPackObjectsFromLBS what $ \case
|
||||||
|
IOp _ s (IGitObject t h) -> do
|
||||||
|
-- putStrLn $ show $ pretty t <+> pretty h <+> pretty s
|
||||||
|
pure True
|
||||||
|
|
||||||
|
IOp _ _ (ISetRef ref w h ) -> do
|
||||||
|
-- putStrLn $ show $ "ref" <+> pretty ref <+> pretty w <+> pretty h
|
||||||
|
pure True
|
||||||
|
|
||||||
|
|
||||||
|
pure ()
|
||||||
|
_ -> throwIO (BadFormException @C nil)
|
||||||
|
-- hash <- headMay [ x | HashLike x <- syn ] & orThrowUser "cblock hash not given"
|
||||||
|
|
||||||
|
-- sto <- getStorage
|
||||||
|
|
||||||
|
-- liftIO do
|
||||||
|
|
||||||
|
-- readCBlock sto hash $ \case
|
||||||
|
-- CBlockParents{} -> none
|
||||||
|
-- CBlockData rs -> do
|
||||||
|
-- for_ rs $ \r -> do
|
||||||
|
-- what <- runExceptT (getTreeContents sto r) >>= orThrowPassIO
|
||||||
|
-- debug $ yellow "reading" <+> pretty r
|
||||||
|
-- enumGitPackObjectsFromLBS what $ \case
|
||||||
|
-- IOp s (IGitObject t h) -> do
|
||||||
|
-- putStrLn $ show $ pretty t <+> pretty h <+> pretty s
|
||||||
|
-- pure True
|
||||||
|
|
||||||
|
-- IOp _ (ISetRef ref w h ) -> do
|
||||||
|
-- putStrLn $ show $ "ref" <+> pretty ref <+> pretty w <+> pretty h
|
||||||
|
-- pure True
|
||||||
|
|
||||||
|
|
||||||
entry $ bindMatch "test:git:cblock:scan" $ nil_ $ \case
|
entry $ bindMatch "test:git:cblock:scan" $ nil_ $ \case
|
||||||
[ HashLike cblock ] -> lift do
|
[ HashLike cblock ] -> lift do
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue