From cbb47e6cf03c578d7435ec1acb56440bd6ebb9d8 Mon Sep 17 00:00:00 2001
From: quasicomputational <quasicomputational@gmail.com>
Date: Wed, 3 Jul 2019 16:56:14 +0100
Subject: [PATCH] Make `Setup.hs copy/install` work when data-files uses **.
 (#6127)

Treating globs like filenames was always illegitimate, but this code
was broken further by the addition of recursive globs.

I had a look around for other dubious code along these lines, and it
looks like this site is the only problematic one.

Fixes #6125.

(cherry picked from commit 7fec503aa7b27d1aa57e8c30a38c78cd03d1d6ea)
---
 Cabal/ChangeLog.md                                 |  3 +++
 Cabal/Distribution/Simple/Install.hs               | 14 +++++++-------
 .../PackageTests/Regression/T6125/Main.hs          |  1 +
 .../Regression/T6125/data/foo/bar.html             |  1 +
 .../PackageTests/Regression/T6125/myprog.cabal     |  9 +++++++++
 .../PackageTests/Regression/T6125/setup.cabal.out  |  9 +++++++++
 .../PackageTests/Regression/T6125/setup.out        |  8 ++++++++
 .../PackageTests/Regression/T6125/setup.test.hs    |  6 ++++++
 8 files changed, 44 insertions(+), 7 deletions(-)
 create mode 100644 cabal-testsuite/PackageTests/Regression/T6125/Main.hs
 create mode 100644 cabal-testsuite/PackageTests/Regression/T6125/data/foo/bar.html
 create mode 100644 cabal-testsuite/PackageTests/Regression/T6125/myprog.cabal
 create mode 100644 cabal-testsuite/PackageTests/Regression/T6125/setup.cabal.out
 create mode 100644 cabal-testsuite/PackageTests/Regression/T6125/setup.out
 create mode 100644 cabal-testsuite/PackageTests/Regression/T6125/setup.test.hs

diff --git a/Cabal/ChangeLog.md b/Cabal/ChangeLog.md
index b9172939f2..2842cb2ecd 100644
--- a/Cabal/ChangeLog.md
+++ b/Cabal/ChangeLog.md
@@ -35,6 +35,9 @@
     separate compilation of C-- and ASM source files (#6033).
   * Setting `debug-info` now implies `library-stripping: False` and
     `executable-stripping: False) ([#2702](https://github.com/haskell/cabal/issues/2702))
+  * `Setup.hs copy` and `install` now work in the presence of
+    `data-files` that use `**` syntax
+    ([#6125](https://github.com/haskell/cabal/issues/6125)).
 
 ----
 
diff --git a/Cabal/Distribution/Simple/Install.hs b/Cabal/Distribution/Simple/Install.hs
index 4ecd80beb1..5dc45924d0 100644
--- a/Cabal/Distribution/Simple/Install.hs
+++ b/Cabal/Distribution/Simple/Install.hs
@@ -223,17 +223,17 @@ copyComponent _ _ _ (CTest _) _ _ = return ()
 --
 installDataFiles :: Verbosity -> PackageDescription -> FilePath -> IO ()
 installDataFiles verbosity pkg_descr destDataDir =
-  flip traverse_ (dataFiles pkg_descr) $ \ file -> do
+  flip traverse_ (dataFiles pkg_descr) $ \ glob -> do
     let srcDataDirRaw = dataDir pkg_descr
         srcDataDir = if null srcDataDirRaw
           then "."
           else srcDataDirRaw
-    files <- matchDirFileGlob verbosity (specVersion pkg_descr) srcDataDir file
-    let dir = takeDirectory file
-    createDirectoryIfMissingVerbose verbosity True (destDataDir </> dir)
-    sequence_ [ installOrdinaryFile verbosity (srcDataDir  </> file')
-                                              (destDataDir </> file')
-              | file' <- files ]
+    files <- matchDirFileGlob verbosity (specVersion pkg_descr) srcDataDir glob
+    for_ files $ \ file' -> do
+      let src = srcDataDir </> file'
+          dst = destDataDir </> file'
+      createDirectoryIfMissingVerbose verbosity True (takeDirectory dst)
+      installOrdinaryFile verbosity src dst
 
 -- | Install the files listed in install-includes for a library
 --
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/Main.hs b/cabal-testsuite/PackageTests/Regression/T6125/Main.hs
new file mode 100644
index 0000000000..b3549c2fe3
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/Main.hs
@@ -0,0 +1 @@
+main = return ()
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/data/foo/bar.html b/cabal-testsuite/PackageTests/Regression/T6125/data/foo/bar.html
new file mode 100644
index 0000000000..99fd1d469d
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/data/foo/bar.html
@@ -0,0 +1 @@
+<!DOCTYPE html>Some random data.
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/myprog.cabal b/cabal-testsuite/PackageTests/Regression/T6125/myprog.cabal
new file mode 100644
index 0000000000..935cdb8b8c
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/myprog.cabal
@@ -0,0 +1,9 @@
+cabal-version: 2.4
+name: myprog
+version: 0
+data-files: data/**/*.html
+
+executable myprog
+  build-depends: base
+  main-is: Main.hs
+  default-language: Haskell2010
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/setup.cabal.out b/cabal-testsuite/PackageTests/Regression/T6125/setup.cabal.out
new file mode 100644
index 0000000000..64e8312ccd
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/setup.cabal.out
@@ -0,0 +1,9 @@
+# Setup configure
+Resolving dependencies...
+Configuring myprog-0...
+# Setup build
+Preprocessing executable 'myprog' for myprog-0..
+Building executable 'myprog' for myprog-0..
+# Setup copy
+Installing executable myprog in <PATH>
+Warning: The directory <ROOT>/setup.cabal.dist/usr/bin is not in the system search path.
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/setup.out b/cabal-testsuite/PackageTests/Regression/T6125/setup.out
new file mode 100644
index 0000000000..b982a76ecc
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/setup.out
@@ -0,0 +1,8 @@
+# Setup configure
+Configuring myprog-0...
+# Setup build
+Preprocessing executable 'myprog' for myprog-0..
+Building executable 'myprog' for myprog-0..
+# Setup copy
+Installing executable myprog in <PATH>
+Warning: The directory <ROOT>/setup.dist/usr/bin is not in the system search path.
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/setup.test.hs b/cabal-testsuite/PackageTests/Regression/T6125/setup.test.hs
new file mode 100644
index 0000000000..aeb2587e70
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/setup.test.hs
@@ -0,0 +1,6 @@
+import Test.Cabal.Prelude
+main = setupAndCabalTest $ do
+    withPackageDb $ do
+        setup "configure" []
+        setup "build" ["myprog"]
+        setup "copy" ["myprog"]
-- 
GitLab