@@ -11,9 +11,10 @@ import qualified Control.Foldl as Foldl
11
11
import Control.Concurrent.Async (forConcurrently_ )
12
12
import qualified Data.Aeson as Aeson
13
13
import Data.Aeson.Encode.Pretty
14
- import Data.Foldable (fold , for_ , traverse_ )
14
+ import Data.Foldable (fold , foldMap , for_ , traverse_ )
15
15
import qualified Data.Graph as G
16
16
import Data.List (maximumBy , nub )
17
+ import qualified Data.List as List
17
18
import qualified Data.Map as Map
18
19
import Data.Maybe (fromMaybe , mapMaybe )
19
20
import Data.Ord (comparing )
@@ -164,6 +165,17 @@ installOrUpdate set pkgName PackageInfo{ repo, version } = do
164
165
cloneShallow repo version pkgDir
165
166
pure pkgDir
166
167
168
+ getReverseDeps :: PackageSet -> PackageName -> IO [(PackageName , PackageInfo )]
169
+ getReverseDeps db dep =
170
+ nub <$> foldMap go (Map. toList db)
171
+ where
172
+ go pair@ (packageName, PackageInfo {dependencies}) =
173
+ case List. find (== dep) dependencies of
174
+ Nothing -> return mempty
175
+ Just _ -> do
176
+ innerDeps <- getReverseDeps db packageName
177
+ return $ pair : innerDeps
178
+
167
179
getTransitiveDeps :: PackageSet -> [PackageName ] -> IO [(PackageName , PackageInfo )]
168
180
getTransitiveDeps db deps =
169
181
Map. toList . fold <$> traverse (go Set. empty) deps
@@ -412,23 +424,44 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
412
424
isMinorReleaseFrom (x : xs) (y : ys) = y == x && ys > xs
413
425
isMinorReleaseFrom _ _ = False
414
426
427
+ verify :: String -> IO ()
428
+ verify inputName = case mkPackageName (pack inputName) of
429
+ Left pnError -> echoT . pack $ " Error while parsing input package name: " <> show pnError
430
+ Right name -> do
431
+ pkg <- readPackageFile
432
+ db <- readPackageSet pkg
433
+ case name `Map.lookup` db of
434
+ Nothing -> echoT . pack $ " No packages found with the name " <> show (runPackageName $ name)
435
+ Just _ -> do
436
+ reverseDeps <- map fst <$> getReverseDeps db name
437
+ let packages = pure name <> reverseDeps
438
+ echoT (" Verifying " <> pack (show (length packages)) <> " packages." )
439
+ echoT " Warning: this could take some time!"
440
+
441
+ let installOrUpdate' (name_, pkgInfo) = (name_, ) <$> installOrUpdate (set pkg) name_ pkgInfo
442
+ paths <- Map. fromList <$> traverse installOrUpdate' (Map. toList db)
443
+
444
+ traverse_ (verifyPackage db paths) packages
445
+
415
446
verifyPackageSet :: IO ()
416
447
verifyPackageSet = do
417
448
pkg <- readPackageFile
418
449
db <- readPackageSet pkg
419
-
420
450
echoT (" Verifying " <> pack (show (Map. size db)) <> " packages." )
421
451
echoT " Warning: this could take some time!"
422
452
423
453
let installOrUpdate' (name, pkgInfo) = (name, ) <$> installOrUpdate (set pkg) name pkgInfo
424
454
paths <- Map. fromList <$> traverse installOrUpdate' (Map. toList db)
425
455
426
- for_ (Map. toList db) $ \ (name, _) -> do
427
- let dirFor pkgName = fromMaybe (error (" verifyPackageSet: no directory for " <> show pkgName)) (Map. lookup pkgName paths)
428
- echoT (" Verifying package " <> runPackageName name)
429
- dependencies <- map fst <$> getTransitiveDeps db [name]
430
- let srcGlobs = map (pathToTextUnsafe . (</> (" src" </> " **" </> " *.purs" )) . dirFor) dependencies
431
- procs " purs" (" compile" : srcGlobs) empty
456
+ for_ (Map. toList db) $ \ (name, _) -> verifyPackage db paths name
457
+
458
+ verifyPackage :: PackageSet -> Map. Map PackageName Turtle. FilePath -> PackageName -> IO ()
459
+ verifyPackage db paths name = do
460
+ let dirFor pkgName = fromMaybe (error (" verifyPackageSet: no directory for " <> show pkgName)) (Map. lookup pkgName paths)
461
+ echoT (" Verifying package " <> runPackageName name)
462
+ dependencies <- map fst <$> getTransitiveDeps db [name]
463
+ let srcGlobs = map (pathToTextUnsafe . (</> (" src" </> " **" </> " *.purs" )) . dirFor) dependencies
464
+ procs " purs" (" compile" : srcGlobs) empty
432
465
433
466
main :: IO ()
434
467
main = do
@@ -492,8 +525,11 @@ main = do
492
525
(Opts. info (checkForUpdates <$> apply <*> applyMajor Opts. <**> Opts. helper)
493
526
(Opts. progDesc " Check all packages in the package set for new releases" ))
494
527
, Opts. command " verify-set"
495
- (Opts. info (pure verifyPackageSet)
528
+ (Opts. info (pure $ verifyPackageSet)
496
529
(Opts. progDesc " Verify that the packages in the package set build correctly" ))
530
+ , Opts. command " verify"
531
+ (Opts. info (verify <$> pkg Opts. <**> Opts. helper)
532
+ (Opts. progDesc " Verify the named package" ))
497
533
]
498
534
where
499
535
pkg = Opts. strArgument $
0 commit comments