wip, trim .ref files

This commit is contained in:
voidlizard 2025-01-20 11:46:16 +03:00
parent dec9fbcc3d
commit 00e24115ec
2 changed files with 121 additions and 20 deletions

View File

@ -29,6 +29,8 @@ import Network.ByteOrder qualified as N
import Text.InterpolatedString.Perl6 (qc) import Text.InterpolatedString.Perl6 (qc)
import Data.HashSet qualified as HS import Data.HashSet qualified as HS
import Data.HashSet (HashSet) import Data.HashSet (HashSet)
import Data.HashMap.Strict (HashMap)
import Data.HashMap.Strict qualified as HM
import Data.Fixed import Data.Fixed
import Lens.Micro.Platform import Lens.Micro.Platform
@ -427,6 +429,37 @@ compression ; prints compression level
for_ rrefs $ \(r,h) -> do for_ rrefs $ \(r,h) -> do
liftIO $ print $ fill 20 (pretty h) <+> pretty r liftIO $ print $ fill 20 (pretty h) <+> pretty r
entry $ bindMatch "reflog:refs:raw" $ nil_ $ \syn -> lift $ connectedDo do
refsFiles >>= readRefsRaw >>= liftIO . mapM_ (print . pretty)
-- entry $ bindMatch "reflog:refs:trimmed" $ nil_ $ \syn -> lift $ connectedDo do
-- txi <- txImported
-- raw <- readRefsRaw =<< refsFiles
-- ni_ <- newTQueueIO
-- imp_ <- newTVarIO ( mempty :: HashMap Text (Integer, GitHash, HashRef) )
-- for_ raw $ \case
-- ListVal [ SymbolVal "R", HashLike seg, LitIntVal r, GitHashLike v, TextLike n ] -> do
-- atomically do
-- if not (HS.member seg txi) then
-- writeTQueue ni_ (n, (r, v, seg))
-- else do
-- let x = (r, v, seg)
-- let fn = HM.insertWith (\a b -> if view _1 a > view _1 b then a else b) n x
-- modifyTVar imp_ fn
-- _ -> none
-- result <- atomically do
-- a <- STM.flushTQueue ni_
-- b <- readTVar imp_ <&> HM.toList
-- pure (a <> b)
-- for_ result $ \(n, (r, h, v)) -> do
-- liftIO $ print $ "R" <+> pretty h <+> pretty r <+> pretty v <+> pretty n
entry $ bindMatch "reflog:imported" $ nil_ $ \syn -> lift $ connectedDo do entry $ bindMatch "reflog:imported" $ nil_ $ \syn -> lift $ connectedDo do
p <- importedCheckpoint p <- importedCheckpoint
liftIO $ print $ pretty p liftIO $ print $ pretty p

View File

