From 9787db2ee718d6eb01a20bb6999d2c1ac42a44b3 Mon Sep 17 00:00:00 2001 From: Gareth Daniel Smith Date: Thu, 3 Oct 2019 14:05:48 +0100 Subject: [PATCH 1/2] Make `spago verify-set` fail if there are duplicate module names. --- CHANGELOG.md | 1 + src/Spago/Packages.hs | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4897daccf..428f2ac1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ New features: - Add `--open` flag to `spago docs` which opens generated docs in browser (#379) - Support building for alternate backends (#355). E.g: Use `backend = "psgo"` entry in `spago.dhall` to compile with `psgo` - Add `--no-comments` flag to `spago init` which strips comments from the generated `spago.dhall` and `packages.dhall` configs (#417) +- Make `spago verify-set` compile everything, to detect duplicate module names. Bugfixes: - Warn (but don't error) when trying to watch missing directories (#406) diff --git a/src/Spago/Packages.hs b/src/Spago/Packages.hs index cf46df904..20adbe569 100644 --- a/src/Spago/Packages.hs +++ b/src/Spago/Packages.hs @@ -312,7 +312,9 @@ verify cacheFlag maybePackage = do Config{ packageSet = packageSet@PackageSet{..}, ..} <- Config.ensureConfig case maybePackage of -- If no package is specified, verify all of them - Nothing -> verifyPackages packageSet (Map.toList packagesDB) + Nothing -> do + verifyPackages packageSet (Map.toList packagesDB) + compileEverything packageSet -- In case we have a package, search in the package set for it Just packageName -> do case Map.lookup packageName packagesDB of @@ -340,3 +342,12 @@ verify cacheFlag maybePackage = do echo $ "Verifying package " <> quotedName Purs.compile globs [] echo $ "Successfully verified " <> quotedName + + compileEverything :: Spago m => PackageSet -> m () + compileEverything PackageSet{..} = do + let deps = Map.toList packagesDB + globs = getGlobs deps DepsOnly [] + Fetch.fetchPackages cacheFlag deps packagesMinPursVersion + echo "Compiling everything (will fail if module names conflict)" + Purs.compile globs [] + echo "Successfully compiled everything" From 243a7bb58402a11f060bdf9cc5daf70aa87536ed Mon Sep 17 00:00:00 2001 From: Gareth Daniel Smith Date: Sat, 5 Oct 2019 09:35:54 +0100 Subject: [PATCH 2/2] Add a --no-check-modules-unique flag to `spago verify-set` --- app/Spago.hs | 11 ++++++----- src/Spago/Packages.hs | 11 ++++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/Spago.hs b/app/Spago.hs index fdb5ab575..df1a9168e 100644 --- a/app/Spago.hs +++ b/app/Spago.hs @@ -21,7 +21,7 @@ import Spago.DryRun (DryRun (..)) import qualified Spago.GitHub import Spago.GlobalCache (CacheFlag (..)) import Spago.Messages as Messages -import Spago.Packages (JsonFlag (..), PackagesFilter (..)) +import Spago.Packages (CheckModulesUnique (..), JsonFlag (..), PackagesFilter (..)) import qualified Spago.Packages import qualified Spago.Purs as Purs import Spago.Types @@ -60,7 +60,7 @@ data Command | Verify (Maybe CacheFlag) PackageName -- | Verify that the Package Set is correct - | VerifySet (Maybe CacheFlag) + | VerifySet (Maybe CacheFlag) CheckModulesUnique -- | Test the project with some module, default Test.Main | Test (Maybe ModuleName) BuildOptions [ExtraArg] @@ -143,6 +143,7 @@ parser = do openDocs = bool NoOpenDocs DoOpenDocs <$> CLI.switch "open" 'o' "Open generated documentation in browser (for HTML format only)" noComments = bool WithComments NoComments <$> CLI.switch "no-comments" 'C' "Generate package.dhall and spago.dhall files without tutorial comments" configPath = CLI.optional $ CLI.optText "config" 'x' "Optional config path to be used instead of the default spago.dhall" + chkModsUniq = bool DoCheckModulesUnique NoCheckModulesUnique <$> CLI.switch "no-check-modules-unique" 'M' "Skip checking whether modules names are unique across all packages." mainModule = CLI.optional $ CLI.opt (Just . ModuleName) "main" 'm' "Module to be used as the application's entry point" toTarget = CLI.optional $ CLI.opt (Just . TargetPath) "to" 't' "The target file path" @@ -264,7 +265,7 @@ parser = do verifySet = ( "verify-set" , "Verify that the whole Package Set builds correctly" - , VerifySet <$> cacheFlag + , VerifySet <$> cacheFlag <*> chkModsUniq ) upgradeSet = @@ -338,8 +339,8 @@ main = do Install cacheConfig packageNames -> Spago.Packages.install cacheConfig packageNames ListPackages packagesFilter jsonFlag -> Spago.Packages.listPackages packagesFilter jsonFlag Sources -> Spago.Packages.sources - Verify cacheConfig package -> Spago.Packages.verify cacheConfig (Just package) - VerifySet cacheConfig -> Spago.Packages.verify cacheConfig Nothing + Verify cacheConfig package -> Spago.Packages.verify cacheConfig NoCheckModulesUnique (Just package) + VerifySet cacheConfig chkModsUniq -> Spago.Packages.verify cacheConfig chkModsUniq Nothing PackageSetUpgrade -> Spago.Packages.upgradePackageSet Freeze -> Spago.Packages.freeze Spago.Packages.packagesPath Build buildOptions -> Spago.Build.build buildOptions Nothing diff --git a/src/Spago/Packages.hs b/src/Spago/Packages.hs index 20adbe569..0cd6db31f 100644 --- a/src/Spago/Packages.hs +++ b/src/Spago/Packages.hs @@ -12,6 +12,7 @@ module Spago.Packages , PackageSet.freeze , PackageSet.packagesPath , PackagesFilter(..) + , CheckModulesUnique(..) , JsonFlag(..) , DepsOnly(..) ) where @@ -306,15 +307,16 @@ sources = do pure () -verify :: Spago m => Maybe CacheFlag -> Maybe PackageName -> m () -verify cacheFlag maybePackage = do +data CheckModulesUnique = DoCheckModulesUnique | NoCheckModulesUnique + +verify :: Spago m => Maybe CacheFlag -> CheckModulesUnique -> Maybe PackageName -> m () +verify cacheFlag chkModsUniq maybePackage = do echoDebug "Running `spago verify`" Config{ packageSet = packageSet@PackageSet{..}, ..} <- Config.ensureConfig case maybePackage of -- If no package is specified, verify all of them Nothing -> do verifyPackages packageSet (Map.toList packagesDB) - compileEverything packageSet -- In case we have a package, search in the package set for it Just packageName -> do case Map.lookup packageName packagesDB of @@ -327,6 +329,9 @@ verify cacheFlag maybePackage = do reverseDeps <- liftIO $ getReverseDeps packageSet packageName let toVerify = [(packageName, package)] <> reverseDeps verifyPackages packageSet toVerify + case chkModsUniq of + DoCheckModulesUnique -> compileEverything packageSet + NoCheckModulesUnique -> pure () where verifyPackages :: Spago m => PackageSet -> [(PackageName, Package)] -> m () verifyPackages packageSet packages = do