This commit is contained in:
Dmitry Zuikov 2024-09-09 16:03:29 +03:00
parent e3655a8eb2
commit 655a901040
5 changed files with 127 additions and 16 deletions

View File

@ -309,6 +309,24 @@ runTop forms = do
_ -> throwIO $ BadFormException @C nil _ -> throwIO $ BadFormException @C nil
entry $ bindMatch "dump" $ nil_ $ \case
[ FixmeHashLike w ] -> lift $ void $ runMaybeT do
key <- lift (selectFixmeKey w) >>= toMPlus
fme <- lift $ getFixme key
liftIO $ print $ pretty fme
_ -> throwIO $ BadFormException @C nil
-- magic <- lift $ asks fixmeEnvScanMagic >>= readTVarIO
-- liftIO $ print $ pretty magic
entry $ bindMatch "fixme:key:show" $ nil_ \case
[ FixmeHashLike w ] -> lift $ void $ runMaybeT do
key <- lift (selectFixmeKey w) >>= toMPlus
liftIO $ print $ pretty key
_ -> throwIO $ BadFormException @C nil
entry $ bindMatch "fixme:scan-magic" $ nil_ $ const do entry $ bindMatch "fixme:scan-magic" $ nil_ $ const do
magic <- lift $ asks fixmeEnvScanMagic >>= readTVarIO magic <- lift $ asks fixmeEnvScanMagic >>= readTVarIO
liftIO $ print $ pretty magic liftIO $ print $ pretty magic

View File

@ -182,7 +182,7 @@ scanFiles = do
let keyText = key <> fromString (show no) let keyText = key <> fromString (show no)
let keyHash = FixmeKey $ fromString $ show $ pretty $ hashObject @HbSync (serialise keyText) let keyHash = FixmeKey $ fromString $ show $ pretty $ hashObject @HbSync (serialise keyText)
let f2 = mempty { fixmeTs = Just (fromIntegral ts) let f2 = mempty { fixmeTs = Just (fromIntegral ts)
, fixmeKey = Just keyHash , fixmeKey = keyHash
, fixmeAttr = HM.fromList , fixmeAttr = HM.fromList
[ ( "fixme-key-string", FixmeAttrVal keyText) [ ( "fixme-key-string", FixmeAttrVal keyText)
, ( "file", FixmeAttrVal (fromString fnShort)) , ( "file", FixmeAttrVal (fromString fnShort))

View File

@ -179,7 +179,7 @@ scanBlob fpath lbs = do
FixmeHead lno _ tag title -> FixmeHead lno _ tag title ->
Fixme (FixmeTag tag) Fixme (FixmeTag tag)
(FixmeTitle title) (FixmeTitle title)
Nothing mempty
Nothing Nothing
(Just (FixmeOffset (fromIntegral lno))) (Just (FixmeOffset (fromIntegral lno)))
Nothing Nothing

View File

@ -7,22 +7,25 @@ module Fixme.State
, insertFixme , insertFixme
, insertScanned , insertScanned
, selectIsAlreadyScanned , selectIsAlreadyScanned
, selectFixmeKey
, getFixme
, HasPredicate(..) , HasPredicate(..)
, SelectPredicate(..) , SelectPredicate(..)
) where ) where
import Fixme.Prelude import Fixme.Prelude hiding (key)
import Fixme.Types import Fixme.Types
import Fixme.Config import Fixme.Config
import HBS2.System.Dir import HBS2.System.Dir
import Data.Config.Suckless import Data.Config.Suckless hiding (key)
import Data.Config.Suckless.Syntax import Data.Config.Suckless.Syntax
import DBPipe.SQLite hiding (field) import DBPipe.SQLite hiding (field)
import Data.HashSet (HashSet) import Data.HashSet (HashSet)
import Data.HashSet qualified as HS import Data.HashSet qualified as HS
import Data.Aeson as Aeson import Data.Aeson as Aeson
import Data.ByteString.Lazy qualified as LBS
import Data.HashMap.Strict qualified as HM import Data.HashMap.Strict qualified as HM
import Text.InterpolatedString.Perl6 (q,qc) import Text.InterpolatedString.Perl6 (q,qc)
import Data.Text qualified as Text import Data.Text qualified as Text
@ -256,12 +259,37 @@ insertScanned file = do
on conflict (hash) do nothing|] on conflict (hash) do nothing|]
(Only k) (Only k)
selectFixmeKey :: (FixmePerks m, MonadReader FixmeEnv m) => Text -> m (Maybe FixmeKey)
selectFixmeKey s = do
withState do
select @(Only FixmeKey) [qc|select distinct(o) from object where o like ? order by w desc|] (Only (s<>"%"))
<&> fmap fromOnly
<&> headMay
getFixme :: (FixmePerks m, MonadReader FixmeEnv m) => FixmeKey -> m (Maybe Fixme)
getFixme key = do
let sql = [qc|
select (cast (json_group_object(o.k, o.v) as blob)) as blob from object o
where o.o = ?
group by o.o
limit 1
|]
runMaybeT do
lift (withState $ select @(Only LBS.ByteString) sql (Only key))
<&> fmap (Aeson.decode @Fixme . fromOnly)
<&> catMaybes
<&> headMay
>>= toMPlus
insertFixme :: (FixmePerks m, MonadReader FixmeEnv m) => Fixme -> DBPipeM m () insertFixme :: (FixmePerks m, MonadReader FixmeEnv m) => Fixme -> DBPipeM m ()
insertFixme fme = do insertFixme fme = do
void $ runMaybeT do void $ runMaybeT do
o <- fixmeKey fme & toMPlus let o = fixmeKey fme
w <- fixmeTs fme & toMPlus w <- fixmeTs fme & toMPlus
let attrs = fixmeAttr fme let attrs = fixmeAttr fme
let txt = fixmePlain fme & Text.unlines . fmap coerce let txt = fixmePlain fme & Text.unlines . fmap coerce
@ -281,6 +309,12 @@ insertFixme fme = do
end end
|] |]
for_ (fixmeStart fme) $ \s -> do
lift $ insert sql (o,w,"fixme-start",s)
for_ (fixmeEnd fme) $ \s -> do
lift $ insert sql (o,w,"fixme-end",s)
for_ (HM.toList attrs) $ \(k,v) -> do for_ (HM.toList attrs) $ \(k,v) -> do
lift $ insert sql (o,w,k,v) lift $ insert sql (o,w,k,v)

