@@ -31,7 +31,7 @@ import Distribution.Package
31
31
import Distribution.Simple.Setup
32
32
( Flag (.. ), fromFlag , fromFlagOrDefault , flagToMaybe )
33
33
import Distribution.Simple.Utils
34
- ( notice , die' , info , writeFileAtomic )
34
+ ( notice , die' , info , warn , writeFileAtomic )
35
35
import qualified Distribution.PackageDescription as PD
36
36
import Distribution.Simple.Program
37
37
( programName )
@@ -49,8 +49,11 @@ import qualified Distribution.Client.Tar as Tar (extractTarGzFile)
49
49
import Distribution.Client.IndexUtils
50
50
( getSourcePackagesAtIndexState , TotalIndexState , ActiveRepos )
51
51
import Distribution.Solver.Types.SourcePackage
52
+ import Distribution.PackageDescription.PrettyPrint
53
+ ( writeGenericPackageDescription )
52
54
53
55
import qualified Data.Map as Map
56
+ import Control.Monad ( mapM_ )
54
57
import System.Directory
55
58
( createDirectoryIfMissing , doesDirectoryExist , doesFileExist )
56
59
import System.FilePath
@@ -94,16 +97,26 @@ get verbosity repoCtxt _ getFlags userTargets = do
94
97
unless (null prefix) $
95
98
createDirectoryIfMissing True prefix
96
99
97
- if useSourceRepo
98
- then clone pkgs
99
- else unpack pkgs
100
+ if onlyPkgDescr
101
+ then do
102
+ when useSourceRepo $
103
+ warn verbosity $
104
+ " Ignoring --source-repository for --only-package-description"
105
+
106
+ mapM_ (unpackOnlyPkgDescr verbosity prefix) pkgs
107
+ else
108
+ if useSourceRepo
109
+ then clone pkgs
110
+ else unpack pkgs
100
111
101
112
where
102
113
resolverParams :: SourcePackageDb -> [PackageSpecifier UnresolvedSourcePackage ] -> DepResolverParams
103
114
resolverParams sourcePkgDb pkgSpecifiers =
104
115
-- TODO: add command-line constraint and preference args for unpack
105
116
standardInstallPolicy mempty sourcePkgDb pkgSpecifiers
106
117
118
+ onlyPkgDescr = fromFlagOrDefault False (getOnlyPkgDescr getFlags)
119
+
107
120
prefix :: String
108
121
prefix = fromFlagOrDefault " " (getDestDir getFlags)
109
122
@@ -189,6 +202,23 @@ unpackPackage verbosity prefix pkgid descOverride pkgPath = do
189
202
writeFileAtomic descFilePath pkgtxt
190
203
191
204
205
+ -- | Write a @pkgId.cabal@ file with the package description to the destination
206
+ -- directory, unless one already exists.
207
+ unpackOnlyPkgDescr :: Verbosity -> FilePath -> UnresolvedSourcePackage -> IO ()
208
+ unpackOnlyPkgDescr verbosity dstDir pkg = do
209
+ let pkgFile = dstDir </> prettyShow (packageId pkg) <.> " cabal"
210
+ existsFile <- doesFileExist pkgFile
211
+ when existsFile $ die' verbosity $
212
+ " The file \" " ++ pkgFile ++ " \" already exists, not overwriting."
213
+ existsDir <- doesDirectoryExist (addTrailingPathSeparator pkgFile)
214
+ when existsDir $ die' verbosity $
215
+ " A directory \" " ++ pkgFile ++ " \" is in the way, not unpacking."
216
+ notice verbosity $ " Writing package description to " ++ pkgFile
217
+ case srcpkgDescrOverride pkg of
218
+ Just pkgTxt -> writeFileAtomic pkgFile pkgTxt
219
+ Nothing ->
220
+ writeGenericPackageDescription pkgFile (srcpkgDescription pkg)
221
+
192
222
-- ------------------------------------------------------------
193
223
-- * Cloning packages from their declared source repositories
194
224
-- ------------------------------------------------------------
0 commit comments