Skip to content

Commit df264d9

Browse files
justinwoopaf31
authored andcommitted
add a single package verification command (#62)
1 parent bf69258 commit df264d9

File tree

1 file changed

+45
-9
lines changed

1 file changed

+45
-9
lines changed

app/Main.hs

+45-9
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ import qualified Control.Foldl as Foldl
1111
import Control.Concurrent.Async (forConcurrently_)
1212
import qualified Data.Aeson as Aeson
1313
import Data.Aeson.Encode.Pretty
14-
import Data.Foldable (fold, for_, traverse_)
14+
import Data.Foldable (fold, foldMap, for_, traverse_)
1515
import qualified Data.Graph as G
1616
import Data.List (maximumBy, nub)
17+
import qualified Data.List as List
1718
import qualified Data.Map as Map
1819
import Data.Maybe (fromMaybe, mapMaybe)
1920
import Data.Ord (comparing)
@@ -164,6 +165,17 @@ installOrUpdate set pkgName PackageInfo{ repo, version } = do
164165
cloneShallow repo version pkgDir
165166
pure pkgDir
166167

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+
167179
getTransitiveDeps :: PackageSet -> [PackageName] -> IO [(PackageName, PackageInfo)]
168180
getTransitiveDeps db deps =
169181
Map.toList . fold <$> traverse (go Set.empty) deps
@@ -412,23 +424,44 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
412424
isMinorReleaseFrom (x : xs) (y : ys) = y == x && ys > xs
413425
isMinorReleaseFrom _ _ = False
414426

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+
415446
verifyPackageSet :: IO ()
416447
verifyPackageSet = do
417448
pkg <- readPackageFile
418449
db <- readPackageSet pkg
419-
420450
echoT ("Verifying " <> pack (show (Map.size db)) <> " packages.")
421451
echoT "Warning: this could take some time!"
422452

423453
let installOrUpdate' (name, pkgInfo) = (name, ) <$> installOrUpdate (set pkg) name pkgInfo
424454
paths <- Map.fromList <$> traverse installOrUpdate' (Map.toList db)
425455

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
432465

433466
main :: IO ()
434467
main = do
@@ -492,8 +525,11 @@ main = do
492525
(Opts.info (checkForUpdates <$> apply <*> applyMajor Opts.<**> Opts.helper)
493526
(Opts.progDesc "Check all packages in the package set for new releases"))
494527
, Opts.command "verify-set"
495-
(Opts.info (pure verifyPackageSet)
528+
(Opts.info (pure $ verifyPackageSet)
496529
(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"))
497533
]
498534
where
499535
pkg = Opts.strArgument $

0 commit comments

Comments
 (0)