0 | module Pack.Runner
  1 |
  2 | import Data.List.Quantifiers
  3 | import Data.IORef
  4 | import Data.SortedMap
  5 | import Pack.CmdLn
  6 | import Pack.CmdLn.Completion
  7 | import Pack.Config
  8 | import public Pack.Core
  9 | import Pack.Database
 10 | import Pack.Runner.Database
 11 | import Pack.Runner.Develop
 12 | import Pack.Runner.Query
 13 | import Pack.Runner.Install
 14 | import Pack.Runner.New
 15 | import Pack.Runner.Uninstall
 16 |
 17 | public export
 18 | Command ConfiguredCmd where
 19 |   defaultCommand = PrintHelp
 20 |
 21 |   usage = usageInfo
 22 |
 23 |   cmdName = name
 24 |
 25 |   appName = "pack"
 26 |
 27 |   defaultLevel Build            = Build
 28 |   defaultLevel BuildDeps        = Build
 29 |   defaultLevel Typecheck        = Build
 30 |   defaultLevel Clean            = Build
 31 |   defaultLevel CleanBuild       = Build
 32 |   defaultLevel Exec             = Warning
 33 |   defaultLevel New              = Build
 34 |   defaultLevel Repl             = Warning
 35 |   defaultLevel Install          = Build
 36 |   defaultLevel InstallApp       = Build
 37 |   defaultLevel Remove           = Build
 38 |   defaultLevel RemoveApp        = Build
 39 |   defaultLevel Run              = Warning
 40 |   defaultLevel Test             = Warning
 41 |   defaultLevel Update           = Build
 42 |   defaultLevel Fetch            = Build
 43 |   defaultLevel PackagePath      = Silence
 44 |   defaultLevel LibsPath         = Silence
 45 |   defaultLevel DataPath         = Silence
 46 |   defaultLevel AppPath          = Silence
 47 |   defaultLevel Switch           = Build
 48 |   defaultLevel UpdateDB         = Build
 49 |   defaultLevel CollectGarbage   = Info
 50 |   defaultLevel Info             = Cache
 51 |   defaultLevel Query            = Cache
 52 |   defaultLevel Fuzzy            = Cache
 53 |   defaultLevel Completion       = Silence
 54 |   defaultLevel Uninstall        = Info
 55 |   defaultLevel PrintHelp        = Silence
 56 |
 57 |   desc = cmdDesc
 58 |
 59 |   ArgTypes Build          = [Maybe PkgOrIpkg]
 60 |   ArgTypes BuildDeps      = [Maybe PkgOrIpkg]
 61 |   ArgTypes Typecheck      = [Maybe PkgOrIpkg]
 62 |   ArgTypes Clean          = [Maybe PkgOrIpkg]
 63 |   ArgTypes CleanBuild     = [Maybe PkgOrIpkg]
 64 |   ArgTypes Repl           = [Maybe (File Abs)]
 65 |   ArgTypes Exec           = [File Abs, CmdArgList]
 66 |   ArgTypes Install        = [List PkgName]
 67 |   ArgTypes InstallApp     = [List PkgName]
 68 |   ArgTypes Remove         = [List PkgName]
 69 |   ArgTypes RemoveApp      = [List PkgName]
 70 |   ArgTypes Run            = [Maybe PkgOrIpkg, CmdArgList]
 71 |   ArgTypes Test           = [PkgName, CmdArgList]
 72 |   ArgTypes New            = [PkgType, Body]
 73 |   ArgTypes Update         = []
 74 |   ArgTypes Fetch          = []
 75 |   ArgTypes PackagePath    = []
 76 |   ArgTypes LibsPath       = []
 77 |   ArgTypes DataPath       = []
 78 |   ArgTypes AppPath        = [PkgName]
 79 |   ArgTypes Switch         = [DBName]
 80 |   ArgTypes UpdateDB       = []
 81 |   ArgTypes CollectGarbage = []
 82 |   ArgTypes Info           = []
 83 |   ArgTypes Query          = [PkgQuery]
 84 |   ArgTypes Fuzzy          = [FuzzyQuery]
 85 |   ArgTypes Completion     = [String, String]
 86 |   ArgTypes Uninstall      = []
 87 |   ArgTypes PrintHelp      = [Maybe Cmd]
 88 |
 89 |   readCommand_ n = lookup n namesAndCommands
 90 |
 91 |   adjConfig_ (Switch) [db] c = case db == MkDBName "latest" of
 92 |     True  => do
 93 |       latest <- copyLatest
 94 |       pure $ {collection := latest} c
 95 |     False => pure $ {collection := db} c
 96 |
 97 |   -- we trust pack to be safe to install even though it uses
 98 |   -- custom build hooks
 99 |   adjConfig_ (Update) []  c = pure $ {safetyPrompt := False} c
