Skip to content

Commit 9993cbd

Browse files
committed
Fix extra-prog-path propagation in the codebase.
This allows finding system executables in: - `cabal exec` - `cabal build` (configure steps for example) - `cabal get` In particular this fixes PATH issues when running MinGW cabal in PowerShell.
1 parent 7ba955f commit 9993cbd

File tree

7 files changed

+56
-21
lines changed

7 files changed

+56
-21
lines changed

cabal-install/src/Distribution/Client/CmdExec.hs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ import Distribution.Client.NixStyleOptions
2626
, defaultNixStyleFlags
2727
, nixStyleOptions
2828
)
29+
import Distribution.Client.ProjectConfig.Types
30+
( ProjectConfig (projectConfigShared)
31+
, ProjectConfigShared (projectConfigProgPathExtra)
32+
)
2933
import Distribution.Client.ProjectFlags
3034
( removeIgnoreProjectOption
3135
)
@@ -91,6 +95,8 @@ import Distribution.Simple.Utils
9195
, withTempDirectory
9296
, wrapText
9397
)
98+
import Distribution.Utils.NubList
99+
( fromNubList )
94100
import Distribution.Verbosity
95101
( normal
96102
)
@@ -163,9 +169,15 @@ execAction flags@NixStyleFlags{..} extraArgs globalFlags = do
163169

164170
-- Some dependencies may have executables. Let's put those on the PATH.
165171
extraPaths <- pathAdditions verbosity baseCtx buildCtx
172+
let configProgPathExtras =
173+
fromNubList
174+
. projectConfigProgPathExtra
175+
. projectConfigShared
176+
. projectConfig
177+
$ baseCtx
166178
let programDb =
167179
modifyProgramSearchPath
168-
(map ProgramSearchPathDir extraPaths ++)
180+
(map ProgramSearchPathDir (configProgPathExtras ++ extraPaths) ++)
169181
. pkgConfigCompilerProgs
170182
. elaboratedShared
171183
$ buildCtx

cabal-install/src/Distribution/Client/Config.hs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,6 +1539,13 @@ parseConfig src initial = \str -> do
15391539
splitMultiPath
15401540
(configConfigureArgs scf)
15411541
}
1542+
, savedGlobalFlags =
1543+
let sgf = savedGlobalFlags conf
1544+
in sgf { globalProgPathExtra =
1545+
toNubList $
1546+
splitMultiPath
1547+
(fromNubList $ globalProgPathExtra sgf)
1548+
}
15421549
}
15431550

15441551
parse =

