Skip to content

Commit b4fc149

Browse files
authored
Harden version detection (#78)
1 parent f6e343b commit b4fc149

File tree

2 files changed

+57
-26
lines changed

2 files changed

+57
-26
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
yv66vgAAADQAIQoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCQAIAAkHAAoMAAsADAEAEGphdmEvbGFuZy9TeXN0ZW0BAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsIAA4BAAxqYXZhLnZlcnNpb24KAAgAEAwAEQASAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAFAAVBwAWDAAXABgBABNqYXZhL2lvL1ByaW50U3RyZWFtAQAFcHJpbnQBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYHABoBABBQcmludEphdmFWZXJzaW9uAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWAQAKU291cmNlRmlsZQEAFVByaW50SmF2YVZlcnNpb24uamF2YQAhABkAAgAAAAAAAgABAAUABgABABsAAAAdAAEAAQAAAAUqtwABsQAAAAEAHAAAAAYAAQAAAAEACQAdAB4AAQAbAAAAKAACAAEAAAAMsgAHEg24AA+2ABOxAAAAAQAcAAAACgACAAAAAwALAAQAAQAfAAAAAgAg

src/main/scala/com/sourcegraph/sbtsourcegraph/Versions.scala

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import java.util.Properties
66
import scala.collection.JavaConverters._
77
import scala.sys.process._
88
import java.io.File
9+
import java.nio.file.Path
910

1011
object Versions {
1112
def scalametaVersion = "4.4.26"
@@ -67,6 +68,43 @@ object Versions {
6768
}
6869

6970
private val jvmVersionCache = collection.mutable.Map.empty[Option[File], Int]
71+
private var printJavaVersionPath = Option.empty[Path]
72+
private def printJavaVersionFolder = {
73+
def create = {
74+
val dir =
75+
Files.createTempDirectory("print-java-version")
76+
val file = dir.resolve("PrintJavaVersion.class")
77+
val base64 = scala.io.Source
78+
.fromInputStream(
79+
getClass()
80+
.getResourceAsStream(
81+
"/sbt-sourcegraph/PrintJavaVersion.class.base64"
82+
)
83+
)
84+
.mkString
85+
.trim
86+
87+
val contents = java.util.Base64.getDecoder().decode(base64)
88+
89+
Files.write(file, contents)
90+
dir
91+
}
92+
93+
printJavaVersionPath.synchronized {
94+
printJavaVersionPath match {
95+
96+
case Some(value)
97+
if value.resolve("PrintJavaVersion.class").toFile.isFile =>
98+
value
99+
case _ =>
100+
val created = create
101+
printJavaVersionPath = Some(created)
102+
created
103+
104+
}
105+
}
106+
107+
}
70108

71109
def isJavaAtLeast(n: Int, home: Option[File] = None): Boolean = {
72110

@@ -77,32 +115,24 @@ object Versions {
77115
case None =>
78116
System.getProperty("java.version")
79117
case Some(javaHome) =>
80-
val sb = new StringBuilder
81-
val proc = {
82-
val cmd =
83-
if (scala.util.Properties.isWin)
84-
Paths.get("bin", "java")
85-
else Paths.get("bin", "java")
86-
87-
scala.sys.process
88-
.Process(Seq(cmd.toString(), "-version"), cwd = javaHome)
89-
.!!(ProcessLogger(sb.append(_)))
90-
91-
sb.result().trim
92-
}
93-
94-
val rgx = "version \"(.*?)\"".r
95-
96-
rgx.findFirstMatchIn(
97-
proc.linesIterator.take(1).mkString("")
98-
) match {
99-
case None =>
100-
sys.error(
101-
s"Cannot process [java -version] output (in $javaHome): [$proc]"
102-
)
103-
case Some(value) =>
104-
value.group(1)
105-
}
118+
val dir = printJavaVersionFolder
119+
120+
val cmd =
121+
if (scala.util.Properties.isWin)
122+
Paths.get("bin", "java")
123+
else Paths.get("bin", "java")
124+
125+
scala.sys.process
126+
.Process(
127+
Seq(
128+
cmd.toString(),
129+
"-cp",
130+
dir.toString(),
131+
"PrintJavaVersion"
132+
),
133+
cwd = javaHome
134+
)
135+
.!!
106136
}
107137

108138
val prop = raw.takeWhile(c => c.isDigit || c == '.')

0 commit comments

Comments
 (0)