This commit is contained in:
Dmitry Zuikov 2024-05-13 09:25:00 +03:00
parent bdec99c48e
commit 9cde6cb7d5
6 changed files with 95 additions and 8 deletions

View File

@ -7,7 +7,7 @@
fixme-prefix FIXME: fixme-prefix FIXME:
fixme-prefix TODO: fixme-prefix TODO:
fixme-git-scan-filter-days 30 fixme-git-scan-filter-days 1
fixme-attribs assigned workflow fixme-attribs assigned workflow
@ -20,13 +20,14 @@ fixme-value-set cat bug feat refactor
fixme-value-set scope mvp-0 mvp-1 backlog fixme-value-set scope mvp-0 mvp-1 backlog
fixme-files **/*.txt docs/devlog.md ;fixme-files **/*.txt docs/devlog.md
fixme-files **/*.hs ; fixme-files **/*.hs
fixme-files **/Run.hs
fixme-file-comments "*.scm" ";" fixme-file-comments "*.scm" ";"
fixme-comments ";" "--" fixme-comments ";" "--"
update ; update

View File

@ -73,6 +73,7 @@ common shared-properties
, filepath , filepath
, filepattern , filepattern
, generic-lens , generic-lens
, generic-deriving
, interpolatedstring-perl6 , interpolatedstring-perl6
, memory , memory
, microlens-platform , microlens-platform

View File

@ -34,6 +34,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.List qualified as List
import Data.Word import Data.Word
import Text.InterpolatedString.Perl6 (qc) import Text.InterpolatedString.Perl6 (qc)
import Data.Coerce import Data.Coerce
@ -47,6 +48,11 @@ import System.IO qualified as IO
import Streaming.Prelude qualified as S import Streaming.Prelude qualified as S
import Data.IntMap qualified as IntMap
import Data.Map qualified as Map
import Data.Map (Map)
import Data.Set qualified as Set
{- HLINT ignore "Functor law" -} {- HLINT ignore "Functor law" -}
pattern Init :: forall {c}. Syntax c pattern Init :: forall {c}. Syntax c
@ -326,12 +332,13 @@ scanGitLocal args p = do
prefix <- liftIO (BS.hGetLine ssout) <&> BS.words prefix <- liftIO (BS.hGetLine ssout) <&> BS.words
case prefix of case prefix of
[_, "blob", ssize] -> do [bh, "blob", ssize] -> do
let mslen = readMay @Int (BS.unpack ssize) let mslen = readMay @Int (BS.unpack ssize)
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
poor <- lift (Scan.scanBlob (Just fp) blob) poor <- lift (Scan.scanBlob (Just fp) blob)
rich <- withDB tempDb do rich <- withDB tempDb do
@ -361,6 +368,7 @@ scanGitLocal args p = do
WHERE RelevantCommits.hash = ? WHERE RelevantCommits.hash = ?
|] |]
what <- select @(FixmeAttrName,FixmeAttrVal) q (Only h) what <- select @(FixmeAttrName,FixmeAttrVal) q (Only h)
<&> HM.fromList <&> HM.fromList
<&> (<> HM.fromList [ ("blob",fromString $ show (pretty h)) <&> (<> HM.fromList [ ("blob",fromString $ show (pretty h))
@ -368,14 +376,53 @@ scanGitLocal args p = do
]) ])
for poor $ \f -> do for poor $ \f -> do
let lno = maybe mempty ( HM.singleton "line"
. FixmeAttrVal
. Text.pack
. show
)
(fixmeStart f)
let ts = HM.lookup "commit-time" what let ts = HM.lookup "commit-time" what
<&> Text.unpack . coerce <&> Text.unpack . coerce
>>= readMay >>= readMay
<&> FixmeTimestamp <&> FixmeTimestamp
pure $ set (field @"fixmeTs") ts $ over (field @"fixmeAttr") (<> what) f pure $ set (field @"fixmeTs") ts $ over (field @"fixmeAttr") (<> (what <> lno)) f
let fixmies = rich
let fxpos1 = [ (fixmeTitle fx, [i :: Int])
| (i,fx) <- zip [0..] rich
-- , fixmeTitle fx /= mempty
] & Map.fromListWith (flip (<>))
let mt e = do
let seed = [ (fst e, i) | i <- snd e ]
flip fix (0,[],seed) $ \next (num,acc,rest) ->
case rest of
[] -> acc
(x:xs) -> next (succ num, (x,num) : acc, xs)
let fxpos2 = [ mt e
| e <- Map.toList fxpos1
] & mconcat
& Map.fromList
debug $ red "fxpos1" <+> pretty h <> line <> pretty (Map.toList fxpos1)
debug $ red "fxpos2" <+> pretty h <> line <> pretty (Map.toList fxpos2)
fixmies <- for (zip [0..] rich) $ \(i,fx) -> do
let title = fixmeTitle fx
let kb = Map.lookup (title,i) fxpos2
let ka = HM.lookup "file" (fixmeAttr fx)
let kk = (,,) <$> ka <*> pure title <*> kb
case kk of
Nothing -> pure fx
Just (a,b,c) -> do
let ks = [qc|{show (pretty a)}#{show (pretty b)}:{show c}|] :: Text
let kv = HM.singleton "fixme-key" (FixmeAttrVal ks)
pure $ over (field @"fixmeAttr") (<> kv) fx
when ( PrintFixme `elem` args ) do when ( PrintFixme `elem` args ) do
for_ fixmies $ \fixme -> do for_ fixmies $ \fixme -> do
@ -558,6 +605,9 @@ run what = do
ListVal [SymbolVal "builtin:evolve"] -> do ListVal [SymbolVal "builtin:evolve"] -> do
evolve evolve
ListVal [SymbolVal "builtin:cleanup-state"] -> do
cleanupDatabase
ListVal [SymbolVal "trace"] -> do ListVal [SymbolVal "trace"] -> do
setLogging @TRACE (logPrefix "[trace] " . toStderr) setLogging @TRACE (logPrefix "[trace] " . toStderr)
trace "trace on" trace "trace on"

View File

@ -159,12 +159,13 @@ scanBlob fpath lbs = do
Fixme (FixmeTag tag) Fixme (FixmeTag tag)
(FixmeTitle title) (FixmeTitle title)
Nothing Nothing
Nothing
(Just (FixmeOffset (fromIntegral lno))) (Just (FixmeOffset (fromIntegral lno)))
Nothing Nothing
mempty mempty
mempty mempty
_ -> Fixme mempty mempty Nothing Nothing Nothing mempty mempty _ -> mempty
emitFixmeStart lno lvl tagbs restbs = do emitFixmeStart lno lvl tagbs restbs = do
let tag = decodeUtf8With ignore (LBS8.toStrict tagbs) & Text.strip let tag = decodeUtf8With ignore (LBS8.toStrict tagbs) & Text.strip

View File

@ -10,6 +10,7 @@ module Fixme.State
, insertCommit , insertCommit
, selectCommit , selectCommit
, newCommit , newCommit
, cleanupDatabase
, HasPredicate(..) , HasPredicate(..)
) where ) where
@ -346,3 +347,14 @@ order by f.ts nulls first
select sql (snd predic) <&> mapMaybe (Aeson.decode @FixmeThin . fromOnly) select sql (snd predic) <&> mapMaybe (Aeson.decode @FixmeThin . fromOnly)
cleanupDatabase :: (FixmePerks m, MonadReader FixmeEnv m) => m ()
cleanupDatabase = do
warn $ red "cleanupDatabase"
withState $ transactional do
update_ [qc|delete from fixme|]
update_ [qc|delete from fixmeattr|]
update_ [qc|delete from fixmecommit|]
update_ [qc|delete from fixmedeleted|]
update_ [qc|delete from fixmerel|]

