@@ -6,31 +6,31 @@ module Distribution.Client.SrcDist (
6
6
) where
7
7
8
8
9
- import Distribution.Simple.SrcDist
10
- ( CreateArchiveFun , sdistWith )
9
+ import Distribution.Client.SetupWrapper
10
+ ( SetupScriptOptions ( .. ), defaultSetupScriptOptions , setupWrapper )
11
11
import Distribution.Client.Tar (createTarGzFile )
12
12
13
13
import Distribution.Package
14
14
( Package (.. ) )
15
15
import Distribution.PackageDescription
16
16
( PackageDescription )
17
+ import Distribution.PackageDescription.Configuration
18
+ ( flattenPackageDescription )
17
19
import Distribution.PackageDescription.Parse
18
20
( readPackageDescription )
19
21
import Distribution.Simple.Utils
20
- ( defaultPackageDesc , die )
22
+ ( createDirectoryIfMissingVerbose , defaultPackageDesc
23
+ , die , notice , withTempDirectory )
21
24
import Distribution.Client.Setup
22
25
( SDistFlags (.. ), SDistExFlags (.. ), ArchiveFormat (.. ) )
23
26
import Distribution.Simple.Setup
24
- ( fromFlag )
25
- import Distribution.Simple.PreProcess (knownSuffixHandlers )
27
+ ( Flag (.. ), sdistCommand , flagToList , fromFlag , fromFlagOrDefault )
26
28
import Distribution.Simple.BuildPaths ( srcPref )
27
- import Distribution.Simple.Configure (maybeGetPersistBuildConfig )
28
- import Distribution.PackageDescription.Configuration
29
- ( flattenPackageDescription )
30
29
import Distribution.Simple.Program (requireProgram , simpleProgram , programPath )
31
30
import Distribution.Simple.Program.Db (emptyProgramDb )
32
- import Distribution.Text
33
- ( display )
31
+ import Distribution.Text ( display )
32
+ import Distribution.Verbosity (Verbosity )
33
+ import Distribution.Version (Version (.. ), orLaterVersion )
34
34
35
35
import System.FilePath ((</>) , (<.>) )
36
36
import Control.Monad (when , unless )
@@ -42,15 +42,42 @@ import System.Exit (ExitCode(..))
42
42
sdist :: SDistFlags -> SDistExFlags -> IO ()
43
43
sdist flags exflags = do
44
44
pkg <- return . flattenPackageDescription
45
- =<< readPackageDescription verbosity
46
- =<< defaultPackageDesc verbosity
47
- mb_lbi <- maybeGetPersistBuildConfig distPref
45
+ =<< readPackageDescription verbosity
46
+ =<< defaultPackageDesc verbosity
47
+ let withDir = if isOutDirectory then (\ f -> f tmpTargetDir)
48
+ else withTempDirectory verbosity False tmpTargetDir " sdist."
49
+ -- Otherwise 'withTempDir' fails...
50
+ createDirectoryIfMissingVerbose verbosity True tmpTargetDir
51
+ withDir $ \ tmpDir -> do
52
+ let outDir = if isOutDirectory then tmpDir else tmpDir </> tarBallName pkg
53
+ flags' = if isOutDirectory then flags
54
+ else flags { sDistDirectory = Flag outDir }
48
55
49
- sdistWith pkg mb_lbi flags srcPref knownSuffixHandlers createArchive
56
+ createDirectoryIfMissingVerbose verbosity True outDir
57
+
58
+ -- Run 'setup sdist --output-directory=tmpDir'
59
+ setupWrapper verbosity setupOpts (Just pkg) sdistCommand (const flags') []
60
+
61
+ -- And unless we were given --list-sources or --output-directory ourselves,
62
+ -- create an archive.
63
+ unless (isListSources || isOutDirectory) $
64
+ createArchive verbosity pkg tmpDir distPref
50
65
51
66
where
52
- verbosity = fromFlag (sDistVerbosity flags)
53
- distPref = fromFlag (sDistDistPref flags)
67
+ flagEnabled f = not . null . flagToList . f $ flags
68
+
69
+ isListSources = flagEnabled sDistListSources
70
+ isOutDirectory = flagEnabled sDistDirectory
71
+ verbosity = fromFlag (sDistVerbosity flags)
72
+ distPref = fromFlag (sDistDistPref flags)
73
+ tmpTargetDir = fromFlagOrDefault (srcPref distPref) (sDistDirectory flags)
74
+ setupOpts = defaultSetupScriptOptions {
75
+ -- The '--output-directory' sdist flag was introduced in Cabal 1.12, and
76
+ -- '--list-sources' in 1.17.
77
+ useCabalVersion = if isListSources
78
+ then orLaterVersion $ Version [1 ,17 ,0 ] []
79
+ else orLaterVersion $ Version [1 ,12 ,0 ] []
80
+ }
54
81
format = fromFlag (sDistFormat exflags)
55
82
createArchive = case format of
56
83
TargzFormat -> createTarGzArchive
@@ -60,16 +87,18 @@ tarBallName :: PackageDescription -> String
60
87
tarBallName = display . packageId
61
88
62
89
-- | Create a tar.gz archive from a tree of source files.
63
- createTarGzArchive :: CreateArchiveFun
64
- createTarGzArchive _verbosity pkg _mlbi tmpDir targetPref = do
90
+ createTarGzArchive :: Verbosity -> PackageDescription -> FilePath -> FilePath
91
+ -> IO ()
92
+ createTarGzArchive verbosity pkg tmpDir targetPref = do
65
93
createTarGzFile tarBallFilePath tmpDir (tarBallName pkg)
66
- return tarBallFilePath
94
+ notice verbosity $ " Source tarball created: " ++ tarBallFilePath
67
95
where
68
96
tarBallFilePath = targetPref </> tarBallName pkg <.> " tar.gz"
69
97
70
98
-- | Create a zip archive from a tree of source files.
71
- createZipArchive :: CreateArchiveFun
72
- createZipArchive verbosity pkg _mlbi tmpDir targetPref = do
99
+ createZipArchive :: Verbosity -> PackageDescription -> FilePath -> FilePath
100
+ -> IO ()
101
+ createZipArchive verbosity pkg tmpDir targetPref = do
73
102
let dir = tarBallName pkg
74
103
zipfile = targetPref </> dir <.> " zip"
75
104
(zipProg, _) <- requireProgram verbosity zipProgram emptyProgramDb
@@ -94,6 +123,6 @@ createZipArchive verbosity pkg _mlbi tmpDir targetPref = do
94
123
unless (exitCode == ExitSuccess ) $
95
124
die $ " Generating the zip file failed "
96
125
++ " (zip returned exit code " ++ show exitCode ++ " )"
97
- return zipfile
126
+ notice verbosity $ " Source zip archive created: " ++ zipfileAbs
98
127
where
99
128
zipProgram = simpleProgram " zip"
0 commit comments