Skip to content

Commit f4ecbf1

Browse files
committed
Resolve #6393. Allow cabal v2-install http://....
1 parent ff9d62d commit f4ecbf1

File tree

4 files changed

+70
-41
lines changed

4 files changed

+70
-41
lines changed

cabal-install/Distribution/Client/CmdInstall.hs

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ module Distribution.Client.CmdInstall (
1515
TargetProblem(..),
1616
selectPackageTargets,
1717
selectComponentTarget,
18+
-- * Internals exposed for CmdRepl + CmdRun
19+
establishDummyDistDirLayout,
1820
establishDummyProjectBaseContext
1921
) where
2022

@@ -44,6 +46,10 @@ import Distribution.Package
4446
( Package(..), PackageName, mkPackageName, unPackageName )
4547
import Distribution.Types.PackageId
4648
( PackageIdentifier(..) )
49+
import Distribution.Client.ProjectConfig
50+
( ProjectPackageLocation(..)
51+
, fetchAndReadSourcePackages
52+
)
4753
import Distribution.Client.ProjectConfig.Types
4854
( ProjectConfig(..), ProjectConfigShared(..)
4955
, ProjectConfigBuildOnly(..), PackageConfig(..)
@@ -136,6 +142,7 @@ import Data.Ord
136142
import qualified Data.Map as Map
137143
import Distribution.Utils.NubList
138144
( fromNubList )
145+
import Network.URI (URI)
139146
import System.Directory
140147
( getHomeDirectory, doesFileExist, createDirectoryIfMissing
141148
, getTemporaryDirectory, makeAbsolute, doesDirectoryExist
@@ -262,7 +269,7 @@ installAction ( configFlags, configExFlags, installFlags
262269
targetFilter = if installLibs then Just LibKind else Just ExeKind
263270
targetStrings' = if null targetStrings then ["."] else targetStrings
264271

265-
withProject :: IO ([PackageSpecifier UnresolvedSourcePackage], [TargetSelector], ProjectConfig)
272+
withProject :: IO ([PackageSpecifier UnresolvedSourcePackage], [URI], [TargetSelector], ProjectConfig)
266273
withProject = do
267274
let verbosity' = lessVerbose verbosity
268275

@@ -292,7 +299,7 @@ installAction ( configFlags, configExFlags, installFlags
292299
flip TargetPackageNamed targetFilter . pkgName <$> packageIds
293300

294301
if null targetStrings'
295-
then return (packageSpecifiers, packageTargets, projectConfig localBaseCtx)
302+
then return (packageSpecifiers, [], packageTargets, projectConfig localBaseCtx)
296303
else do
297304
targetSelectors <-
298305
either (reportTargetSelectorProblems verbosity) return
@@ -397,10 +404,11 @@ installAction ( configFlags, configExFlags, installFlags
397404
else return (local ++ hackagePkgs, targets' ++ hackageTargets)
398405

399406
return ( specs ++ packageSpecifiers
407+
, []
400408
, selectors ++ packageTargets
401409
, projectConfig localBaseCtx )
402410

403-
withoutProject :: ProjectConfig -> IO ([PackageSpecifier pkg], [TargetSelector], ProjectConfig)
411+
withoutProject :: ProjectConfig -> IO ([PackageSpecifier pkg], [URI], [TargetSelector], ProjectConfig)
404412
withoutProject globalConfig = do
405413
tss <- mapM (parseWithoutProjectTargetSelector verbosity) targetStrings'
406414

@@ -441,14 +449,15 @@ installAction ( configFlags, configExFlags, installFlags
441449
]
442450

443451
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)
447456

448457
let
449458
ignoreProject = fromFlagOrDefault False (cinstIgnoreProject clientInstallFlags)
450459

451-
(specs, selectors, config) <-
460+
(specs, uris, selectors, config) <-
452461
withProjectOrGlobalConfigIgn ignoreProject verbosity globalConfigFlag withProject withoutProject
453462

454463
home <- getHomeDirectory
@@ -551,16 +560,21 @@ installAction ( configFlags, configExFlags, installFlags
551560
envSpecs' | installLibs = envSpecs
552561
| otherwise = []
553562

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+
559573
baseCtx <- establishDummyProjectBaseContext
560574
verbosity
561575
config
562-
tmpDir
563-
(envSpecs' ++ specs)
576+
distDirLayout
577+
(envSpecs' ++ specs ++ uriSpecs)
564578
InstallCommand
565579

566580
buildCtx <-
@@ -867,21 +881,15 @@ entriesForLibraryComponents = Map.foldrWithKey' (\k v -> mappend (go k v)) []
867881
establishDummyProjectBaseContext
868882
:: Verbosity
869883
-> ProjectConfig
870-
-> FilePath
884+
-> DistDirLayout
871885
-- ^ Where to put the dist directory
872886
-> [PackageSpecifier UnresolvedSourcePackage]
873887
-- ^ The packages to be included in the project
874888
-> CurrentCommand
875889
-> IO ProjectBaseContext
876-
establishDummyProjectBaseContext verbosity cliConfig tmpDir
877-
localPackages currentCommand = do
890+
establishDummyProjectBaseContext verbosity cliConfig distDirLayout localPackages currentCommand = do
878891
cabalDir <- getCabalDir
879892

880-
-- Create the dist directories
881-
createDirectoryIfMissingVerbose verbosity True $ distDirectory distDirLayout
882-
createDirectoryIfMissingVerbose verbosity True $
883-
distProjectCacheDirectory distDirLayout
884-
885893
globalConfig <- runRebuild ""
886894
$ readGlobalConfig verbosity
887895
$ projectConfigConfigFile
@@ -912,13 +920,21 @@ establishDummyProjectBaseContext verbosity cliConfig tmpDir
912920
buildSettings,
913921
currentCommand
914922
}
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
915933
where
916934
mdistDirectory = flagToMaybe
917935
$ projectConfigDistDir
918936
$ projectConfigShared cliConfig
919937
projectRoot = ProjectRootImplicit tmpDir
920-
distDirLayout = defaultDistDirLayout projectRoot
921-
mdistDirectory
922938

923939
-- | This defines what a 'TargetSelector' means for the @bench@ command.
924940
-- It selects the 'AvailableTarget's that the 'TargetSelector' refers to,

cabal-install/Distribution/Client/CmdInstall/ClientInstallTargetSelector.hs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ module Distribution.Client.CmdInstall.ClientInstallTargetSelector (
99
import Distribution.Client.Compat.Prelude
1010
import Prelude ()
1111

12+
import Network.URI (URI, parseURI)
13+
1214
import Distribution.Client.TargetSelector
1315
import Distribution.Client.Types
1416
import Distribution.Compat.CharParsing (char, optional)
@@ -23,14 +25,16 @@ import Distribution.Version
2325
data WithoutProjectTargetSelector
2426
= WoPackageId PackageId
2527
| WoPackageComponent PackageId ComponentName
26-
-- | WoURI URI
28+
| WoURI URI
2729
deriving (Show)
2830

2931
parseWithoutProjectTargetSelector :: Verbosity -> String -> IO WithoutProjectTargetSelector
3032
parseWithoutProjectTargetSelector verbosity input =
3133
case explicitEitherParsec parser input of
3234
Right ts -> return ts
33-
Left err -> die' verbosity $ "Invalid package ID: " ++ input ++ "\n" ++ err
35+
Left err -> case parseURI input of
36+
Just uri -> return (WoURI uri)
37+
Nothing -> die' verbosity $ "Invalid package ID: " ++ input ++ "\n" ++ err
3438
where
3539
parser :: ParsecParser WithoutProjectTargetSelector
3640
parser = do
@@ -43,16 +47,20 @@ parseWithoutProjectTargetSelector verbosity input =
4347
woPackageNames :: WithoutProjectTargetSelector -> [PackageName]
4448
woPackageNames (WoPackageId pid) = [pkgName pid]
4549
woPackageNames (WoPackageComponent pid _) = [pkgName pid]
50+
woPackageNames (WoURI _) = []
4651

4752
woPackageTargets :: WithoutProjectTargetSelector -> TargetSelector
4853
woPackageTargets (WoPackageId pid) =
4954
TargetPackageNamed (pkgName pid) Nothing
5055
woPackageTargets (WoPackageComponent pid cn) =
5156
TargetComponentUnknown (pkgName pid) (Right cn) WholeComponent
57+
woPackageTargets (WoURI _) =
58+
TargetAllPackages (Just ExeKind)
5259

53-
woPackageSpecifiers :: WithoutProjectTargetSelector -> PackageSpecifier pkg
54-
woPackageSpecifiers (WoPackageId pid) = pidPackageSpecifiers pid
55-
woPackageSpecifiers (WoPackageComponent pid _) = pidPackageSpecifiers pid
60+
woPackageSpecifiers :: WithoutProjectTargetSelector -> Either URI (PackageSpecifier pkg)
61+
woPackageSpecifiers (WoPackageId pid) = Right (pidPackageSpecifiers pid)
62+
woPackageSpecifiers (WoPackageComponent pid _) = Right (pidPackageSpecifiers pid)
63+
woPackageSpecifiers (WoURI uri) = Left uri
5664

5765
pidPackageSpecifiers :: PackageId -> PackageSpecifier pkg
5866
pidPackageSpecifiers pid

cabal-install/Distribution/Client/CmdRepl.hs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ import qualified Distribution.Types.Lens as L
2525

2626
import Distribution.Client.CmdErrorMessages
2727
import Distribution.Client.CmdInstall
28-
( establishDummyProjectBaseContext )
28+
( establishDummyDistDirLayout
29+
, establishDummyProjectBaseContext
30+
)
2931
import qualified Distribution.Client.InstallPlan as InstallPlan
3032
import Distribution.Client.ProjectBuilding
3133
( rebuildTargetsDryRun, improveInstallPlanWithUpToDatePackages )
@@ -419,11 +421,12 @@ withoutProject config verbosity extraArgs = do
419421
cwd <- getCurrentDirectory
420422
writeFile ghciScriptPath (":cd " ++ cwd)
421423

424+
distDirLayout <- establishDummyDistDirLayout verbosity config tempDir
422425
baseCtx <-
423426
establishDummyProjectBaseContext
424427
verbosity
425428
config
426-
tempDir
429+
distDirLayout
427430
[SpecificSourcePackage sourcePackage]
428431
OtherCommand
429432

cabal-install/Distribution/Client/CmdRun.hs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ import Distribution.Simple.Utils
4747
( wrapText, warn, die', ordNub, info
4848
, createTempDirectory, handleDoesNotExist )
4949
import Distribution.Client.CmdInstall
50-
( establishDummyProjectBaseContext )
50+
( establishDummyDistDirLayout
51+
, establishDummyProjectBaseContext )
5152
import Distribution.Client.ProjectConfig
5253
( ProjectConfig(..), ProjectConfigShared(..)
5354
, withProjectOrGlobalConfigIgn )
@@ -200,13 +201,14 @@ runAction ( configFlags, configExFlags, installFlags
200201
, clientRunFlags )
201202
targetStrings globalFlags = do
202203
globalTmp <- getTemporaryDirectory
203-
tempDir <- createTempDirectory globalTmp "cabal-repl."
204+
tmpDir <- createTempDirectory globalTmp "cabal-repl."
204205

205206
let
206207
with =
207208
establishProjectBaseContext verbosity cliConfig OtherCommand
208-
without config =
209-
establishDummyProjectBaseContext verbosity (config <> cliConfig) tempDir [] OtherCommand
209+
without config = do
210+
distDirLayout <- establishDummyDistDirLayout verbosity (config <> cliConfig) tmpDir
211+
establishDummyProjectBaseContext verbosity (config <> cliConfig) distDirLayout [] OtherCommand
210212

211213
let
212214
ignoreProject = fromFlagOrDefault False (crunIgnoreProject clientRunFlags)
@@ -219,7 +221,7 @@ runAction ( configFlags, configExFlags, installFlags
219221
let pol | takeExtension script == ".lhs" = LiterateHaskell
220222
| otherwise = PlainHaskell
221223
if exists
222-
then BS.readFile script >>= handleScriptCase verbosity pol baseCtx tempDir
224+
then BS.readFile script >>= handleScriptCase verbosity pol baseCtx tmpDir
223225
else reportTargetSelectorProblems verbosity err
224226

225227
(baseCtx', targetSelectors) <-
@@ -337,7 +339,7 @@ runAction ( configFlags, configExFlags, installFlags
337339
elaboratedPlan
338340
}
339341

340-
handleDoesNotExist () (removeDirectoryRecursive tempDir)
342+
handleDoesNotExist () (removeDirectoryRecursive tmpDir)
341343
where
342344
verbosity = fromFlagOrDefault normal (configVerbosity configFlags)
343345
cliConfig = commandLineFlagsToProjectConfig
@@ -441,7 +443,7 @@ handleScriptCase
441443
-> FilePath
442444
-> BS.ByteString
443445
-> IO (ProjectBaseContext, [TargetSelector])
444-
handleScriptCase verbosity pol baseCtx tempDir scriptContents = do
446+
handleScriptCase verbosity pol baseCtx tmpDir scriptContents = do
445447
(executable, contents') <- readScriptBlockFromScript verbosity pol scriptContents
446448

447449
-- We need to create a dummy package that lives in our dummy project.
@@ -453,7 +455,7 @@ handleScriptCase verbosity pol baseCtx tempDir scriptContents = do
453455
sourcePackage = SourcePackage
454456
{ packageInfoId = pkgId
455457
, SP.packageDescription = genericPackageDescription
456-
, packageSource = LocalUnpackedPackage tempDir
458+
, packageSource = LocalUnpackedPackage tmpDir
457459
, packageDescrOverride = Nothing
458460
}
459461
genericPackageDescription = emptyGenericPackageDescription
@@ -477,8 +479,8 @@ handleScriptCase verbosity pol baseCtx tempDir scriptContents = do
477479
}
478480
pkgId = fakePackageId
479481

480-
writeGenericPackageDescription (tempDir </> "fake-package.cabal") genericPackageDescription
481-
BS.writeFile (tempDir </> mainName) contents'
482+
writeGenericPackageDescription (tmpDir </> "fake-package.cabal") genericPackageDescription
483+
BS.writeFile (tmpDir </> mainName) contents'
482484

483485
let
484486
baseCtx' = baseCtx

0 commit comments

Comments
 (0)