View File

@ -11,6 +11,7 @@ import HBS2.Git.Local
import Data.Config.Suckless import Data.Config.Suckless
import Control.Applicative
import Data.Aeson import Data.Aeson
import Data.HashMap.Strict (HashMap) import Data.HashMap.Strict (HashMap)
import Data.HashMap.Strict qualified as HM import Data.HashMap.Strict qualified as HM
@ -22,6 +23,7 @@ import Data.Coerce
import Data.Text qualified as Text import Data.Text qualified as Text
import System.FilePath import System.FilePath
import Text.InterpolatedString.Perl6 (qc) import Text.InterpolatedString.Perl6 (qc)
import Lens.Micro.Platform
pattern StringLike :: forall {c} . String -> Syntax c pattern StringLike :: forall {c} . String -> Syntax c
@ -79,6 +81,10 @@ newtype FixmeTimestamp = FixmeTimestamp Word64
deriving stock (Data,Generic) deriving stock (Data,Generic)
newtype FixmeKey = FixmeKey Text
deriving newtype (Eq,Ord,Show,ToField,FromField)
deriving stock (Data,Generic)
newtype FixmeOffset = FixmeOffset Word32 newtype FixmeOffset = FixmeOffset Word32
deriving newtype (Eq,Ord,Show,Num,ToField,FromField) deriving newtype (Eq,Ord,Show,Num,ToField,FromField)
deriving stock (Data,Generic) deriving stock (Data,Generic)
@ -88,6 +94,7 @@ data Fixme =
Fixme Fixme
{ fixmeTag :: FixmeTag { fixmeTag :: FixmeTag
, fixmeTitle :: FixmeTitle , fixmeTitle :: FixmeTitle
, fixmeKey :: Maybe FixmeKey
, fixmeTs :: Maybe FixmeTimestamp , fixmeTs :: Maybe FixmeTimestamp
, fixmeStart :: Maybe FixmeOffset , fixmeStart :: Maybe FixmeOffset
, fixmeEnd :: Maybe FixmeOffset , fixmeEnd :: Maybe FixmeOffset
@ -96,10 +103,24 @@ data Fixme =
} }
deriving stock (Show,Data,Generic) deriving stock (Show,Data,Generic)
instance Monoid Fixme where
mempty = Fixme mempty mempty Nothing Nothing Nothing Nothing mempty mempty
instance Semigroup Fixme where
(<>) a b = b { fixmeTs = fixmeTs b <|> fixmeTs a
, fixmeStart = fixmeStart b <|> fixmeStart a
, fixmeEnd = fixmeEnd b <|> fixmeEnd a
, fixmePlain = fixmePlain b
, fixmeAttr = fixmeAttr a <> fixmeAttr b
}
newtype FixmeThin = FixmeThin (HashMap FixmeAttrName FixmeAttrVal) newtype FixmeThin = FixmeThin (HashMap FixmeAttrName FixmeAttrVal)
deriving newtype (Semigroup,Monoid,Eq,Ord,Show,ToJSON,FromJSON) deriving newtype (Semigroup,Monoid,Eq,Ord,Show,ToJSON,FromJSON)
deriving stock (Data,Generic) deriving stock (Data,Generic)
type FixmePerks m = ( MonadUnliftIO m type FixmePerks m = ( MonadUnliftIO m
, MonadIO m , MonadIO m
) )
@ -161,6 +182,7 @@ instance Serialise FixmeAttrName
instance Serialise FixmeAttrVal instance Serialise FixmeAttrVal
instance Serialise FixmeTimestamp instance Serialise FixmeTimestamp
instance Serialise FixmeOffset instance Serialise FixmeOffset
instance Serialise FixmeKey
instance Serialise Fixme instance Serialise Fixme