cabal-install/src/Distribution/Client/Get.hs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ import Distribution.Solver.Types.SourcePackage
7878
import Control.Monad (mapM_)
7979
import qualified Data.Map as Map
8080
import Distribution.Client.Errors
81+
import Distribution.Utils.NubList
82+
(fromNubList)
8183
import System.Directory
8284
( createDirectoryIfMissing
8385
, doesDirectoryExist
@@ -99,7 +101,7 @@ get
99101
-> IO ()
100102
get verbosity _ _ _ [] =
101103
notice verbosity "No packages requested. Nothing to do."
102-
get verbosity repoCtxt _ getFlags userTargets = do
104+
get verbosity repoCtxt globalFlags getFlags userTargets = do
103105
let useSourceRepo = case getSourceRepository getFlags of
104106
NoFlag -> False
105107
_ -> True
@@ -154,7 +156,7 @@ get verbosity repoCtxt _ getFlags userTargets = do
154156

155157
clone :: [UnresolvedSourcePackage] -> IO ()
156158
clone =
157-
clonePackagesFromSourceRepo verbosity prefix kind
159+
clonePackagesFromSourceRepo verbosity prefix kind (fromNubList $ globalProgPathExtra globalFlags)
158160
. map (\pkg -> (packageId pkg, packageSourceRepos pkg))
159161
where
160162
kind :: Maybe RepoKind
@@ -337,6 +339,8 @@ clonePackagesFromSourceRepo
337339
-- ^ destination dir prefix
338340
-> Maybe RepoKind
339341
-- ^ preferred 'RepoKind'
342+
-> [FilePath]
343+
-- ^ Extra prog paths
340344
-> [(PackageId, [PD.SourceRepo])]
341345
-- ^ the packages and their
342346
-- available 'SourceRepo's
@@ -345,13 +349,15 @@ clonePackagesFromSourceRepo
345349
verbosity
346350
destDirPrefix
347351
preferredRepoKind
352+
progPaths
348353
pkgrepos = do
349354
-- Do a bunch of checks and collect the required info
350355
pkgrepos' <- traverse preCloneChecks pkgrepos
351356

352357
-- Configure the VCS drivers for all the repository types we may need
353358
vcss <-
354-
configureVCSs verbosity $
359+
-- TODO: the empty list below should have the config prog paths
360+
configureVCSs verbosity progPaths $
355361
Map.fromList
356362
[ (vcsRepoType vcs, vcs)
357363
| (_, _, vcs, _) <- pkgrepos'

cabal-install/src/Distribution/Client/ProjectConfig.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,11 +1351,10 @@ syncAndReadSourcePackagesRemoteRepos
13511351
| (repo, rloc, rtype, vcs) <- repos'
13521352
]
13531353

1354-
-- TODO: pass progPathExtra on to 'configureVCS'
1355-
let _progPathExtra = fromNubList projectConfigProgPathExtra
1354+
let progPathExtra = fromNubList projectConfigProgPathExtra
13561355
getConfiguredVCS <- delayInitSharedResources $ \repoType ->
13571356
let vcs = Map.findWithDefault (error $ "Unknown VCS: " ++ prettyShow repoType) repoType knownVCSs
1358-
in configureVCS verbosity {-progPathExtra-} vcs
1357+
in configureVCS verbosity progPathExtra vcs
13591358

13601359
concat
13611360
<$> sequenceA

cabal-install/src/Distribution/Client/VCS.hs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ import Distribution.Simple.Program
6161
, runProgramInvocation
6262
, simpleProgram
6363
)
64+
import Distribution.Simple.Program.Db
65+
( modifyProgramSearchPath )
66+
import Distribution.Simple.Program.Find
67+
( ProgramSearchPathEntry (ProgramSearchPathDir) )
6468
import Distribution.Types.SourceRepo
6569
( KnownRepoType (..)
6670
, RepoType (..)
@@ -198,18 +202,22 @@ validateSourceRepos rs =
198202

199203
configureVCS
200204
:: Verbosity
205+
-> [FilePath]
201206
-> VCS Program
207+
-- ^ Extra prog paths
202208
-> IO (VCS ConfiguredProgram)
203-
configureVCS verbosity vcs@VCS{vcsProgram = prog} =
204-
asVcsConfigured <$> requireProgram verbosity prog emptyProgramDb
209+
configureVCS verbosity progPaths vcs@VCS{vcsProgram = prog} =
210+
asVcsConfigured <$> requireProgram verbosity prog (modifyProgramSearchPath (map ProgramSearchPathDir progPaths ++) emptyProgramDb )
205211
where
206212
asVcsConfigured (prog', _) = vcs{vcsProgram = prog'}
207213

208214
configureVCSs
209215
:: Verbosity
216+
-> [FilePath]
210217
-> Map RepoType (VCS Program)
218+
-- ^ Extra prog paths
211219
-> IO (Map RepoType (VCS ConfiguredProgram))
212-
configureVCSs verbosity = traverse (configureVCS verbosity)
220+
configureVCSs verbosity progPaths = traverse (configureVCS verbosity progPaths)
213221

214222
-- ------------------------------------------------------------
215223

cabal-install/tests/UnitTests/Distribution/Client/Get.hs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ testNoRepos :: Assertion
6464
testNoRepos = do
6565
e <-
6666
assertException $
67-
clonePackagesFromSourceRepo verbosity "." Nothing pkgrepos
67+
clonePackagesFromSourceRepo verbosity "." Nothing [] pkgrepos
6868
e @?= ClonePackageNoSourceRepos pkgidfoo
6969
where
7070
pkgrepos = [(pkgidfoo, [])]
@@ -73,7 +73,7 @@ testNoReposOfKind :: Assertion
7373
testNoReposOfKind = do
7474
e <-
7575
assertException $
76-
clonePackagesFromSourceRepo verbosity "." repokind pkgrepos
76+
clonePackagesFromSourceRepo verbosity "." repokind [] pkgrepos
7777
e @?= ClonePackageNoSourceReposOfKind pkgidfoo repokind
7878
where
7979
pkgrepos = [(pkgidfoo, [repo])]
@@ -84,7 +84,7 @@ testNoRepoType :: Assertion
8484
testNoRepoType = do
8585
e <-
8686
assertException $
87-
clonePackagesFromSourceRepo verbosity "." Nothing pkgrepos
87+
clonePackagesFromSourceRepo verbosity "." Nothing [] pkgrepos
8888
e @?= ClonePackageNoRepoType pkgidfoo repo
8989
where
9090
pkgrepos = [(pkgidfoo, [repo])]
@@ -94,7 +94,7 @@ testUnsupportedRepoType :: Assertion
9494
testUnsupportedRepoType = do
9595
e <-
9696
assertException $
97-
clonePackagesFromSourceRepo verbosity "." Nothing pkgrepos
97+
clonePackagesFromSourceRepo verbosity "." Nothing [] pkgrepos
9898
e @?= ClonePackageUnsupportedRepoType pkgidfoo repo' repotype
9999
where
100100
pkgrepos = [(pkgidfoo, [repo])]
@@ -118,7 +118,7 @@ testNoRepoLocation :: Assertion
118118
testNoRepoLocation = do
119119
e <-
120120
assertException $
121-
clonePackagesFromSourceRepo verbosity "." Nothing pkgrepos
121+
clonePackagesFromSourceRepo verbosity "." Nothing [] pkgrepos
122122
e @?= ClonePackageNoRepoLocation pkgidfoo repo
123123
where
124124
pkgrepos = [(pkgidfoo, [repo])]
@@ -139,7 +139,7 @@ testSelectRepoKind =
139139
e' @?= ClonePackageNoRepoType pkgidfoo expectedRepo
140140
| let test rt rs =
141141
assertException $
142-
clonePackagesFromSourceRepo verbosity "." rt rs
142+
clonePackagesFromSourceRepo verbosity "." rt [] rs
143143
, (requestedRepoType, expectedRepo) <- cases
144144
]
145145
where
@@ -161,14 +161,14 @@ testRepoDestinationExists =
161161
createDirectory pkgdir
162162
e1 <-
163163
assertException $
164-
clonePackagesFromSourceRepo verbosity tmpdir Nothing pkgrepos
164+
clonePackagesFromSourceRepo verbosity tmpdir Nothing [] pkgrepos
165165
e1 @?= ClonePackageDestinationExists pkgidfoo pkgdir True {- isdir -}
166166
removeDirectory pkgdir
167167

