Skip to content
Snippets Groups Projects
Commit cf1bf417 authored by Oleg Grenrus's avatar Oleg Grenrus
Browse files

Resolve #7124: sdist tells which package fails

parent 119de0d0
No related branches found
No related tags found
No related merge requests found
Showing
with 91 additions and 21 deletions
...@@ -18,6 +18,7 @@ module Distribution.Simple.Glob ( ...@@ -18,6 +18,7 @@ module Distribution.Simple.Glob (
GlobSyntaxError(..), GlobSyntaxError(..),
GlobResult(..), GlobResult(..),
matchDirFileGlob, matchDirFileGlob,
matchDirFileGlobWithDie,
runDirFileGlob, runDirFileGlob,
fileGlobMatches, fileGlobMatches,
parseFileGlob, parseFileGlob,
...@@ -220,24 +221,37 @@ parseFileGlob version filepath = case reverse (splitDirectories filepath) of ...@@ -220,24 +221,37 @@ parseFileGlob version filepath = case reverse (splitDirectories filepath) of
-- prefix. -- prefix.
-- --
-- The second 'FilePath' is the glob itself. -- The second 'FilePath' is the glob itself.
--
matchDirFileGlob :: Verbosity -> CabalSpecVersion -> FilePath -> FilePath -> IO [FilePath] matchDirFileGlob :: Verbosity -> CabalSpecVersion -> FilePath -> FilePath -> IO [FilePath]
matchDirFileGlob verbosity version dir filepath = case parseFileGlob version filepath of matchDirFileGlob v = matchDirFileGlobWithDie v die'
Left err -> die' verbosity $ explainGlobSyntaxError filepath err
-- | Like 'matchDirFileGlob' but with customizable 'die'
--
-- @since 3.6.0.0
--
matchDirFileGlobWithDie :: Verbosity -> (Verbosity -> String -> IO [FilePath]) -> CabalSpecVersion -> FilePath -> FilePath -> IO [FilePath]
matchDirFileGlobWithDie verbosity rip version dir filepath = case parseFileGlob version filepath of
Left err -> rip verbosity $ explainGlobSyntaxError filepath err
Right glob -> do Right glob -> do
results <- runDirFileGlob verbosity dir glob results <- runDirFileGlob verbosity dir glob
let missingDirectories = let missingDirectories =
[ missingDir | GlobMissingDirectory missingDir <- results ] [ missingDir | GlobMissingDirectory missingDir <- results ]
matches = globMatches results matches = globMatches results
-- Check for missing directories first, since we'll obviously have
-- no matches in that case. let errors :: [String]
for_ missingDirectories $ \ missingDir -> errors =
die' verbosity $ [ "filepath wildcard '" ++ filepath ++ "' refers to the directory"
"filepath wildcard '" ++ filepath ++ "' refers to the directory" ++ " '" ++ missingDir ++ "', which does not exist or is not a directory."
++ " '" ++ missingDir ++ "', which does not exist or is not a directory." | missingDir <- missingDirectories
when (null matches) $ die' verbosity $ ]
"filepath wildcard '" ++ filepath ++
++ "' does not match any files." [ "filepath wildcard '" ++ filepath ++ "' does not match any files."
return matches | null matches
]
if null errors
then return matches
else rip verbosity $ unlines errors
-- | Match files against a pre-parsed glob, starting in a directory. -- | Match files against a pre-parsed glob, starting in a directory.
-- --
......
...@@ -54,7 +54,7 @@ import Distribution.ModuleName ...@@ -54,7 +54,7 @@ import Distribution.ModuleName
import qualified Distribution.ModuleName as ModuleName import qualified Distribution.ModuleName as ModuleName
import Distribution.Version import Distribution.Version
import Distribution.Simple.Configure (findDistPrefOrDefault) import Distribution.Simple.Configure (findDistPrefOrDefault)
import Distribution.Simple.Glob import Distribution.Simple.Glob (matchDirFileGlobWithDie)
import Distribution.Simple.Utils import Distribution.Simple.Utils
import Distribution.Simple.Setup import Distribution.Simple.Setup
import Distribution.Simple.PreProcess import Distribution.Simple.PreProcess
...@@ -223,16 +223,16 @@ listPackageSources' verbosity rip cwd pkg_descr pps = ...@@ -223,16 +223,16 @@ listPackageSources' verbosity rip cwd pkg_descr pps =
let srcDataDirRaw = dataDir pkg_descr let srcDataDirRaw = dataDir pkg_descr
srcDataDir | null srcDataDirRaw = "." srcDataDir | null srcDataDirRaw = "."
| otherwise = srcDataDirRaw | otherwise = srcDataDirRaw
matchDirFileGlob verbosity (specVersion pkg_descr) cwd (srcDataDir </> filename) matchDirFileGlobWithDie verbosity rip (specVersion pkg_descr) cwd (srcDataDir </> filename)
-- Extra source files. -- Extra source files.
, fmap concat . for (extraSrcFiles pkg_descr) $ \fpath -> , fmap concat . for (extraSrcFiles pkg_descr) $ \fpath ->
matchDirFileGlob verbosity (specVersion pkg_descr) cwd fpath matchDirFileGlobWithDie verbosity rip (specVersion pkg_descr) cwd fpath
-- Extra doc files. -- Extra doc files.
, fmap concat , fmap concat
. for (extraDocFiles pkg_descr) $ \ filename -> . for (extraDocFiles pkg_descr) $ \ filename ->
matchDirFileGlob verbosity (specVersion pkg_descr) cwd filename matchDirFileGlobWithDie verbosity rip (specVersion pkg_descr) cwd filename
-- License file(s). -- License file(s).
, return (licenseFiles pkg_descr) , return (licenseFiles pkg_descr)
......
...@@ -50,7 +50,7 @@ import Distribution.Simple.Setup ...@@ -50,7 +50,7 @@ import Distribution.Simple.Setup
, optionVerbosity, optionDistPref, trueArg, configVerbosity, configDistPref , optionVerbosity, optionDistPref, trueArg, configVerbosity, configDistPref
) )
import Distribution.Simple.SrcDist import Distribution.Simple.SrcDist
( listPackageSources ) ( listPackageSourcesWithDie )
import Distribution.Client.SrcDist import Distribution.Client.SrcDist
( packageDirToSdist ) ( packageDirToSdist )
import Distribution.Simple.Utils import Distribution.Simple.Utils
...@@ -61,6 +61,7 @@ import Distribution.Types.PackageName ...@@ -61,6 +61,7 @@ import Distribution.Types.PackageName
( PackageName, unPackageName ) ( PackageName, unPackageName )
import Distribution.Verbosity import Distribution.Verbosity
( normal ) ( normal )
import Distribution.Types.GenericPackageDescription (GenericPackageDescription)
import qualified Data.ByteString.Lazy.Char8 as BSL import qualified Data.ByteString.Lazy.Char8 as BSL
import System.Directory import System.Directory
...@@ -250,7 +251,13 @@ packageToSdist verbosity projectRootDir format outputFile pkg = do ...@@ -250,7 +251,13 @@ packageToSdist verbosity projectRootDir format outputFile pkg = do
Right dir -> case format of Right dir -> case format of
SourceList nulSep -> do SourceList nulSep -> do
files' <- listPackageSources verbosity dir (flattenPackageDescription $ srcpkgDescription pkg) knownSuffixHandlers let gpd :: GenericPackageDescription
gpd = srcpkgDescription pkg
let thisDie :: Verbosity -> String -> IO a
thisDie v s = die' v $ "sdist of " <> prettyShow (packageId gpd) ++ ": " ++ s
files' <- listPackageSourcesWithDie verbosity thisDie dir (flattenPackageDescription gpd) knownSuffixHandlers
let files = nub $ sort $ map normalise files' let files = nub $ sort $ map normalise files'
let prefix = makeRelative projectRootDir dir let prefix = makeRelative projectRootDir dir
write $ concat [prefix </> i ++ [nulSep] | i <- files] write $ concat [prefix </> i ++ [nulSep] | i <- files]
......
...@@ -18,7 +18,6 @@ import Distribution.Package (Package (packageId)) ...@@ -18,7 +18,6 @@ import Distribution.Package (Package (packageId))
import Distribution.PackageDescription.Configuration (flattenPackageDescription) import Distribution.PackageDescription.Configuration (flattenPackageDescription)
import Distribution.PackageDescription.Parsec (readGenericPackageDescription) import Distribution.PackageDescription.Parsec (readGenericPackageDescription)
import Distribution.Simple.PreProcess (knownSuffixHandlers) import Distribution.Simple.PreProcess (knownSuffixHandlers)
import Distribution.Simple.SrcDist (listPackageSources)
import Distribution.Simple.SrcDist (listPackageSourcesWithDie) import Distribution.Simple.SrcDist (listPackageSourcesWithDie)
import Distribution.Simple.Utils (die') import Distribution.Simple.Utils (die')
import Distribution.Types.GenericPackageDescription (GenericPackageDescription) import Distribution.Types.GenericPackageDescription (GenericPackageDescription)
...@@ -52,7 +51,10 @@ packageDirToSdist ...@@ -52,7 +51,10 @@ packageDirToSdist
-> FilePath -- ^ directory containing that GPD -> FilePath -- ^ directory containing that GPD
-> IO BSL.ByteString -- ^ resulting sdist tarball -> IO BSL.ByteString -- ^ resulting sdist tarball
packageDirToSdist verbosity gpd dir = do packageDirToSdist verbosity gpd dir = do
files' <- listPackageSources verbosity dir (flattenPackageDescription gpd) knownSuffixHandlers let thisDie :: Verbosity -> String -> IO a
thisDie v s = die' v $ "sdist of " <> prettyShow (packageId gpd) ++ ": " ++ s
files' <- listPackageSourcesWithDie verbosity thisDie dir (flattenPackageDescription gpd) knownSuffixHandlers
let files = nub $ sort $ map normalise files' let files = nub $ sort $ map normalise files'
let entriesM :: StateT (Set.Set FilePath) (WriterT [Tar.Entry] IO) () let entriesM :: StateT (Set.Set FilePath) (WriterT [Tar.Entry] IO) ()
......
# cabal v2-sdist # cabal v2-sdist
cabal: filepath wildcard './actually-a-directory' does not match any files. cabal: sdist of t5195-0: filepath wildcard './actually-a-directory' does not match any files.
# cabal v2-sdist
Wrote source list to <TMPDIR>/pkg-a-0.list
cabal: sdist of pkg-b-0: filepath wildcard './data.txt' does not match any files.
import Test.Cabal.Prelude
-- Issue 7124
-- when we sdist, error should tell which package caused the failure
main :: IO ()
main = cabalTest $ do
tmpdir <- fmap testTmpDir getTestEnv
fails $ cabal "v2-sdist" ["--ignore-project", "--list-only", "--output-directory", tmpdir, "all"]
# cabal v2-sdist
Wrote tarball sdist to <TMPDIR>/pkg-a-0.tar.gz
cabal: sdist of pkg-b-0: filepath wildcard './data.txt' does not match any files.
packages: pkg-a/*.cabal
packages: pkg-b/*.cabal
import Test.Cabal.Prelude
-- Issue 7124
-- when we sdist, error should tell which package caused the failure
main :: IO ()
main = cabalTest $ do
tmpdir <- fmap testTmpDir getTestEnv
fails $ cabal "v2-sdist" ["--ignore-project", "--output-directory", tmpdir, "all"]
main = putStrLn "hi"
Lorem Ipsum
cabal-version: 2.2
name: pkg-a
version: 0
data-files: data.txt
executable foo
default-language: Haskell2010
main-is: Main.hs
main = putStrLn "hi"
cabal-version: 2.2
name: pkg-b
version: 0
data-files: data.txt
executable foo
default-language: Haskell2010
main-is: Main.hs
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment