Skip to content

Commit 5ba03ea

Browse files
committed
Cabal library: allow setting the logging handle
The goal of this patch is to allow the logging handle to be set when calling Cabal library functions, without having to spawn a separate process and redirect handles. This allows Cabal library functions to be called in a concurrent setting without spawning separate processes. To achieve this, this commit modifies Verbosity as follows: 1. The old Verbosity datatype becomes VerbosityFlags. This is what gets passed in the command-line interface, e.g. when running a Setup executable. 2. The new Verbosity datatype contains VerbosityFlags together with VerbosityHandles, which specify where to redirect stdout/stderr. Crucially, this allows us to get rid of the isJust (useLoggingHandle options) condition in 'getSetupMethod', which forced us to use the cabal-install "act as setup" mechanism instead of directly calling Cabal library functions.
1 parent 9a343d1 commit 5ba03ea

File tree

148 files changed

+1303
-885
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

148 files changed

+1303
-885
lines changed

Cabal-QuickCheck/src/Test/QuickCheck/Instances/Cabal.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,9 @@ instance Arbitrary FlagAssignment where
265265
-- Verbosity
266266
-------------------------------------------------------------------------------
267267

268-
instance Arbitrary Verbosity where
268+
instance Arbitrary VerbosityFlags where
269269
arbitrary = do
270-
v <- elements [minBound..maxBound]
270+
v <- mkVerbosityFlags <$> elements [minBound..maxBound]
271271
-- verbose markoutput is left out on purpose
272272
flags <- listOf $ elements
273273
[ verboseCallSite

Cabal-described/src/Distribution/Described.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ import Distribution.Types.TestType (TestType)
9999
import Distribution.Types.UnitId (UnitId)
100100
import Distribution.Types.UnqualComponentName (UnqualComponentName)
101101
import Distribution.Utils.Path (SymbolicPath, RelativePath)
102-
import Distribution.Verbosity (Verbosity)
102+
import Distribution.Verbosity (VerbosityFlags)
103103
import Distribution.Version (Version, VersionRange)
104104
import Language.Haskell.Extension (Extension, Language, knownLanguages)
105105

@@ -493,7 +493,7 @@ instance Described RepoType where
493493
instance Described TestType where
494494
describe _ = REUnion ["exitcode-stdio-1.0", "detailed-0.9"]
495495

496-
instance Described Verbosity where
496+
instance Described VerbosityFlags where
497497
describe _ = REUnion
498498
[ REUnion ["0", "1", "2", "3"]
499499
, REUnion ["silent", "normal", "verbose", "debug", "deafening"]

Cabal-tests/tests/UnitTests.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ main = do
109109
(mtimeChange, mtimeChange') <- calibrateMtimeChangeDelay
110110
let toMillis :: Int -> Double
111111
toMillis x = fromIntegral x / 1000.0
112-
notice normal $ "File modification time resolution calibration completed, "
112+
notice (mkVerbosity defaultVerbosityHandles normal) $ "File modification time resolution calibration completed, "
113113
++ "maximum delay observed: "
114114
++ (show . toMillis $ mtimeChange ) ++ " ms. "
115115
++ "Will be using delay of " ++ (show . toMillis $ mtimeChange')

Cabal-tests/tests/UnitTests/Distribution/Compat/Time.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import Control.Concurrent (threadDelay)
44
import System.FilePath
55

66
import Distribution.Simple.Utils (withTempDirectory)
7-
import Distribution.Verbosity
87

98
import Distribution.Compat.Time
109

@@ -19,7 +18,7 @@ tests mtimeChange =
1918

2019
getModTimeTest :: Int -> Assertion
2120
getModTimeTest mtimeChange =
22-
withTempDirectory silent "." "getmodtime-" $ \dir -> do
21+
withTempDirectory "." "getmodtime-" $ \dir -> do
2322
let fileName = dir </> "foo"
2423
writeFile fileName "bar"
2524
t0 <- getModTime fileName
@@ -31,7 +30,7 @@ getModTimeTest mtimeChange =
3130

3231
getCurTimeTest :: Int -> Assertion
3332
getCurTimeTest mtimeChange =
34-
withTempDirectory silent "." "getmodtime-" $ \dir -> do
33+
withTempDirectory "." "getmodtime-" $ \dir -> do
3534
let fileName = dir </> "foo"
3635
writeFile fileName "bar"
3736
t0 <- getModTime fileName

Cabal-tests/tests/UnitTests/Distribution/Described.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import Distribution.Types.PackageName (PackageName)
2222
import Distribution.Types.PackageVersionConstraint (PackageVersionConstraint)
2323
import Distribution.Types.Version (Version)
2424
import Distribution.Types.VersionRange (VersionRange)
25-
import Distribution.Verbosity (Verbosity)
25+
import Distribution.Verbosity (VerbosityFlags)
2626

2727
-- instances
2828
import Test.QuickCheck.Instances.Cabal ()
@@ -45,5 +45,5 @@ tests = testGroup "Described"
4545
, testDescribed (Proxy :: Proxy ModuleRenaming)
4646
, testDescribed (Proxy :: Proxy IncludeRenaming)
4747
, testDescribed (Proxy :: Proxy Mixin)
48-
, testDescribed (Proxy :: Proxy Verbosity)
48+
, testDescribed (Proxy :: Proxy VerbosityFlags)
4949
]

Cabal-tests/tests/UnitTests/Distribution/Simple/Glob.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import System.FilePath ((</>), splitFileName, normalise)
1616
import System.IO.Temp (withSystemTempDirectory)
1717
import Test.Tasty
1818
import Test.Tasty.HUnit
19+
import Distribution.Verbosity
1920

2021
sampleFileNames :: [FilePath]
2122
sampleFileNames =
@@ -100,6 +101,7 @@ testMatchesVersion version pat expected = do
100101
checkPure globPat
101102
checkIO globPat
102103
where
104+
verbosity = mkVerbosity defaultVerbosityHandles Verbosity.normal
103105
isEqual = (==) `on` (sort . fmap (fmap normalise))
104106
checkPure globPat = do
105107
let actual = mapMaybe (\p -> (p <$) <$> fileGlobMatches version globPat p) sampleFileNames
@@ -111,7 +113,7 @@ testMatchesVersion version pat expected = do
111113
checkIO globPat =
112114
withSystemTempDirectory "globstar-sample" $ \tmpdir -> do
113115
makeSampleFiles tmpdir
114-
actual <- runDirFileGlob Verbosity.normal (Just version) tmpdir globPat
116+
actual <- runDirFileGlob verbosity (Just version) tmpdir globPat
115117
unless (isEqual actual expected) $
116118
assertFailure $ "Unexpected result (impure matcher): " ++ show actual ++ "\nExpected: " ++ show expected
117119

Cabal-tests/tests/UnitTests/Distribution/Simple/Utils.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ withTempDirTest :: Assertion
3838
withTempDirTest = do
3939
dirName <- newIORef ""
4040
tempDir <- getTemporaryDirectory
41-
withTempDirectory normal tempDir "foo" $ \dirName' -> do
41+
withTempDirectory tempDir "foo" $ \dirName' -> do
4242
writeIORef dirName dirName'
4343
dirExists <- readIORef dirName >>= doesDirectoryExist
4444
assertBool "Temporary directory not deleted by 'withTempDirectory'!"
@@ -47,7 +47,7 @@ withTempDirTest = do
4747
withTempDirRemovedTest :: Assertion
4848
withTempDirRemovedTest = do
4949
tempDir <- getTemporaryDirectory
50-
withTempDirectory normal tempDir "foo" $ \dirPath -> do
50+
withTempDirectory tempDir "foo" $ \dirPath -> do
5151
removeDirectoryRecursive dirPath
5252

5353
rawSystemStdInOutTextDecodingTest :: FilePath -> Assertion
@@ -67,15 +67,15 @@ rawSystemStdInOutTextDecodingTest ghcPath
6767
hClose handleExe
6868

6969
-- Compile
70-
(resOutput, resErrors, resExitCode) <- rawSystemStdInOut normal
70+
(resOutput, resErrors, resExitCode) <- rawSystemStdInOut (mkVerbosity defaultVerbosityHandles normal)
7171
ghcPath ["-o", filenameExe, filenameHs]
7272
Nothing Nothing Nothing
7373
IODataModeText
7474
print (resOutput, resErrors, resExitCode)
7575

7676
-- Execute
7777
Exception.try $ do
78-
rawSystemStdInOut normal
78+
rawSystemStdInOut (mkVerbosity defaultVerbosityHandles normal)
7979
filenameExe []
8080
Nothing Nothing Nothing
8181
IODataModeText -- not binary mode output, ie utf8 text mode so try to decode

Cabal-tests/tests/UnitTests/Distribution/Utils/Structured.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ md5CheckGenericPackageDescription proxy = md5Check proxy
3333

3434
md5CheckLocalBuildInfo :: Proxy LocalBuildInfo -> Assertion
3535
md5CheckLocalBuildInfo proxy = md5Check proxy
36-
0xea86b170fa32ac289cbd1fb6174b5cbf
36+
0xaa3a1e323dbdc3a8a881f84f5a0468fa

Cabal-tests/tests/custom-setup/CabalDoctestSetup.hs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
-- This is Distribution.Extra.Doctest module from cabal-doctest-1.0.4
22
-- This isn't technically a Custom-Setup script, but it /was/.
33

4+
{-# LANGUAGE CPP #-}
45
{-# LANGUAGE FlexibleInstances #-}
56

67
{-
@@ -335,7 +336,11 @@ generateBuildModule
335336
-> BuildFlags -> PackageDescription -> LocalBuildInfo -> IO ()
336337
{- FOURMOLU_DISABLE -}
337338
generateBuildModule testSuiteName flags pkg lbi = do
338-
let verbosity = fromFlag (buildVerbosity flags)
339+
let verbosity =
340+
#if MIN_VERSION_Cabal(3,17,0)
341+
mkVerbosity defaultVerbosityHandles $
342+
#endif
343+
fromFlag (buildVerbosity flags)
339344
let distPref = fromFlag (buildDistPref flags)
340345

341346
-- Package DBs & environments

Cabal-tests/tests/custom-setup/IdrisSetup.hs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import Distribution.Simple.InstallDirs as I
5656
import Distribution.Simple.LocalBuildInfo as L
5757
import qualified Distribution.Simple.Setup as S
5858
import qualified Distribution.Simple.Program as P
59+
import qualified Distribution.Verbosity as V
5960
import Distribution.Simple.Utils (createDirectoryIfMissingVerbose, notice, installOrdinaryFiles)
6061
import Distribution.Simple.Utils (rewriteFileEx)
6162
import Distribution.Compiler
@@ -156,12 +157,26 @@ mkFlagName :: String -> FlagName
156157
mkFlagName = FlagName
157158
#endif
158159

160+
mkVerbosity
161+
::
162+
#if MIN_VERSION_Cabal(3,17,0)
163+
S.Flag V.VerbosityFlags
164+
#else
165+
S.Flag V.Verbosity
166+
#endif
167+
-> V.Verbosity
168+
mkVerbosity v =
169+
#if MIN_VERSION_Cabal(3,17,0)
170+
V.mkVerbosity V.defaultVerbosityHandles $
171+
#endif
172+
S.fromFlag v
173+
159174
-- -----------------------------------------------------------------------------
160175
-- Clean
161176

162177
idrisClean _ flags _ _ = cleanStdLib
163178
where
164-
verbosity = S.fromFlag $ S.cleanVerbosity flags
179+
verbosity = mkVerbosity $ S.cleanVerbosity flags
165180

166181
cleanStdLib = makeClean "libs"
167182

@@ -247,7 +262,7 @@ idrisConfigure _ flags pkgdesc local = do
247262
else
248263
generateToolchainModule verbosity libAutogenDir Nothing
249264
where
250-
verbosity = S.fromFlag $ S.configVerbosity flags
265+
verbosity = mkVerbosity $ S.fromFlag $ S.configVerbosity flags
251266
version = pkgVersion . package $ localPkgDescr local
252267

253268
-- This is a hack. I don't know how to tell cabal that a data file needs
@@ -307,7 +322,7 @@ idrisPreBuild args flags = do
307322
windres verbosity ["icons/idris_icon.rc","-o", dir++"/idris_icon.o"]
308323
return (Nothing, [(fromString "idris", emptyBuildInfo { ldOptions = [dir ++ "/idris_icon.o"] })])
309324
where
310-
verbosity = S.fromFlag $ S.buildVerbosity flags
325+
verbosity = mkVerbosity $ S.fromFlag $ S.buildVerbosity flags
311326

312327
dir =
313328
#if MIN_VERSION_Cabal(3,11,0)
@@ -325,7 +340,7 @@ idrisBuild _ flags _ local
325340
else do buildStdLib
326341
buildRTS
327342
where
328-
verbosity = S.fromFlag $ S.buildVerbosity flags
343+
verbosity = mkVerbosity $ S.fromFlag $ S.buildVerbosity flags
329344

330345
buildStdLib = do
331346
putStrLn "Building libraries..."
@@ -396,10 +411,10 @@ main = defaultMainWithHooks $ simpleUserHooks
396411
, preBuild = idrisPreBuild
397412
, postBuild = idrisBuild
398413
, postCopy = \_ flags pkg local ->
399-
idrisInstall (S.fromFlag $ S.copyVerbosity flags)
414+
idrisInstall (mkVerbosity $ S.copyVerbosity flags)
400415
(S.fromFlag $ S.copyDest flags) pkg local
401416
, postInst = \_ flags pkg local ->
402-
idrisInstall (S.fromFlag $ S.installVerbosity flags)
417+
idrisInstall (mkVerbosity $ S.installVerbosity flags)
403418
NoCopyDest pkg local
404419
#if !MIN_VERSION_Cabal(3,0,0)
405420
, preSDist = idrisPreSDist

0 commit comments

Comments
 (0)