Skip to content

Commit

Permalink
Increase effect of --dry-run flag (haskell#7379)
Browse files Browse the repository at this point in the history
Changes the behavior of the following commands under the --dry-run flag
- `v2-configure` and `v2-freeze` print out what the file contents
would've been rather than writing the file.
- `v2-exec` and `v2-run` print out the command that would've been
executed rather than doing so.

Adds package tests for the configure and freeze commands.
  • Loading branch information
aaronallen8455 committed May 25, 2021
1 parent ac5cb4c commit dddded7
Show file tree
Hide file tree
Showing 13 changed files with 128 additions and 29 deletions.
31 changes: 19 additions & 12 deletions cabal-install/src/Distribution/Client/CmdConfigure.hs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import qualified Data.Map as Map

import Distribution.Client.ProjectOrchestration
import Distribution.Client.ProjectConfig
( writeProjectLocalExtraConfig )
( showProjectConfig, writeProjectLocalExtraConfig )

import Distribution.Client.NixStyleOptions
( NixStyleFlags (..), nixStyleOptions, defaultNixStyleFlags )
Expand Down Expand Up @@ -107,17 +107,23 @@ configureAction flags@NixStyleFlags {..} _extraArgs globalFlags = do
if exists
then firstFreeBackup' (i + 1)
else return backup

-- If cabal.project.local already exists, back up to cabal.project.local~[n]
exists <- doesFileExist localFile
when exists $ do
backup <- firstFreeBackup
notice verbosity $
quote (takeFileName localFile) <> " already exists, backing it up to "
<> quote (takeFileName backup) <> "."
copyFile localFile backup
writeProjectLocalExtraConfig (distDirLayout baseCtx)
cliConfig
dryRun = buildSettingDryRun $ buildSettings baseCtx

if dryRun
then notice verbosity . unlines
$ "Would have written the following configuration file:"
: (indent <$> lines (showProjectConfig cliConfig))
else do
-- If cabal.project.local already exists, back up to cabal.project.local~[n]
exists <- doesFileExist localFile
when exists $ do
backup <- firstFreeBackup
notice verbosity $
quote (takeFileName localFile) <> " already exists, backing it up to "
<> quote (takeFileName backup) <> "."
copyFile localFile backup
writeProjectLocalExtraConfig (distDirLayout baseCtx)
cliConfig

buildCtx <-
runProjectPreBuildPhase verbosity baseCtx $ \elaboratedPlan ->
Expand Down Expand Up @@ -145,4 +151,5 @@ configureAction flags@NixStyleFlags {..} _extraArgs globalFlags = do
cliConfig = commandLineFlagsToProjectConfig globalFlags flags
mempty -- ClientInstallFlags, not needed here
quote s = "'" <> s <> "'"
indent s = "> " <> s

14 changes: 13 additions & 1 deletion cabal-install/src/Distribution/Client/CmdExec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import Distribution.Client.ProjectOrchestration
, distDirLayout
, commandLineFlagsToProjectConfig
, ProjectBaseContext(..)
, buildSettingDryRun
)
import Distribution.Client.ProjectPlanOutput
( updatePostBuildProjectStatus
Expand Down Expand Up @@ -81,6 +82,7 @@ import Distribution.Simple.Utils
, createDirectoryIfMissingVerbose
, withTempDirectory
, wrapText
, notice
)
import Distribution.Verbosity
( normal
Expand All @@ -91,6 +93,9 @@ import Distribution.Client.Compat.Prelude

import qualified Data.Set as S
import qualified Data.Map as M
import System.Process
( showCommandForUser
)

execCommand :: CommandUI (NixStyleFlags ())
execCommand = CommandUI
Expand Down Expand Up @@ -185,7 +190,14 @@ execAction flags@NixStyleFlags {..} extraArgs globalFlags = do
argOverrides'
program
invocation = programInvocation program' args
runProgramInvocation verbosity invocation
dryRun = buildSettingDryRun $ buildSettings baseCtx

if dryRun
then notice verbosity $ unlines
[ "Would have executed the following:"
, showCommandForUser (programPath program') args
]
else runProgramInvocation verbosity invocation
where
verbosity = fromFlagOrDefault normal (configVerbosity configFlags)
cliConfig = commandLineFlagsToProjectConfig globalFlags flags
Expand Down
20 changes: 14 additions & 6 deletions cabal-install/src/Distribution/Client/CmdFreeze.hs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import Distribution.Client.ProjectOrchestration
import Distribution.Client.ProjectPlanning
import Distribution.Client.ProjectConfig
( ProjectConfig(..), ProjectConfigShared(..)
, writeProjectLocalFreezeConfig )
, showProjectConfig, writeProjectLocalFreezeConfig )
import Distribution.Client.IndexUtils (TotalIndexState, ActiveRepos, filterSkippedActiveRepos)
import Distribution.Client.Targets
( UserQualifier(..), UserConstraintScope(..), UserConstraint(..) )
Expand Down Expand Up @@ -106,7 +106,8 @@ freezeAction flags@NixStyleFlags {..} extraArgs globalFlags = do
distDirLayout,
cabalDirLayout,
projectConfig,
localPackages
localPackages,
buildSettings
} <- establishProjectBaseContext verbosity cliConfig OtherCommand

