Skip to content

Commit a6132b8

Browse files
authored
Fix CompilerError decoding in 0.13.x series of purs (#635)
* Use Version in callCompiler - swap between stdout and stderr depending on version * Utils.unsafeVersion * traverse * cleanup
1 parent 2d251c0 commit a6132b8

File tree

5 files changed

+26
-19
lines changed

5 files changed

+26
-19
lines changed

app/src/App/API.purs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,7 @@ compilePackage { packageSourceDir, compiler, resolutions } = Except.runExcept do
777777
Log.debug "Compiling..."
778778
compilerOutput <- Run.liftAff $ Purs.callCompiler
779779
{ command: Purs.Compile { globs }
780-
, version: Just (Version.print compiler)
780+
, version: Just compiler
781781
, cwd: Just packageSourceDir
782782
}
783783

@@ -834,7 +834,7 @@ publishToPursuit { packageSourceDir, dependenciesDir, compiler, resolutions } =
834834
-- with the format used by Pursuit in PureScript versions at least up to 0.16
835835
compilerOutput <- Run.liftAff $ Purs.callCompiler
836836
{ command: Purs.Publish { resolutions: resolutionsFilePath }
837-
, version: Just (Version.print compiler)
837+
, version: Just compiler
838838
, cwd: Just packageSourceDir
839839
}
840840

app/src/App/CLI/Purs.purs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import Data.Codec.Argonaut.Record as CA.Record
99
import Data.Foldable (foldMap)
1010
import Data.String as String
1111
import Node.Library.Execa as Execa
12+
import Registry.Version as Version
1213

1314
-- | Call a specific version of the PureScript compiler
14-
callCompiler_ :: { version :: Maybe String, command :: PursCommand, cwd :: Maybe FilePath } -> Aff Unit
15+
callCompiler_ :: { version :: Maybe Version, command :: PursCommand, cwd :: Maybe FilePath } -> Aff Unit
1516
callCompiler_ = void <<< callCompiler
1617

1718
data CompilerFailure
@@ -83,7 +84,7 @@ printCompilerErrors errors = do
8384
]
8485