100 |   adjConfig_ _        _   c = pure c
101 |
102 |   readArgs Build           = %search
103 |   readArgs BuildDeps       = %search
104 |   readArgs Typecheck       = %search
105 |   readArgs Clean           = %search
106 |   readArgs CleanBuild      = %search
107 |   readArgs Repl            = %search
108 |   readArgs Exec            = %search
109 |   readArgs Install         = %search
110 |   readArgs InstallApp      = %search
111 |   readArgs Remove          = %search
112 |   readArgs RemoveApp       = %search
113 |   readArgs Run             = %search
114 |   readArgs Test            = %search
115 |   readArgs New             = %search
116 |   readArgs Update          = %search
117 |   readArgs Fetch           = %search
118 |   readArgs PackagePath     = %search
119 |   readArgs LibsPath        = %search
120 |   readArgs DataPath        = %search
121 |   readArgs AppPath         = %search
122 |   readArgs Switch          = %search
123 |   readArgs UpdateDB        = %search
124 |   readArgs CollectGarbage  = %search
125 |   readArgs Info            = %search
126 |   readArgs Query           = %search
127 |   readArgs Fuzzy           = %search
128 |   readArgs Completion      = %search
129 |   readArgs Uninstall       = %search
130 |   readArgs PrintHelp       = %search
131 |
132 | public export
133 | Command TrivialCmd where
134 |   defaultCommand = CompletionScript
135 |
136 |   usage = usageInfo
137 |
138 |   cmdName = name
139 |
140 |   appName = "pack"
141 |
142 |   defaultLevel (CompletionScript) = Silence
143 |
144 |   desc = cmdDesc
145 |
146 |   ArgTypes (CompletionScript) = [String]
147 |
148 |   readCommand_ n = lookup n namesAndCommands
149 |
150 |   adjConfig_ _ _ c = pure c
151 |
152 |   readArgs (CompletionScript) = %search
153 |
154 | public export
155 | Command Cmd where
156 |   defaultCommand = Configured PrintHelp
157 |
158 |   usage = usageInfo
159 |
160 |   cmdName = name
161 |
162 |   appName = "pack"
163 |
164 |   defaultLevel (Configured cmd) = defaultLevel cmd
165 |   defaultLevel (Trivial    cmd) = defaultLevel cmd
166 |
167 |   desc (Configured cmd) = cmdDesc cmd
168 |   desc (Trivial    cmd) = cmdDesc cmd
169 |
170 |   ArgTypes (Configured cmd) = ArgTypes cmd
171 |   ArgTypes (Trivial    cmd) = ArgTypes cmd
172 |
173 |   readCommand_ n = lookup n namesAndCommands
174 |
175 |   adjConfig_ (Configured cmd) args c = adjConfig_ cmd args c
176 |   adjConfig_ (Trivial    cmd) args c = adjConfig_ cmd args c
177 |
178 |   readArgs (Configured cmd) = readArgs cmd
179 |   readArgs (Trivial    cmd) = readArgs cmd
180 |
181 | fetchMethod : ConfiguredCmd -> FetchMethod
182 | fetchMethod Fetch  = All
183 | fetchMethod _      = MissingOnly
184 |
185 | runConfiguredCmd :
186 |      {auto _ : HasIO io}
187 |   -> {auto _ : PackDirs}
188 |   -> {auto _ : TmpDir}
189 |   -> {auto _ : LibCache}
190 |   -> {auto _ : LineBufferingCmd}
191 |   -> CurDir
192 |   -> MetaConfig
193 |   -> (fetch : FetchMethod)
194 |   -> (cmd : CommandWithArgs ConfiguredCmd)
195 |   -> EitherT PackErr io ()
196 | runConfiguredCmd cd mc fetch = go
197 |   where
198 |     go : (cmd : CommandWithArgs ConfiguredCmd) -> EitherT PackErr io ()
199 |     go (Completion ** [a,b])  = env mc fetch >>= complete a b
200 |     go (Query  ** [MkQ m s])  = env mc fetch >>= query m s
201 |     go (Fuzzy ** [MkFQ m s])  = idrisEnv mc fetch >>= fuzzy m s
202 |     go (UpdateDB ** [])       = updateDB
203 |     go (CollectGarbage ** []= env mc fetch >>= garbageCollector
204 |     go (Run ** [p,args])      = idrisEnv mc fetch >>= runApp !(refinePkg p) args
205 |     go (Test ** [p,args])     = idrisEnv mc fetch >>= runTest p args
206 |     go (Exec ** [p,args])     = idrisEnv mc fetch >>= exec p args
207 |     go (Repl ** [p])          = idrisEnv mc fetch >>= idrisRepl p
208 |     go (Build ** [p])         = idrisEnv mc fetch >>= build !(refinePkg p)
209 |     go (BuildDeps ** [p])     = idrisEnv mc fetch >>= buildDeps !(refinePkg p)
210 |     go (Typecheck ** [p])     = idrisEnv mc fetch >>= typecheck !(refinePkg p)
211 |     go (Clean ** [p])         = idrisEnv mc fetch >>= clean !(refinePkg p)
212 |     go (CleanBuild ** [p])    = do p <- refinePkg p
213 |                                    e <- idrisEnv mc fetch
214 |                                    clean p e >> build p e
215 |     go (PrintHelp ** [c])     = putStrLn (usageDesc c)
216 |     go (Install ** [ps])      = idrisEnv mc fetch >>= \e => installLibs ps
217 |     go (Remove ** [ps])       = idrisEnv mc fetch >>= \e => removeLibs ps
218 |     go (InstallApp ** [ps])   = idrisEnv mc fetch >>= \e => installApps ps
219 |     go (RemoveApp ** [ps])    = idrisEnv mc fetch >>= \e => removeApps ps
220 |     go (Update ** [])         = idrisEnv mc fetch >>= update
221 |     go (Fetch ** [])          = idrisEnv mc fetch >>= \e => install []
222 |     go (PackagePath ** [])    = env mc fetch >>= packagePathDirs >>= putStrLn . interpolate
223 |     go (LibsPath ** [])       = env mc fetch >>= packageLibDirs  >>= putStrLn . interpolate
224 |     go (DataPath ** [])       = env mc fetch >>= packageDataDirs >>= putStrLn . interpolate
225 |     go (AppPath ** [n])       = env mc fetch >>= appPath n
226 |     go (Info ** [])           = env mc fetch >>= printInfo
227 |     go (New ** [pty,p])       = idrisEnv mc fetch >>= new cd pty p
228 |     go (Switch ** [db])       = Prelude.do
229 |       let fetch2 := if db == MkDBName "latest" then ClearCommits else fetch
230 |       env <- idrisEnv mc fetch2
231 |       install []
232 |       writeCollection
233 |     go (Uninstall ** [])      = uninstallPack @{metaConfigToLogRef @{mc}}
234 |
235 | ||| Main application entry point (modulo error handling).
236 | export covering
237 | runCmd : HasIO io => EitherT PackErr io ()
238 | runCmd = do
239 |   args       <- getArgs'
240 |   cd         <- CD <$> curDir
241 |   parsedArgs <- liftEither $ parseOpts Cmd cd args
242 |   case parsedArgs.cmd of
243 |        (Trivial CompletionScript ** [f]=> putStrLn (completionScript f)
244 |        (Configured cmd ** args)          => do
245 |          pd <- getPackDirs
246 |          withTmpDir $ do
247 |            cache    <- emptyCache
248 |            mc <- getConfig Cmd parsedArgs
249 |            let fetch := fetchMethod cmd
250 |            linebuf  <- getLineBufferingCmd
251 |            runConfiguredCmd cd mc fetch (cmd ** args)
252 |