View File

@ -27,7 +27,10 @@ import Data.Config.Suckless
import Prettyprinter.Render.Terminal import Prettyprinter.Render.Terminal
import Control.Applicative import Control.Applicative
import Data.Aeson import Data.Aeson as Aeson
import Data.Aeson.KeyMap as Aeson hiding (null)
import Data.Aeson.Key qualified as Aeson
import Data.Aeson.Types as Aeson
import Data.ByteString (ByteString) import Data.ByteString (ByteString)
import Data.ByteString.Char8 qualified as BS8 import Data.ByteString.Char8 qualified as BS8
import Data.ByteString.Lazy qualified as LBS import Data.ByteString.Lazy qualified as LBS
@ -97,15 +100,15 @@ tsFromFromSyn = \case
_ -> Nothing _ -> Nothing
newtype FixmeTag = FixmeTag { fromFixmeTag :: Text } newtype FixmeTag = FixmeTag { fromFixmeTag :: Text }
deriving newtype (Eq,Ord,Show,IsString,Hashable,Semigroup,Monoid,ToField,FromField) deriving newtype (Eq,Ord,Show,IsString,Hashable,Semigroup,Monoid,ToField,FromField,FromJSON,ToJSON)
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,ToField,FromField,Hashable) deriving newtype (Eq,Ord,Show,IsString,Semigroup,Monoid,ToField,FromField,Hashable,FromJSON,ToJSON)
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,ToField,FromField) deriving newtype (Eq,Ord,Show,IsString,Semigroup,Monoid,ToField,FromField,FromJSON,ToJSON)
deriving stock (Data,Generic) deriving stock (Data,Generic)
@ -121,16 +124,16 @@ newtype FixmeAttrVal = FixmeAttrVal { fromFixmeAttrVal :: Text }
deriving stock (Data,Generic) deriving stock (Data,Generic)
newtype FixmeTimestamp = FixmeTimestamp Word64 newtype FixmeTimestamp = FixmeTimestamp Word64
deriving newtype (Eq,Ord,Show,Num,ToField,FromField) deriving newtype (Eq,Ord,Show,Num,ToField,FromField,ToJSON)
deriving stock (Data,Generic) deriving stock (Data,Generic)
newtype FixmeKey = FixmeKey Text newtype FixmeKey = FixmeKey Text
deriving newtype (Eq,Ord,Show,ToField,FromField,Pretty) deriving newtype (Eq,Ord,Show,ToField,FromField,Pretty,FromJSON,ToJSON,Semigroup,Monoid)
deriving stock (Data,Generic) 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,ToJSON)
deriving newtype (Integral,Real,Enum) deriving newtype (Integral,Real,Enum)
deriving stock (Data,Generic) deriving stock (Data,Generic)
@ -139,7 +142,7 @@ data Fixme =
Fixme Fixme
{ fixmeTag :: FixmeTag { fixmeTag :: FixmeTag
, fixmeTitle :: FixmeTitle , fixmeTitle :: FixmeTitle
, fixmeKey :: Maybe FixmeKey , fixmeKey :: FixmeKey
, fixmeTs :: Maybe FixmeTimestamp , fixmeTs :: Maybe FixmeTimestamp
, fixmeStart :: Maybe FixmeOffset , fixmeStart :: Maybe FixmeOffset
, fixmeEnd :: Maybe FixmeOffset , fixmeEnd :: Maybe FixmeOffset
@ -149,7 +152,7 @@ data Fixme =
deriving stock (Ord,Eq,Show,Data,Generic) deriving stock (Ord,Eq,Show,Data,Generic)
instance Monoid Fixme where instance Monoid Fixme where
mempty = Fixme mempty mempty Nothing Nothing Nothing Nothing mempty mempty mempty = Fixme mempty mempty mempty Nothing Nothing Nothing mempty mempty
instance Semigroup Fixme where instance Semigroup Fixme where
(<>) a b = b { fixmeTs = fixmeTs b <|> fixmeTs a (<>) a b = b { fixmeTs = fixmeTs b <|> fixmeTs a
@ -161,6 +164,57 @@ instance Semigroup Fixme where
, fixmeAttr = fixmeAttr a <> fixmeAttr b , fixmeAttr = fixmeAttr a <> fixmeAttr b
} }
instance FromJSON FixmeOffset where
parseJSON = \case
Number x -> pure (FixmeOffset (ceiling x))
String s -> do
n <- maybe (fail "invalid FixmeOffset value") pure (readMay (Text.unpack s))
pure $ FixmeOffset n
_ -> fail "invalid FixmeOffset value"
instance FromJSON FixmeTimestamp where
parseJSON = \case
Number x -> pure (FixmeTimestamp (ceiling x))
String s -> do
n <- maybe (fail "invalid FixmeOffset value") pure (readMay (Text.unpack s))
pure $ FixmeTimestamp n
_ -> fail "invalid FixmeTimestamp value"
instance FromJSON Fixme where
parseJSON = withObject "Fixme" $ \o -> do
fixmeKey <- o .: "fixme-key"
fixmeTag <- o .: "fixme-tag"
fixmeTitle <- o .: "fixme-title"
fixmeStart <- o .:? "fixme-start"
fixmeEnd <- o .:? "fixme-end"
fixmeTs <- o .:? "fixme-timestamp"
fixmePlainTxt <- o .:? "fixme-text" <&> fromMaybe mempty
let fixmePlain = fmap FixmePlainLine (Text.lines fixmePlainTxt)
let wtf = [ unpackItem k v
| (k,v) <- Aeson.toList o
, k /= "fixme-text"
] & catMaybes
let fixmeAttr = HM.fromList wtf
return Fixme{..}
where
unpackItem k v = do
(FixmeAttrName (Aeson.toText k),) <$>
case v of
String x -> pure (FixmeAttrVal x)
_ -> Nothing
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)
@ -635,7 +689,7 @@ fixmeAttrNonEmpty a b = case (coerce a :: Text, coerce b :: Text) of
(_,_) -> b (_,_) -> b
fixmeDerivedFields :: Fixme -> Fixme fixmeDerivedFields :: Fixme -> Fixme
fixmeDerivedFields fx = fx <> fxKey <> fxCo <> tag <> fxLno <> fxMisc fixmeDerivedFields fx = fxEnd <> fx <> fxKey <> fxCo <> tag <> fxLno <> fxMisc
where where
email = HM.lookup "commiter-email" (fixmeAttr fx) email = HM.lookup "commiter-email" (fixmeAttr fx)
& maybe mempty (\x -> " <" <> x <> ">") & maybe mempty (\x -> " <" <> x <> ">")
@ -645,7 +699,7 @@ fixmeDerivedFields fx = fx <> fxKey <> fxCo <> tag <> fxLno <> fxMisc
tag = mempty { fixmeAttr = HM.singleton "fixme-tag" (FixmeAttrVal (coerce $ fixmeTag fx)) } tag = mempty { fixmeAttr = HM.singleton "fixme-tag" (FixmeAttrVal (coerce $ fixmeTag fx)) }
key = maybe mempty ( HM.singleton "fixme-key" . FixmeAttrVal . coerce) (fixmeKey fx) key = HM.singleton "fixme-key" (FixmeAttrVal $ coerce $ (fixmeKey fx))
fxKey = mempty { fixmeAttr = key } fxKey = mempty { fixmeAttr = key }
@ -653,6 +707,11 @@ fixmeDerivedFields fx = fx <> fxKey <> fxCo <> tag <> fxLno <> fxMisc
fxLno = mempty { fixmeAttr = maybe mempty (HM.singleton "line") lno } fxLno = mempty { fixmeAttr = maybe mempty (HM.singleton "line") lno }
fxE = join $ for (fixmeStart fx) $ \n -> do
Just $ FixmeOffset $ fromIntegral $ fromIntegral n + length (fixmePlain fx)
fxEnd = mempty { fixmeEnd = fxE }
fxCo = fxCo =
maybe mempty (\c -> mempty { fixmeAttr = HM.singleton "committer" c }) comitter maybe mempty (\c -> mempty { fixmeAttr = HM.singleton "committer" c }) comitter