@@ -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
@@ -28,6 +30,7 @@ import Distribution.Client.CmdErrorMessages
28
30
import Distribution.Client.CmdSdist
29
31
30
32
import Distribution.Client.CmdInstall.ClientInstallFlags
33
+ import Distribution.Client.CmdInstall.ClientInstallTargetSelector
31
34
32
35
import Distribution.Client.Setup
33
36
( GlobalFlags (.. ), ConfigFlags (.. ), ConfigExFlags , InstallFlags (.. )
@@ -43,6 +46,10 @@ import Distribution.Package
43
46
( Package (.. ), PackageName , mkPackageName , unPackageName )
44
47
import Distribution.Types.PackageId
45
48
( PackageIdentifier (.. ) )
49
+ import Distribution.Client.ProjectConfig
50
+ ( ProjectPackageLocation (.. )
51
+ , fetchAndReadSourcePackages
52
+ )
46
53
import Distribution.Client.ProjectConfig.Types
47
54
( ProjectConfig (.. ), ProjectConfigShared (.. )
48
55
, ProjectConfigBuildOnly (.. ), PackageConfig (.. )
@@ -135,6 +142,7 @@ import Data.Ord
135
142
import qualified Data.Map as Map
136
143
import Distribution.Utils.NubList
137
144
( fromNubList )
145
+ import Network.URI (URI )
138
146
import System.Directory
139
147
( getHomeDirectory , doesFileExist , createDirectoryIfMissing
140
148
, getTemporaryDirectory , makeAbsolute , doesDirectoryExist
@@ -261,7 +269,7 @@ installAction ( configFlags, configExFlags, installFlags
261
269
targetFilter = if installLibs then Just LibKind else Just ExeKind
262
270
targetStrings' = if null targetStrings then [" ." ] else targetStrings
263
271
264
- withProject :: IO ([PackageSpecifier UnresolvedSourcePackage ], [TargetSelector ], ProjectConfig )
272
+ withProject :: IO ([PackageSpecifier UnresolvedSourcePackage ], [URI ], [ TargetSelector ], ProjectConfig )
265
273
withProject = do
266
274
let verbosity' = lessVerbose verbosity
267
275
@@ -291,7 +299,7 @@ installAction ( configFlags, configExFlags, installFlags
291
299
flip TargetPackageNamed targetFilter . pkgName <$> packageIds
292
300
293
301
if null targetStrings'
294
- then return (packageSpecifiers, packageTargets, projectConfig localBaseCtx)
302
+ then return (packageSpecifiers, [] , packageTargets, projectConfig localBaseCtx)
295
303
else do
296
304
targetSelectors <-
297
305
either (reportTargetSelectorProblems verbosity) return
@@ -396,16 +404,13 @@ installAction ( configFlags, configExFlags, installFlags
396
404
else return (local ++ hackagePkgs, targets' ++ hackageTargets)
397
405
398
406
return ( specs ++ packageSpecifiers
407
+ , []
399
408
, selectors ++ packageTargets
400
409
, projectConfig localBaseCtx )
401
410
402
- withoutProject :: ProjectConfig -> IO ([PackageSpecifier pkg ], [TargetSelector ], ProjectConfig )
411
+ withoutProject :: ProjectConfig -> IO ([PackageSpecifier pkg ], [URI ], [ TargetSelector ], ProjectConfig )
403
412
withoutProject globalConfig = do
404
- let
405
- parsePkg pkgName
406
- | Just (pkg :: PackageId ) <- simpleParse pkgName = return pkg
407
- | otherwise = die' verbosity (" Invalid package ID: " ++ pkgName)
408
- packageIds <- mapM parsePkg targetStrings'
413
+ tss <- mapM (parseWithoutProjectTargetSelector verbosity) targetStrings'
409
414
410
415
cabalDir <- getCabalDir
411
416
let
@@ -431,31 +436,28 @@ installAction ( configFlags, configExFlags, installFlags
431
436
verbosity buildSettings
432
437
(getSourcePackages verbosity)
433
438
434
- for_ targetStrings' $ \ case
435
- name
436
- | null (lookupPackageName packageIndex (mkPackageName name))
437
- , xs@ (_: _) <- searchByName packageIndex name ->
438
- die' verbosity . concat $
439
- [ " Unknown package \" " , name, " \" . "
440
- , " Did you mean any of the following?\n "
441
- , unlines ((" - " ++ ) . unPackageName . fst <$> xs)
442
- ]
443
- _ -> return ()
439
+ for_ (concatMap woPackageNames tss) $ \ name -> do
440
+ when (null (lookupPackageName packageIndex name)) $ do
441
+ let xs = searchByName packageIndex (unPackageName name)
442
+ let emptyIf True _ = []
443
+ emptyIf False zs = zs
444
+ die' verbosity $ concat $
445
+ [ " Unknown package \" " , unPackageName name, " \" . "
446
+ ] ++ emptyIf (null xs)
447
+ [ " Did you mean any of the following?\n "
448
+ , unlines ((" - " ++ ) . unPackageName . fst <$> xs)
449
+ ]
444
450
445
451
let
446
- packageSpecifiers = flip fmap packageIds $ \ case
447
- PackageIdentifier {.. }
448
- | pkgVersion == nullVersion -> NamedPackage pkgName []
449
- | otherwise -> NamedPackage pkgName
450
- [PackagePropertyVersion
451
- (thisVersion pkgVersion)]
452
- packageTargets = flip TargetPackageNamed Nothing . pkgName <$> packageIds
453
- return (packageSpecifiers, packageTargets, projectConfig)
452
+ (uris, packageSpecifiers) = partitionEithers $ map woPackageSpecifiers tss
453
+ packageTargets = map woPackageTargets tss
454
+
455
+ return (packageSpecifiers, uris, packageTargets, projectConfig)
454
456
455
457
let
456
458
ignoreProject = fromFlagOrDefault False (cinstIgnoreProject clientInstallFlags)
457
459
458
- (specs, selectors, config) <-
460
+ (specs, uris, selectors, config) <-
459
461
withProjectOrGlobalConfigIgn ignoreProject verbosity globalConfigFlag withProject withoutProject
460
462
461
463
home <- getHomeDirectory
@@ -558,16 +560,21 @@ installAction ( configFlags, configExFlags, installFlags
558
560
envSpecs' | installLibs = envSpecs
559
561
| otherwise = []
560
562
561
- withTempDirectory
562
- verbosity
563
- globalTmp
564
- " cabal-install."
565
- $ \ 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
+
566
573
baseCtx <- establishDummyProjectBaseContext
567
574
verbosity
568
575
config
569
- tmpDir
570
- (envSpecs' ++ specs)
576
+ distDirLayout
577
+ (envSpecs' ++ specs ++ uriSpecs )
571
578
InstallCommand
572
579
573
580
buildCtx <-
@@ -874,21 +881,15 @@ entriesForLibraryComponents = Map.foldrWithKey' (\k v -> mappend (go k v)) []
874
881
establishDummyProjectBaseContext
875
882
:: Verbosity
876
883
-> ProjectConfig
877
- -> FilePath
884
+ -> DistDirLayout
878
885
-- ^ Where to put the dist directory
879
886
-> [PackageSpecifier UnresolvedSourcePackage ]
880
887
-- ^ The packages to be included in the project
881
888
-> CurrentCommand
882
889
-> IO ProjectBaseContext
883
- establishDummyProjectBaseContext verbosity cliConfig tmpDir
884
- localPackages currentCommand = do
890
+ establishDummyProjectBaseContext verbosity cliConfig distDirLayout localPackages currentCommand = do
885
891
cabalDir <- getCabalDir
886
892
887
- -- Create the dist directories
888
- createDirectoryIfMissingVerbose verbosity True $ distDirectory distDirLayout
889
- createDirectoryIfMissingVerbose verbosity True $
890
- distProjectCacheDirectory distDirLayout
891
-
892
893
globalConfig <- runRebuild " "
893
894
$ readGlobalConfig verbosity
894
895
$ projectConfigConfigFile
@@ -919,13 +920,21 @@ establishDummyProjectBaseContext verbosity cliConfig tmpDir
919
920
buildSettings,
920
921
currentCommand
921
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
922
933
where
923
934
mdistDirectory = flagToMaybe
924
935
$ projectConfigDistDir
925
936
$ projectConfigShared cliConfig
926
937
projectRoot = ProjectRootImplicit tmpDir
927
- distDirLayout = defaultDistDirLayout projectRoot
928
- mdistDirectory
929
938
930
939
-- | This defines what a 'TargetSelector' means for the @bench@ command.
931
940
-- It selects the 'AvailableTarget's that the 'TargetSelector' refers to,
0 commit comments