Skip to content

Commit 4a7fdf6

Browse files
authored
Merge pull request haskell-mafia#175 from ambiata/topic/cache
Support for very restricted import/export from the global cache
2 parents 512e7b2 + 2ccb8bc commit 4a7fdf6

File tree

8 files changed

+446
-126
lines changed

8 files changed

+446
-126
lines changed

Diff for: ambiata-mafia.cabal

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ library
6464
Mafia.Cabal.Sandbox
6565
Mafia.Cabal.Types
6666
Mafia.Cabal.Version
67+
Mafia.Cache
6768
Mafia.Error
6869
Mafia.Flock
6970
Mafia.Ghc

Diff for: main/mafia.hs

+47-1
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ import GHC.Conc (getNumProcessors)
2222

2323
import Mafia.Bin
2424
import Mafia.Cabal
25+
import Mafia.Cache
2526
import Mafia.Error
2627
import Mafia.Ghc
2728
import Mafia.Hoogle
2829
import Mafia.IO
29-
import Mafia.Init
3030
import Mafia.Include
31+
import Mafia.Init
3132
import Mafia.Install
3233
import Mafia.Lock
3334
import Mafia.Makefile
@@ -90,6 +91,8 @@ data MafiaCommand =
9091
| MafiaWatch [Flag] [GhciInclude] File [Argument]
9192
| MafiaHoogle [Argument]
9293
| MafiaInstall [Constraint] InstallPackage
94+
| MafiaExport Profiling [Flag] Directory
95+
| MafiaImport Directory
9396
| MafiaScript Path [Argument]
9497
| MafiaExec [Argument]
9598
| MafiaCFlags
@@ -148,6 +151,10 @@ run = \case
148151
mafiaHoogle args
149152
MafiaInstall constraints ipkg ->
150153
mafiaInstall ipkg constraints
154+
MafiaExport p flags dir ->
155+
mafiaExport p flags dir
156+
MafiaImport dir ->
157+
mafiaImport dir
151158
MafiaScript path args ->
152159
mafiaScript path args
153160
MafiaExec args ->
@@ -226,6 +233,12 @@ commands =
226233
<> "The general usage is as follows: $(mafia install pretty-show)/ppsh" )
227234
(MafiaInstall <$> many pConstraint <*> pInstallPackage)
228235

236+
, command' "export" "Export binary substitutes of the current package's dependencies."
237+
(MafiaExport <$> pProfiling <*> many pFlag <*> pExportDirectory)
238+
239+
, command' "import" "Import binary substitutes from a directory."
240+
(MafiaImport <$> pImportDirectory)
241+
229242
, command' "exec" "Exec the provided command line in the local cabal sandbox."
230243
(MafiaExec <$> many pCabalArgs)
231244

@@ -238,6 +251,18 @@ commands =
238251
<> "developing across multiple source trees at once or loading "
239252
<> "a not-yet-compiling package."
240253

254+
pExportDirectory :: Parser Directory
255+
pExportDirectory =
256+
argument textRead $
257+
metavar "EXPORT_DIRECTORY"
258+
<> help "The location to write binary substitute tarballs containing the current package's dependencies."
259+
260+
pImportDirectory :: Parser Directory
261+
pImportDirectory =
262+
argument textRead $
263+
metavar "IMPORT_DIRECTORY"
264+
<> help "The location to import binary substitute tarballs from."
265+
241266
pProfiling :: Parser Profiling
242267
pProfiling =
243268
flag DisableProfiling EnableProfiling $
@@ -529,6 +554,27 @@ mafiaInstall :: InstallPackage -> [Constraint] -> EitherT MafiaError IO ()
529554
mafiaInstall ipkg constraints = do
530555
liftIO . T.putStrLn =<< firstT MafiaBinError (installBinary ipkg constraints)
531556

557+
mafiaExport :: Profiling -> [Flag] -> Directory -> EitherT MafiaError IO ()
558+
mafiaExport p flags dir = do
559+
initMafia LatestSources p flags
560+
mkeys <- firstT MafiaInitError readPackageKeys
561+
case mkeys of
562+
Nothing ->
563+
left MafiaNoPackageKeys
564+
Just keys -> do
565+
env <- firstT MafiaCacheError getCacheEnv
566+
for_ keys $ \key -> do
567+
result <- firstT MafiaCacheError $ exportPackage env key dir
568+
liftIO . T.putStrLn $ renderExportResult result
569+
570+
mafiaImport :: Directory -> EitherT MafiaError IO ()
571+
mafiaImport dir = do
572+
env <- firstT MafiaCacheError getCacheEnv
573+
keys <- firstT MafiaCacheError $ listPackages env dir
574+
for_ keys $ \key -> do
575+
result <- firstT MafiaCacheError $ importPackage env key dir
576+
liftIO . T.putStrLn $ renderImportResult result
577+
532578
mafiaScript :: File -> [Argument] -> EitherT MafiaError IO ()
533579
mafiaScript file args =
534580
firstT MafiaScriptError $ runScript file args

Diff for: src/Mafia/Bin.hs

+7-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module Mafia.Bin
1919
import Mafia.Cabal.Constraint
2020
import Mafia.Cabal.Sandbox
2121
import Mafia.Cabal.Types
22+
import Mafia.Cache
2223
import Mafia.Hash
2324
import Mafia.Home
2425
import Mafia.Install
@@ -35,6 +36,7 @@ import X.Control.Monad.Trans.Either (EitherT, left)
3536

3637
data BinError =
3738
BinInstallError InstallError
39+
| BinCacheError CacheError
3840
| BinCabalError CabalError
3941
| BinNotExecutable PackageId
4042
| BinFailedToCreateSymbolicLink Path File
@@ -44,6 +46,8 @@ renderBinError :: BinError -> Text
4446
renderBinError = \case
4547
BinInstallError err ->
4648
renderInstallError err
49+
BinCacheError err ->
50+
renderCacheError err
4751
BinCabalError err ->
4852
renderCabalError err
4953
BinNotExecutable pid ->
@@ -122,9 +126,9 @@ installInDirectory bin ipkg constraints = do
122126
installPackage (ipkgName ipkg) (ipkgConstraints ipkg <> constraints)
123127

124128
gdir <-
125-
fmap (flip packageSandboxDir pkg) .
126-
firstT BinInstallError $
127-
getPackageEnv
129+
fmap (flip packageSandboxDir $ pkgKey pkg) .
130+
firstT BinCacheError $
131+
getCacheEnv
128132

129133
unlessM (doesDirectoryExist $ gdir </> "bin") $
130134
left (BinNotExecutable . refId $ pkgRef pkg)

0 commit comments

Comments
 (0)