@@ -15,7 +15,6 @@ import Data.Set as Set
15
15
import Effect.Aff as Aff
16
16
import Effect.Aff.AVar as AVar
17
17
import Effect.Now as Now
18
- import Node.Process as Process
19
18
import Options.Applicative (CommandFields , Mod , Parser , ParserPrefs (..))
20
19
import Options.Applicative as O
21
20
import Options.Applicative.Types (Backtracking (..))
@@ -52,6 +51,7 @@ import Spago.Generated.BuildInfo as BuildInfo
52
51
import Spago.Git as Git
53
52
import Spago.Json as Json
54
53
import Spago.Log (LogVerbosity (..))
54
+ import Spago.Path as Path
55
55
import Spago.Paths as Paths
56
56
import Spago.Purs as Purs
57
57
import Spago.Registry as Registry
@@ -163,7 +163,7 @@ type BundleArgs =
163
163
{ minify :: Boolean
164
164
, sourceMaps :: Boolean
165
165
, module :: Maybe String
166
- , outfile :: Maybe FilePath
166
+ , outfile :: Maybe String
167
167
, platform :: Maybe String
168
168
, selectedPackage :: Maybe String
169
169
, pursArgs :: List String
@@ -536,7 +536,8 @@ main = do
536
536
\c -> Aff .launchAff_ case c of
537
537
Cmd'SpagoCmd (SpagoCmd globalArgs@{ offline, migrateConfig } command) -> do
538
538
logOptions <- mkLogOptions startingTime globalArgs
539
- runSpago { logOptions } case command of
539
+ rootPath <- Path .mkRoot =<< Paths .cwd
540
+ runSpago { logOptions, rootPath } case command of
540
541
Sources args -> do
541
542
{ env } <- mkFetchEnv
542
543
{ packages: mempty
@@ -551,11 +552,9 @@ main = do
551
552
void $ runSpago env (Sources .run { json: args.json })
552
553
Init args@{ useSolver } -> do
553
554
-- Fetch the registry here so we can select the right package set later
554
- env <- mkRegistryEnv offline
555
-
555
+ env <- mkRegistryEnv offline <#> Record .union { rootPath }
556
556
setVersion <- parseSetVersion args.setVersion
557
557
void $ runSpago env $ Init .run { mode: args.mode, setVersion, useSolver }
558
-
559
558
Fetch args -> do
560
559
{ env, fetchOpts } <- mkFetchEnv (Record .merge { isRepl: false , migrateConfig, offline } args)
561
560
void $ runSpago env (Fetch .run fetchOpts)
@@ -600,7 +599,7 @@ main = do
600
599
void $ runSpago publishEnv (Publish .publish {})
601
600
602
601
Repl args@{ selectedPackage } -> do
603
- packages <- FS .exists " spago.yaml" >>= case _ of
602
+ packages <- FS .exists (rootPath </> " spago.yaml" ) >>= case _ of
604
603
true -> do
605
604
-- if we have a config then we assume it's a workspace, and we can run a repl in the project
606
605
pure mempty -- TODO newPackages
@@ -609,9 +608,10 @@ main = do
609
608
logWarn " No configuration found, creating a temporary project to run a repl in..."
610
609
tmpDir <- mkTemp
611
610
FS .mkdirp tmpDir
612
- logDebug $ " Creating repl project in temp dir: " <> tmpDir
613
- liftEffect $ Process .chdir tmpDir
614
- env <- mkRegistryEnv offline
611
+ logDebug $ " Creating repl project in temp dir: " <> Path .quote tmpDir
612
+ Paths .chdir tmpDir
613
+ tmpRootPath <- Path .mkRoot tmpDir
614
+ env <- mkRegistryEnv offline <#> Record .union { rootPath: tmpRootPath }
615
615
void $ runSpago env $ Init .run
616
616
{ setVersion: Nothing
617
617
, mode: Init.InitWorkspace { packageName: Just " repl" }
@@ -661,12 +661,12 @@ main = do
661
661
testEnv <- runSpago env (mkTestEnv args buildEnv)
662
662
runSpago testEnv Test .run
663
663
LsPaths args -> do
664
- runSpago { logOptions } $ Ls .listPaths args
664
+ runSpago { logOptions, rootPath } $ Ls .listPaths args
665
665
LsPackages args@{ pure } -> do
666
666
let fetchArgs = { packages: mempty, selectedPackage: Nothing , pure, ensureRanges: false , testDeps: false , isRepl: false , migrateConfig, offline }
667
667
{ env: env@{ workspace }, fetchOpts } <- mkFetchEnv fetchArgs
668
668
dependencies <- runSpago env (Fetch .run fetchOpts)
669
- let lsEnv = { workspace, dependencies, logOptions }
669
+ let lsEnv = { workspace, dependencies, logOptions, rootPath }
670
670
runSpago lsEnv (Ls .listPackageSet args)
671
671
LsDeps { selectedPackage, json, transitive, pure } -> do
672
672
let fetchArgs = { packages: mempty, selectedPackage, pure, ensureRanges: false , testDeps: false , isRepl: false , migrateConfig, offline }
@@ -691,12 +691,12 @@ main = do
691
691
{ env, fetchOpts } <- mkFetchEnv { packages: mempty, selectedPackage: Nothing , pure: false , ensureRanges: false , testDeps: false , isRepl: false , migrateConfig, offline }
692
692
dependencies <- runSpago env (Fetch .run fetchOpts)
693
693
purs <- Purs .getPurs
694
- runSpago { dependencies, logOptions, purs, workspace: env.workspace } (Graph .graphModules args)
694
+ runSpago { dependencies, logOptions, rootPath, purs, workspace: env.workspace } (Graph .graphModules args)
695
695
GraphPackages args -> do
696
696
{ env, fetchOpts } <- mkFetchEnv { packages: mempty, selectedPackage: Nothing , pure: false , ensureRanges: false , testDeps: false , isRepl: false , migrateConfig, offline }
697
697
dependencies <- runSpago env (Fetch .run fetchOpts)
698
698
purs <- Purs .getPurs
699
- runSpago { dependencies, logOptions, purs, workspace: env.workspace } (Graph .graphPackages args)
699
+ runSpago { dependencies, logOptions, rootPath, purs, workspace: env.workspace } (Graph .graphPackages args)
700
700
701
701
Cmd'VersionCmd v -> when v do
702
702
output (OutputLines [ BuildInfo .packages." spago-bin" ])
@@ -721,7 +721,7 @@ main = do
721
721
722
722
mkBundleEnv :: forall a . BundleArgs -> Spago (Fetch.FetchEnv a ) (Bundle.BundleEnv ())
723
723
mkBundleEnv bundleArgs = do
724
- { workspace, logOptions } <- ask
724
+ { workspace, logOptions, rootPath } <- ask
725
725
logDebug $ " Bundle args: " <> show bundleArgs
726
726
727
727
selected <- case workspace.selected of
@@ -770,18 +770,19 @@ mkBundleEnv bundleArgs = do
770
770
, sourceMaps: bundleArgs.sourceMaps
771
771
, extraArgs
772
772
}
773
+ argsOutput = bundleArgs.output <#> (rootPath </> _)
773
774
newWorkspace = workspace
774
775
{ buildOptions
775
- { output = bundleArgs.output <|> workspace.buildOptions.output
776
+ { output = argsOutput <|> workspace.buildOptions.output
776
777
}
777
778
}
778
779
esbuild <- Esbuild .getEsbuild
779
- let bundleEnv = { esbuild, logOptions, workspace: newWorkspace, selected, bundleOptions }
780
+ let bundleEnv = { esbuild, logOptions, rootPath, workspace: newWorkspace, selected, bundleOptions }
780
781
pure bundleEnv
781
782
782
783
mkRunEnv :: forall a b . RunArgs -> Build.BuildEnv b -> Spago (Fetch.FetchEnv a ) (Run.RunEnv ())
783
784
mkRunEnv runArgs { dependencies, purs } = do
784
- { workspace, logOptions } <- ask
785
+ { workspace, logOptions, rootPath } <- ask
785
786
logDebug $ " Run args: " <> show runArgs
786
787
787
788
node <- Run .getNode
@@ -816,17 +817,18 @@ mkRunEnv runArgs { dependencies, purs } = do
816
817
runOptions =
817
818
{ moduleName
818
819
, execArgs
819
- , executeDir: Paths .cwd
820
+ , executeDir: Path .toGlobal rootPath
820
821
, successMessage: Nothing
821
822
, failureMessage: " Running failed."
822
823
}
823
- let newWorkspace = workspace { buildOptions { output = runArgs.output <|> workspace.buildOptions.output } }
824
- let runEnv = { logOptions, workspace: newWorkspace, selected, node, runOptions, dependencies, purs }
824
+ let argsOutput = runArgs.output <#> (rootPath </> _)
825
+ let newWorkspace = workspace { buildOptions { output = argsOutput <|> workspace.buildOptions.output } }
826
+ let runEnv = { logOptions, rootPath, workspace: newWorkspace, selected, node, runOptions, dependencies, purs }
825
827
pure runEnv
826
828
827
829
mkTestEnv :: forall a b . TestArgs -> Build.BuildEnv b -> Spago (Fetch.FetchEnv a ) (Test.TestEnv ())
828
830
mkTestEnv testArgs { dependencies, purs } = do
829
- { workspace, logOptions } <- ask
831
+ { workspace, logOptions, rootPath } <- ask
830
832
logDebug $ " Test args: " <> show testArgs
831
833
832
834
node <- Run .getNode
@@ -860,8 +862,9 @@ mkTestEnv testArgs { dependencies, purs } = do
860
862
861
863
logDebug $ " Selected packages to test: " <> Json .stringifyJson (CJ.Common .nonEmptyArray PackageName .codec) (map _.selected.package.name selectedPackages)
862
864
863
- let newWorkspace = workspace { buildOptions { output = testArgs.output <|> workspace.buildOptions.output } }
864
- let testEnv = { logOptions, workspace: newWorkspace, selectedPackages, node, dependencies, purs }
865
+ let argsOutput = testArgs.output <#> (rootPath </> _)
866
+ let newWorkspace = workspace { buildOptions { output = argsOutput <|> workspace.buildOptions.output } }
867
+ let testEnv = { logOptions, rootPath, workspace: newWorkspace, selectedPackages, node, dependencies, purs }
865
868
pure testEnv
866
869
867
870
mkBuildEnv
@@ -876,12 +879,13 @@ mkBuildEnv
876
879
-> Fetch.PackageTransitiveDeps
877
880
-> Spago (Fetch.FetchEnv ()) (Build.BuildEnv ())
878
881
mkBuildEnv buildArgs dependencies = do
879
- { logOptions, workspace, git } <- ask
882
+ { logOptions, rootPath, workspace, git } <- ask
880
883
purs <- Purs .getPurs
881
884
let
885
+ argsOutput = buildArgs.output <#> (rootPath </> _)
882
886
newWorkspace = workspace
883
887
{ buildOptions
884
- { output = buildArgs.output <|> workspace.buildOptions.output
888
+ { output = argsOutput <|> workspace.buildOptions.output
885
889
, statVerbosity = buildArgs.statVerbosity <|> workspace.buildOptions.statVerbosity
886
890
}
887
891
-- Override the backend args from the config if they are passed in through a flag
@@ -895,6 +899,7 @@ mkBuildEnv buildArgs dependencies = do
895
899
896
900
pure
897
901
{ logOptions
902
+ , rootPath
898
903
, purs
899
904
, git
900
905
, dependencies
@@ -925,7 +930,7 @@ mkPublishEnv dependencies = do
925
930
926
931
mkReplEnv :: forall a . ReplArgs -> Fetch.PackageTransitiveDeps -> PackageMap -> Spago (Fetch.FetchEnv a ) (Repl.ReplEnv ())
927
932
mkReplEnv replArgs dependencies supportPackage = do
928
- { workspace, logOptions } <- ask
933
+ { workspace, logOptions, rootPath } <- ask
929
934
logDebug $ " Repl args: " <> show replArgs
930
935
931
936
purs <- Purs .getPurs
@@ -941,16 +946,17 @@ mkReplEnv replArgs dependencies supportPackage = do
941
946
, supportPackage
942
947
, depsOnly: false
943
948
, logOptions
949
+ , rootPath
944
950
, pursArgs: Array .fromFoldable replArgs.pursArgs
945
951
, selected
946
952
}
947
953
948
- mkFetchEnv :: forall a b . { offline :: OnlineStatus , migrateConfig :: Boolean , isRepl :: Boolean | FetchArgsRow b } -> Spago (LogEnv a ) { env :: Fetch.FetchEnv (), fetchOpts :: Fetch.FetchOpts }
954
+ mkFetchEnv :: forall a b . { offline :: OnlineStatus , migrateConfig :: Boolean , isRepl :: Boolean | FetchArgsRow b } -> Spago (SpagoBaseEnv a ) { env :: Fetch.FetchEnv (), fetchOpts :: Fetch.FetchOpts }
949
955
mkFetchEnv args@{ migrateConfig, offline } = do
950
956
let
951
- parsePackageName p = case PackageName .parse p of
952
- Right pkg -> Right pkg
953
- Left err -> Left ( " - Could not parse package " <> show p <> " : " <> err)
957
+ parsePackageName p =
958
+ PackageName .parse p
959
+ # lmap \ err -> " - Could not parse package " <> show p <> " : " <> err
954
960
let { right: packageNames, left: failedPackageNames } = partitionMap parsePackageName (Array .fromFoldable args.packages)
955
961
unless (Array .null failedPackageNames) do
956
962
die $ [ toDoc " Failed to parse some package name: " ] <> map (indent <<< toDoc) failedPackageNames
@@ -960,25 +966,28 @@ mkFetchEnv args@{ migrateConfig, offline } = do
960
966
Left _err -> die $ " Failed to parse selected package name, was: " <> show args.selectedPackage
961
967
962
968
env <- mkRegistryEnv offline
963
- workspace <- runSpago env (Config .readWorkspace { maybeSelectedPackage, pureBuild: args.pure, migrateConfig })
969
+ { rootPath } <- ask
970
+ workspace <-
971
+ runSpago (Record .union env { rootPath })
972
+ (Config .readWorkspace { maybeSelectedPackage, pureBuild: args.pure, migrateConfig })
964
973
let fetchOpts = { packages: packageNames, ensureRanges: args.ensureRanges, isTest: args.testDeps, isRepl: args.isRepl }
965
- pure { fetchOpts, env: Record .union { workspace } env }
974
+ pure { fetchOpts, env: Record .union { workspace, rootPath } env }
966
975
967
- mkRegistryEnv :: forall a . OnlineStatus -> Spago (LogEnv a ) (Registry.RegistryEnv ())
976
+ mkRegistryEnv :: forall a . OnlineStatus -> Spago (SpagoBaseEnv a ) (Registry.RegistryEnv ())
968
977
mkRegistryEnv offline = do
969
- logDebug $ " CWD: " <> Paths .cwd
978
+ { logOptions, rootPath } <- ask
970
979
971
980
-- Take care of the caches
972
981
FS .mkdirp Paths .globalCachePath
973
- FS .mkdirp Paths .localCachePath
974
- FS .mkdirp Paths .localCachePackagesPath
975
- logDebug $ " Global cache: " <> show Paths .globalCachePath
976
- logDebug $ " Local cache: " <> show Paths .localCachePath
982
+ FS .mkdirp $ rootPath </> Paths .localCachePath
983
+ FS .mkdirp $ rootPath </> Paths .localCachePackagesPath
984
+ logDebug $ " Workspace root path: " <> Path .quote rootPath
985
+ logDebug $ " Global cache: " <> Path .quote Paths .globalCachePath
986
+ logDebug $ " Local cache: " <> Paths .localCachePath
977
987
978
988
-- Make sure we have git and purs
979
989
git <- Git .getGit
980
990
purs <- Purs .getPurs
981
- { logOptions } <- ask
982
991
db <- liftEffect $ Db .connect
983
992
{ database: Paths .databasePath
984
993
, logger: \str -> Reader .runReaderT (logDebug $ " DB: " <> str) { logOptions }
@@ -997,7 +1006,7 @@ mkRegistryEnv offline = do
997
1006
998
1007
mkLsEnv :: forall a . Fetch.PackageTransitiveDeps -> Spago (Fetch.FetchEnv a ) Ls.LsEnv
999
1008
mkLsEnv dependencies = do
1000
- { logOptions, workspace } <- ask
1009
+ { logOptions, workspace, rootPath } <- ask
1001
1010
selected <- case workspace.selected of
1002
1011
Just s -> pure s
1003
1012
Nothing ->
@@ -1013,15 +1022,16 @@ mkLsEnv dependencies = do
1013
1022
[ toDoc " No package was selected. Please select (with -p) one of the following packages:"
1014
1023
, indent (toDoc $ map _.package.name workspacePackages)
1015
1024
]
1016
- pure { logOptions, workspace, dependencies, selected }
1025
+ pure { logOptions, workspace, dependencies, selected, rootPath }
1017
1026
1018
1027
mkDocsEnv :: ∀ a . DocsArgs -> Fetch.PackageTransitiveDeps -> Spago (Fetch.FetchEnv a ) (Docs.DocsEnv ())
1019
1028
mkDocsEnv args dependencies = do
1020
- { logOptions, workspace } <- ask
1029
+ { logOptions, rootPath, workspace } <- ask
1021
1030
purs <- Purs .getPurs
1022
1031
pure
1023
1032
{ purs
1024
1033
, logOptions
1034
+ , rootPath
1025
1035
, workspace
1026
1036
, dependencies
1027
1037
, depsOnly: args.depsOnly
0 commit comments