1
- {-# LANGUAGE CPP #-}
2
- {-# LANGUAGE NondecreasingIndentation #-}
3
- {-# LANGUAGE FlexibleContexts #-}
4
- -- Implements the \"@.\/cabal sdist@\" command, which creates a source
5
- -- distribution for this package. That is, packs up the source code
6
- -- into a tarball, making use of the corresponding Cabal module.
1
+ -- | Utilities to implemenet cabal @v2-sdist@.
7
2
module Distribution.Client.SrcDist (
8
- sdist ,
9
- allPackageSourceFiles
10
- ) where
3
+ allPackageSourceFiles ,
4
+ ) where
11
5
12
6
13
- import Distribution.Client.SetupWrapper
14
- ( SetupScriptOptions ( .. ), defaultSetupScriptOptions , setupWrapper )
15
- import Distribution.Client.Tar ( createTarGzFile )
7
+ import Control.Exception ( IOException , evaluate )
8
+ import System.Directory ( getTemporaryDirectory )
9
+ import System.FilePath ( (</>) )
16
10
17
- import Distribution.Package
18
- ( Package (.. ), packageName )
19
- import Distribution.PackageDescription
20
- ( PackageDescription )
21
- import Distribution.PackageDescription.Configuration
22
- ( flattenPackageDescription )
23
- import Distribution.PackageDescription.Parsec
24
- ( readGenericPackageDescription )
25
- import Distribution.Simple.Utils
26
- ( createDirectoryIfMissingVerbose , defaultPackageDesc
27
- , warn , notice , withTempDirectory )
28
- import Distribution.Client.Setup
29
- ( SDistFlags (.. ) )
30
- import Distribution.Simple.Setup
31
- ( Flag (.. ), sdistCommand , flagToList , fromFlag , fromFlagOrDefault
32
- , defaultSDistFlags )
33
- import Distribution.Simple.BuildPaths ( srcPref )
34
- import Distribution.Deprecated.Text ( display )
35
- import Distribution.Verbosity (Verbosity , normal , lessVerbose )
36
- import Distribution.Version (mkVersion , orLaterVersion , intersectVersionRanges )
37
-
38
- import Distribution.Client.Utils
39
- (tryFindAddSourcePackageDesc )
40
11
import Distribution.Compat.Exception (catchIO )
41
-
42
- import System.FilePath ((</>) , (<.>) )
43
- import Control.Monad (when , unless , liftM )
44
- import System.Directory (getTemporaryDirectory )
45
- import Control.Exception (IOException , evaluate )
46
-
47
- -- | Create a source distribution.
48
- sdist :: SDistFlags -> IO ()
49
- sdist flags = do
50
- pkg <- liftM flattenPackageDescription
51
- (readGenericPackageDescription verbosity =<< defaultPackageDesc verbosity)
52
- let withDir :: (FilePath -> IO a ) -> IO a
53
- withDir = if not needMakeArchive then \ f -> f tmpTargetDir
54
- else withTempDirectory verbosity tmpTargetDir " sdist."
55
- -- 'withTempDir' fails if we don't create 'tmpTargetDir'...
56
- when needMakeArchive $
57
- createDirectoryIfMissingVerbose verbosity True tmpTargetDir
58
- withDir $ \ tmpDir -> do
59
- let outDir = if isOutDirectory then tmpDir else tmpDir </> tarBallName pkg
60
- flags' = (if not needMakeArchive then flags
61
- else flags { sDistDirectory = Flag outDir })
62
- unless isListSources $
63
- createDirectoryIfMissingVerbose verbosity True outDir
64
-
65
- -- Run 'setup sdist --output-directory=tmpDir' (or
66
- -- '--list-source'/'--output-directory=someOtherDir') in case we were passed
67
- -- those options.
68
- setupWrapper verbosity setupOpts (Just pkg) sdistCommand (const flags') (const [] )
69
-
70
- -- Unless we were given --list-sources or --output-directory ourselves,
71
- -- create an archive.
72
- when needMakeArchive $
73
- createTarGzArchive verbosity pkg tmpDir distPref
74
-
75
- when isOutDirectory $
76
- notice verbosity $ " Source directory created: " ++ tmpTargetDir
77
-
78
- when isListSources $
79
- notice verbosity $ " List of package sources written to file '"
80
- ++ (fromFlag . sDistListSources $ flags) ++ " '"
81
-
82
- where
83
- flagEnabled f = not . null . flagToList . f $ flags
84
-
85
- isListSources = flagEnabled sDistListSources
86
- isOutDirectory = flagEnabled sDistDirectory
87
- needMakeArchive = not (isListSources || isOutDirectory)
88
- verbosity = fromFlag (sDistVerbosity flags)
89
- distPref = fromFlag (sDistDistPref flags)
90
- tmpTargetDir = fromFlagOrDefault (srcPref distPref) (sDistDirectory flags)
91
- setupOpts = defaultSetupScriptOptions {
92
- useDistPref = distPref,
93
- -- The '--output-directory' sdist flag was introduced in Cabal 1.12, and
94
- -- '--list-sources' in 1.17.
95
- useCabalVersion = if isListSources
96
- then orLaterVersion $ mkVersion [1 ,17 ,0 ]
97
- else orLaterVersion $ mkVersion [1 ,12 ,0 ]
98
- }
99
-
100
- tarBallName :: PackageDescription -> String
101
- tarBallName = display . packageId
102
-
103
- -- | Create a tar.gz archive from a tree of source files.
104
- createTarGzArchive :: Verbosity -> PackageDescription -> FilePath -> FilePath
105
- -> IO ()
106
- createTarGzArchive verbosity pkg tmpDir targetPref = do
107
- createTarGzFile tarBallFilePath tmpDir (tarBallName pkg)
108
- notice verbosity $ " Source tarball created: " ++ tarBallFilePath
109
- where
110
- tarBallFilePath = targetPref </> tarBallName pkg <.> " tar.gz"
12
+ import Distribution.Package (packageName )
13
+ import Distribution.PackageDescription.Configuration (flattenPackageDescription )
14
+ import Distribution.PackageDescription.Parsec (readGenericPackageDescription )
15
+ import Distribution.Pretty (prettyShow )
16
+ import Distribution.Simple.Setup (Flag (.. ), defaultSDistFlags , sdistCommand )
17
+ import Distribution.Simple.Utils (warn , withTempDirectory )
18
+ import Distribution.Verbosity (Verbosity , lessVerbose , normal )
19
+ import Distribution.Version (intersectVersionRanges , mkVersion , orLaterVersion )
20
+
21
+ import Distribution.Client.Setup (SDistFlags (.. ))
22
+ import Distribution.Client.SetupWrapper (SetupScriptOptions (.. ), setupWrapper )
23
+ import Distribution.Client.Utils (tryFindAddSourcePackageDesc )
111
24
112
25
-- | List all source files of a given add-source dependency. Exits with error if
113
26
-- something is wrong (e.g. there is no .cabal file in the given directory).
@@ -120,36 +33,36 @@ allPackageSourceFiles verbosity setupOpts0 packageDir = do
120
33
flattenPackageDescription `fmap` readGenericPackageDescription verbosity desc
121
34
globalTmp <- getTemporaryDirectory
122
35
withTempDirectory verbosity globalTmp " cabal-list-sources." $ \ tempDir -> do
123
- let file = tempDir </> " cabal-sdist-list-sources"
124
- flags = defaultSDistFlags {
125
- sDistVerbosity = Flag $ if verbosity == normal
126
- then lessVerbose verbosity else verbosity,
127
- sDistListSources = Flag file
128
- }
129
- setupOpts = setupOpts0 {
130
- -- 'sdist --list-sources' was introduced in Cabal 1.18.
131
- useCabalVersion = intersectVersionRanges
132
- (orLaterVersion $ mkVersion [1 ,18 ,0 ])
133
- (useCabalVersion setupOpts0),
134
- useWorkingDir = Just packageDir
135
- }
136
-
137
- doListSources :: IO [FilePath ]
138
- doListSources = do
139
- setupWrapper verbosity setupOpts (Just pkg) sdistCommand (const flags) (const [] )
140
- fmap lines . readFile $ file
141
-
142
- onFailedListSources :: IOException -> IO ()
143
- onFailedListSources e = do
144
- warn verbosity $
145
- " Could not list sources of the package '"
146
- ++ display (packageName pkg) ++ " '."
147
- warn verbosity $
148
- " Exception was: " ++ show e
149
-
150
- -- Run setup sdist --list-sources=TMPFILE
151
- r <- doListSources `catchIO` (\ e -> onFailedListSources e >> return [] )
152
- -- Ensure that we've closed the 'readFile' handle before we exit the
153
- -- temporary directory.
154
- _ <- evaluate (length r)
155
- return r
36
+ let file = tempDir </> " cabal-sdist-list-sources"
37
+ flags = defaultSDistFlags {
38
+ sDistVerbosity = Flag $ if verbosity == normal
39
+ then lessVerbose verbosity else verbosity,
40
+ sDistListSources = Flag file
41
+ }
42
+ setupOpts = setupOpts0 {
43
+ -- 'sdist --list-sources' was introduced in Cabal 1.18.
44
+ useCabalVersion = intersectVersionRanges
45
+ (orLaterVersion $ mkVersion [1 ,18 ,0 ])
46
+ (useCabalVersion setupOpts0),
47
+ useWorkingDir = Just packageDir
48
+ }
49
+
50
+ doListSources :: IO [FilePath ]
51
+ doListSources = do
52
+ setupWrapper verbosity setupOpts (Just pkg) sdistCommand (const flags) (const [] )
53
+ fmap lines . readFile $ file
54
+
55
+ onFailedListSources :: IOException -> IO ()
56
+ onFailedListSources e = do
57
+ warn verbosity $
58
+ " Could not list sources of the package '"
59
+ ++ prettyShow (packageName pkg) ++ " '."
60
+ warn verbosity $
61
+ " Exception was: " ++ show e
62
+
63
+ -- Run setup sdist --list-sources=TMPFILE
64
+ r <- doListSources `catchIO` (\ e -> onFailedListSources e >> return [] )
65
+ -- Ensure that we've closed the 'readFile' handle before we exit the
66
+ -- temporary directory.
67
+ _ <- evaluate (length r)
68
+ return r
0 commit comments