@@ -15,6 +15,8 @@ module Distribution.Client.CmdInstall (
15
15
TargetProblem (.. ),
16
16
selectPackageTargets ,
17
17
selectComponentTarget ,
18
+ -- * Internals exposed for CmdRepl + CmdRun
19
+ establishDummyDistDirLayout ,
18
20
establishDummyProjectBaseContext
19
21
) where
20
22
@@ -44,6 +46,10 @@ import Distribution.Package
44
46
( Package (.. ), PackageName , mkPackageName , unPackageName )
45
47
import Distribution.Types.PackageId
46
48
( PackageIdentifier (.. ) )
49
+ import Distribution.Client.ProjectConfig
50
+ ( ProjectPackageLocation (.. )
51
+ , fetchAndReadSourcePackages
52
+ )
47
53
import Distribution.Client.ProjectConfig.Types
48
54
( ProjectConfig (.. ), ProjectConfigShared (.. )
49
55
, ProjectConfigBuildOnly (.. ), PackageConfig (.. )
@@ -136,6 +142,7 @@ import Data.Ord
136
142
import qualified Data.Map as Map
137
143
import Distribution.Utils.NubList
138
144
( fromNubList )
145
+ import Network.URI (URI )
139
146
import System.Directory
140
147
( getHomeDirectory , doesFileExist , createDirectoryIfMissing
141
148
, getTemporaryDirectory , makeAbsolute , doesDirectoryExist
@@ -262,7 +269,7 @@ installAction ( configFlags, configExFlags, installFlags
262
269
targetFilter = if installLibs then Just LibKind else Just ExeKind
263
270
targetStrings' = if null targetStrings then [" ." ] else targetStrings
264
271
265
- withProject :: IO ([PackageSpecifier UnresolvedSourcePackage ], [TargetSelector ], ProjectConfig )
272
+ withProject :: IO ([PackageSpecifier UnresolvedSourcePackage ], [URI ], [ TargetSelector ], ProjectConfig )
266
273
withProject = do
267
274
let verbosity' = lessVerbose verbosity
268
275
@@ -292,7 +299,7 @@ installAction ( configFlags, configExFlags, installFlags
292
299
flip TargetPackageNamed targetFilter . pkgName <$> packageIds
293
300
294
301
if null targetStrings'
295
- then return (packageSpecifiers, packageTargets, projectConfig localBaseCtx)
302
+ then return (packageSpecifiers, [] , packageTargets, projectConfig localBaseCtx)
296
303
else do
297
304
targetSelectors <-
298
305
either (reportTargetSelectorProblems verbosity) return
@@ -397,10 +404,11 @@ installAction ( configFlags, configExFlags, installFlags
397
404
else return (local ++ hackagePkgs, targets' ++ hackageTargets)
398
405
399
406
return ( specs ++ packageSpecifiers
407
+ , []
400
408
, selectors ++ packageTargets
401
409
, projectConfig localBaseCtx )
402
410
403
- withoutProject :: ProjectConfig -> IO ([PackageSpecifier pkg ], [TargetSelector ], ProjectConfig )
411
+ withoutProject :: ProjectConfig -> IO ([PackageSpecifier pkg ], [URI ], [ TargetSelector ], ProjectConfig )
404
412
withoutProject globalConfig = do
405
413
tss <- mapM (parseWithoutProjectTargetSelector verbosity) targetStrings'
406
414
@@ -441,14 +449,15 @@ installAction ( configFlags, configExFlags, installFlags
441
449
]
442
450
443
451
let
444
- packageSpecifiers = woPackageSpecifiers <$> tss
445
- packageTargets = woPackageTargets <$> tss
446
- return (packageSpecifiers, packageTargets, projectConfig)
452
+ (uris, packageSpecifiers) = partitionEithers $ map woPackageSpecifiers tss
453
+ packageTargets = map woPackageTargets tss
454
+
455
+ return (packageSpecifiers, uris, packageTargets, projectConfig)
447
456
448
457
let
449
458
ignoreProject = fromFlagOrDefault False (cinstIgnoreProject clientInstallFlags)
450
459
451
- (specs, selectors, config) <-
460
+ (specs, uris, selectors, config) <-
452
461
withProjectOrGlobalConfigIgn ignoreProject verbosity globalConfigFlag withProject withoutProject
453
462
454
463
home <- getHomeDirectory
@@ -551,16 +560,21 @@ installAction ( configFlags, configExFlags, installFlags
551
560
envSpecs' | installLibs = envSpecs
552
561
| otherwise = []
553
562
554
- withTempDirectory
555
- verbosity
556
- globalTmp
557
- " cabal-install."
558
- $ \ tmpDir -> do
563
+ withTempDirectory verbosity globalTmp " cabal-install." $ \ tmpDir -> do
564
+ distDirLayout <- establishDummyDistDirLayout verbosity config tmpDir
565
+
566
+ uriSpecs <- runRebuild tmpDir $ fetchAndReadSourcePackages
567
+ verbosity
568
+ distDirLayout
569
+ (projectConfigShared config)
570
+ (projectConfigBuildOnly config)
571
+ [ ProjectPackageRemoteTarball uri | uri <- uris ]
572
+
559
573
baseCtx <- establishDummyProjectBaseContext
560
574
verbosity
561
575
config
562
- tmpDir
563
- (envSpecs' ++ specs)
576
+ distDirLayout
577
+ (envSpecs' ++ specs ++ uriSpecs )
564
578
InstallCommand
565
579
566
580
buildCtx <-
@@ -867,21 +881,15 @@ entriesForLibraryComponents = Map.foldrWithKey' (\k v -> mappend (go k v)) []
867
881
establishDummyProjectBaseContext
868
882
:: Verbosity
869
883
-> ProjectConfig
870
- -> FilePath
884
+ -> DistDirLayout
871
885
-- ^ Where to put the dist directory
872
886
-> [PackageSpecifier UnresolvedSourcePackage ]
873
887
-- ^ The packages to be included in the project
874
888
-> CurrentCommand
875
889
-> IO ProjectBaseContext
876
- establishDummyProjectBaseContext verbosity cliConfig tmpDir
877
- localPackages currentCommand = do
890
+ establishDummyProjectBaseContext verbosity cliConfig distDirLayout localPackages currentCommand = do
878
891
cabalDir <- getCabalDir
879
892
880
- -- Create the dist directories
881
- createDirectoryIfMissingVerbose verbosity True $ distDirectory distDirLayout
882
- createDirectoryIfMissingVerbose verbosity True $
883
- distProjectCacheDirectory distDirLayout
884
-
885
893
globalConfig <- runRebuild " "
886
894
$ readGlobalConfig verbosity
887
895
$ projectConfigConfigFile
@@ -912,13 +920,21 @@ establishDummyProjectBaseContext verbosity cliConfig tmpDir
912
920
buildSettings,
913
921
currentCommand
914
922
}
923
+
924
+ establishDummyDistDirLayout :: Verbosity -> ProjectConfig -> FilePath -> IO DistDirLayout
925
+ establishDummyDistDirLayout verbosity cliConfig tmpDir = do
926
+ let distDirLayout = defaultDistDirLayout projectRoot mdistDirectory
927
+
928
+ -- Create the dist directories
929
+ createDirectoryIfMissingVerbose verbosity True $ distDirectory distDirLayout
930
+ createDirectoryIfMissingVerbose verbosity True $ distProjectCacheDirectory distDirLayout
931
+
932
+ return distDirLayout
915
933
where
916
934
mdistDirectory = flagToMaybe
917
935
$ projectConfigDistDir
918
936
$ projectConfigShared cliConfig
919
937
projectRoot = ProjectRootImplicit tmpDir
920
- distDirLayout = defaultDistDirLayout projectRoot
921
- mdistDirectory
922
938
923
939
-- | This defines what a 'TargetSelector' means for the @bench@ command.
924
940
-- It selects the 'AvailableTarget's that the 'TargetSelector' refers to,
0 commit comments