168168
writeFile pkgdir ""
169169
e2 <-
170170
assertException $
171-
clonePackagesFromSourceRepo verbosity tmpdir Nothing pkgrepos
171+
clonePackagesFromSourceRepo verbosity tmpdir Nothing [] pkgrepos
172172
e2 @?= ClonePackageDestinationExists pkgidfoo pkgdir False {- isfile -}
173173
where
174174
pkgrepos = [(pkgidfoo, [repo])]
@@ -199,7 +199,7 @@ testGitFetchFailed =
199199
pkgrepos = [(pkgidfoo, [repo])]
200200
e1 <-
201201
assertException $
202-
clonePackagesFromSourceRepo verbosity tmpdir Nothing pkgrepos
202+
clonePackagesFromSourceRepo verbosity tmpdir Nothing [] pkgrepos
203203
e1 @?= ClonePackageFailedWithExitCode pkgidfoo repo' "git" (ExitFailure 128)
204204

205205
testNetworkGitClone :: Assertion
@@ -214,6 +214,7 @@ testNetworkGitClone =
214214
verbosity
215215
tmpdir
216216
Nothing
217+
[]
217218
[(mkpkgid "zlib1", [repo1])]
218219
assertFileContains (tmpdir </> "zlib1/zlib.cabal") ["name:", "zlib"]
219220

@@ -226,6 +227,7 @@ testNetworkGitClone =
226227
verbosity
227228
tmpdir
228229
Nothing
230+
[]
229231
[(mkpkgid "zlib2", [repo2])]
230232
assertFileContains (tmpdir </> "zlib2/zlib.cabal") ["name:", "zlib"]
231233

@@ -239,6 +241,7 @@ testNetworkGitClone =
239241
verbosity
240242
tmpdir
241243
Nothing
244+
[]
242245
[(mkpkgid "zlib3", [repo3])]
243246
assertFileContains (tmpdir </> "zlib3/zlib.cabal") ["version:", "0.5.0.0"]
244247
where

cabal-install/tests/UnitTests/Distribution/Client/VCS.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ tests :: MTimeChange -> [TestTree]
5757
tests mtimeChange =
5858
map
5959
(localOption $ QuickCheckTests 10)
60-
[ ignoreInWindows "See issue #8048" $
60+
[ ignoreInWindows "See issue #8048 and #9519" $
6161
testGroup
6262
"git"
6363
[ testProperty "check VCS test framework" prop_framework_git
@@ -227,7 +227,7 @@ testSetup
227227
-> IO a
228228
testSetup vcs mkVCSTestDriver repoRecipe theTest = do
229229
-- test setup
230-
vcs' <- configureVCS verbosity vcs
230+
vcs' <- configureVCS verbosity [] vcs
231231
withTestDir verbosity "vcstest" $ \tmpdir -> do
232232
let srcRepoPath = tmpdir </> "src"
233233
submodulesPath = tmpdir </> "submodules"

0 commit comments

Comments
 (0)