Skip to content

Commit

Permalink
Build workspace packages in top-sorted order (#1018)
Browse files Browse the repository at this point in the history
  • Loading branch information
JordanMartinez authored Oct 5, 2023
1 parent 90ada7d commit 8ccaff1
Show file tree
Hide file tree
Showing 23 changed files with 1,020 additions and 291 deletions.
27 changes: 14 additions & 13 deletions bin/src/Main.purs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import Spago.Command.Repl as Repl
import Spago.Command.Run as Run
import Spago.Command.Sources as Sources
import Spago.Command.Test as Test
import Spago.Config (BundleConfig, BundlePlatform(..), BundleType(..), Package, RunConfig, TestConfig)
import Spago.Config (BundleConfig, BundlePlatform(..), BundleType(..), RunConfig, TestConfig, PackageMap)
import Spago.Config as Config
import Spago.Core.Config as Core
import Spago.Db as Db
Expand All @@ -54,6 +54,7 @@ import Spago.Log (LogVerbosity(..))
import Spago.Paths as Paths
import Spago.Purs as Purs
import Spago.Registry as Registry
import Spago.Repl as SpagoRepl
import Unsafe.Coerce as UnsafeCoerce

type GlobalArgs =
Expand Down Expand Up @@ -570,8 +571,8 @@ main =
, testDeps: false
}
dependencies <- runSpago env (Fetch.run fetchOpts)
supportPackages <- runSpago env (Repl.supportPackage env.workspace.packageSet)
replEnv <- runSpago env (mkReplEnv args (Map.union dependencies supportPackages))
supportPackages <- runSpago env (SpagoRepl.supportPackage env.workspace.packageSet)
replEnv <- runSpago env (mkReplEnv args dependencies supportPackages)
void $ runSpago replEnv Repl.run

Bundle args@{ selectedPackage, ensureRanges } -> do
Expand Down Expand Up @@ -791,7 +792,7 @@ mkBuildEnv
, persistWarnings :: Maybe Boolean
| r
}
-> Map PackageName Package
-> Fetch.PackageTransitiveDeps
-> Spago (Fetch.FetchEnv ()) (Build.BuildEnv ())
mkBuildEnv buildArgs dependencies = do
{ logOptions, workspace, git } <- ask
Expand Down Expand Up @@ -826,7 +827,7 @@ mkBuildEnv buildArgs dependencies = do
, workspace: newWorkspace
}

mkPublishEnv :: forall a. Map PackageName Package -> Spago (Fetch.FetchEnv a) (Publish.PublishEnv a)
mkPublishEnv :: forall a. Fetch.PackageTransitiveDeps -> Spago (Fetch.FetchEnv a) (Publish.PublishEnv a)
mkPublishEnv dependencies = do
env <- ask
selected <- case env.workspace.selected of
Expand All @@ -846,21 +847,21 @@ mkPublishEnv dependencies = do
]
pure (Record.union { selected, dependencies } env)

mkReplEnv :: forall a. ReplArgs -> Map PackageName Package -> Spago (Fetch.FetchEnv a) (Repl.ReplEnv ())
mkReplEnv replArgs dependencies = do
mkReplEnv :: forall a. ReplArgs -> Fetch.PackageTransitiveDeps -> PackageMap -> Spago (Fetch.FetchEnv a) (Repl.ReplEnv ())
mkReplEnv replArgs dependencies supportPackage = do
{ workspace, logOptions } <- ask
logDebug $ "Repl args: " <> show replArgs

purs <- Purs.getPurs

let
selected = case workspace.selected of
Just s -> [ s ]
Nothing -> Config.getWorkspacePackages workspace.packageSet
selected <- case workspace.selected of
Just s -> pure $ Build.SinglePackageGlobs s
Nothing -> pure $ Build.AllWorkspaceGlobs workspace.packageSet

pure
{ purs
, dependencies
, supportPackage
, depsOnly: false
, logOptions
, pursArgs: Array.fromFoldable replArgs.pursArgs
Expand Down Expand Up @@ -973,7 +974,7 @@ mkRegistryEnv = do
, db
}