@ -39,6 +39,8 @@ import System.IO (hPrint)
import Streaming.Prelude qualified as S import Streaming.Prelude qualified as S
import System.TimeIt import System.TimeIt
import Lens.Micro.Platform
import Control.Concurrent.STM qualified as STM
import UnliftIO.IO.File qualified as UIO import UnliftIO.IO.File qualified as UIO
@ -371,20 +373,61 @@ updateReflogIndex = do
<+> pretty gh <+> pretty gh
<+> pretty nm <+> pretty nm
lift trimRefs
-- entries <- liftIO $ S.toList_ $ glob ["**/*.ref"] [] idxPath $ \fn -> do
-- ls <- liftIO (LBS8.readFile fn) <&> LBS8.lines
-- S.each ls
-- rm fn
-- pure True
entries <- liftIO $ S.toList_ $ glob ["**/*.ref"] [] idxPath $ \fn -> do -- let es = HS.fromList entries
ls <- liftIO (LBS8.readFile fn) <&> LBS8.lines
S.each ls
rm fn
pure True
let es = HS.fromList entries -- liftIO do
-- name <- emptyTempFile idxPath ".ref"
-- UIO.withBinaryFileAtomic name WriteMode $ \wh -> do
-- for_ es $ \s -> LBS8.hPutStrLn wh s
liftIO do
name <- emptyTempFile idxPath ".ref"
UIO.withBinaryFileAtomic name WriteMode $ \wh -> do
for_ es $ \s -> LBS8.hPutStrLn wh s
trimRefs :: forall m . ( Git3Perks m
, MonadReader Git3Env m
, HasGitRemoteKey m
, HasStorage m
, HasClientAPI RefLogAPI UNIX m
) => m ()
trimRefs = do
idxPath <- indexPath
files <- refsFiles
name <- liftIO $ emptyTempFile idxPath ".ref"
UIO.withBinaryFileAtomic name WriteMode $ \wh -> do
txi <- txImported
raw <- readRefsRaw files
ni_ <- newTQueueIO
imp_ <- newTVarIO ( mempty :: HashMap Text (Integer, GitHash, HashRef) )
for_ raw $ \case
ListVal [ SymbolVal "R", HashLike seg, LitIntVal r, GitHashLike v, TextLike n ] -> do
atomically do
if not (HS.member seg txi) then
writeTQueue ni_ (n, (r, v, seg))
else do
let x = (r, v, seg)
let fn = HM.insertWith (\a b -> if view _1 a > view _1 b then a else b) n x
modifyTVar imp_ fn
_ -> none
result <- atomically do
a <- STM.flushTQueue ni_
b <- readTVar imp_ <&> HM.toList
pure (a <> b)
for_ result $ \(n, (r, h, seg)) -> do
liftIO $ hPrint wh $ "R" <+> pretty seg <+> pretty r <+> pretty h <+> pretty n
mapM_ rm files
importedCheckpoint :: forall m . ( Git3Perks m importedCheckpoint :: forall m . ( Git3Perks m
, MonadReader Git3Env m , MonadReader Git3Env m
@ -406,6 +449,38 @@ importedCheckpoint = do
nullHash :: GitHash nullHash :: GitHash
nullHash = GitHash (BS.replicate 20 0) nullHash = GitHash (BS.replicate 20 0)
txImported :: forall m . ( Git3Perks m
, MonadReader Git3Env m
, HasClientAPI RefLogAPI UNIX m
, HasStorage m
, HasGitRemoteKey m
) => m (HashSet HashRef)
txImported = maybe mempty HS.fromList <$> runMaybeT do
cp <- lift importedCheckpoint >>= toMPlus
fmap fst <$> lift (txListAll (Just cp))
refsFiles :: forall m . (Git3Perks m, HasGitRemoteKey m) => m [FilePath]
refsFiles = do
state <- getStatePathM
dirFiles state
<&> filter ( (== ".ref") . takeExtension )
readRefsRaw :: forall m . ( Git3Perks m
, MonadReader Git3Env m
, HasClientAPI RefLogAPI UNIX m
, HasStorage m
, HasGitRemoteKey m
)
=> [FilePath] -> m [Syntax C]
readRefsRaw files = do
mapM (try @_ @IOError . liftIO . readFile) files
<&> unlines . rights
<&> parseTop
<&> fromRight mempty
{- HLINT ignore "Functor law"-} {- HLINT ignore "Functor law"-}
importedRefs :: forall m . ( Git3Perks m importedRefs :: forall m . ( Git3Perks m
, MonadReader Git3Env m , MonadReader Git3Env m
@ -416,18 +491,11 @@ importedRefs :: forall m . ( Git3Perks m
importedRefs = do importedRefs = do
state <- getStatePathM files <- refsFiles
refs <- dirFiles state refs <- readRefsRaw files
<&> filter ( (== ".ref") . takeExtension )
>>= mapM (try @_ @IOError . liftIO . readFile)
<&> unlines . rights
<&> parseTop
<&> fromRight mempty
txh <- maybe mempty HS.fromList <$> runMaybeT do txh <- txImported
cp <- lift importedCheckpoint >>= toMPlus
fmap fst <$> lift (txListAll (Just cp))
let rrefs = [ (n,((GitRef (BS8.pack n),g),r)) let rrefs = [ (n,((GitRef (BS8.pack n),g),r))
| ListVal [ SymbolVal "R" | ListVal [ SymbolVal "R"