0 | module Pack.Config.Types
2 | import Control.Monad.Either
6 | import public Data.List.Quantifiers
8 | import Data.SortedMap as SM
9 | import Idris.Package.Types
10 | import Libraries.Data.List.Extra
11 | import Pack.Core.Git.Consts
12 | import Pack.Core.Types
13 | import Pack.Database.Types
21 | data Autoload : Type where
26 | Installed : Autoload
33 | AutoPkgs : List PkgName -> Autoload
37 | ForcePkgs : List PkgName -> Autoload
41 | data QueryType : Type where
43 | NameOnly : QueryType
46 | ShortDesc : QueryType
49 | Dependencies : QueryType
62 | ReverseTree : QueryType
66 | data Codegen : Type where
73 | JavaScript : Codegen
76 | Other : String -> Codegen
79 | Interpolation Codegen where
80 | interpolate Default = ""
81 | interpolate Chez = "chez"
82 | interpolate ChezSep = "chez-sep"
83 | interpolate Racket = "racket"
84 | interpolate Gambit = "gambit"
85 | interpolate Node = "node"
86 | interpolate JavaScript = "javascript"
87 | interpolate RefC = "refc"
88 | interpolate VMCode = "vmcode-interp"
89 | interpolate (Other x) = x
92 | fromString : String -> Codegen
93 | fromString "chez" = Chez
94 | fromString "chez-sep" = ChezSep
95 | fromString "racket" = Racket
96 | fromString "gambit" = Gambit
97 | fromString "node" = Node
98 | fromString "javascript" = JavaScript
99 | fromString "refc" = RefC
100 | fromString "vmcode-interp" = VMCode
101 | fromString x = Other x
111 | data WithIpkg : Type where
117 | Search : (dir : CurDir) -> WithIpkg
124 | Use : (ipkg : File Abs) -> WithIpkg
133 | data RlwrapConfig : Type where
134 | DoNotUseRlwrap : RlwrapConfig
135 | UseRlwrap : CmdArgList -> RlwrapConfig
148 | record Config_ (f : Type -> Type) (c : Type) where
149 | constructor MkConfig
151 | collection : f DBName
156 | idrisURL : Maybe URL
161 | idrisCommit : Maybe c
164 | allIdrisCommits : List c
167 | packURL : Maybe URL
170 | packCommit : Maybe c
173 | scheme : f FilePath
179 | bootstrapStage3 : f Bool
184 | safetyPrompt : f Bool
197 | warnDepends : f Bool
205 | whitelist : f (List PkgName)
218 | withIpkg : f WithIpkg
221 | rlwrap : f RlwrapConfig
224 | extraArgs : f CmdArgList
227 | autoLibs : f (List PkgName)
230 | autoApps : f (List PkgName)
233 | autoLoad : f Autoload
236 | custom : f CustomMap
239 | queryType : f (QueryType)
242 | logLevel : f (LogLevel)
245 | codegen : f (Codegen)
251 | levels : f (SortedMap String LogLevel)
258 | 0 IConfig : Type -> Type
259 | IConfig = Config_ I
263 | 0 MConfig : Type -> Type
264 | MConfig = Config_ Maybe
268 | 0 MetaConfig : Type
269 | MetaConfig = IConfig MetaCommit
274 | Config = IConfig Commit
278 | 0 UserConfig : Type
279 | UserConfig = MConfig MetaCommit
285 | traverse : Applicative f
286 | => (URL -> a -> f b)
287 | -> (idrisURL : URL)
290 | traverse g idrisURL cfg =
291 | let iurl = fromMaybe idrisURL cfg.idrisURL
292 | purl = fromMaybe defaultPackRepo cfg.packURL
293 | ic = traverse (g iurl) cfg.idrisCommit
294 | ics = traverse (g iurl) cfg.allIdrisCommits
295 | pc = traverse (g purl) cfg.packCommit
296 | in [| adj ic ics pc |]
297 | where adj : (idrisCommit : Maybe b)
298 | -> (allidrisCommits : List b)
299 | -> (packCommit : Maybe b)
302 | { idrisCommit := ic
303 | , allIdrisCommits := ics
309 | export %inline %hint
310 | configToLogRef : (c : Config) => LogRef
311 | configToLogRef = MkLogRef c.logLevel
315 | export %inline %hint
316 | metaConfigToLogRef : (c : MetaConfig) => LogRef
317 | metaConfigToLogRef = MkLogRef c.logLevel
323 | export infixl 8 `mergeRight`
326 | mergeRight : SortedMap k v -> SortedMap k v -> SortedMap k v
327 | mergeRight = mergeWith (\_,v => v)
331 | init : (cur : CurDir) => (coll : DBName) -> MetaConfig
332 | init coll = MkConfig {
334 | , idrisURL = Nothing
335 | , idrisCommit = Nothing
336 | , allIdrisCommits = []
337 | , packURL = Nothing
338 | , packCommit = Nothing
339 | , scheme = "scheme"
340 | , bootstrap = False
341 | , bootstrapStage3 = True
342 | , safetyPrompt = True
345 | , warnDepends = True
346 | , skipTests = False
347 | , whitelist = ["pack", "idris2-lsp"]
351 | , withIpkg = Search cur
352 | , rlwrap = DoNotUseRlwrap
356 | , autoLoad = NoPkgs
358 | , queryType = NameOnly
359 | , logLevel = Warning
360 | , codegen = Default
361 | , output = "_tmppack"
366 | export infixl 7 `update`
370 | update : IConfig c -> MConfig c -> IConfig c
373 | collection = fromMaybe ci.collection cm.collection
374 | , idrisURL = cm.idrisURL <|> ci.idrisURL
375 | , idrisCommit = cm.idrisCommit <|> ci.idrisCommit
376 | , allIdrisCommits = cm.allIdrisCommits <+> ci.allIdrisCommits
377 | , packURL = cm.packURL <|> ci.packURL
378 | , packCommit = cm.packCommit <|> ci.packCommit
379 | , scheme = fromMaybe ci.scheme cm.scheme
380 | , bootstrap = fromMaybe ci.bootstrap cm.bootstrap
381 | , bootstrapStage3 = fromMaybe ci.bootstrapStage3 cm.bootstrapStage3
382 | , safetyPrompt = fromMaybe ci.safetyPrompt cm.safetyPrompt
383 | , gcPrompt = fromMaybe ci.gcPrompt cm.gcPrompt
384 | , gcPurge = fromMaybe ci.gcPurge cm.gcPurge
385 | , warnDepends = fromMaybe ci.warnDepends cm.warnDepends
386 | , skipTests = fromMaybe ci.skipTests cm.skipTests
387 | , withSrc = fromMaybe ci.withSrc cm.withSrc
388 | , withDocs = fromMaybe ci.withDocs cm.withDocs
389 | , useKatla = fromMaybe ci.useKatla cm.useKatla
390 | , withIpkg = fromMaybe ci.withIpkg cm.withIpkg
391 | , rlwrap = fromMaybe ci.rlwrap cm.rlwrap
392 | , extraArgs = ci.extraArgs <+> fromMaybe [] cm.extraArgs
393 | , whitelist = sortedNub (ci.whitelist ++ concat cm.whitelist)
394 | , autoLibs = sortedNub (ci.autoLibs ++ concat cm.autoLibs)
395 | , autoApps = sortedNub (ci.autoApps ++ concat cm.autoApps)
396 | , autoLoad = fromMaybe ci.autoLoad cm.autoLoad
397 | , custom = mergeWith (mergeWith mergeUP) ci.custom (fromMaybe empty cm.custom)
398 | , queryType = fromMaybe ci.queryType cm.queryType
399 | , logLevel = fromMaybe ci.logLevel cm.logLevel
400 | , codegen = fromMaybe ci.codegen cm.codegen
401 | , output = fromMaybe ci.output cm.output
402 | , levels = mergeWith (\_,v => v) ci.levels (fromMaybe empty cm.levels)
403 | , gitInit = fromMaybe ci.gitInit cm.gitInit
413 | data HasIdris : Config -> DB -> Type where
415 | ItHasIdris : {0 c : _} -> {0 db : _} -> HasIdris c db
424 | LibCache = IORef (SortedMap PkgName $
ResolvedLib U)
428 | emptyCache : HasIO io => io LibCache
429 | emptyCache = newIORef SortedMap.empty
433 | cacheLib : HasIO io
434 | => (ref : LibCache)
437 | -> io (ResolvedLib U)
438 | cacheLib n lib = modifyIORef ref (insert n lib) $> lib
442 | lookupLib : HasIO io
443 | => (ref : LibCache)
445 | -> io (Maybe $
ResolvedLib U)
446 | lookupLib n = lookup n <$> readIORef ref
450 | uncacheLib : HasIO io => (ref : LibCache) => PkgName -> io ()
451 | uncacheLib n = modifyIORef ref (delete n)
460 | packDirs : PackDirs
465 | all : SortedMap PkgName Package
466 | linebuf : LineBufferingCmd
471 | nanoString : (e : Env) => String
472 | nanoString = show $
toNano e.clock
476 | export %inline %hint
477 | envToPackDirs : (e : Env) => PackDirs
478 | envToPackDirs = e.packDirs
482 | export %inline %hint
483 | envToTmpDir : (e : Env) => TmpDir
484 | envToTmpDir = e.tmpDir
488 | export %inline %hint
489 | envToCache : (e : Env) => LibCache
490 | envToCache = e.cache
494 | export %inline %hint
495 | envToConfig : (e : Env) => Config
496 | envToConfig = e.config
500 | export %inline %hint
501 | envToDB : (e : Env) => DB
506 | export %inline %hint
507 | envToLinebuf : (e : Env) => LineBufferingCmd
508 | envToLinebuf = e.linebuf
513 | record IdrisEnv where
514 | constructor MkIdrisEnv
517 | 0 prf : HasIdris env.config env.db
521 | export %inline %hint
522 | idrisEnvToEnv : (e : IdrisEnv) => Env
523 | idrisEnvToEnv = e.env
527 | export %inline %hint
528 | idrisEnvToTTC : (e : IdrisEnv) => TTCVersion
529 | idrisEnvToTTC = e.ttc
537 | interface Arg (0 a : Type) where
539 | readArg : List String -> Maybe (a, List String)
542 | public export %inline
543 | argDesc : (0 a : Type) -> Arg a => String
544 | argDesc a = argDesc_ {a}
548 | parseSingleMaybe : (read : String -> Maybe a)
550 | -> Maybe (a, List String)
551 | parseSingleMaybe read [] = Nothing
552 | parseSingleMaybe read (h :: t) = (,t) <$> read h
556 | parseSingle : (read : String -> Either e a)
558 | -> Maybe (a, List String)
559 | parseSingle read = parseSingleMaybe (eitherToMaybe . read)
563 | readSingle : (read : String -> a) -> List String -> Maybe (a, List String)
564 | readSingle read = parseSingleMaybe (Just . read)
567 | Arg a => Arg (Maybe a) where
568 | argDesc_ = "[\{argDesc a}]"
570 | readArg ss = case readArg {a} ss of
571 | Nothing => Just (Nothing, ss)
572 | Just (v,ss') => Just (Just v, ss')
575 | (cd : CurDir) => Arg (File Abs) where
576 | argDesc_ = "<file>"
577 | readArg = parseSingle (readAbsFile curDir)
580 | (cd : CurDir) => Arg (Path Abs) where
582 | readArg = readSingle (\s => parse s curDir)
585 | (cd : CurDir) => Arg PkgOrIpkg where
586 | argDesc_ = "<pkg or .ipkg>"
587 | readArg = readSingle $
\s => case readAbsFile curDir s of
588 | Left _ => Pkg $
MkPkgName s
590 | if isIpkgBody f.file
592 | else Pkg $
MkPkgName s
597 | readArg = readSingle MkPkgName
601 | argDesc_ = "<lib | bin>"
602 | readArg = parseSingle readPkgType
605 | Arg CmdArgList where
606 | argDesc_ = "[<args>]"
607 | readArg ss = Just (fromStrList ss, [])
610 | Arg (List PkgName) where
611 | argDesc_ = "[<pkgs>]"
612 | readArg ss = Just (map MkPkgName ss, [])
616 | argDesc_ = "<file name>"
617 | readArg = parseSingle readBody
622 | readArg = parseSingle readDBName
627 | readArg = readSingle id
646 | interface Command c where
655 | cmdName : c -> String
658 | defaultLevel : c -> LogLevel
664 | usage : Lazy String
667 | 0 ArgTypes : c -> List Type
670 | readCommand_ : String -> Maybe c
673 | readArgs : CurDir => (cmd : c) -> All Arg (ArgTypes cmd)
679 | adjConfig_ : HasIO io
683 | -> All I (ArgTypes cmd)
685 | -> EitherT PackErr io MetaConfig
687 | args : All Arg ts -> CurDir => List String -> Maybe (All I ts)
688 | args [] [] = Just []
689 | args [] (_ :: _) = Nothing
690 | args {ts = x :: xs} (p :: ps) ss = do
691 | (v,ss') <- readArg {a = x} ss
695 | argsDesc : CurDir => Command c => Maybe c -> String
696 | argsDesc Nothing = " [<args>]"
697 | argsDesc (Just x) = fastConcat $
go (readArgs x)
698 | where go : All Arg ts -> List String
699 | go = forget . mapProperty (\p => " " ++ argDesc_ @{p})
703 | usageHeader : CurDir => Command c => Maybe c -> String
705 | let nm := maybe "<cmd>" cmdName cmd
706 | in "Usage: \{appName {c}} [options] \{nm}\{argsDesc cmd}"
708 | ind : String -> String
709 | ind = unlines . map (indent 2) . lines
716 | usageDesc : CurDir => Command c => Maybe c -> String
717 | usageDesc m = case m of
734 | 0 Args : Command c => c -> Type
735 | Args cmd = All I (ArgTypes cmd)
739 | 0 CommandWithArgs : (c : Type) -> Command c => Type
740 | CommandWithArgs c = DPair c Args
742 | readCWA : Command c
746 | -> Either PackErr (CommandWithArgs c)
748 | let readers := readArgs x
749 | Just as := args readers ss
750 | | Nothing => Left (InvalidCmdArgs (cmdName x) ss $
usageHeader $
Just x)
756 | readCommand : (0 c : Type)
760 | -> Either PackErr (CommandWithArgs c)
761 | readCommand c cd [] = readCWA defaultCommand []
762 | readCommand c cd (h :: t) = case readCommand_ {c} h of
763 | Nothing => Left (UnknownCommand h $
usageDesc {c} Nothing)
764 | Just x => readCWA x t
771 | adjConfig : HasIO io
775 | => CommandWithArgs c
777 | -> EitherT PackErr io MetaConfig
778 | adjConfig (
command ** args)
= adjConfig_ command args