Skip to content

Commit 7a75c0f

Browse files
committed
Merge pull request scala#4824 from szeiger/wip/sbt-mkBin
Improvements to the sbt build
2 parents 0c597f0 + 7248894 commit 7a75c0f

File tree

6 files changed

+394
-137
lines changed

6 files changed

+394
-137
lines changed

build.sbt

Lines changed: 201 additions & 127 deletions
Large diffs are not rendered by default.

build.xml

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,20 +1684,15 @@ TODO:
16841684
<target name="docs.lib" depends="docs.start" unless="docs.skip">
16851685
<staged-docs project="library">
16861686
<include name="**/*.scala"/>
1687-
<exclude name="runtime/*$.scala"/>
1688-
<exclude name="runtime/ScalaRunTime.scala"/>
1689-
<exclude name="runtime/StringAdd.scala"/>
1687+
<exclude name="**/runtime/*$.scala"/>
1688+
<exclude name="**/runtime/ScalaRunTime.scala"/>
1689+
<exclude name="**/runtime/StringAdd.scala"/>
16901690
</staged-docs>
16911691
</target>
16921692

16931693
<target name="docs.reflect" depends="docs.start" unless="docs.skip">
16941694
<staged-docs project="reflect">
16951695
<include name="**/*.scala"/>
1696-
<exclude name="reflect/Code.scala"/>
1697-
<exclude name="reflect/Print.scala"/>
1698-
<exclude name="reflect/Symbol.scala"/>
1699-
<exclude name="reflect/Tree.scala"/>
1700-
<exclude name="reflect/Type.scala"/>
17011696
</staged-docs>
17021697
</target>
17031698

project/JarJar.scala

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import org.pantsbuild.jarjar
2+
import org.pantsbuild.jarjar._
3+
import org.pantsbuild.jarjar.util._
4+
import scala.collection.JavaConverters._
5+
import java.util.jar._
6+
import java.io._
7+
import sbt._
8+
9+
object JarJar {
10+
sealed abstract class JarJarConfig {
11+
def toPatternElement: PatternElement
12+
}
13+
object JarJarConfig {
14+
case class Rule(pattern: String, result: String) extends JarJarConfig {
15+
def toPatternElement: PatternElement = {
16+
val rule = new jarjar.Rule
17+
rule.setPattern(pattern)
18+
rule.setResult(result)
19+
rule
20+
}
21+
}
22+
case class Keep(pattern: String) extends JarJarConfig {
23+
def toPatternElement: PatternElement = {
24+
val keep = new jarjar.Keep
25+
keep.setPattern(pattern)
26+
keep
27+
}
28+
}
29+
}
30+
31+
sealed abstract class Entry {
32+
def name: String
33+
def time: Long
34+
def data: Array[Byte]
35+
}
36+
37+
case class JarEntryInput(jarFile: JarFile, entry: JarEntry) extends Entry {
38+
def name = entry.getName
39+
def time = entry.getTime
40+
def data = sbt.IO.readBytes(jarFile.getInputStream(entry))
41+
}
42+
case class FileInput(base: File, file: File) extends Entry {
43+
def name = file.relativeTo(base).get.getPath
44+
def time = file.lastModified
45+
def data = sbt.IO.readBytes(file)
46+
}
47+
48+
private def newMainProcessor(patterns: java.util.List[PatternElement], verbose: Boolean, skipManifest: Boolean): JarProcessor = {
49+
val cls = Class.forName("org.pantsbuild.jarjar.MainProcessor")
50+
val constructor = cls.getConstructor(classOf[java.util.List[_]], java.lang.Boolean.TYPE, java.lang.Boolean.TYPE)
51+
constructor.setAccessible(true)
52+
constructor.newInstance(patterns, Boolean.box(verbose), Boolean.box(skipManifest)).asInstanceOf[JarProcessor]
53+
}
54+
55+
def apply(in: Iterator[Entry], outdir: File,
56+
config: Seq[JarJarConfig], verbose: Boolean = false): Seq[File] = {
57+
val patterns = config.map(_.toPatternElement).asJava
58+
val processor: JarProcessor = newMainProcessor(patterns, verbose, false)
59+
def process(e: Entry): Option[File] = {
60+
val struct = new EntryStruct()
61+
struct.name = e.name
62+
struct.time = e.time
63+
struct.data = e.data
64+
if (processor.process(struct)) {
65+
if (struct.name.endsWith("/")) None
66+
else {
67+
val f = outdir / struct.name
68+
try {
69+
f.getParentFile.mkdirs()
70+
sbt.IO.write(f, struct.data)
71+
} catch {
72+
case ex: Exception =>
73+
throw new IOException(s"Failed to write ${e.name} / ${f.getParentFile} / ${f.getParentFile.exists}", ex)
74+
}
75+
Some(f)
76+
}
77+
}
78+
else None
79+
}
80+
in.flatMap(entry => process(entry)).toList
81+
82+
}
83+
}