8586
type CompilerArgs =
86-
{ version :: Maybe String
87+
{ version :: Maybe Version
8788
, cwd :: Maybe FilePath
8889
, command :: PursCommand
8990
}
@@ -111,8 +112,7 @@ callCompiler compilerArgs = do
111112
Just version ->
112113
append "purs-"
113114
$ String.replaceAll (String.Pattern ".") (String.Replacement "_")
114-
$ fromMaybe version
115-
$ String.stripPrefix (String.Pattern "v") version
115+
$ Version.print version
116116

117117
errorsCodec = CA.Record.object "CompilerErrors"
118118
{ errors: CA.array compilerErrorCodec }
@@ -122,7 +122,12 @@ callCompiler compilerArgs = do
122122
Left { originalMessage }
123123
| originalMessage == Just (String.joinWith " " [ "spawn", purs, "ENOENT" ]) -> Left MissingCompiler
124124
Left { stdout, stderr } -> Left do
125-
case parseJson errorsCodec stdout of
125+
let
126+
output = case compilerArgs.version of
127+
Nothing -> stdout
128+
Just version | Right min <- Version.parse "0.14.0", version < min -> stderr
129+
Just _ -> stdout
130+
case parseJson errorsCodec output of
126131
Left err -> UnknownError $ String.joinWith "\n" [ stdout, stderr, CA.printJsonDecodeError err ]
127132
Right ({ errors } :: { errors :: Array CompilerError })
128133
| Array.null errors -> UnknownError "Non-normal exit code, but no errors reported."

app/src/App/Effect/PackageSets.purs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,7 @@ handle env = case _ of
240240
compileInstalledPackages compiler = do
241241
Log.debug "Compiling installed packages..."
242242
let command = Purs.Compile { globs: [ Path.concat [ Path.basename packagesWorkDir, "**/*.purs" ] ] }
243-
let version = Version.print compiler
244-
Run.liftAff $ Purs.callCompiler { command, version: Just version, cwd: Just env.workdir }
243+
Run.liftAff $ Purs.callCompiler { command, version: Just compiler, cwd: Just env.workdir }
245244

246245
attemptChanges :: Version -> PackageSet -> ChangeSet -> Run _ (Either CompilerFailure PackageSet)
247246
attemptChanges compiler (PackageSet set) changes = do

app/test/App/CLI/Purs.purs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,26 @@ module Test.Registry.App.CLI.Purs (spec) where
22

33
import Registry.App.Prelude
44

5+
import Data.Array as Array
56
import Data.Foldable (traverse_)
67
import Node.FS.Aff as FS.Aff
78
import Node.Path as Path
89
import Registry.App.CLI.Purs (CompilerFailure(..))
910
import Registry.App.CLI.Purs as Purs
1011
import Registry.Foreign.Tmp as Tmp
1112
import Registry.Test.Assert as Assert
13+
import Registry.Test.Utils as Utils
14+
import Registry.Version as Version
1215
import Test.Spec as Spec
1316

1417
spec :: Spec.Spec Unit
1518
spec = do
16-
traverse_ testVersion [ "0.13.0", "0.14.0", "0.14.7", "0.15.4" ]
17-
traverse_ testMissingVersion [ "0.13.1", "0.13.7", "0.15.1", "0.12.0", "0.14.12345" ]
18-
testCompilationError
19+
traverse_ (testVersion <<< Utils.unsafeVersion) [ "0.13.0", "0.14.0", "0.14.7", "0.15.4" ]
20+
traverse_ (testMissingVersion <<< Utils.unsafeVersion) [ "0.13.1", "0.13.7", "0.15.1", "0.12.0", "0.14.12345" ]
21+
traverse_ testCompilationError [ Just (Utils.unsafeVersion "0.13.0"), Just (Utils.unsafeVersion "0.13.8"), Just (Utils.unsafeVersion "0.14.0"), Just (Utils.unsafeVersion "0.15.0"), Nothing ]
1922
where
2023
testVersion version =
21-
Spec.it ("Calls compiler version " <> version) do
24+
Spec.it ("Calls compiler version " <> Version.print version) do
2225
Purs.callCompiler { command: Purs.Version, cwd: Nothing, version: Just version } >>= case _ of
2326
Left err -> case err of
2427
MissingCompiler ->
@@ -28,21 +31,21 @@ spec = do
2831
UnknownError err' ->
2932
Assert.fail ("UnknownError: " <> err')
3033
Right stdout ->
31-
version `Assert.shouldEqual` stdout
34+
Version.print version `Assert.shouldEqual` stdout
3235

3336
testMissingVersion version =
34-
Spec.it ("Handles failure when compiler is missing " <> version) do
37+
Spec.it ("Handles failure when compiler is missing " <> Version.print version) do
3538
result <- Purs.callCompiler { command: Purs.Version, cwd: Nothing, version: Just version }
3639
case result of
3740
Left MissingCompiler -> pure unit
3841
_ -> Assert.fail "Should have failed with MissingCompiler"
3942

40-
testCompilationError =
41-
Spec.it "Handles compilation error for bad input file" do
43+
testCompilationError version =
44+
Spec.it ("Handles compilation error for bad input file for version " <> maybe "latest" Version.print version) do
4245
tmp <- Tmp.mkTmpDir
4346
let file = Path.concat [ tmp, "ShouldFailToCompile.purs" ]
4447
FS.Aff.writeTextFile UTF8 file "<contents>"
45-
result <- Purs.callCompiler { command: Purs.Compile { globs: [ file ] }, cwd: Nothing, version: Nothing }
48+
result <- Purs.callCompiler { command: Purs.Compile { globs: [ file ] }, cwd: Nothing, version }
4649
case result of
4750
Left (CompilationError [ { position: { startLine: 1, startColumn: 1 } } ]) -> pure unit
4851
_ -> Assert.fail "Should have failed with CompilationError"

scripts/src/CompilerVersions.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ determineCompilerVersionsForPackage package version = do
161161

162162
result <- Run.liftAff $ Purs.callCompiler
163163
{ command: Purs.Compile { globs: [ Path.concat [ formattedName, "src/**/*.purs" ] ] }
164-
, version: Just (Version.print compiler)
164+
, version: Just compiler
165165
, cwd: Just tmp
166166
}
167167

0 commit comments

Comments
 (0)