Skip to content

Commit

Permalink
Add ProgramPaths and -Args concat test
Browse files Browse the repository at this point in the history
  • Loading branch information
jgotoh committed May 27, 2024
1 parent 35c943a commit 8c6f48c
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 15 deletions.
28 changes: 13 additions & 15 deletions cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -249,29 +249,23 @@ parseSection programDb (MkSection (Name pos name) args secFields)
verifyNullSubsections
verifyNullSectionArgs
opts <- lift $ parseProgramArgs Warn programDb fields
stateConfig . L.projectConfigLocalPackages %= (\lp -> lp{packageConfigProgramArgs = opts})
stateConfig . L.projectConfigLocalPackages %= (\cfg -> cfg{packageConfigProgramArgs = (opts <> packageConfigProgramArgs cfg)})
| name == "program-locations" = do
verifyNullSubsections
verifyNullSectionArgs
opts <- lift $ parseProgramPaths Warn programDb fields
stateConfig . L.projectConfigLocalPackages %= (\lp -> lp{packageConfigProgramPaths = opts})
paths <- lift $ parseProgramPaths Warn programDb fields
stateConfig . L.projectConfigLocalPackages %= (\cfg -> cfg{packageConfigProgramPaths = (paths <> packageConfigProgramPaths cfg)})
| name == "package" = do
verifyNullSubsections
package <- lift $ parsePackageName pos args
case package of
Just AllPackages -> do
parsedPkgCfg <- lift $ parseFieldGrammar cabalSpec fields (packageConfigFieldGrammar programNames)
args' <- lift $ parseProgramArgs Ignore programDb fields
paths <- lift $ parseProgramPaths Ignore programDb fields
let pkgCfg' = parsedPkgCfg{packageConfigProgramPaths = paths, packageConfigProgramArgs = args'}
stateConfig . L.projectConfigAllPackages %= (\pkgCfg -> pkgCfg' <> pkgCfg)
packageCfg' <- parsePackageConfig
stateConfig . L.projectConfigAllPackages %= (\packageCfg -> packageCfg' <> packageCfg)
Just (SpecificPackage packageName) -> do
pkgCfg <- lift $ parseFieldGrammar cabalSpec fields (packageConfigFieldGrammar programNames)
args' <- lift $ parseProgramArgs Ignore programDb fields
paths <- lift $ parseProgramPaths Ignore programDb fields
let pkgCfg' = pkgCfg{packageConfigProgramPaths = paths, packageConfigProgramArgs = args'}
stateConfig . L.projectConfigSpecificPackage %= (\spcs -> spcs <> MapMappend (Map.singleton packageName pkgCfg'))
Nothing -> return () -- TODO what then? error?
packageCfg <- parsePackageConfig
stateConfig . L.projectConfigSpecificPackage %= (\spcs -> spcs <> MapMappend (Map.singleton packageName packageCfg))
Nothing -> return ()
| otherwise = do
warnInvalidSubsection pos name
where
Expand All @@ -280,10 +274,14 @@ parseSection programDb (MkSection (Name pos name) args secFields)
programNames = knownProgramNames programDb
verifyNullSubsections = unless (null sections) (warnInvalidSubsection pos name)
verifyNullSectionArgs = unless (null args) (lift $ parseFailure pos $ "The section '" <> (show name) <> "' takes no arguments")
parsePackageConfig = do
packageCfg <- lift $ parseFieldGrammar cabalSpec fields (packageConfigFieldGrammar programNames)
args' <- lift $ parseProgramArgs Ignore programDb fields
paths <- lift $ parseProgramPaths Ignore programDb fields
return packageCfg{packageConfigProgramPaths = paths, packageConfigProgramArgs = args'}

data PackageConfigTarget = AllPackages | SpecificPackage PackageName

-- TODO what happens when package * is used more than once? maybe emit "warning, not more than once?" what happens atm?
parsePackageName :: Position -> [SectionArg Position] -> ParseResult (Maybe PackageConfigTarget)
parsePackageName pos args = case args of
[SecArgName _ secName] -> parseName secName
Expand Down
26 changes: 26 additions & 0 deletions cabal-testsuite/PackageTests/ProjectConfig/Parsec/cabal.test.hs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ main = do
cabalTest' "read project-config-specific-packages" testProjectConfigSpecificPackages
cabalTest' "test projectConfigAllPackages concatenation" testAllPackagesConcat
cabalTest' "test projectConfigSpecificPackages concatenation" testSpecificPackagesConcat
cabalTest' "test program-locations concatenation" testProgramLocationsConcat
cabalTest' "test program-options concatenation" testProgramOptionsConcat

testPackages :: TestM ()
testPackages = do
Expand Down Expand Up @@ -350,6 +352,30 @@ testSpecificPackagesConcat = do
, packageConfigProgramArgs = MapMappend $ Map.fromList [("ghc", ["-fno-state-hack", "-threaded"])]
}

testProgramLocationsConcat :: TestM ()
testProgramLocationsConcat = do
let rootFp = "program-locations-concat"
(config, legacy) <- readConfigDefault rootFp
assertConfig expected config legacy (projectConfigLocalPackages . condTreeData)
where
expected :: PackageConfig
expected =
mempty
{ packageConfigProgramPaths = MapLast $ Map.fromList [("gcc", "/tmp/bin/gcc"), ("ghc", "/tmp/bin/ghc")]
}

testProgramOptionsConcat :: TestM ()
testProgramOptionsConcat = do
let rootFp = "program-options-concat"
(config, legacy) <- readConfigDefault rootFp
assertConfig expected config legacy (projectConfigLocalPackages . condTreeData)
where
expected :: PackageConfig
expected =
mempty
{ packageConfigProgramArgs = MapMappend $ Map.fromList [("ghc", ["-threaded", "-Wall", "-fno-state-hack"]), ("gcc", ["-baz", "-foo", "-bar"])]
}

readConfigDefault :: FilePath -> TestM (ProjectConfigSkeleton, ProjectConfigSkeleton)
readConfigDefault testSubDir = readConfig testSubDir "cabal.project"

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
program-locations
gcc-location: /tmp/bin/gcc

program-locations
ghc-location: /tmp/bin/ghc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
program-options
ghc-options: -fno-state-hack
gcc-options: -foo -bar

program-options
ghc-options: -threaded -Wall
gcc-options: -baz

0 comments on commit 8c6f48c

Please sign in to comment.