This commit is contained in:
Dmitry Zuikov 2024-05-17 12:09:10 +03:00
parent 3717471b3f
commit 57a1a5e81b
5 changed files with 64 additions and 7 deletions

View File

@ -38,7 +38,7 @@ fixme-comments ";" "--"
) )
(fixme-play-log-action (fixme-play-log-action
; (hello kitty) (hello kitty)
) )
(define-template short (define-template short

View File

@ -1,2 +1,7 @@
deleted "6R2raAzjbViHZVk24zwUr7rwgfepHTdXeW6Lbqw3q25A" deleted "6R2raAzjbViHZVk24zwUr7rwgfepHTdXeW6Lbqw3q25A"
deleted "DtcQir9mHe7R5ixYGXTbsXGPeVGV8TqAMmrvYgGy1wGB" deleted "DtcQir9mHe7R5ixYGXTbsXGPeVGV8TqAMmrvYgGy1wGB"
modified "2XpT9uxrz3yu9jtYtu46jfs8ZFr8s3PVAZREJWTCSdYx" "workflow" "done"
modified 0 "2XpT9uxrz3yu9jtYtu46jfs8ZFr8s3PVAZREJWTCSdYx" "workflow" "done"
modified "2XpT9uxrz3yu9jtYtu46jfs8ZFr8s3PVAZREJWTCSdYx" "workflow" "done"
modified "2XpT9uxrz3yu9jtYtu46jfs8ZFr8s3PVAZREJWTCSdYx" "workflow" "done"
modified "2XpT9uxrz3yu9jtYtu46jfs8ZFr8s3PVAZREJWTCSdYx" "workflow" "backlog"

View File

@ -583,6 +583,22 @@ delete txt = do
liftIO $ what (Literal noContext syn) liftIO $ what (Literal noContext syn)
modify_ :: FixmePerks m => Text -> String -> String -> FixmeM m ()
modify_ txt a b = do
acts <- asks fixmeEnvUpdateActions >>= readTVarIO
void $ runMaybeT do
ha <- toMPlus =<< lift (selectFixmeHash txt)
let syn = mkLit @Text [qc|modified "{pretty ha}" "{a}" "{b}"|]
debug $ red $ pretty syn
for_ acts $ \(UpdateAction what) -> do
liftIO $ what (Literal noContext syn)
printEnv :: FixmePerks m => FixmeM m () printEnv :: FixmePerks m => FixmeM m ()
printEnv = do printEnv = do
g <- asks fixmeEnvGitDir g <- asks fixmeEnvGitDir
@ -646,6 +662,7 @@ splitForms s0 = runIdentity $ S.toList_ (go mempty s0)
sanitizeLog :: [Syntax c] -> [Syntax c] sanitizeLog :: [Syntax c] -> [Syntax c]
sanitizeLog lls = flip filter lls $ \case sanitizeLog lls = flip filter lls $ \case
ListVal (SymbolVal "deleted" : _) -> True ListVal (SymbolVal "deleted" : _) -> True
ListVal (SymbolVal "modified" : _) -> True
_ -> False _ -> False
pattern Template :: forall {c}. Maybe Id -> [Syntax c] -> [Syntax c] pattern Template :: forall {c}. Maybe Id -> [Syntax c] -> [Syntax c]
@ -757,6 +774,17 @@ run what = do
ListVal [SymbolVal "delete", FixmeHashLike hash] -> do ListVal [SymbolVal "delete", FixmeHashLike hash] -> do
delete hash delete hash
ListVal [SymbolVal "modify", FixmeHashLike hash, StringLike a, StringLike b] -> do
modify_ hash a b
ListVal [SymbolVal "modified", TimeStampLike t, FixmeHashLike hash, StringLike a, StringLike b] -> do
debug $ green $ pretty s
updateFixme (Just t) hash (fromString a) (fromString b)
ListVal [SymbolVal "modified", FixmeHashLike hash, StringLike a, StringLike b] -> do
debug $ green $ pretty s
updateFixme Nothing hash (fromString a) (fromString b)
ListVal [SymbolVal "deleted", FixmeHashLike hash] -> do ListVal [SymbolVal "deleted", FixmeHashLike hash] -> do
deleteFixme hash deleteFixme hash
@ -769,7 +797,7 @@ run what = do
notice $ "hello" <+> pretty xs notice $ "hello" <+> pretty xs
ListVal (SymbolVal "define-template" : SymbolVal who : IsSimpleTemplate xs) -> do ListVal (SymbolVal "define-template" : SymbolVal who : IsSimpleTemplate xs) -> do
debug $ "define-template" <+> pretty who <+> "simple" <+> hsep (fmap pretty xs) trace $ "define-template" <+> pretty who <+> "simple" <+> hsep (fmap pretty xs)
t <- asks fixmeEnvTemplates t <- asks fixmeEnvTemplates
atomically $ modifyTVar t (HM.insert who (Simple (SimpleTemplate xs))) atomically $ modifyTVar t (HM.insert who (Simple (SimpleTemplate xs)))
@ -785,7 +813,9 @@ run what = do
env <- ask env <- ask
t <- asks fixmeEnvUpdateActions t <- asks fixmeEnvUpdateActions
let repl syn = [ ( "$1", syn ) ] let repl syn = [ ( "$1", syn ) ]
let action = UpdateAction @c $ \syn -> liftIO (withFixmeEnv env (runForms (inject (repl syn) xs))) let action = UpdateAction @c $ \syn -> do
liftIO (withFixmeEnv env (runForms (inject (repl syn) xs)))
atomically $ modifyTVar t (<> [action]) atomically $ modifyTVar t (<> [action])
ListVal (SymbolVal "fixme-play-log-action" : xs) -> do ListVal (SymbolVal "fixme-play-log-action" : xs) -> do

View File

@ -8,6 +8,7 @@ module Fixme.State
, selectFixmeHash , selectFixmeHash
, selectFixme , selectFixme
, deleteFixme , deleteFixme
, updateFixme
, insertCommit , insertCommit
, insertBlob , insertBlob
, selectObjectHash , selectObjectHash
@ -154,8 +155,8 @@ createTables = do
row_number() over (partition by fixme, name order by ts desc nulls first) as rn row_number() over (partition by fixme, name order by ts desc nulls first) as rn
from fixmeattr from fixmeattr
where not ({commits}) where not ({commits})
), )
ranked2 as ( , ranked2 as (
select select
fixme, fixme,
name, name,
@ -520,6 +521,20 @@ deleteFixme hash = withState do
|] (Only hash) |] (Only hash)
updateFixme :: (FixmePerks m,MonadReader FixmeEnv m)
=> Maybe FixmeTimestamp
-> Text
-> FixmeAttrName
-> FixmeAttrVal
-> m ()
updateFixme ts hash a b = withState do
warn $ red "updateFixme" <+> pretty hash
insert [qc| insert into fixmeattr (fixme,ts,name,value)
values (?,coalesce(?,strftime('%s', 'now')),?,?)
on conflict(fixme,ts,name) do update set value = excluded.value
|] (hash,ts,a,b)
updateIndexes :: (FixmePerks m, MonadReader FixmeEnv m) => m () updateIndexes :: (FixmePerks m, MonadReader FixmeEnv m) => m ()
updateIndexes = withState $ transactional do updateIndexes = withState $ transactional do
update_ [qc|delete from fixmeactual|] update_ [qc|delete from fixmeactual|]

