mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
45f525c756
commit
498ad63f63
|
|
@ -83,6 +83,7 @@ common shared-properties
|
||||||
, time
|
, time
|
||||||
, timeit
|
, timeit
|
||||||
, transformers
|
, transformers
|
||||||
|
|
||||||
, typed-process
|
, typed-process
|
||||||
, unordered-containers
|
, unordered-containers
|
||||||
, unliftio
|
, unliftio
|
||||||
|
|
|
||||||
|
|
@ -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 DBPipe.SQLite hiding (field)
|
||||||
import Data.Config.Suckless
|
import Data.Config.Suckless
|
||||||
import Data.Text.Fuzzy.Tokenize
|
import Data.Text.Fuzzy.Tokenize
|
||||||
|
|
||||||
|
|
@ -33,6 +33,7 @@ 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
|
||||||
|
import Data.Generics.Product.Fields (field)
|
||||||
import Lens.Micro.Platform
|
import Lens.Micro.Platform
|
||||||
import System.Process.Typed
|
import System.Process.Typed
|
||||||
import Control.Monad.Trans.Cont
|
import Control.Monad.Trans.Cont
|
||||||
|
|
@ -174,7 +175,7 @@ listCommits = do
|
||||||
[co, n, e, t] -> do
|
[co, n, e, t] -> do
|
||||||
let gh = fromStringMay @GitHash (Text.unpack co)
|
let gh = fromStringMay @GitHash (Text.unpack co)
|
||||||
|
|
||||||
let bag = [ ("commit-hash", co)
|
let bag = [ ("commit", co)
|
||||||
, ("commit-time", t)
|
, ("commit-time", t)
|
||||||
, ("committer-name", n)
|
, ("committer-name", n)
|
||||||
, ("committer-email", e)
|
, ("committer-email", e)
|
||||||
|
|
@ -301,7 +302,45 @@ scanGitLocal args p = do
|
||||||
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)
|
poor <- lift (Scan.scanBlob (Just fp) blob)
|
||||||
|
|
||||||
|
rich <- withDB tempDb do
|
||||||
|
let q = [qc|
|
||||||
|
|
||||||
|
WITH CommitAttributes AS (
|
||||||
|
SELECT co.cohash, co.ts, coattr.name, coattr.value
|
||||||
|
FROM co
|
||||||
|
JOIN coattr ON co.cohash = coattr.cohash
|
||||||
|
),
|
||||||
|
MinCommitTimes AS (
|
||||||
|
SELECT blob.hash, MIN(co.ts) as mintime
|
||||||
|
FROM blob
|
||||||
|
JOIN co ON blob.cohash = co.cohash
|
||||||
|
WHERE co.ts IS NOT NULL
|
||||||
|
GROUP BY blob.hash
|
||||||
|
),
|
||||||
|
RelevantCommits AS (
|
||||||
|
SELECT blob.hash, blob.cohash, blob.path
|
||||||
|
FROM blob
|
||||||
|
JOIN MinCommitTimes ON blob.hash = MinCommitTimes.hash
|
||||||
|
JOIN co ON blob.cohash = co.cohash AND co.ts = MinCommitTimes.mintime
|
||||||
|
)
|
||||||
|
SELECT CommitAttributes.name, CommitAttributes.value
|
||||||
|
FROM RelevantCommits
|
||||||
|
JOIN CommitAttributes ON RelevantCommits.cohash = CommitAttributes.cohash
|
||||||
|
WHERE RelevantCommits.hash = ?
|
||||||
|
|]
|
||||||
|
|
||||||
|
what <- select @(FixmeAttrName,FixmeAttrVal) q (Only h)
|
||||||
|
<&> HM.fromList
|
||||||
|
<&> (<> HM.fromList [ ("blob",fromString $ show (pretty h))
|
||||||
|
, ("file",fromString fp)
|
||||||
|
])
|
||||||
|
|
||||||
|
for poor $ \f -> do
|
||||||
|
pure $ over (field @"fixmeAttr") (<> what) f
|
||||||
|
|
||||||
|
let fixmies = rich
|
||||||
|
|
||||||
when ( PrintFixme `elem` args ) do
|
when ( PrintFixme `elem` args ) do
|
||||||
for_ fixmies $ \fixme -> do
|
for_ fixmies $ \fixme -> do
|
||||||
|
|
|
||||||
|
|
@ -43,11 +43,11 @@ data S = S Sx [(Int,ByteString)]
|
||||||
data FixmePart = FixmePart Int FixmeWhat
|
data FixmePart = FixmePart Int FixmeWhat
|
||||||
deriving stock (Show,Data,Generic)
|
deriving stock (Show,Data,Generic)
|
||||||
|
|
||||||
data FixmeWhat = FixmeHead Int Text Text
|
data FixmeWhat = FixmeHead Int Int Text Text
|
||||||
| FixmeLine Text
|
| FixmeLine Text
|
||||||
deriving stock (Show,Data,Generic)
|
deriving stock (Show,Data,Generic)
|
||||||
|
|
||||||
data P = P0 [FixmePart] | P1 Fixme [FixmePart]
|
data P = P0 [FixmePart] | P1 Int Fixme [FixmePart]
|
||||||
|
|
||||||
scanBlob :: forall m . FixmePerks m
|
scanBlob :: forall m . FixmePerks m
|
||||||
=> Maybe FilePath -- ^ filename to detect type
|
=> Maybe FilePath -- ^ filename to detect type
|
||||||
|
|
@ -94,7 +94,7 @@ scanBlob fpath lbs = do
|
||||||
| li <= l0 && not (LBS8.null bs) -> next (S S0 (x:xs))
|
| li <= l0 && not (LBS8.null bs) -> next (S S0 (x:xs))
|
||||||
|
|
||||||
| otherwise -> do
|
| otherwise -> do
|
||||||
emitFixmeLine lno l0 bs
|
emitFixmeLine (fst x) l0 bs
|
||||||
next (S (Sf (succEln env bs)) xs)
|
next (S (Sf (succEln env bs)) xs)
|
||||||
|
|
||||||
S _ [] -> pure ()
|
S _ [] -> pure ()
|
||||||
|
|
@ -104,22 +104,26 @@ scanBlob fpath lbs = do
|
||||||
S.toList_ do
|
S.toList_ do
|
||||||
flip fix (P0 parts) $ \next -> \case
|
flip fix (P0 parts) $ \next -> \case
|
||||||
|
|
||||||
(P0 (FixmePart _ h@FixmeHead{} : rs)) -> do
|
(P0 (FixmePart l h@FixmeHead{} : rs)) -> do
|
||||||
next (P1 (fromHead h) rs)
|
next (P1 l (fromHead h) rs)
|
||||||
|
|
||||||
(P1 fx (FixmePart _ h@FixmeHead{} : rs)) -> do
|
(P1 _ fx (FixmePart l h@FixmeHead{} : rs)) -> do
|
||||||
emitFixme fx
|
emitFixme fx
|
||||||
next (P1 (fromHead h) rs)
|
next (P1 l (fromHead h) rs)
|
||||||
|
|
||||||
(P1 fx (FixmePart _ (FixmeLine what) : rs)) -> do
|
(P1 w fx (FixmePart lno (FixmeLine what) : rs)) -> do
|
||||||
next (P1 (over (field @"fixmePlain") (<> [FixmePlainLine what]) fx) rs)
|
next (P1 lno (setLno lno $ over (field @"fixmePlain") (<> [FixmePlainLine what]) fx) rs)
|
||||||
|
|
||||||
(P1 fx []) -> emitFixme fx
|
(P1 _ fx []) -> emitFixme fx
|
||||||
(P0 ( _ : rs ) ) -> next (P0 rs)
|
(P0 ( _ : rs ) ) -> next (P0 rs)
|
||||||
(P0 []) -> pure ()
|
(P0 []) -> pure ()
|
||||||
|
|
||||||
where
|
where
|
||||||
|
|
||||||
|
setLno lno fx@Fixme{} = do
|
||||||
|
let lno1 = Just (FixmeOffset (fromIntegral lno))
|
||||||
|
set (field @"fixmeEnd") lno1 fx
|
||||||
|
|
||||||
emitFixme e = do
|
emitFixme e = do
|
||||||
S.yield $ over (field @"fixmePlain") dropEmpty e
|
S.yield $ over (field @"fixmePlain") dropEmpty e
|
||||||
where
|
where
|
||||||
|
|
@ -129,13 +133,22 @@ scanBlob fpath lbs = do
|
||||||
|
|
||||||
-- FIXME: jopakita
|
-- FIXME: jopakita
|
||||||
fromHead = \case
|
fromHead = \case
|
||||||
FixmeHead _ tag title -> Fixme (FixmeTag tag) (FixmeTitle title) Nothing mempty mempty Nothing
|
FixmeHead lno _ tag title ->
|
||||||
_ -> Fixme mempty mempty Nothing mempty mempty Nothing
|
Fixme (FixmeTag tag)
|
||||||
|
(FixmeTitle title)
|
||||||
|
Nothing
|
||||||
|
(Just (FixmeOffset (fromIntegral lno)))
|
||||||
|
Nothing
|
||||||
|
mempty
|
||||||
|
mempty
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
_ -> Fixme mempty mempty Nothing Nothing Nothing mempty mempty Nothing
|
||||||
|
|
||||||
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
|
||||||
let rest = decodeUtf8With ignore (LBS8.toStrict restbs) & Text.strip
|
let rest = decodeUtf8With ignore (LBS8.toStrict restbs) & Text.strip
|
||||||
S.yield (FixmePart lno (FixmeHead lvl tag rest))
|
S.yield (FixmePart lno (FixmeHead lno lvl tag rest))
|
||||||
|
|
||||||
emitFixmeLine lno l0 restbs = do
|
emitFixmeLine lno l0 restbs = do
|
||||||
let rest = decodeUtf8With ignore (LBS8.toStrict restbs) & Text.stripEnd
|
let rest = decodeUtf8With ignore (LBS8.toStrict restbs) & Text.stripEnd
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import Data.HashMap.Strict (HashMap)
|
||||||
import Data.HashMap.Strict qualified as HM
|
import Data.HashMap.Strict qualified as HM
|
||||||
import Data.HashSet (HashSet)
|
import Data.HashSet (HashSet)
|
||||||
import Data.HashSet qualified as HS
|
import Data.HashSet qualified as HS
|
||||||
import Data.Word (Word64)
|
import Data.Word (Word64,Word32)
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Coerce
|
import Data.Coerce
|
||||||
import System.FilePath
|
import System.FilePath
|
||||||
|
|
@ -53,11 +53,19 @@ newtype FixmeTimestamp = FixmeTimestamp Word64
|
||||||
deriving newtype (Eq,Ord,Show,Num,ToField,FromField)
|
deriving newtype (Eq,Ord,Show,Num,ToField,FromField)
|
||||||
deriving stock (Data,Generic)
|
deriving stock (Data,Generic)
|
||||||
|
|
||||||
|
|
||||||
|
newtype FixmeOffset = FixmeOffset Word32
|
||||||
|
deriving newtype (Eq,Ord,Show,Num,ToField,FromField)
|
||||||
|
deriving stock (Data,Generic)
|
||||||
|
|
||||||
|
|
||||||
data Fixme =
|
data Fixme =
|
||||||
Fixme
|
Fixme
|
||||||
{ fixmeTag :: FixmeTag
|
{ fixmeTag :: FixmeTag
|
||||||
, fixmeTitle :: FixmeTitle
|
, fixmeTitle :: FixmeTitle
|
||||||
, fixmeTs :: Maybe FixmeTimestamp
|
, fixmeTs :: Maybe FixmeTimestamp
|
||||||
|
, fixmeStart :: Maybe FixmeOffset
|
||||||
|
, fixmeEnd :: Maybe FixmeOffset
|
||||||
, fixmePlain :: [FixmePlainLine]
|
, fixmePlain :: [FixmePlainLine]
|
||||||
, fixmeAttr :: HashMap FixmeAttrName FixmeAttrVal
|
, fixmeAttr :: HashMap FixmeAttrName FixmeAttrVal
|
||||||
, fixmeSource :: Maybe FixmeSource
|
, fixmeSource :: Maybe FixmeSource
|
||||||
|
|
@ -148,6 +156,7 @@ instance Serialise FixmePlainLine
|
||||||
instance Serialise FixmeAttrName
|
instance Serialise FixmeAttrName
|
||||||
instance Serialise FixmeAttrVal
|
instance Serialise FixmeAttrVal
|
||||||
instance Serialise FixmeTimestamp
|
instance Serialise FixmeTimestamp
|
||||||
|
instance Serialise FixmeOffset
|
||||||
instance Serialise Fixme
|
instance Serialise Fixme
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -164,6 +173,14 @@ instance FromField GitHash where
|
||||||
fromField = fmap fromString . fromField @String
|
fromField = fmap fromString . fromField @String
|
||||||
|
|
||||||
|
|
||||||
|
instance Pretty FixmeOffset where
|
||||||
|
pretty = pretty . coerce @_ @Word32
|
||||||
|
|
||||||
|
instance Pretty FixmeAttrName where
|
||||||
|
pretty = pretty . coerce @_ @Text
|
||||||
|
|
||||||
|
instance Pretty FixmeAttrVal where
|
||||||
|
pretty = pretty . coerce @_ @Text
|
||||||
|
|
||||||
instance Pretty FixmeTitle where
|
instance Pretty FixmeTitle where
|
||||||
pretty = pretty . coerce @_ @Text
|
pretty = pretty . coerce @_ @Text
|
||||||
|
|
@ -177,8 +194,28 @@ instance Pretty FixmePlainLine where
|
||||||
instance Pretty Fixme where
|
instance Pretty Fixme where
|
||||||
pretty Fixme{..} =
|
pretty Fixme{..} =
|
||||||
pretty fixmeTag <+> pretty fixmeTitle
|
pretty fixmeTag <+> pretty fixmeTitle
|
||||||
|
<> fstart
|
||||||
|
<> fend
|
||||||
|
<> la
|
||||||
<> lls
|
<> lls
|
||||||
|
<> line
|
||||||
where
|
where
|
||||||
|
|
||||||
|
fstart = case fixmeStart of
|
||||||
|
Just s -> line <> pretty ([qc| $fixme-start: {show $ pretty s}|] :: String)
|
||||||
|
Nothing -> mempty
|
||||||
|
|
||||||
|
fend = case fixmeEnd of
|
||||||
|
Just s -> line <> pretty ([qc| $fixme-end: {show $ pretty s}|] :: String)
|
||||||
|
Nothing -> mempty
|
||||||
|
|
||||||
|
la | not (HM.null fixmeAttr) = do
|
||||||
|
let a = HM.toList fixmeAttr
|
||||||
|
let ss = [ [qc| ${show $ pretty n}: {show $ pretty v}|] | (n,v) <- a ] :: [String]
|
||||||
|
line <> vcat ( fmap pretty ss ) <> line
|
||||||
|
|
||||||
|
| otherwise = mempty
|
||||||
|
|
||||||
lls | not (null fixmePlain) = line <> vcat (fmap pretty fixmePlain)
|
lls | not (null fixmePlain) = line <> vcat (fmap pretty fixmePlain)
|
||||||
| otherwise = mempty
|
| otherwise = mempty
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue