This commit is contained in:
Dmitry Zuikov 2024-05-11 11:40:09 +03:00
parent 71ad8d89a3
commit 45f525c756
3 changed files with 131 additions and 33 deletions

View File

@ -12,7 +12,7 @@ import Fixme.Scan as Scan
import HBS2.Git.Local.CLI import HBS2.Git.Local.CLI
import HBS2.System.Dir import HBS2.System.Dir
import DBPipe.SQLite
import Data.Config.Suckless import Data.Config.Suckless
import Data.Text.Fuzzy.Tokenize import Data.Text.Fuzzy.Tokenize
@ -29,6 +29,7 @@ import Data.Text qualified as Text
import Data.Text.Encoding qualified as Text import Data.Text.Encoding qualified as Text
import Data.Text.Encoding (decodeUtf8With) import Data.Text.Encoding (decodeUtf8With)
import Data.Text.Encoding.Error (ignore) import Data.Text.Encoding.Error (ignore)
import Data.Word
import Text.InterpolatedString.Perl6 (qc) import Text.InterpolatedString.Perl6 (qc)
import Data.Coerce import Data.Coerce
import Control.Monad.Identity import Control.Monad.Identity
@ -212,17 +213,76 @@ filterBlobs xs = do
scanGitLocal :: FixmePerks m => [ScanGitArgs] -> Maybe FilePath -> FixmeM m () scanGitLocal :: FixmePerks m => [ScanGitArgs] -> Maybe FilePath -> FixmeM m ()
scanGitLocal args p = do scanGitLocal args p = do
env <- ask
flip runContT pure do flip runContT pure do
(dbFn, _) <- ContT $ withSystemTempFile "fixme-db" . curry
tempDb <- newDBPipeEnv dbPipeOptsDef dbFn
withDB tempDb do
ddl [qc| create table co
( cohash text not null
, ts int null
, primary key (cohash)
)
|]
ddl [qc| create table coattr
( cohash text not null
, name text not null
, value text not null
, primary key (cohash,name)
)
|]
ddl [qc| create table blob
( hash text not null
, cohash text not null
, path text not null
, primary key (hash,cohash,path)
)
|]
co <- lift listCommits co <- lift listCommits
blobs <- lift $ mconcat <$> for co (\c -> do lift do
listBlobs (fst c) >>= filterBlobs ) withDB tempDb $ transactional do
for_ co $ \(commit, attr) -> do
blobs <- listBlobs commit >>= withFixmeEnv env . filterBlobs
let ts = HM.lookup "commit-time" attr
>>= readMay @Word64 . Text.unpack . coerce
insert [qc|
insert into co (cohash,ts) values (?,?) on conflict (cohash) do nothing
|] (commit,ts)
for_ (HM.toList attr) $ \(a,b) -> do
insert [qc|
insert into coattr(cohash,name,value) values(?,?,?)
on conflict (cohash,name) do nothing
|] (commit,a,b)
for_ blobs $ \(fp,h) -> do
insert [qc| insert into blob (hash,cohash,path)
values (?,?,?)
on conflict (hash,cohash,path) do nothing
|] (h,commit,fp)
blobs <- withDB tempDb do
select_ @_ @(GitHash, FilePath) [qc|select distinct hash, path from blob order by path|]
when ( PrintBlobs `elem` args ) do when ( PrintBlobs `elem` args ) do
for_ blobs $ \(fp,h) -> do for_ blobs $ \(h,fp) -> do
liftIO $ print $ pretty h <+> pretty fp liftIO $ print $ pretty h <+> pretty fp
callCC \fucked -> do
gitCat <- ContT $ bracket startGitCatFile (hClose . getStdin) gitCat <- ContT $ bracket startGitCatFile (hClose . getStdin)
let ssin = getStdin gitCat let ssin = getStdin gitCat
@ -230,11 +290,7 @@ scanGitLocal args p = do
liftIO $ IO.hSetBuffering ssin LineBuffering liftIO $ IO.hSetBuffering ssin LineBuffering
callCC \fucked -> do for_ blobs $ \(h,fp) -> do
when ( PrintFixme `elem` args ) do
for_ blobs $ \(fp,h) -> do
liftIO $ IO.hPrint ssin (pretty h) >> IO.hFlush ssin liftIO $ IO.hPrint ssin (pretty h) >> IO.hFlush ssin
prefix <- liftIO (BS.hGetLine ssout) <&> BS.words prefix <- liftIO (BS.hGetLine ssout) <&> BS.words
@ -244,14 +300,37 @@ scanGitLocal args p = do
len <- ContT $ maybe1 mslen (pure ()) len <- ContT $ maybe1 mslen (pure ())
blob <- liftIO $ LBS8.hGet ssout len blob <- liftIO $ LBS8.hGet ssout len
void $ liftIO $ BS.hGetLine ssout void $ liftIO $ BS.hGetLine ssout
fixmies <- lift $ Scan.scanBlob (Just fp) blob
fixmies <- lift (Scan.scanBlob (Just fp) blob)
when ( PrintFixme `elem` args ) do
for_ fixmies $ \fixme -> do for_ fixmies $ \fixme -> do
liftIO $ print $ pretty fixme liftIO $ print $ pretty fixme
_ -> fucked () _ -> fucked ()
debug $ red "NOW WHAT?"
-- when ( PrintFixme `elem` args ) do
-- for_ blobs $ \(fp,h) -> do
-- liftIO $ IO.hPrint ssin (pretty h) >> IO.hFlush ssin
-- prefix <- liftIO (BS.hGetLine ssout) <&> BS.words
-- case prefix of
-- [_, "blob", ssize] -> do
-- let mslen = readMay @Int (BS.unpack ssize)
-- len <- ContT $ maybe1 mslen (pure ())
-- blob <- liftIO $ LBS8.hGet ssout len
-- void $ liftIO $ BS.hGetLine ssout
-- fixmies <- lift (Scan.scanBlob (Just fp) blob)
-- for_ fixmies $ \fixme -> do
-- liftIO $ print $ pretty fixme
-- _ -> fucked ()
-- debug $ red "NOW WHAT?"
startGitCatFile :: (FixmePerks m, MonadReader FixmeEnv m) => m (Process Handle Handle ()) startGitCatFile :: (FixmePerks m, MonadReader FixmeEnv m) => m (Process Handle Handle ())