project/VersionUtil.scala

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import sbt._
2+
import Keys._
3+
import java.util.Properties
4+
import java.io.FileInputStream
5+
import scala.collection.JavaConverters._
6+
7+
object VersionUtil {
8+
lazy val copyrightString = settingKey[String]("Copyright string.")
9+
lazy val versionProperties = settingKey[Versions]("Version properties.")
10+
lazy val generateVersionPropertiesFile = taskKey[File]("Generating version properties file.")
11+
12+
lazy val versionPropertiesSettings = Seq[Setting[_]](
13+
versionProperties := versionPropertiesImpl.value
14+
)
15+
16+
lazy val generatePropertiesFileSettings = Seq[Setting[_]](
17+
copyrightString := "Copyright 2002-2015, LAMP/EPFL",
18+
resourceGenerators in Compile += generateVersionPropertiesFile.map(file => Seq(file)).taskValue,
19+
versionProperties := versionPropertiesImpl.value,
20+
generateVersionPropertiesFile := generateVersionPropertiesFileImpl.value
21+
)
22+
23+
case class Versions(canonicalVersion: String, mavenVersion: String, osgiVersion: String, commitSha: String, commitDate: String, isRelease: Boolean) {
24+
val githubTree =
25+
if(isRelease) "v" + mavenVersion
26+
else if(commitSha != "unknown") commitSha
27+
else "master"
28+
29+
override def toString = s"Canonical: $canonicalVersion, Maven: $mavenVersion, OSGi: $osgiVersion, github: $githubTree"
30+
31+
def toProperties: Properties = {
32+
val props = new Properties
33+
props.put("version.number", canonicalVersion)
34+
props.put("maven.version.number", mavenVersion)
35+
props.put("osgi.version.number", osgiVersion)
36+
props
37+
}
38+
}
39+
40+
lazy val versionPropertiesImpl: Def.Initialize[Versions] = Def.setting {
41+
/** Regexp that splits version number split into two parts: version and suffix.
42+
* Examples of how the split is performed:
43+
*
44+
* "2.11.5": ("2.11.5", null)
45+
* "2.11.5-acda7a": ("2.11.5", "-acda7a")
46+
* "2.11.5-SNAPSHOT": ("2.11.5", "-SNAPSHOT") */
47+
val versionSplitted = """([\w+\.]+)(-[\w+\.]+)??""".r
48+
49+
val versionSplitted(ver, suffixOrNull) = version.value
50+
51+
val osgiSuffix = suffixOrNull match {
52+
case null => "-VFINAL"
53+
case "-SNAPSHOT" => ""
54+
case suffixStr => suffixStr
55+
}
56+
57+
def executeTool(tool: String) = {
58+
val cmd =
59+
if (System.getProperty("os.name").toLowerCase.contains("windows"))
60+
s"cmd.exe /c tools\\$tool.bat -p"
61+
else s"tools/$tool"
62+
Process(cmd).lines.head
63+
}
64+
65+
val commitDate = executeTool("get-scala-commit-date")
66+
val commitSha = executeTool("get-scala-commit-sha")
67+
68+
Versions(
69+
canonicalVersion = s"$ver-$commitDate-$commitSha",
70+
mavenVersion = s"${version.value}",
71+
osgiVersion = s"$ver.v$commitDate$osgiSuffix-$commitSha",
72+
commitSha = commitSha,
73+
commitDate = commitDate,
74+
isRelease = !osgiSuffix.isEmpty
75+
)
76+
}
77+
78+
lazy val generateVersionPropertiesFileImpl: Def.Initialize[Task[File]] = Def.task {
79+
val props = versionProperties.value.toProperties
80+
val propFile = (resourceManaged in Compile).value / s"${thisProject.value.id}.properties"
81+
props.put("copyright.string", copyrightString.value)
82+
83+
// unfortunately, this will write properties in arbitrary order
84+
// this makes it harder to test for stability of generated artifacts
85+
// consider using https://github.com/etiennestuder/java-ordered-properties
86+
// instead of java.util.Properties
87+
IO.write(props, null, propFile)
88+
propFile
89+
}
90+
91+
/** The global versions.properties data */
92+
lazy val versionProps: Map[String, String] = {
93+
val props = new Properties()
94+
val in = new FileInputStream(file("versions.properties"))
95+
try props.load(in)
96+
finally in.close()
97+
props.asScala.toMap
98+
}
99+
100+
/** Get a subproject version number from `versionProps` */
101+
def versionNumber(name: String): String =
102+
versionProps(s"$name.version.number")
103+
}

project/plugins.sbt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.3.2"
1+
libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.3.2"
2+
3+
libraryDependencies += "org.pantsbuild" % "jarjar" % "1.6.0"

src/repl/scala/tools/nsc/interpreter/ILoop.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
876876

877877
if (settings.debug) {
878878
val readerDiags = (readerClasses, readers).zipped map {
879-
case (cls, Failure(e)) => s" - $cls --> " + e.getStackTrace.mkString(e.toString+"\n\t", "\n\t","\n")
879+
case (cls, Failure(e)) => s" - $cls --> \n\t" + scala.tools.nsc.util.stackTraceString(e) + "\n"
880880
case (cls, Success(_)) => s" - $cls OK"
881881
}
882882
Console.println(s"All InteractiveReaders tried: ${readerDiags.mkString("\n","\n","\n")}")

0 commit comments

Comments
 (0)