View File

@ -24,11 +24,9 @@ import Data.Maybe
import Data.Coerce import Data.Coerce
import Data.Text qualified as Text import Data.Text qualified as Text
import Data.List qualified as List import Data.List qualified as List
import Data.Either
import Data.Map qualified as Map import Data.Map qualified as Map
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
@ -40,6 +38,10 @@ pattern StringLikeList e <- (stringLikeList -> e)
pattern FixmeHashLike :: forall {c} . Text -> Syntax c pattern FixmeHashLike :: forall {c} . Text -> Syntax c
pattern FixmeHashLike e <- (fixmeHashFromSyn -> Just e) pattern FixmeHashLike e <- (fixmeHashFromSyn -> Just e)
pattern TimeStampLike :: forall {c} . FixmeTimestamp -> Syntax c
pattern TimeStampLike e <- (tsFromFromSyn -> Just e)
stringLike :: Syntax c -> Maybe String stringLike :: Syntax c -> Maybe String
stringLike = \case stringLike = \case
LitStrVal s -> Just $ Text.unpack s LitStrVal s -> Just $ Text.unpack s
@ -57,6 +59,11 @@ fixmeHashFromSyn = \case
_ -> Nothing _ -> Nothing
tsFromFromSyn :: Syntax c -> Maybe FixmeTimestamp
tsFromFromSyn = \case
LitIntVal n -> Just (fromIntegral n)
_ -> 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)
deriving stock (Data,Generic) deriving stock (Data,Generic)