Skip to content

Commit

Permalink
increase commands that --dry-run works with (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 ced6590
Show file tree
Hide file tree
Showing 12 changed files with 127 additions and 28 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,24 @@ 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 write the following configuration file:"
, 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
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: 15 additions & 5 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,9 +117,18 @@ 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 do
notice verbosity $ unlines
[ "Would have written the following freeze file:"
, showProjectConfig freezeConfig
]
else do
writeProjectLocalFreezeConfig distDirLayout freezeConfig
notice verbosity $
"Wrote freeze file: " ++ distProjectFile distDirLayout "freeze"

where
verbosity = fromFlagOrDefault normal (configVerbosity configFlags)
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
17 changes: 17 additions & 0 deletions cabal-testsuite/PackageTests/NewConfigure/ConfigFile/cabal.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# cabal v2-configure
Would write 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
10 changes: 10 additions & 0 deletions cabal-testsuite/PackageTests/NewFreeze/FreezeFile/new_freeze.out
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ Build profile: -w ghc-<GHCVER> -O1
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
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

0 comments on commit ced6590

Please sign in to comment.