mkLsEnv :: forall a. Map PackageName Package -> Spago (Fetch.FetchEnv a) Ls.LsEnv
mkLsEnv :: forall a. Fetch.PackageTransitiveDeps -> Spago (Fetch.FetchEnv a) Ls.LsEnv
mkLsEnv dependencies = do
{ logOptions, workspace } <- ask
selected <- case workspace.selected of
Expand All @@ -993,7 +994,7 @@ mkLsEnv dependencies = do
]
pure { logOptions, workspace, dependencies, selected }

mkDocsEnv :: forall a. DocsArgs -> Map PackageName Package -> Spago (Fetch.FetchEnv a) Docs.DocsEnv
mkDocsEnv :: forall a. DocsArgs -> Fetch.PackageTransitiveDeps -> Spago (Fetch.FetchEnv a) Docs.DocsEnv
mkDocsEnv args dependencies = do
{ logOptions, workspace } <- ask
purs <- Purs.getPurs
Expand Down
35 changes: 34 additions & 1 deletion core/src/Log.purs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ module Spago.Log
, class Loggable
, die
, die'
, justOrDieWith
, justOrDieWith'
, rightOrDieWith
, rightOrDieWith'
, indent2
, logDebug
, logError
Expand All @@ -26,7 +30,8 @@ import Control.Monad.Reader as Reader
import Data.Array ((:))
import Data.Array as Array
import Data.Codec.Argonaut (JsonCodec)
import Data.Maybe (fromMaybe)
import Data.Either (Either(..))
import Data.Maybe (Maybe(..), fromMaybe)
import Data.String as String
import Data.Traversable (traverse)
import Dodo (Doc, print, twoSpaces)
Expand Down Expand Up @@ -132,6 +137,34 @@ die' msgs = do
_ <- traverse logFailure msgs
Effect.liftEffect $ Process.exit 1

justOrDieWith :: forall a b m x. MonadEffect m => MonadAsk (LogEnv b) m => Loggable a => Maybe x -> a -> m x
justOrDieWith value msg = case value of
Just a ->
pure a
Nothing ->
die msg

justOrDieWith' :: forall a b m x. MonadEffect m => MonadAsk (LogEnv b) m => Loggable a => Maybe x -> Array a -> m x
justOrDieWith' value msg = case value of
Just a ->
pure a
Nothing ->
die' msg

rightOrDieWith :: forall a b m err x. MonadEffect m => MonadAsk (LogEnv b) m => Loggable a => Either err x -> (err -> a) -> m x
rightOrDieWith value toMsg = case value of
Right a ->
pure a
Left err ->
die $ toMsg err

rightOrDieWith' :: forall a b m err x. MonadEffect m => MonadAsk (LogEnv b) m => Loggable a => Either err x -> (err -> Array a) -> m x
rightOrDieWith' value toMsg = case value of
Right a ->
pure a
Left err ->
die' $ toMsg err

data OutputFormat a
= OutputJson (JsonCodec a) a
| OutputYaml (JsonCodec a) a
Expand Down
2 changes: 1 addition & 1 deletion core/src/Prelude.purs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ import Partial.Unsafe (unsafeCrashWith)
import Registry.ManifestIndex (ManifestIndex) as Extra
import Registry.Types (PackageName, Version, Range, Location, License, Manifest(..), Metadata(..), Sha256) as Extra
import Spago.Json (printJson, parseJson) as Extra
import Spago.Log (logDebug, logError, logInfo, Docc, logSuccess, logWarn, die, die', toDoc, indent, indent2, output, LogEnv, LogOptions, OutputFormat(..)) as Extra
import Spago.Log (logDebug, logError, logInfo, Docc, logSuccess, logWarn, die, die', justOrDieWith, justOrDieWith', rightOrDieWith, rightOrDieWith', toDoc, indent, indent2, output, LogEnv, LogOptions, OutputFormat(..)) as Extra
import Spago.Yaml (YamlDoc, printYaml, parseYaml) as Extra

newtype Spago env a = Spago (ReaderT env Extra.Aff a)
Expand Down
Loading

0 comments on commit 8ccaff1

Please sign in to comment.