diff --git a/Cabal/Distribution/PackageDescription/Check.hs b/Cabal/Distribution/PackageDescription/Check.hs index 9bae54e14ff..b9869abf605 100644 --- a/Cabal/Distribution/PackageDescription/Check.hs +++ b/Cabal/Distribution/PackageDescription/Check.hs @@ -1045,6 +1045,15 @@ checkPaths pkg = , (GHC, flags) <- options bi , path <- flags , isInsideDist path ] + ++ + [ PackageBuildWarning $ + "Using a '*' character in 'data-dir', like " ++ path ++ ", can behave" + ++ " erratically with prior versions of Cabal. It is recommended that you" + ++ " set 'cabal-version: 3.0' to exclude old versions." + | path <- [dataDir pkg] + , specVersion pkg < mkVersion [3,0] + , '*' `elem` path + ] where isOutsideTree path = case splitDirectories path of "..":_ -> True diff --git a/Cabal/Distribution/Simple/SrcDist.hs b/Cabal/Distribution/Simple/SrcDist.hs index 1011788f02e..ba57d970e5c 100644 --- a/Cabal/Distribution/Simple/SrcDist.hs +++ b/Cabal/Distribution/Simple/SrcDist.hs @@ -207,8 +207,8 @@ listPackageSourcesOrdinary verbosity pkg_descr pps = -- Data files. , fmap concat - . for (dataFiles pkg_descr) $ \filename -> - matchFileGlob (dataDir pkg_descr filename) + . for (dataFiles pkg_descr) $ \ filename -> fmap (fmap (dataDir pkg_descr )) $ + matchDirFileGlob (dataDir pkg_descr) filename -- Extra doc files. , fmap concat diff --git a/cabal-install/changelog b/cabal-install/changelog index 4cf826f8761..0bfc548ad18 100644 --- a/cabal-install/changelog +++ b/cabal-install/changelog @@ -1,5 +1,9 @@ -*-change-log-*- +2.3.0.0 (current development version) + * `cabal sdist` would error out when `data-dir` included `*` + characters. These are now correctly treated as inert. + 2.2.0.0 (current development version) * '--with-PROG' and '--PROG-options' are applied to all packages and not local packages only (#5019). diff --git a/cabal-testsuite/PackageTests/SDist/ListSources/Main.hs b/cabal-testsuite/PackageTests/SDist/ListSources/Main.hs new file mode 100644 index 00000000000..b3549c2fe3d --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/ListSources/Main.hs @@ -0,0 +1 @@ +main = return () diff --git a/cabal-testsuite/PackageTests/SDist/ListSources/data/blah/a.dat b/cabal-testsuite/PackageTests/SDist/ListSources/data/blah/a.dat new file mode 100644 index 00000000000..907b308167f --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/ListSources/data/blah/a.dat @@ -0,0 +1 @@ +blah diff --git a/cabal-testsuite/PackageTests/SDist/ListSources/extra-doc/blah/a.tex b/cabal-testsuite/PackageTests/SDist/ListSources/extra-doc/blah/a.tex new file mode 100644 index 00000000000..907b308167f --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/ListSources/extra-doc/blah/a.tex @@ -0,0 +1 @@ +blah diff --git a/cabal-testsuite/PackageTests/SDist/ListSources/extra-src/blah/a.html b/cabal-testsuite/PackageTests/SDist/ListSources/extra-src/blah/a.html new file mode 100644 index 00000000000..907b308167f --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/ListSources/extra-src/blah/a.html @@ -0,0 +1 @@ +blah diff --git a/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.cabal b/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.cabal new file mode 100644 index 00000000000..c0c0abfb781 --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.cabal @@ -0,0 +1,11 @@ +cabal-version: 2.2 +name: list-sources +version: 0 +data-dir: data +data-files: blah/*.dat +extra-source-files: extra-src/blah/*.html +extra-doc-files: extra-doc/blah/*.tex + +executable dummy + default-language: Haskell2010 + main-is: Main.hs diff --git a/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.cabal.out b/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.cabal.out new file mode 100644 index 00000000000..f6b12649785 --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.cabal.out @@ -0,0 +1,3 @@ +# cabal sdist +List of package sources written to file '/tmp/cabal-testsuite.included-in-sdist-d7916f39/sources' +List of package sources written to file '/tmp/cabal-testsuite.included-in-sdist-d7916f39/sources' diff --git a/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.out b/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.out new file mode 100644 index 00000000000..9386a7f81ee --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.out @@ -0,0 +1,3 @@ +# cabal sdist +List of package sources written to file '/tmp/cabal-testsuite.included-in-sdist-f48849cb/sources' +List of package sources written to file '/tmp/cabal-testsuite.included-in-sdist-f48849cb/sources' diff --git a/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.test.hs b/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.test.hs new file mode 100644 index 00000000000..031d47fc86b --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/ListSources/list-sources.test.hs @@ -0,0 +1,10 @@ +import Control.Monad.IO.Class +import System.IO.Temp (withSystemTempDirectory) +import Test.Cabal.Prelude +main = setupAndCabalTest $ withSystemTempDirectory "cabal-testsuite.included-in-sdist" $ \dir -> do + let fn = dir "sources" + cabal "sdist" ["--list-sources=" ++ fn] + liftIO $ putStrLn =<< readFile fn + assertFileDoesContain fn "data/blah/a.dat" + assertFileDoesContain fn "extra-src/blah/a.html" + assertFileDoesContain fn "extra-doc/blah/a.tex" diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/*/a.dat b/cabal-testsuite/PackageTests/SDist/StarInDataDir/*/a.dat new file mode 100644 index 00000000000..907b308167f --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/*/a.dat @@ -0,0 +1 @@ +blah diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/Main.hs b/cabal-testsuite/PackageTests/SDist/StarInDataDir/Main.hs new file mode 100644 index 00000000000..b3549c2fe3d --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/Main.hs @@ -0,0 +1 @@ +main = return () diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/a/a.dat b/cabal-testsuite/PackageTests/SDist/StarInDataDir/a/a.dat new file mode 100644 index 00000000000..907b308167f --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/a/a.dat @@ -0,0 +1 @@ +blah diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.cabal.out b/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.cabal.out new file mode 100644 index 00000000000..fa6fca5a423 --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.cabal.out @@ -0,0 +1,3 @@ +# cabal sdist +List of package sources written to file '/tmp/cabal-testsuite.included-in-sdist-c7bfa464/sources' +List of package sources written to file '/tmp/cabal-testsuite.included-in-sdist-c7bfa464/sources' diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.out b/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.out new file mode 100644 index 00000000000..f5fbd875de1 --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.out @@ -0,0 +1,3 @@ +# cabal sdist +List of package sources written to file '/tmp/cabal-testsuite.included-in-sdist-8306c552/sources' +List of package sources written to file '/tmp/cabal-testsuite.included-in-sdist-8306c552/sources' diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.test.hs b/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.test.hs new file mode 100644 index 00000000000..cfb95610466 --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/included-in-sdist.test.hs @@ -0,0 +1,10 @@ +import Control.Monad.IO.Class +import System.FilePath (normalise) +import System.IO.Temp (withSystemTempDirectory) +import Test.Cabal.Prelude +main = setupAndCabalTest $ withSystemTempDirectory "cabal-testsuite.included-in-sdist" $ \dir -> do + let fn = dir "sources" + cabal "sdist" ["--list-sources=" ++ fn] + files <- liftIO $ fmap (fmap normalise . lines) $ readFile fn + assertBool "has */a.dat" ("*/a.dat" `elem` files) + assertBool "hasn't a/a.dat" $ not ("a/a.dat" `elem` files) diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/star-in-data-dir.cabal b/cabal-testsuite/PackageTests/SDist/StarInDataDir/star-in-data-dir.cabal new file mode 100644 index 00000000000..3429629b2b1 --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/star-in-data-dir.cabal @@ -0,0 +1,9 @@ +cabal-version: 2.2 +name: star-in-data-dir +version: 0 +data-dir: * +data-files: *.dat + +executable dummy + default-language: Haskell2010 + main-is: Main.hs diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.cabal.out b/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.cabal.out new file mode 100644 index 00000000000..2f594958dda --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.cabal.out @@ -0,0 +1,12 @@ +# cabal sdist +Distribution quality errors: +No 'synopsis' or 'description' field. +The 'license' field is missing or is NONE. +Using a '*' character in 'data-dir', like *, can behave erratically with prior versions of Cabal. It is recommended that you set 'cabal-version: 3.0' to exclude old versions. +Distribution quality warnings: +No 'category' field. +No 'maintainer' field. +Note: the public hackage server would reject this package. +Warning: Cannot run preprocessors. Run 'configure' command first. +Building source dist for star-in-data-dir-0... +Source tarball created: /warning-issued.cabal.dist/work/./dist/star-in-data-dir-0.tar.gz diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.out b/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.out new file mode 100644 index 00000000000..6216a966eb2 --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.out @@ -0,0 +1,12 @@ +# cabal sdist +Distribution quality errors: +No 'synopsis' or 'description' field. +The 'license' field is missing or is NONE. +Using a '*' character in 'data-dir', like *, can behave erratically with prior versions of Cabal. It is recommended that you set 'cabal-version: 3.0' to exclude old versions. +Distribution quality warnings: +No 'category' field. +No 'maintainer' field. +Note: the public hackage server would reject this package. +Warning: Cannot run preprocessors. Run 'configure' command first. +Building source dist for star-in-data-dir-0... +Source tarball created: /warning-issued.dist/work/./dist/star-in-data-dir-0.tar.gz diff --git a/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.test.hs b/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.test.hs new file mode 100644 index 00000000000..68fe11b6dda --- /dev/null +++ b/cabal-testsuite/PackageTests/SDist/StarInDataDir/warning-issued.test.hs @@ -0,0 +1,4 @@ +import Test.Cabal.Prelude +main = setupAndCabalTest $ do + output <- cabal' "sdist" [] + assertOutputContains "Using a '*' character in 'data-dir'" output diff --git a/cabal-testsuite/cabal-testsuite.cabal b/cabal-testsuite/cabal-testsuite.cabal index 05604c69e19..bcbe695b7e3 100644 --- a/cabal-testsuite/cabal-testsuite.cabal +++ b/cabal-testsuite/cabal-testsuite.cabal @@ -45,6 +45,7 @@ library filepath, regex-compat-tdfa, regex-tdfa, + temporary, text, Cabal >= 2.3 ghc-options: -Wall -fwarn-tabs