2
2
-- distribution for this package. That is, packs up the source code
3
3
-- into a tarball, making use of the corresponding Cabal module.
4
4
module Distribution.Client.SrcDist (
5
- sdist
5
+ sdist ,
6
+ allPackageSourceFiles
6
7
) where
7
8
8
9
@@ -11,7 +12,7 @@ import Distribution.Client.SetupWrapper
11
12
import Distribution.Client.Tar (createTarGzFile )
12
13
13
14
import Distribution.Package
14
- ( Package (.. ) )
15
+ ( Package (.. ), packageName )
15
16
import Distribution.PackageDescription
16
17
( PackageDescription )
17
18
import Distribution.PackageDescription.Configuration
@@ -20,23 +21,29 @@ import Distribution.PackageDescription.Parse
20
21
( readPackageDescription )
21
22
import Distribution.Simple.Utils
22
23
( createDirectoryIfMissingVerbose , defaultPackageDesc
23
- , die , notice , withTempDirectory )
24
+ , warn , die , notice , withTempDirectory )
24
25
import Distribution.Client.Setup
25
26
( SDistFlags (.. ), SDistExFlags (.. ), ArchiveFormat (.. ) )
26
27
import Distribution.Simple.Setup
27
- ( Flag (.. ), sdistCommand , flagToList , fromFlag , fromFlagOrDefault )
28
+ ( Flag (.. ), sdistCommand , flagToList , fromFlag , fromFlagOrDefault
29
+ , defaultSDistFlags )
28
30
import Distribution.Simple.BuildPaths ( srcPref )
29
31
import Distribution.Simple.Program (requireProgram , simpleProgram , programPath )
30
32
import Distribution.Simple.Program.Db (emptyProgramDb )
31
33
import Distribution.Text ( display )
32
- import Distribution.Verbosity (Verbosity )
34
+ import Distribution.Verbosity (Verbosity , normal , lessVerbose )
33
35
import Distribution.Version (Version (.. ), orLaterVersion )
34
36
37
+ import Distribution.Client.Utils
38
+ (removeExistingFile , tryFindAddSourcePackageDesc )
39
+ import Distribution.Compat.Exception (catchIO )
40
+
35
41
import System.FilePath ((</>) , (<.>) )
36
42
import Control.Monad (when , unless , liftM )
37
43
import System.Directory (doesFileExist , removeFile , canonicalizePath )
38
44
import System.Process (runProcess , waitForProcess )
39
45
import System.Exit (ExitCode (.. ))
46
+ import Control.Exception (IOException )
40
47
41
48
-- | Create a source distribution.
42
49
sdist :: SDistFlags -> SDistExFlags -> IO ()
@@ -136,3 +143,42 @@ createZipArchive verbosity pkg tmpDir targetPref = do
136
143
notice verbosity $ " Source zip archive created: " ++ zipfile
137
144
where
138
145
zipProgram = simpleProgram " zip"
146
+
147
+ -- | List all source files of a given add-source dependency. Exits with error if
148
+ -- something is wrong (e.g. there is no .cabal file in the given directory).
149
+ allPackageSourceFiles :: Verbosity -> FilePath -> IO [FilePath ]
150
+ allPackageSourceFiles verbosity packageDir = do
151
+ pkg <- do
152
+ let err = " Error reading source files of package."
153
+ desc <- tryFindAddSourcePackageDesc packageDir err
154
+ flattenPackageDescription `fmap` readPackageDescription verbosity desc
155
+ let -- TODO: allocate a temporary directory for this, more thread safe.
156
+ file = packageDir </> " cabal-sdist-list-sources"
157
+ flags = defaultSDistFlags {
158
+ sDistVerbosity = Flag $ if verbosity == normal
159
+ then lessVerbose verbosity else verbosity,
160
+ sDistListSources = Flag file
161
+ }
162
+ setupOpts = defaultSetupScriptOptions {
163
+ -- 'sdist --list-sources' was introduced in Cabal 1.18.
164
+ useCabalVersion = orLaterVersion $ Version [1 ,18 ,0 ] [] ,
165
+ useWorkingDir = Just packageDir
166
+ }
167
+
168
+ doListSources :: IO [FilePath ]
169
+ doListSources = do
170
+ setupWrapper verbosity setupOpts (Just pkg) sdistCommand (const flags) []
171
+ fmap lines . readFile $ file
172
+
173
+ onFailedListSources :: IOException -> IO ()
174
+ onFailedListSources e = do
175
+ warn verbosity $
176
+ " Could not list sources of the package '"
177
+ ++ display (packageName pkg) ++ " '."
178
+ warn verbosity $
179
+ " Exception was: " ++ show e
180
+
181
+ -- Run setup sdist --list-sources=TMPFILE
182
+ ret <- doListSources `catchIO` (\ e -> onFailedListSources e >> return [] )
183
+ removeExistingFile file
184
+ return ret
0 commit comments