mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
e3655a8eb2
commit
655a901040
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue