1
1
// Usage
2
- // > scala-cli project/scripts/dottyCompileBisect.scala -- File1. scala File2 .scala
2
+ // > scala-cli project/scripts/dottyCompileBisect.scala -- [--run <main.class.name>] [<compiler-option> ...] <file1. scala> [<fileN .scala> ...]
3
3
//
4
4
// This script will bisect the compilation failure starting with a fast bisection on released nightly builds.
5
5
// Then it will bisect the commits between the last nightly that worked and the first nightly that failed.
8
8
import sys .process ._
9
9
import scala .io .Source
10
10
import Releases .Release
11
+ import java .io .File
12
+ import java .nio .file .{Files , Paths , StandardCopyOption }
11
13
12
- @ main def dottyCompileBisect (files : String * ): Unit =
13
- val releaseBisect = ReleaseBisect (files.toList)
14
- val fistBadRelease = releaseBisect.bisect(Releases .allReleases)
14
+ @ main def dottyCompileBisect (args : String * ): Unit =
15
+ val (mainClass, compilerArgs) = args match
16
+ case Seq (" --run" , mainClass, compilerArgs* ) =>
17
+ (Some (mainClass), compilerArgs)
18
+ case _ =>
19
+ (None , args)
20
+
21
+ val releaseBisect = ReleaseBisect (mainClass, compilerArgs.toList)
22
+ val bisectedBadRelease = releaseBisect.bisectedBadRelease(Releases .allReleases)
15
23
println(" \n Finished bisecting releases\n " )
16
- fistBadRelease.previous match
17
- case Some (lastGoodRelease) =>
18
- println(s " Last good release: $lastGoodRelease\n First bad release: $fistBadRelease\n " )
19
- val commitBisect = CommitBisect (files.toList)
20
- commitBisect.bisect(lastGoodRelease.hash, fistBadRelease.hash)
24
+
25
+ bisectedBadRelease match
26
+ case Some (firstBadRelease) =>
27
+ firstBadRelease.previous match
28
+ case Some (lastGoodRelease) =>
29
+ println(s " Last good release: $lastGoodRelease" )
30
+ println(s " First bad release: $firstBadRelease" )
31
+ val commitBisect = CommitBisect (mainClass, compilerArgs.toList)
32
+ commitBisect.bisect(lastGoodRelease.hash, firstBadRelease.hash)
33
+ case None =>
34
+ println(s " No good release found " )
21
35
case None =>
22
- println(s " No good release found " )
36
+ println(s " No bad release found " )
23
37
24
- class ReleaseBisect (files : List [String ]):
38
+ class ReleaseBisect (mainClass : Option [String ], compilerArgs : List [String ]):
39
+ def bisectedBadRelease (releases : Vector [Release ]): Option [Release ] =
40
+ Some (bisect(releases : Vector [Release ]))
41
+ .filter(! isGoodRelease(_))
25
42
26
43
def bisect (releases : Vector [Release ]): Release =
27
44
assert(releases.length > 1 , " Need at least 2 releases to bisect" )
@@ -35,7 +52,12 @@ class ReleaseBisect(files: List[String]):
35
52
36
53
private def isGoodRelease (release : Release ): Boolean =
37
54
println(s " Testing ${release.version}" )
38
- val res = s """ scala-cli compile ${files.mkString(" " )} -S " ${release.version}" """ .!
55
+ val testCommand = mainClass match
56
+ case Some (className) =>
57
+ s " run --main-class ' $className' "
58
+ case None =>
59
+ " compile"
60
+ val res = s """ scala-cli $testCommand -S ' ${release.version}' ${compilerArgs.mkString(" " )}""" .!
39
61
val isGood = res == 0
40
62
println(s " Test result: ${release.version} is a ${if isGood then " good" else " bad" } release \n " )
41
63
isGood
@@ -64,10 +86,14 @@ object Releases:
64
86
65
87
override def toString : String = version
66
88
67
- class CommitBisect (files : List [String ]):
89
+ class CommitBisect (mainClass : Option [ String ], compilerArgs : List [String ]):
68
90
def bisect (lastGoodHash : String , fistBadHash : String ): Unit =
69
91
println(s " Starting bisecting commits $lastGoodHash.. $fistBadHash\n " )
92
+ val runOption = mainClass.map(className => s " --run $className" ).getOrElse(" " )
93
+ val scriptFile = Paths .get(" project" , " scripts" , " dottyCompileBisect.sh" )
94
+ val tempScriptFile = File .createTempFile(" dottyCompileBisect" , " sh" ).toPath
95
+ Files .copy(scriptFile, tempScriptFile, StandardCopyOption .REPLACE_EXISTING )
70
96
" git bisect start" .!
71
97
s " git bisect bad $fistBadHash" .!
72
98
s " git bisect good $lastGoodHash" .!
73
- s " git bisect run sh project/scripts/dottyCompileBisect.sh ${files .mkString(" " )}" .!
99
+ s " git bisect run sh ${tempScriptFile.toAbsolutePath} ${runOption} ${compilerArgs .mkString(" " )}" .!
0 commit comments