@@ -40,15 +40,14 @@ import Distribution.Parsec.Warning (PWarnType (..))
4040import Distribution.Simple.Program.Db (ProgramDb , defaultProgramDb , knownPrograms , lookupKnownProgram )
4141import Distribution.Simple.Program.Types (programName )
4242import Distribution.Simple.Setup
43- import Distribution.Simple.Utils (debug , noticeDoc )
43+ import Distribution.Simple.Utils (debug )
4444import Distribution.Solver.Types.ProjectConfigPath
4545import Distribution.System (buildOS )
4646import Distribution.Types.CondTree (CondBranch (.. ), CondTree (.. ))
4747import Distribution.Types.ConfVar (ConfVar (.. ))
4848import Distribution.Types.PackageName (PackageName )
4949import Distribution.Utils.Generic (fromUTF8BS , toUTF8BS , validateUTF8 )
5050import Distribution.Utils.NubList (toNubList )
51- import Distribution.Utils.String (trim )
5251import Distribution.Verbosity
5352
5453import Control.Monad.State.Strict (StateT , execStateT , lift )
@@ -58,12 +57,11 @@ import qualified Data.Map.Strict as Map
5857import qualified Data.Set as Set
5958import Distribution.Client.Errors.Parser (ProjectFileSource (.. ))
6059import qualified Distribution.Compat.CharParsing as P
61- import Network.URI (parseURI , uriFragment , uriPath , uriScheme )
60+ import Network.URI (uriFragment , uriPath , uriScheme )
6261import System.Directory (createDirectoryIfMissing , makeAbsolute )
6362import System.FilePath (isAbsolute , isPathSeparator , makeValid , splitFileName , (</>) )
6463import qualified Text.Parsec
6564import Text.PrettyPrint (render )
66- import qualified Text.PrettyPrint as Disp
6765
6866singletonProjectConfigSkeleton :: ProjectConfig -> ProjectConfigSkeleton
6967singletonProjectConfigSkeleton x = CondNode x mempty mempty
@@ -99,7 +97,7 @@ parseProject
9997parseProject rootPath cacheDir httpTransport verbosity configToParse = do
10098 let (dir, projectFileName) = splitFileName rootPath
10199 projectDir <- makeAbsolute dir
102- projectPath <- canonicalizeConfigPath projectDir (ProjectConfigPath $ projectFileName :| [] )
100+ projectPath <- canonicalizeConfigPath projectDir (PCPWithoutImports projectFileName)
103101 parseProjectSkeleton cacheDir httpTransport verbosity projectDir projectPath configToParse
104102
105103parseProjectSkeleton
@@ -123,7 +121,7 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project
123121 (Field (Name pos name) importLines) | name == " import" -> do
124122 liftParseResult
125123 ( \ importLoc -> do
126- let importLocPath = importLoc `consProjectConfigPath` source
124+ importLocPath <- maybe (throwIO $ InvalidURIImport importLoc) pure $ parseLeaf importLoc `consProjectConfigPath` source
127125
128126 -- Once we canonicalize the import path, we can check for cyclical imports
129127 normSource <- canonicalizeConfigPath projectDir source
@@ -133,9 +131,6 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project
133131 if isCyclicConfigPath normLocPath
134132 then pure $ parseFatalFailure pos (render $ cyclicalImportMsg normLocPath)
135133 else do
136- when
137- (isUntrimmedUriConfigPath importLocPath)
138- (noticeDoc verbosity $ untrimmedUriImportMsg (Disp. text " Warning:" ) importLocPath)
139134 let fs = (\ z -> CondNode z [normLocPath] mempty ) <$> fieldsToConfig normSource (reverse acc)
140135 importParseResult <- parseProjectSkeleton cacheDir httpTransport verbosity projectDir importLocPath . ProjectConfigToParse =<< fetchImportConfig normLocPath
141136
@@ -192,20 +187,21 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project
192187 return config'
193188
194189 fetchImportConfig :: ProjectConfigPath -> IO BS. ByteString
195- fetchImportConfig (ProjectConfigPath (pci :| _)) = do
196- debug verbosity $ " fetching import: " ++ pci
197- fetch pci
198-
199- fetch :: FilePath -> IO BS. ByteString
200- fetch pci = case parseURI (trim pci) of
201- Just uri -> do
202- let fp = cacheDir </> map (\ x -> if isPathSeparator x then ' _' else x) (makeValid $ show uri)
203- createDirectoryIfMissing True cacheDir
204- _ <- downloadURI httpTransport verbosity uri fp
205- BS. readFile fp
206- Nothing ->
207- BS. readFile $
208- if isAbsolute pci then pci else coerce projectDir </> pci
190+ fetchImportConfig pcp = do
191+ let readPFile pci = BS. readFile $ if isAbsolute pci then pci else coerce projectDir </> pci
192+ case pcp of
193+ PCPWithoutImports fp -> do
194+ debug verbosity $ " reading import: " ++ fp
195+ readPFile fp
196+ PCPWithImports (PCPFilePath fp) _ -> do
197+ debug verbosity $ " reading import: " ++ fp
198+ readPFile fp
199+ PCPWithImports (PCPURI uri) _ -> do
200+ let fp = cacheDir </> map (\ x -> if isPathSeparator x then ' _' else x) (makeValid $ show uri)
201+ debug verbosity $ " fetching import: " ++ show uri
202+ createDirectoryIfMissing True cacheDir
203+ _ <- downloadURI httpTransport verbosity uri fp
204+ BS. readFile fp
209205
210206 modifiesCompiler :: ProjectConfig -> Bool
211207 modifiesCompiler pc = isSet projectConfigHcFlavor || isSet projectConfigHcPath || isSet projectConfigHcPkg
0 commit comments