@@ -12,7 +12,7 @@ import Data.Aeson.Encode.Pretty
12import Data.Foldable (fold, for_, traverse_)
12import Data.Foldable (fold, for_, traverse_)
13import Data.List (nub)
13import Data.List (nub)
14import qualified Data.Map as Map
14import qualified Data.Map as Map
15−import Data.Maybe (mapMaybe)
15+import Data.Maybe (fromMaybe, mapMaybe)
16import qualified Data.Set as Set
16import qualified Data.Set as Set
17import Data.Text (pack)
17import Data.Text (pack)
18import qualified Data.Text.Lazy as TL
18import qualified Data.Text.Lazy as TL
@@ -128,11 +128,13 @@ readPackageSet PackageConfig{ set } = do
128 exit (ExitFailure 1)
128 exit (ExitFailure 1)
129 Just db -> return db
129 Just db -> return db
131−installOrUpdate :: PackageConfig -> Text -> PackageInfo -> IO ()
131+installOrUpdate :: Text -> Text -> PackageInfo -> IO Turtle.FilePath
132−installOrUpdate PackageConfig{ set } pkgName PackageInfo{ repo, version } = do
132+installOrUpdate set pkgName PackageInfo{ repo, version } = do
133+ echo ("Updating " <> pkgName)
133 let pkgDir = ".psc-package" </> fromText set </> fromText pkgName </> fromText version
134 let pkgDir = ".psc-package" </> fromText set </> fromText pkgName </> fromText version
134 exists <- testdir pkgDir
135 exists <- testdir pkgDir
135 unless exists . void $ cloneShallow repo version pkgDir
136 unless exists . void $ cloneShallow repo version pkgDir
137getTransitiveDeps :: PackageSet -> [Text] -> IO [(Text, PackageInfo)]
139getTransitiveDeps :: PackageSet -> [Text] -> IO [(Text, PackageInfo)]
138getTransitiveDeps db depends = do
140getTransitiveDeps db depends = do
@@ -151,9 +153,7 @@ updateImpl config@PackageConfig{ depends } = do
151 db <- readPackageSet config
153 db <- readPackageSet config
152 trans <- getTransitiveDeps db depends
154 trans <- getTransitiveDeps db depends
153 echo ("Updating " <> pack (show (length trans)) <> " packages...")
155 echo ("Updating " <> pack (show (length trans)) <> " packages...")
154− for_ trans $ \(pkgName, pkg) -> do
155− echo ("Updating " <> pkgName)
156− installOrUpdate config pkgName pkg
156+ for_ trans $ \(pkgName, pkg) -> installOrUpdate (set config) pkgName pkg
158initialize :: IO ()
158initialize :: IO ()
159initialize = do
159initialize = do
@@ -233,6 +233,23 @@ exec exeName = do
233 (map pathToTextUnsafe ("src" </> "**" </> "*.purs" : paths))
233 (map pathToTextUnsafe ("src" </> "**" </> "*.purs" : paths))
236+verifyPackageSet :: IO ()
237+verifyPackageSet = do
238+ pkg <- readPackageFile
239+ db <- readPackageSet pkg
241+ echo ("Verifying " <> pack (show (Map.size db)) <> " packages.")
242+ echo "Warning: this could take some time!"
244+ let installOrUpdate' (name, pkgInfo) = (name, ) <$> installOrUpdate (set pkg) name pkgInfo
245+ paths <- Map.fromList <$> traverse installOrUpdate' (Map.toList db)
247+ for_ (Map.toList db) $ \(name, PackageInfo{..}) -> do
248+ let dirFor = fromMaybe (error "verifyPackageSet: no directory") . (`Map.lookup` paths)
249+ echo ("Verifying package " <> name)
250+ let srcGlobs = map (pathToTextUnsafe . (</> ("src" </> "**" </> "*.purs")) . dirFor) (name : dependencies)
251+ procs "psc" srcGlobs empty
236main :: IO ()
253main :: IO ()
238 IO.hSetEncoding IO.stdout IO.utf8
255 IO.hSetEncoding IO.stdout IO.utf8
@@ -275,6 +292,9 @@ main = do
275 , Opts.command "available"
292 , Opts.command "available"
276 (Opts.info (pure listPackages)
293 (Opts.info (pure listPackages)
277 (Opts.progDesc "List all packages available in the package set"))
294 (Opts.progDesc "List all packages available in the package set"))
295+ , Opts.command "verify-set"
296+ (Opts.info (pure verifyPackageSet)
297+ (Opts.progDesc "Verify that the packages in the package set build correctly"))
280 pkg = Opts.strArgument $
300 pkg = Opts.strArgument $