@@ -50,6 +50,7 @@ import qualified Data.Map.Strict as M
50
50
import Data.Maybe
51
51
import Data.Maybe.Extra
52
52
import Data.Monoid
53
+ import Data.Set (Set )
53
54
import qualified Data.Set as S
54
55
import Data.Text (Text )
55
56
import qualified Data.Text as T
@@ -149,10 +150,10 @@ resolvePackage packageConfig gpkg = Package
149
150
distDir <- distDirFromDir (parent cabalfp)
150
151
files <- runReaderT (packageDescFiles ty pkg)
151
152
(cabalfp, buildDir distDir)
152
- return $ S. fromList $
153
+ return $
153
154
case ty of
154
155
Modules -> files
155
- AllFiles -> cabalfp : files
156
+ AllFiles -> S. insert cabalfp files
156
157
, packageTools = packageDescTools pkg
157
158
, packageFlags = packageConfigFlags packageConfig
158
159
, packageAllDeps = S. fromList (M. keys deps)
@@ -317,13 +318,13 @@ allBuildInfo' pkg_descr = [ bi | Just lib <- [library pkg_descr]
317
318
-- | Get all files referenced by the package.
318
319
packageDescFiles
319
320
:: (MonadLogger m , MonadIO m , MonadThrow m , MonadReader (Path Abs File , Path Abs Dir ) m , MonadCatch m )
320
- => CabalFileType -> PackageDescription -> m [ Path Abs File ]
321
+ => CabalFileType -> PackageDescription -> m ( Set ( Path Abs File ))
321
322
packageDescFiles ty pkg = do
322
323
libfiles <-
323
- liftM concat (mapM (libraryFiles ty) (maybe [] return (library pkg)))
324
- exefiles <- liftM concat (mapM (executableFiles ty) (executables pkg))
325
- benchfiles <- liftM concat (mapM (benchmarkFiles ty) (benchmarks pkg))
326
- testfiles <- liftM concat (mapM (testFiles ty) (testSuites pkg))
324
+ liftM S. unions (mapM (libraryFiles ty) (maybe [] return (library pkg)))
325
+ exefiles <- liftM S. unions (mapM (executableFiles ty) (executables pkg))
326
+ benchfiles <- liftM S. unions (mapM (benchmarkFiles ty) (benchmarks pkg))
327
+ testfiles <- liftM S. unions (mapM (testFiles ty) (testSuites pkg))
327
328
dfiles <- resolveGlobFiles (map (dataDir pkg FilePath. </> ) (dataFiles pkg))
328
329
srcfiles <- resolveGlobFiles (extraSrcFiles pkg)
329
330
-- extraTmpFiles purposely not included here, as those are files generated
@@ -332,24 +333,23 @@ packageDescFiles ty pkg = do
332
333
docfiles <- resolveGlobFiles (extraDocFiles pkg)
333
334
case ty of
334
335
Modules ->
335
- return (nubOrd ( concat [libfiles, exefiles, testfiles, benchfiles]) )
336
+ return (S. unions [libfiles, exefiles, testfiles, benchfiles])
336
337
AllFiles ->
337
338
return
338
- (nubOrd
339
- (concat
340
- [ libfiles
341
- , exefiles
342
- , dfiles
343
- , srcfiles
344
- , docfiles
345
- , benchfiles
346
- , testfiles]))
339
+ (S. unions
340
+ [ libfiles
341
+ , exefiles
342
+ , dfiles
343
+ , srcfiles
344
+ , docfiles
345
+ , benchfiles
346
+ , testfiles])
347
347
348
348
-- | Resolve globbing of files (e.g. data files) to absolute paths.
349
349
resolveGlobFiles :: (MonadLogger m ,MonadIO m ,MonadThrow m ,MonadReader (Path Abs File , Path Abs Dir ) m ,MonadCatch m )
350
- => [String ] -> m [ Path Abs File ]
350
+ => [String ] -> m ( Set ( Path Abs File ))
351
351
resolveGlobFiles =
352
- liftM (catMaybes . concat ) .
352
+ liftM (S. fromList . catMaybes . concat ) .
353
353
mapM resolve
354
354
where
355
355
resolve name =
@@ -409,7 +409,7 @@ matchDirFileGlob_ dir filepath = case parseFileGlob filepath of
409
409
410
410
-- | Get all files referenced by the benchmark.
411
411
benchmarkFiles :: (MonadLogger m , MonadIO m , MonadThrow m , MonadReader (Path Abs File , Path Abs Dir ) m )
412
- => CabalFileType -> Benchmark -> m [ Path Abs File ]
412
+ => CabalFileType -> Benchmark -> m ( Set ( Path Abs File ))
413
413
benchmarkFiles ty bench = do
414
414
dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
415
415
dir <- asks (parent . fst )
@@ -420,7 +420,7 @@ benchmarkFiles ty bench = do
420
420
names
421
421
haskellModuleExts
422
422
cfiles <- buildCSources ty build
423
- return (rfiles ++ cfiles)
423
+ return (S. union rfiles cfiles)
424
424
where
425
425
names =
426
426
case ty of
@@ -437,7 +437,7 @@ benchmarkFiles ty bench = do
437
437
438
438
-- | Get all files referenced by the test.
439
439
testFiles :: (MonadLogger m , MonadIO m , MonadThrow m , MonadReader (Path Abs File , Path Abs Dir ) m )
440
- => CabalFileType -> TestSuite -> m [ Path Abs File ]
440
+ => CabalFileType -> TestSuite -> m ( Set ( Path Abs File ))
441
441
testFiles ty test = do
442
442
dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
443
443
dir <- asks (parent . fst )
@@ -448,7 +448,7 @@ testFiles ty test = do
448
448
names
449
449
haskellModuleExts
450
450
cfiles <- buildCSources ty build
451
- return (rfiles ++ cfiles)
451
+ return (S. union rfiles cfiles)
452
452
where
453
453
names =
454
454
case ty of
@@ -467,7 +467,7 @@ testFiles ty test = do
467
467
468
468
-- | Get all files referenced by the executable.
469
469
executableFiles :: (MonadLogger m ,MonadIO m ,MonadThrow m ,MonadReader (Path Abs File , Path Abs Dir ) m )
470
- => CabalFileType -> Executable -> m [ Path Abs File ]
470
+ => CabalFileType -> Executable -> m ( Set ( Path Abs File ))
471
471
executableFiles ty exe =
472
472
do dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
473
473
dir <- asks (parent . fst )
@@ -478,7 +478,7 @@ executableFiles ty exe =
478
478
names
479
479
haskellModuleExts
480
480
cfiles <- buildCSources ty build
481
- return (rfiles ++ cfiles)
481
+ return (S. union rfiles cfiles)
482
482
where
483
483
names =
484
484
case ty of
@@ -490,7 +490,7 @@ executableFiles ty exe =
490
490
491
491
-- | Get all files referenced by the library.
492
492
libraryFiles :: (MonadLogger m ,MonadIO m ,MonadThrow m ,MonadReader (Path Abs File , Path Abs Dir ) m )
493
- => CabalFileType -> Library -> m [ Path Abs File ]
493
+ => CabalFileType -> Library -> m ( Set ( Path Abs File ))
494
494
libraryFiles ty lib =
495
495
do dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
496
496
dir <- asks (parent . fst )
@@ -501,7 +501,7 @@ libraryFiles ty lib =
501
501
names
502
502
haskellModuleExts
503
503
cfiles <- buildCSources ty build
504
- return (rfiles ++ cfiles)
504
+ return (S. union rfiles cfiles)
505
505
where
506
506
names =
507
507
case ty of
@@ -513,9 +513,11 @@ libraryFiles ty lib =
513
513
514
514
-- | Get all C sources in a build.
515
515
buildCSources :: (MonadLogger m ,MonadIO m ,MonadThrow m ,MonadReader (Path Abs File , Path Abs Dir ) m )
516
- => CabalFileType -> BuildInfo -> m [Path Abs File ]
517
- buildCSources Modules _ = return []
518
- buildCSources AllFiles build = mapMaybeM resolveFileOrWarn (cSources build)
516
+ => CabalFileType -> BuildInfo -> m (Set (Path Abs File ))
517
+ buildCSources Modules _ =
518
+ return S. empty
519
+ buildCSources AllFiles build =
520
+ liftM S. fromList (mapMaybeM resolveFileOrWarn (cSources build))
519
521
520
522
-- | Get all dependencies of a package, including library,
521
523
-- executables, tests, benchmarks.
@@ -644,7 +646,7 @@ resolveFilesAndDeps
644
646
-> [Path Abs Dir ] -- ^ Directories to look in.
645
647
-> [Either ModuleName String ] -- ^ Base names.
646
648
-> [Text ] -- ^ Extentions.
647
- -> m [ Path Abs File ]
649
+ -> m ( Set ( Path Abs File ))
648
650
resolveFilesAndDeps ty component dirs names0 exts = do
649
651
(moduleFiles,thFiles,foundModules) <- loop names0 S. empty
650
652
cabalfp <- asks fst
@@ -664,27 +666,27 @@ resolveFilesAndDeps ty component dirs names0 exts = do
664
666
Just c -> " for '" ++ c ++ " '" ) ++
665
667
" component (add to other-modules):\n " ++
666
668
intercalate " \n " (map display (S. toList unlistedModules))
667
- return (S. toList moduleFiles ++ thFiles)
669
+ return (S. union moduleFiles thFiles)
668
670
where
669
- loop [] doneModules = return (S. empty, [] , doneModules)
671
+ loop [] doneModules = return (S. empty, S. empty , doneModules)
670
672
loop names doneModules0 = do
671
673
resolvedFiles <- resolveFiles dirs names exts
672
674
pairs <- mapM getDependencies resolvedFiles
673
675
let doneModules' = S. union doneModules0 (S. fromList (lefts names))
674
676
moduleDeps = S. unions (map fst pairs)
675
- thDepFiles = concatMap snd pairs
677
+ thDepFiles = S. unions ( map snd pairs)
676
678
modulesRemaining = S. difference moduleDeps doneModules'
677
679
(moduleDepFiles',thDepFiles',doneModules'') <-
678
680
loop (map Left (S. toList modulesRemaining)) doneModules'
679
681
return
680
682
( S. union (S. fromList resolvedFiles) moduleDepFiles'
681
- , thDepFiles ++ thDepFiles'
683
+ , S. union thDepFiles thDepFiles'
682
684
, doneModules'')
683
685
getDependencies resolvedFile = do
684
686
dir <- asks (parent . fst )
685
687
dumpHIDir <- getDumpHIDir
686
688
case stripDir dir resolvedFile of
687
- Nothing -> return (S. empty, [] )
689
+ Nothing -> return (S. empty, S. empty )
688
690
Just fileRel -> do
689
691
let dumpHIPath =
690
692
FilePath. replaceExtension
@@ -693,7 +695,7 @@ resolveFilesAndDeps ty component dirs names0 exts = do
693
695
dumpHIExists <- liftIO $ doesFileExist dumpHIPath
694
696
if dumpHIExists
695
697
then parseDumpHI dumpHIPath
696
- else return (S. empty, [] )
698
+ else return (S. empty, S. empty )
697
699
parseDumpHI dumpHIPath = do
698
700
dir <- asks (parent . fst )
699
701
dumpHI <- liftIO $ fmap C8. lines (C8. readFile dumpHIPath)
@@ -713,14 +715,15 @@ resolveFilesAndDeps ty component dirs names0 exts = do
713
715
AllFiles ->
714
716
-- The dependent file path is surrounded by quotes but is not escaped.
715
717
-- It can be an absolute or relative path.
718
+ S. fromList $
716
719
mapMaybe
717
720
(parseAbsOrRelFile dir <=<
718
721
(fmap T. unpack .
719
722
(T. stripSuffix " \" " <=< T. stripPrefix " \" " ) .
720
723
T. dropWhileEnd (== ' \r ' ) .
721
724
decodeUtf8 . C8. dropWhile (/= ' "' ))) $
722
725
filter (" addDependentFile \" " `C8.isPrefixOf` ) dumpHI
723
- Modules -> []
726
+ Modules -> S. empty
724
727
return
725
728
(moduleDeps, thDeps)
726
729
getDumpHIDir = do
0 commit comments