Skip to content

Commit 72b483a

Browse files
committed
plugin runner now detects scala version for env var set by sbt
1 parent 61c7c1e commit 72b483a

File tree

3 files changed

+58
-10
lines changed

3 files changed

+58
-10
lines changed

build.sbt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ crossScalaVersions := Seq("2.10.4", "2.11.0")
3939
libraryDependencies := {
4040
CrossVersion.partialVersion(scalaVersion.value) match {
4141
case Some((2, scalaMajor)) if scalaMajor == 11 =>
42-
System.setProperty("CrossBuildScalaVersion", "2.11.0")
42+
EnvSupport.setEnv("CrossBuildScalaVersion", "2.11.0")
4343
libraryDependencies.value :+ "org.scala-lang.modules" %% "scala-xml" % "1.0.1"
4444
case _ =>
45-
System.setProperty("CrossBuildScalaVersion", "2.10.4")
45+
EnvSupport.setEnv("CrossBuildScalaVersion", "2.10.4")
4646
libraryDependencies.value
4747
}
4848
}

project/EnvSupport.scala

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
2+
/** @author Stephen Samuel */
3+
object EnvSupport {
4+
5+
// code credit: http://stackoverflow.com/a/19040660/2048448
6+
def setEnv(k: String, v: String): Unit = {
7+
try {
8+
val processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment")
9+
val theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment")
10+
theEnvironmentField.setAccessible(true)
11+
12+
val variableClass = Class.forName("java.lang.ProcessEnvironment$Variable")
13+
val convertToVariable = variableClass.getMethod("valueOf", classOf[java.lang.String])
14+
convertToVariable.setAccessible(true)
15+
16+
val valueClass = Class.forName("java.lang.ProcessEnvironment$Value")
17+
val convertToValue = valueClass.getMethod("valueOf", classOf[java.lang.String])
18+
convertToValue.setAccessible(true)
19+
20+
val sampleVariable = convertToVariable.invoke(null, "")
21+
val sampleValue = convertToValue.invoke(null, "")
22+
val env = theEnvironmentField.get(null).asInstanceOf[java.util.Map[sampleVariable.type, sampleValue.type]]
23+
24+
val variable = convertToVariable.invoke(null, k).asInstanceOf[sampleVariable.type]
25+
val value = convertToValue.invoke(null, v).asInstanceOf[sampleValue.type]
26+
env.put(variable, value)
27+
28+
val theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment")
29+
theCaseInsensitiveEnvironmentField.setAccessible(true)
30+
val cienv = theCaseInsensitiveEnvironmentField.get(null).asInstanceOf[java.util.Map[String, String]]
31+
cienv.put(k, v)
32+
33+
}
34+
catch {
35+
case e: NoSuchFieldException =>
36+
val classes = classOf[java.util.Collections].getDeclaredClasses
37+
val env = System.getenv()
38+
classes foreach (cl => {
39+
if ("java.util.Collections$UnmodifiableMap" == cl.getName) {
40+
val field = cl.getDeclaredField("m")
41+
field.setAccessible(true)
42+
val map = field.get(env).asInstanceOf[java.util.Map[String, String]]
43+
map.put(k, v)
44+
}
45+
})
46+
}
47+
}
48+
}

src/test/scala/scoverage/PluginRunner.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,20 @@ import scala.collection.mutable.ListBuffer
1010
/** @author Stephen Samuel */
1111
trait PluginSupport {
1212

13-
val scalaVersion = "2.11.0"
14-
// System.getProperty("CrossBuildScalaVersion")
13+
val scalaVersion = Option(System.getenv("CrossBuildScalaVersion")).getOrElse("2.11.0")
1514
val shortScalaVersion = scalaVersion.dropRight(2)
1615

1716
val classPath = getScalaJars.map(_.getAbsolutePath) :+ sbtCompileDir.getAbsolutePath
1817

1918
val settings = {
20-
val settings = new scala.tools.nsc.Settings
21-
settings.Xprint.value = List("all")
22-
settings.Yrangepos.value = true
23-
settings.classpath.value = classPath.mkString(":")
24-
settings
19+
val s = new scala.tools.nsc.Settings
20+
s.Xprint.value = List("all")
21+
s.Yrangepos.value = true
22+
s.classpath.value = classPath.mkString(":")
23+
s
2524
}
2625

2726
val reporter = new scala.tools.nsc.reporters.ConsoleReporter(settings)
28-
2927
val compiler = new ScoverageAwareCompiler(settings, reporter)
3028

3129
def writeCodeSnippetToTempFile(code: String): File = {
@@ -83,6 +81,8 @@ trait PluginSupport {
8381
}
8482
}
8583

84+
85+
8686
class ScoverageAwareCompiler(settings: scala.tools.nsc.Settings, reporter: scala.tools.nsc.reporters.Reporter)
8787
extends scala.tools.nsc.Global(settings, reporter) {
8888

0 commit comments

Comments
 (0)