hello
This commit is contained in:
parent
7f5c63f729
commit
f081c83abf
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,3 +1,5 @@
|
||||||
.stack-work/
|
.stack-work/
|
||||||
*~
|
*~
|
||||||
.direnv
|
.direnv
|
||||||
|
.vscode
|
||||||
|
git
|
||||||
|
|
|
@ -34,7 +34,13 @@ library
|
||||||
src
|
src
|
||||||
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints
|
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints
|
||||||
build-depends:
|
build-depends:
|
||||||
base >=4.7 && <5
|
aeson
|
||||||
|
, base >=4.7 && <5
|
||||||
|
, bytestring
|
||||||
|
, chronos
|
||||||
|
, text
|
||||||
|
, typed-process
|
||||||
|
, wl-pprint-text
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
||||||
executable git-activity-tracker-exe
|
executable git-activity-tracker-exe
|
||||||
|
@ -47,8 +53,14 @@ executable git-activity-tracker-exe
|
||||||
app
|
app
|
||||||
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
|
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
|
||||||
build-depends:
|
build-depends:
|
||||||
base >=4.7 && <5
|
aeson
|
||||||
|
, base >=4.7 && <5
|
||||||
|
, bytestring
|
||||||
|
, chronos
|
||||||
, git-activity-tracker
|
, git-activity-tracker
|
||||||
|
, text
|
||||||
|
, typed-process
|
||||||
|
, wl-pprint-text
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
||||||
test-suite git-activity-tracker-test
|
test-suite git-activity-tracker-test
|
||||||
|
@ -62,6 +74,12 @@ test-suite git-activity-tracker-test
|
||||||
test
|
test
|
||||||
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
|
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
|
||||||
build-depends:
|
build-depends:
|
||||||
base >=4.7 && <5
|
aeson
|
||||||
|
, base >=4.7 && <5
|
||||||
|
, bytestring
|
||||||
|
, chronos
|
||||||
, git-activity-tracker
|
, git-activity-tracker
|
||||||
|
, text
|
||||||
|
, typed-process
|
||||||
|
, wl-pprint-text
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
|
@ -21,6 +21,12 @@ description: Please see the README on GitHub at <https://github.com/gith
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- base >= 4.7 && < 5
|
- base >= 4.7 && < 5
|
||||||
|
- typed-process
|
||||||
|
- chronos
|
||||||
|
- text
|
||||||
|
- bytestring
|
||||||
|
- aeson
|
||||||
|
- wl-pprint-text
|
||||||
|
|
||||||
ghc-options:
|
ghc-options:
|
||||||
- -Wall
|
- -Wall
|
||||||
|
|
59
src/Lib.hs
59
src/Lib.hs
|
@ -1,7 +1,66 @@
|
||||||
|
{-# LANGUAGE DeriveGeneric #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE InstanceSigs #-}
|
||||||
|
{-# LANGUAGE NamedFieldPuns #-}
|
||||||
module Lib
|
module Lib
|
||||||
( libMain
|
( libMain
|
||||||
) where
|
) where
|
||||||
|
import System.Process.Typed
|
||||||
|
import Chronos
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import Data.Text (Text)
|
||||||
|
import GHC.Generics (Generic)
|
||||||
|
import Data.Aeson
|
||||||
|
import qualified Data.ByteString.Lazy.Char8 as BSL
|
||||||
|
import Data.Char (toLower)
|
||||||
|
import Text.PrettyPrint.Leijen.Text
|
||||||
|
|
||||||
|
updateHead :: (a -> a) -> [a] -> [a]
|
||||||
|
updateHead fun (x:xs) = fun x : xs
|
||||||
|
updateHead _ [] = []
|
||||||
|
|
||||||
|
data Commit = Commit{_cDate :: Datetime, _cHash :: Text, _cAuthor :: Text, _cMessage :: Text} deriving (Generic, Show)
|
||||||
|
|
||||||
|
commitOptions :: Options
|
||||||
|
commitOptions = (defaultOptions { fieldLabelModifier = updateHead toLower . drop 2})
|
||||||
|
|
||||||
|
instance ToJSON Commit where
|
||||||
|
toEncoding :: Commit -> Encoding
|
||||||
|
toEncoding = genericToEncoding commitOptions
|
||||||
|
|
||||||
|
instance FromJSON Commit where
|
||||||
|
parseJSON = genericParseJSON commitOptions
|
||||||
|
|
||||||
|
prettyCommit :: Commit -> Doc
|
||||||
|
prettyCommit (Commit {_cDate, _cHash, _cAuthor, _cMessage})
|
||||||
|
= textStrict (encode_YmdHMS (SubsecondPrecisionFixed 0) hyphen _cDate)
|
||||||
|
<+> textStrict _cAuthor
|
||||||
|
<+> textStrict _cHash
|
||||||
|
<+> textStrict ("\"" <> _cMessage <> "\"")
|
||||||
|
|
||||||
libMain :: IO ()
|
libMain :: IO ()
|
||||||
libMain = do
|
libMain = do
|
||||||
putStrLn "someFunc"
|
putStrLn "someFunc"
|
||||||
|
result <- getCommits "magic_rb/dotfiles/master/master" ["magic_rb"] (Just (Datetime (Date (Year 2024) (Month 0) (DayOfMonth 31)) (TimeOfDay 0 0 0)), Nothing)
|
||||||
|
|
||||||
|
case result of
|
||||||
|
Left err -> print err
|
||||||
|
Right ok -> mapM_ (print . prettyCommit) ok
|
||||||
|
|
||||||
|
getCommits :: String -> [String] -> (Maybe Datetime, Maybe Datetime) -> IO (Either String [Commit])
|
||||||
|
getCommits branch authors (from, to) =
|
||||||
|
readProcessStdout pc >>= \(exitCode, stdout) ->
|
||||||
|
case exitCode of
|
||||||
|
ExitFailure _ -> pure $ Left ""
|
||||||
|
ExitSuccess -> pure $ mapM eitherDecode (BSL.lines stdout)
|
||||||
|
where
|
||||||
|
pc = proc "git" args
|
||||||
|
args = filter (/= "") $
|
||||||
|
[ "log"
|
||||||
|
, "--date=format:%Y-%m-%d %H:%M:%S"
|
||||||
|
, "--format=format:{ \"date\": \"%ad\", \"hash\": \"%H\", \"author\": \"%an\", \"message\": \"%s\" }"
|
||||||
|
, maybe "" (\from' -> "--since=" <> T.unpack (encodeIso8601 from')) from
|
||||||
|
, maybe "" (\to' -> "--before=" <> T.unpack (encodeIso8601 to')) to
|
||||||
|
] <> map ("--author=" <>) authors <>
|
||||||
|
[ branch
|
||||||
|
]
|
Loading…
Reference in a new issue