diff --git a/cabal-testsuite/PackageTests/NewFreeze/cabal.project b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/cabal.project similarity index 100% rename from cabal-testsuite/PackageTests/NewFreeze/cabal.project rename to cabal-testsuite/PackageTests/NewFreeze/BuildTools/cabal.project diff --git a/cabal-testsuite/PackageTests/NewFreeze/my-local-package.cabal b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/my-local-package.cabal similarity index 100% rename from cabal-testsuite/PackageTests/NewFreeze/my-local-package.cabal rename to cabal-testsuite/PackageTests/NewFreeze/BuildTools/my-local-package.cabal diff --git a/cabal-testsuite/PackageTests/NewFreeze/new_freeze.out b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/new_freeze.out similarity index 71% rename from cabal-testsuite/PackageTests/NewFreeze/new_freeze.out rename to cabal-testsuite/PackageTests/NewFreeze/BuildTools/new_freeze.out index fda50e4c6e5..a0d0f0128b3 100644 --- a/cabal-testsuite/PackageTests/NewFreeze/new_freeze.out +++ b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/new_freeze.out @@ -19,11 +19,3 @@ In order, the following would be built: - my-build-tool-dep-2.0 (exe:my-build-tool) (requires download & build) - my-library-dep-1.0 (lib) (requires download & build) - my-local-package-1.0 (lib) (first run) -# cabal new-build -Resolving dependencies... -Build profile: -w ghc- -O1 -In order, the following would be built: - - my-build-tool-dep-1.0 (exe:my-build-tool) (requires download & build) - - my-build-tool-dep-3.0 (exe:my-build-tool) (requires download & build) - - my-library-dep-1.0 (lib) (requires download & build) - - my-local-package-1.0 (lib) (first run) diff --git a/cabal-testsuite/PackageTests/NewFreeze/new_freeze.test.hs b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/new_freeze.test.hs similarity index 90% rename from cabal-testsuite/PackageTests/NewFreeze/new_freeze.test.hs rename to cabal-testsuite/PackageTests/NewFreeze/BuildTools/new_freeze.test.hs index 1b74c27f5d3..6ff13457481 100644 --- a/cabal-testsuite/PackageTests/NewFreeze/new_freeze.test.hs +++ b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/new_freeze.test.hs @@ -34,11 +34,6 @@ main = cabalTest $ withSourceCopy $ do -- cabal should be able to find an install plan that fits the constraints -- from the freeze file. cabal' "new-build" ["--dry-run"] >>= assertDoesNotUseLatestBuildTool - - -- cabal should choose the latest version again after the freeze file is - -- removed. - liftIO $ removeFile freezeFile - cabal' "new-build" ["--dry-run"] >>= assertUsesLatestBuildTool where assertUsesLatestBuildTool out = do assertOutputContains "my-build-tool-dep-3.0 (exe:my-build-tool)" out diff --git a/cabal-testsuite/PackageTests/NewFreeze/repo/my-build-tool-dep-1.0/my-build-tool-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/repo/my-build-tool-dep-1.0/my-build-tool-dep.cabal similarity index 100% rename from cabal-testsuite/PackageTests/NewFreeze/repo/my-build-tool-dep-1.0/my-build-tool-dep.cabal rename to cabal-testsuite/PackageTests/NewFreeze/BuildTools/repo/my-build-tool-dep-1.0/my-build-tool-dep.cabal diff --git a/cabal-testsuite/PackageTests/NewFreeze/repo/my-build-tool-dep-2.0/my-build-tool-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/repo/my-build-tool-dep-2.0/my-build-tool-dep.cabal similarity index 100% rename from cabal-testsuite/PackageTests/NewFreeze/repo/my-build-tool-dep-2.0/my-build-tool-dep.cabal rename to cabal-testsuite/PackageTests/NewFreeze/BuildTools/repo/my-build-tool-dep-2.0/my-build-tool-dep.cabal diff --git a/cabal-testsuite/PackageTests/NewFreeze/repo/my-build-tool-dep-3.0/my-build-tool-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/repo/my-build-tool-dep-3.0/my-build-tool-dep.cabal similarity index 100% rename from cabal-testsuite/PackageTests/NewFreeze/repo/my-build-tool-dep-3.0/my-build-tool-dep.cabal rename to cabal-testsuite/PackageTests/NewFreeze/BuildTools/repo/my-build-tool-dep-3.0/my-build-tool-dep.cabal diff --git a/cabal-testsuite/PackageTests/NewFreeze/repo/my-library-dep-1.0/my-library-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/BuildTools/repo/my-library-dep-1.0/my-library-dep.cabal similarity index 100% rename from cabal-testsuite/PackageTests/NewFreeze/repo/my-library-dep-1.0/my-library-dep.cabal rename to cabal-testsuite/PackageTests/NewFreeze/BuildTools/repo/my-library-dep-1.0/my-library-dep.cabal diff --git a/cabal-testsuite/PackageTests/NewFreeze/Flags/cabal.project b/cabal-testsuite/PackageTests/NewFreeze/Flags/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/Flags/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/NewFreeze/Flags/my-local-package.cabal b/cabal-testsuite/PackageTests/NewFreeze/Flags/my-local-package.cabal new file mode 100644 index 00000000000..ef169c981bd --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/Flags/my-local-package.cabal @@ -0,0 +1,7 @@ +name: my-local-package +version: 1.0 +cabal-version: 1.20 +build-type: Simple + +library + build-depends: my-library-dep diff --git a/cabal-testsuite/PackageTests/NewFreeze/Flags/new_freeze.out b/cabal-testsuite/PackageTests/NewFreeze/Flags/new_freeze.out new file mode 100644 index 00000000000..b2964507d7e --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/Flags/new_freeze.out @@ -0,0 +1,19 @@ +# cabal update +Downloading the latest package list from test-local-repo +# cabal new-build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - true-dep-1.0 (lib) (requires download & build) + - my-library-dep-1.0 (lib) (requires download & build) + - my-local-package-1.0 (lib) (first run) +# cabal new-freeze +Resolving dependencies... +Wrote freeze file: /new_freeze.dist/source/cabal.project.freeze +# cabal new-build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - false-dep-1.0 (lib) (requires download & build) + - my-library-dep-1.0 (lib) (requires download & build) + - my-local-package-1.0 (lib) (first run) diff --git a/cabal-testsuite/PackageTests/NewFreeze/Flags/new_freeze.test.hs b/cabal-testsuite/PackageTests/NewFreeze/Flags/new_freeze.test.hs new file mode 100644 index 00000000000..1a1aa6d283a --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/Flags/new_freeze.test.hs @@ -0,0 +1,35 @@ +import Test.Cabal.Prelude +import Control.Monad.IO.Class +import Data.Char +import System.Directory + +-- Test that 'cabal new-freeze' freezes flag choices. my-local-package depends +-- on my-library-dep. my-library-dep has a flag, my-flag, which defaults to +-- true. +main = cabalTest $ withSourceCopy $ + withRepo "repo" $ do + cabal' "new-build" ["--dry-run"] >>= assertDependencyFlagChoice True + + cabal "new-freeze" ["--constraint=my-library-dep -my-flag"] + + cwd <- fmap testCurrentDir getTestEnv + let freezeFile = cwd "cabal.project.freeze" + + -- The freeze file should constrain the version and the flag. + -- TODO: The flag constraint should be qualified. See + -- https://github.com/haskell/cabal/issues/5134. + assertFileDoesContain freezeFile "any.my-library-dep ==1.0" + assertFileDoesContain freezeFile "my-library-dep -my-flag" + + -- cabal should be able to find an install plan that fits the constraints + -- from the freeze file. + cabal' "new-build" ["--dry-run"] >>= assertDependencyFlagChoice False + where + -- my-library-dep's flag controls whether it depends on true-dep or + -- false-dep, so this function uses the dependency to infer the flag choice. + assertDependencyFlagChoice True out = do + assertOutputContains "true-dep-1.0 (lib)" out + assertOutputDoesNotContain "false-dep" out + assertDependencyFlagChoice False out = do + assertOutputContains "false-dep-1.0 (lib)" out + assertOutputDoesNotContain "true-dep" out diff --git a/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/false-dep-1.0/false-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/false-dep-1.0/false-dep.cabal new file mode 100644 index 00000000000..1a2b287f839 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/false-dep-1.0/false-dep.cabal @@ -0,0 +1,6 @@ +name: false-dep +version: 1.0 +cabal-version: 1.20 +build-type: Simple + +library diff --git a/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/my-library-dep-1.0/my-library-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/my-library-dep-1.0/my-library-dep.cabal new file mode 100644 index 00000000000..7a4d72274be --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/my-library-dep-1.0/my-library-dep.cabal @@ -0,0 +1,15 @@ +name: my-library-dep +version: 1.0 +cabal-version: 1.20 +build-type: Simple + +flag my-flag + default: True + manual: False + +library + build-depends: base + if flag(my-flag) + build-depends: true-dep + else + build-depends: false-dep diff --git a/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/true-dep-1.0/true-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/true-dep-1.0/true-dep.cabal new file mode 100644 index 00000000000..cf9bd7da0b8 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/Flags/repo/true-dep-1.0/true-dep.cabal @@ -0,0 +1,6 @@ +name: true-dep +version: 1.0 +cabal-version: 1.20 +build-type: Simple + +library diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/Main.hs b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/Main.hs new file mode 100644 index 00000000000..1a1b44262d6 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/Main.hs @@ -0,0 +1,3 @@ +import MyLibModule (message) + +main = putStrLn message diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/cabal.project b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/my-local-package.cabal b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/my-local-package.cabal new file mode 100644 index 00000000000..ba8c3562296 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/my-local-package.cabal @@ -0,0 +1,10 @@ +name: my-local-package +version: 1.0 +cabal-version: 1.20 +build-type: Simple + +executable my-exe + hs-source-dirs: . + main-is: Main.hs + build-depends: base, my-library-dep + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/new_freeze.out b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/new_freeze.out new file mode 100644 index 00000000000..52d3b30d236 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/new_freeze.out @@ -0,0 +1,34 @@ +# cabal update +Downloading the latest package list from test-local-repo +# cabal new-build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - my-library-dep-2.0 (lib) (requires download & build) + - my-local-package-1.0 (exe:my-exe) (first run) +# cabal new-freeze +Resolving dependencies... +Wrote freeze file: /new_freeze.dist/source/cabal.project.freeze +# cabal new-build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following will be built: + - my-library-dep-1.0 (lib) (requires download & build) + - my-local-package-1.0 (exe:my-exe) (first run) +Configuring library for my-library-dep-1.0.. +Preprocessing library for my-library-dep-1.0.. +Building library for my-library-dep-1.0.. +Installing library in +Configuring executable 'my-exe' for my-local-package-1.0.. +Preprocessing executable 'my-exe' for my-local-package-1.0.. +Building executable 'my-exe' for my-local-package-1.0.. +# cabal new-freeze +Wrote freeze file: /new_freeze.dist/source/cabal.project.freeze +# cabal new-build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following would be built: + - my-library-dep-2.0 (lib) (requires download & build) + - my-local-package-1.0 (exe:my-exe) (configuration changed) +# cabal new-freeze +Wrote freeze file: /new_freeze.dist/source/cabal.project.freeze diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/new_freeze.test.hs b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/new_freeze.test.hs new file mode 100644 index 00000000000..de914a226a2 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/new_freeze.test.hs @@ -0,0 +1,52 @@ +import Test.Cabal.Prelude +import Control.Monad.IO.Class +import Data.Char +import System.Directory + +-- Test for 'cabal new-freeze' with only a single library dependency. +-- my-local-package depends on my-library-dep, which has versions 1.0 and 2.0. +main = cabalTest $ withSourceCopy $ + withRepo "repo" $ do + cwd <- fmap testCurrentDir getTestEnv + let freezeFile = cwd "cabal.project.freeze" + + shouldNotExist freezeFile + + -- new-build should choose the latest version for the dependency. + cabal' "new-build" ["--dry-run"] >>= assertUsesLatestDependency + + -- Freeze a dependency on the older version. + cabal "new-freeze" ["--constraint=my-library-dep==1.0"] + + -- The file should constrain the dependency, but not the local package. + shouldExist freezeFile + assertFileDoesContain freezeFile "any.my-library-dep ==1.0" + assertFileDoesNotContain freezeFile "my-local-package" + + -- cabal should be able to build the package using the constraint from the + -- freeze file. + cabal' "new-build" [] >>= assertDoesNotUseLatestDependency + + -- Re-running new-freeze should not change the constraints, because cabal + -- should use the existing freeze file when choosing the new install plan. + cabal "new-freeze" [] + assertFileDoesContain freezeFile "any.my-library-dep ==1.0" + + -- cabal should choose the latest version again after the freeze file is + -- removed. + liftIO $ removeFile freezeFile + cabal' "new-build" ["--dry-run"] >>= assertUsesLatestDependency + + -- Re-running new-freeze with no constraints or freeze file should constrain + -- the dependency to the latest version. + cabal "new-freeze" [] + assertFileDoesContain freezeFile "any.my-library-dep ==2.0" + assertFileDoesNotContain freezeFile "my-local-package" + where + assertUsesLatestDependency out = do + assertOutputContains "my-library-dep-2.0 (lib)" out + assertOutputDoesNotContain "my-library-dep-1.0" out + + assertDoesNotUseLatestDependency out = do + assertOutputContains "my-library-dep-1.0 (lib)" out + assertOutputDoesNotContain "my-library-dep-2.0" out diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-1.0/MyLibModule.hs b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-1.0/MyLibModule.hs new file mode 100644 index 00000000000..10c6c8f7154 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-1.0/MyLibModule.hs @@ -0,0 +1,3 @@ +module MyLibModule (message) where + +message = "Hello" diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-1.0/my-library-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-1.0/my-library-dep.cabal new file mode 100644 index 00000000000..54b5506b4c4 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-1.0/my-library-dep.cabal @@ -0,0 +1,10 @@ +name: my-library-dep +version: 1.0 +cabal-version: 1.20 +build-type: Simple + +library + hs-source-dirs: . + build-depends: base + default-language: Haskell2010 + exposed-modules: MyLibModule diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-2.0/MyLibModule.hs b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-2.0/MyLibModule.hs new file mode 100644 index 00000000000..10c6c8f7154 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-2.0/MyLibModule.hs @@ -0,0 +1,3 @@ +module MyLibModule (message) where + +message = "Hello" diff --git a/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-2.0/my-library-dep.cabal b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-2.0/my-library-dep.cabal new file mode 100644 index 00000000000..98d2146a4ec --- /dev/null +++ b/cabal-testsuite/PackageTests/NewFreeze/FreezeFile/repo/my-library-dep-2.0/my-library-dep.cabal @@ -0,0 +1,10 @@ +name: my-library-dep +version: 2.0 +cabal-version: 1.20 +build-type: Simple + +library + hs-source-dirs: . + build-depends: base + default-language: Haskell2010 + exposed-modules: MyLibModule