(_, elaboratedPlan, _, totalIndexState, activeRepos) <-
Expand All @@ -116,15 +117,22 @@ freezeAction flags@NixStyleFlags {..} extraArgs globalFlags = do
localPackages

let freezeConfig = projectFreezeConfig elaboratedPlan totalIndexState activeRepos
writeProjectLocalFreezeConfig distDirLayout freezeConfig
notice verbosity $
"Wrote freeze file: " ++ distProjectFile distDirLayout "freeze"
dryRun = buildSettingDryRun buildSettings

if dryRun
then notice verbosity . unlines
$ "Would have written the following freeze file:"
: (indent <$> lines (showProjectConfig freezeConfig))
else do
writeProjectLocalFreezeConfig distDirLayout freezeConfig
notice verbosity $
"Wrote freeze file: " ++ distProjectFile distDirLayout "freeze"

where
verbosity = fromFlagOrDefault normal (configVerbosity configFlags)
cliConfig = commandLineFlagsToProjectConfig globalFlags flags
mempty -- ClientInstallFlags, not needed here

indent s = "> " <> s


-- | Given the install plan, produce a config value with constraints that
Expand Down
31 changes: 21 additions & 10 deletions cabal-install/src/Distribution/Client/CmdRun.hs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ import Distribution.CabalSpecVersion (CabalSpecVersion (..), cabalSpecLatest)
import Distribution.Verbosity
( normal )
import Distribution.Simple.Utils
( wrapText, warn, die', ordNub, info
( wrapText, warn, die', ordNub, info, notice
, createTempDirectory, handleDoesNotExist )
import Distribution.Client.ProjectConfig
( ProjectConfig(..), ProjectConfigShared(..)
Expand Down Expand Up @@ -108,6 +108,8 @@ import System.Directory
( getTemporaryDirectory, removeDirectoryRecursive, doesFileExist )
import System.FilePath
( (</>), isValid, isPathSeparator, takeExtension )
import System.Process
( showCommandForUser )


runCommand :: CommandUI (NixStyleFlags ())
Expand Down Expand Up @@ -284,15 +286,24 @@ runAction flags@NixStyleFlags {..} targetStrings globalFlags = do
exeName
</> exeName
let args = drop 1 targetStrings
runProgramInvocation
verbosity
emptyProgramInvocation {
progInvokePath = exePath,
progInvokeArgs = args,
progInvokeEnv = dataDirsEnvironmentForPlan
(distDirLayout baseCtx)
elaboratedPlan
}
dryRun = buildSettingDryRun $ buildSettings baseCtx

if dryRun
then notice verbosity $ unlines
[ "Would have run the following:"
, showCommandForUser exePath args
]
else
unless dryRun $
runProgramInvocation
verbosity
emptyProgramInvocation {
progInvokePath = exePath,
progInvokeArgs = args,
progInvokeEnv = dataDirsEnvironmentForPlan
(distDirLayout baseCtx)
elaboratedPlan
}

handleDoesNotExist () (removeDirectoryRecursive tmpDir)
where
Expand Down
1 change: 1 addition & 0 deletions cabal-install/src/Distribution/Client/ProjectConfig.hs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ module Distribution.Client.ProjectConfig (
readProjectConfig,
readGlobalConfig,
readProjectLocalFreezeConfig,
showProjectConfig,
withProjectOrGlobalConfig,
writeProjectLocalExtraConfig,
writeProjectLocalFreezeConfig,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name: ConfigFile
version: 0.1.0.0
author: Foo Bar
maintainer: cabal-dev@haskell.org
build-type: Simple
cabal-version: >=1.10

2 changes: 2 additions & 0 deletions cabal-testsuite/PackageTests/NewConfigure/ConfigFile/Setup.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import Distribution.Simple
main = defaultMain
16 changes: 16 additions & 0 deletions cabal-testsuite/PackageTests/NewConfigure/ConfigFile/cabal.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# cabal v2-configure
Would have written the following configuration file:
> store-dir: <GBLTMPDIR>
> verbose: verbose +nowrap +markoutput
> builddir: <ROOT>/cabal.dist/work/./dist
> jobs: 1
> project-file: cabal.project
> ignore-project: False
Resolving dependencies...
Build profile: -w ghc-<GHCVER> -O1
In order, the following would be built:
- ConfigFile-0.1.0.0 (first run)
# cabal v2-configure
Build profile: -w ghc-<GHCVER> -O1
In order, the following would be built:
- ConfigFile-0.1.0.0 (first run)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
packages: .
17 changes: 17 additions & 0 deletions cabal-testsuite/PackageTests/NewConfigure/ConfigFile/cabal.test.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import Test.Cabal.Prelude

-- Test that 'cabal v2-configure' generates the config file appropriately
main = withShorterPathForNewBuildStore $ \storeDir ->
cabalTest . withSourceCopy $ do
cwd <- fmap testCurrentDir getTestEnv
let configFile = cwd </> "cabal.project.local"

shouldNotExist configFile

-- should not create config file with --dry-run
cabalG ["--store-dir=" ++ storeDir] "v2-configure" ["--dry-run"]
shouldNotExist configFile

-- should create the config file
cabalG ["--store-dir=" ++ storeDir] "v2-configure" []
shouldExist configFile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ In order, the following would be built:
- my-library-dep-2.0 (lib) (requires build)
- my-local-package-1.0 (exe:my-exe) (first run)
# cabal v2-freeze
Would have written the following freeze file:
> active-repositories: test-local-repo:merge
> constraints: any.base ==4.14.1.0,
> any.ghc-prim ==0.6.1,
> any.integer-gmp ==1.0.3.0,
> any.my-library-dep ==2.0,
> any.rts ==1.0
> index-state: HEAD
# cabal v2-freeze
Resolving dependencies...
Wrote freeze file: <ROOT>/new_freeze.dist/source/cabal.project.freeze
# cabal v2-build
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ main = withShorterPathForNewBuildStore $ \storeDir ->
-- v2-build should choose the latest version for the dependency.
cabalG' ["--store-dir=" ++ storeDir] "v2-build" ["--dry-run"] >>= assertUsesLatestDependency

-- should not create freeze file with --dry-run flag
cabalG' ["--store-dir=" ++ storeDir] "v2-freeze" ["--dry-run"]
shouldNotExist freezeFile

-- Freeze a dependency on the older version.
cabalG ["--store-dir=" ++ storeDir] "v2-freeze" ["--constraint=my-library-dep==1.0"]

Expand Down
4 changes: 4 additions & 0 deletions changelog.d/pr-7407
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
synopsis: improve --dry-run effect for v2-configure, v2-freeze, v2-run, and v2-exec
pr: #7407
issues: #7379
decription: { v2-configure, v2-freeze, v2-run, and v2-exec now behave expectedly under the --dry-run flag }

0 comments on commit dddded7

Please sign in to comment.