View File

@ -1,6 +1,9 @@
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Fixme.Types where module Fixme.Types where
import Fixme.Prelude import Fixme.Prelude
import DBPipe.SQLite
import HBS2.Git.Local
import Data.HashMap.Strict (HashMap) import Data.HashMap.Strict (HashMap)
import Data.HashMap.Strict qualified as HM import Data.HashMap.Strict qualified as HM
@ -25,30 +28,29 @@ data FixmeSource =
deriving stock (Show,Data,Generic) deriving stock (Show,Data,Generic)
newtype FixmeTag = FixmeTag { fromFixmeTag :: Text } newtype FixmeTag = FixmeTag { fromFixmeTag :: Text }
deriving newtype (Eq,Ord,Show,IsString,Hashable,Semigroup,Monoid) deriving newtype (Eq,Ord,Show,IsString,Hashable,Semigroup,Monoid,ToField,FromField)
deriving stock (Data,Generic) deriving stock (Data,Generic)
newtype FixmeTitle = FixmeTitle { fromFixmeTitle :: Text } newtype FixmeTitle = FixmeTitle { fromFixmeTitle :: Text }
deriving newtype (Eq,Ord,Show,IsString,Semigroup,Monoid) deriving newtype (Eq,Ord,Show,IsString,Semigroup,Monoid,ToField,FromField)
deriving stock (Data,Generic) deriving stock (Data,Generic)
newtype FixmePlainLine = FixmePlainLine { fromFixmeText :: Text } newtype FixmePlainLine = FixmePlainLine { fromFixmeText :: Text }
deriving newtype (Eq,Ord,Show,IsString,Semigroup,Monoid) deriving newtype (Eq,Ord,Show,IsString,Semigroup,Monoid,ToField,FromField)
deriving stock (Data,Generic) deriving stock (Data,Generic)
newtype FixmeAttrName = FixmeAttrName { fromFixmeAttrName :: Text } newtype FixmeAttrName = FixmeAttrName { fromFixmeAttrName :: Text }
deriving newtype (Eq,Ord,Show,IsString,Hashable) deriving newtype (Eq,Ord,Show,IsString,Hashable,ToField,FromField)
deriving stock (Data,Generic) deriving stock (Data,Generic)
newtype FixmeAttrVal = FixmeAttrVal { fromFixmeAttrVal :: Text } newtype FixmeAttrVal = FixmeAttrVal { fromFixmeAttrVal :: Text }
deriving newtype (Eq,Ord,Show,IsString) deriving newtype (Eq,Ord,Show,IsString,ToField,FromField)
deriving stock (Data,Generic) deriving stock (Data,Generic)
newtype FixmeTimestamp = FixmeTimestamp Word64 newtype FixmeTimestamp = FixmeTimestamp Word64
deriving newtype (Eq,Ord,Show,Num) deriving newtype (Eq,Ord,Show,Num,ToField,FromField)
deriving stock (Data,Generic) deriving stock (Data,Generic)
data Fixme = data Fixme =
@ -111,6 +113,9 @@ newtype FixmeM m a = FixmeM { fromFixmeM :: ReaderT FixmeEnv m a }
, MonadReader FixmeEnv , MonadReader FixmeEnv
) )
withFixmeEnv :: FixmePerks m => FixmeEnv -> FixmeM m a -> m a
withFixmeEnv env what = runReaderT ( fromFixmeM what) env
runFixmeCLI :: FixmePerks m => FixmeM m a -> m a runFixmeCLI :: FixmePerks m => FixmeM m a -> m a
runFixmeCLI m = do runFixmeCLI m = do
env <- FixmeEnv Nothing env <- FixmeEnv Nothing
@ -146,6 +151,20 @@ instance Serialise FixmeTimestamp
instance Serialise Fixme instance Serialise Fixme
instance ToField GitHash where
toField h = toField (show $ pretty h)
instance ToField GitRef where
toField h = toField (show $ pretty h)
instance FromField GitRef where
fromField = fmap fromString . fromField @String
instance FromField GitHash where
fromField = fmap fromString . fromField @String
instance Pretty FixmeTitle where instance Pretty FixmeTitle where
pretty = pretty . coerce @_ @Text pretty = pretty . coerce @_ @Text

View File

@ -865,7 +865,7 @@ main = join . customExecParser (prefs showHelpOnError) $
deepScan ScanDeep (const none) h (getBlock sto) $ \ha -> do deepScan ScanDeep (const none) h (getBlock sto) $ \ha -> do
print $ pretty ha print $ pretty ha
-- TODO: reflog-del-command-- TODO: reflog-del-command -- TODO: reflog-del-command
pDel = do pDel = do
o <- common o <- common
recurse <- optional (flag' True ( short 'r' <> long "recursive" <> help "try to delete all blocks recursively" ) recurse <- optional (flag' True ( short 'r' <> long "recursive" <> help "try to delete all blocks recursively" )