@@ -12,7 +12,7 @@ import Protolude
12
12
13
13
import Lib
14
14
import Data.Char (isSpace )
15
- import Data.FileEmbed (embedStringFile )
15
+ import Data.FileEmbed (embedStringFile , makeRelativeToProject )
16
16
import Data.Hourglass
17
17
import Data.String (fromString )
18
18
import qualified Data.Text as T
@@ -27,15 +27,19 @@ import Options.Applicative
27
27
import Paths_tasklite_core ()
28
28
import System.Directory
29
29
( createDirectoryIfMissing
30
+ , executable
30
31
, getHomeDirectory
32
+ , getPermissions
31
33
, getXdgDirectory
34
+ , listDirectory
35
+ , Permissions
32
36
, XdgDirectory (.. )
33
37
)
34
38
import System.FilePath ((</>) )
35
39
import Time.System
36
40
import Database.SQLite.Simple (close , Connection (.. ))
37
41
38
- import Config (Config (.. ))
42
+ import Config (Config (.. ), HooksConfig ( .. ), addHookFilesToConfig )
39
43
import DbSetup
40
44
import ImportExport
41
45
import Migrations
@@ -918,33 +922,76 @@ executeCLiCommand conf now connection cmd =
918
922
919
923
920
924
printOutput :: [Char ] -> Config -> IO ()
921
- printOutput appName configUser = do
922
- configUserNorm <-
923
- if (dataDir configUser /= " " )
924
- then pure $ configUser
925
- else do
926
- xdgDataDir <- getXdgDirectory XdgData appName
927
- pure $ configUser {dataDir = xdgDataDir}
928
-
929
- config <- case (T. stripPrefix " ~/" $ T. pack $ dataDir configUserNorm) of
930
- Nothing ->
931
- pure $ configUser {dataDir = dataDir configUserNorm}
932
- Just rest -> do
933
- homeDir <- getHomeDirectory
934
- pure $ configUser { dataDir = homeDir </> T. unpack rest }
935
-
936
- cliCommand <- execParser $ commandParserInfo config
937
-
938
- connection <- setupConnection config
925
+ printOutput appName config = do
926
+ let dataPath = config & dataDir
927
+
928
+ configNormDataDir <-
929
+ if null dataPath
930
+ then do
931
+ xdgDataDir <- getXdgDirectory XdgData appName
932
+ pure $ config {dataDir = xdgDataDir}
933
+ else
934
+ case T. stripPrefix " ~/" $ T. pack dataPath of
935
+ Nothing -> pure $ config
936
+ Just rest -> do
937
+ homeDir <- getHomeDirectory
938
+ pure $ config { dataDir = homeDir </> T. unpack rest }
939
+
940
+
941
+ let hooksPath = configNormDataDir & hooks & directory
942
+
943
+ configNormHookDir <-
944
+ if null hooksPath
945
+ then pure $
946
+ configNormDataDir
947
+ { hooks = (configNormDataDir & hooks)
948
+ { directory = dataDir configNormDataDir </> " hooks" }
949
+ }
950
+ else
951
+ case T. stripPrefix " ~/" $ T. pack hooksPath of
952
+ Nothing -> pure $ configNormDataDir
953
+ Just rest -> do
954
+ homeDir <- getHomeDirectory
955
+ pure $ configNormDataDir
956
+ { hooks = (configNormDataDir & hooks)
957
+ { directory = homeDir </> T. unpack rest }
958
+ }
959
+
960
+ let hooksPathNorm = configNormHookDir & hooks & directory
961
+
962
+ createDirectoryIfMissing True hooksPathNorm
963
+
964
+ hookFiles <- listDirectory hooksPathNorm
965
+
966
+ hookFilesPerm :: [(FilePath , Permissions )] <- sequence $ hookFiles
967
+ & filter (\ name ->
968
+ (" pre-" `isPrefixOf` name) || (" post-" `isPrefixOf` name))
969
+ <&> (hooksPathNorm </> )
970
+ <&> \ path -> do
971
+ perm <- getPermissions path
972
+ pure (path, perm)
973
+
974
+ hookFilesPermContent <- sequence $ hookFilesPerm
975
+ & filter (\ (_, perm) -> executable perm)
976
+ <&> \ (filePath, perm) -> do
977
+ fileContent <- readFile filePath
978
+ pure (filePath, perm, fileContent)
979
+
980
+
981
+ let configNorm = addHookFilesToConfig configNormHookDir hookFilesPermContent
982
+
983
+ cliCommand <- execParser $ commandParserInfo configNorm
984
+
985
+ connection <- setupConnection configNorm
939
986
-- TODO: Integrate into migrations
940
- tableStatus <- createTables config connection
941
- migrationsStatus <- runMigrations config connection
987
+ tableStatus <- createTables configNorm connection
988
+ migrationsStatus <- runMigrations configNorm connection
942
989
nowElapsed <- timeCurrentP
943
990
944
991
let
945
992
now = timeFromElapsedP nowElapsed :: DateTime
946
993
947
- doc <- executeCLiCommand config now connection cliCommand
994
+ doc <- executeCLiCommand configNorm now connection cliCommand
948
995
949
996
-- TODO: Use withConnection instead
950
997
close connection
@@ -976,7 +1023,8 @@ main = do
976
1023
977
1024
case configResult of
978
1025
Left error -> do
979
- if " not found" `T.isInfixOf` (T. pack $ prettyPrintParseException error )
1026
+ if " file not found" `T.isInfixOf`
1027
+ (T. pack $ prettyPrintParseException error )
980
1028
then do
981
1029
writeFile configPath exampleConfig
982
1030
configResult2 <- decodeFileEither configPath
0 commit comments