Skip to content

Commit

Permalink
Merge pull request #6 from alexarchambault/develop
Browse files Browse the repository at this point in the history
Proguard interface JAR
  • Loading branch information
alexarchambault authored Mar 11, 2019
2 parents 984e64b + d7b7d22 commit 231fbac
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 52 deletions.
108 changes: 83 additions & 25 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
import com.tonicsystems.jarjar.classpath.ClassPath
import com.tonicsystems.jarjar.transform.JarTransformer
import com.tonicsystems.jarjar.transform.config.ClassRename
import com.tonicsystems.jarjar.transform.jar.DefaultJarProcessor
import com.typesafe.tools.mima.core.{MissingClassProblem, Problem, ProblemFilters}

import scala.xml.{Node => XmlNode, NodeSeq => XmlNodeSeq, _}
import scala.xml.transform.{RewriteRule, RuleTransformer}

inThisBuild(List(
organization := "io.get-coursier",
homepage := Some(url("https://github.com/coursier/interface")),
Expand All @@ -14,33 +21,89 @@ inThisBuild(List(
)
))

val shadingNamespace0 = "coursierapi.shaded"
lazy val finalPackageBin = taskKey[File]("")

lazy val interface = project
.enablePlugins(ShadingPlugin)
.enablePlugins(SbtProguard)
.settings(
skip.in(publish) := scalaVersion.value != Settings.scala212,
finalPackageBin := {
val log = streams.value.log
val orig = proguard.in(Proguard).value.head
val origLastModified = orig.lastModified()
val dest = orig.getParentFile / s"${orig.getName.stripSuffix(".jar")}-with-renaming.jar"
if (!dest.exists() || dest.lastModified() < origLastModified) {

val processor = new DefaultJarProcessor

processor.addClassRename(new ClassRename("scala.**", "coursierapi.shaded.scala.@1"))
processor.addClassRename(new ClassRename("coursier.**", "coursierapi.shaded.coursier.@1"))
processor.addClassRename(new ClassRename("io.github.soc.directories.**", "coursierapi.shaded.directories.@1"))

val transformer = new JarTransformer(dest, processor)
val cp = new ClassPath(file(sys.props("user.dir")), Array(orig))

log.info(s"Generating $dest")
transformer.transform(cp)

Check.onlyNamespace("coursierapi", dest)

dest.setLastModified(origLastModified)
}
dest
},
addArtifact(artifact.in(Compile, packageBin), finalPackageBin),
proguardOptions.in(Proguard) ++= Seq(
"-dontwarn",
"-dontobfuscate",
"-keep class coursierapi.** {\n public protected *;\n}",
),
javaOptions.in(Proguard, proguard) := Seq("-Xmx3172M"),

// Adding the interface JAR rather than its classes directory.
// The former contains META-INF stuff in particular.
proguardInputs.in(Proguard) := proguardInputs.in(Proguard).value.filter(f => !f.isDirectory || f.getName != "classes"),
proguardInputs.in(Proguard) += packageBin.in(Compile).value,

proguardInputFilter.in(Proguard) := { file =>
file.name match {
case n if n.startsWith("interface") => None // keep META-INF from main JAR
case n if n.startsWith("coursier-core") => Some("!META-INF/**,!coursier.properties,!coursier/coursier.properties")
case n if n.startsWith("scala-xml") => Some("!META-INF/**,!scala-xml.properties")
case n if n.startsWith("scala-library") => Some("!META-INF/**,!library.properties,!rootdoc.txt")
case _ => Some("!META-INF/**")
}
},

// inspired by https://github.com/olafurpg/coursier-small/blob/408528d10cea1694c536f55ba1b023e55af3e0b2/build.sbt#L44-L56
pomPostProcess := { node =>
new RuleTransformer(new RewriteRule {
override def transform(node: XmlNode) = node match {
case _: Elem if node.label == "dependency" =>
val org = node.child.find(_.label == "groupId").fold("")(_.text.trim)
val name = node.child.find(_.label == "artifactId").fold("")(_.text.trim)
val ver = node.child.find(_.label == "version").fold("")(_.text.trim)
Comment(s"shaded dependency $org:$name:$ver")
case _ => node
}
}).transform(node).head
},

Settings.shared,
// shading stuff
publish := publish.in(Shading).value,
publishLocal := publishLocal.in(Shading).value,
inConfig(_root_.coursier.ShadingPlugin.Shading)(com.typesafe.sbt.pgp.PgpSettings.projectSettings),
ShadingPlugin.projectSettings, // seems this has to be repeated, *after* the addition of PgpSettings…
PgpKeys.publishSigned := PgpKeys.publishSigned.in(Shading).value,
PgpKeys.publishLocalSigned := PgpKeys.publishLocalSigned.in(Shading).value,
shadingNamespace := shadingNamespace0,
shadeNamespaces ++= Set(
"coursier",
"io.github.soc.directories",
"scala"
libraryDependencies += "io.get-coursier" %% "coursier" % "1.1.0-M13-1",
mimaBinaryIssueFilters ++= Seq(
// users shouln't ever reference those
ProblemFilters.exclude[Problem]("coursierapi.shaded.*"),
),

autoScalaLibrary := false,
libraryDependencies += "io.get-coursier" %% "coursier" % "1.1.0-M13-1" % "shaded",
crossVersion := CrossVersion.disabled,

mimaBinaryIssueFilters ++= Seq(
// users shouln't ever reference this
ProblemFilters.exclude[Problem](s"$shadingNamespace0.*"),
)
// filtering out non cross versioned module in 0.0.1 (published cross-versioned there, added below)
mimaPreviousArtifacts := mimaPreviousArtifacts.value.filter(_.revision != "0.0.1"),

// was cross-versioned publishing in 0.0.1
mimaPreviousArtifacts += organization.value %% "interface" % "0.0.1",

)

Expand All @@ -60,9 +123,4 @@ lazy val interpolators = project
)
)

lazy val `coursier-interface` = project
.in(file("."))
.aggregate(interface, interpolators)
.settings(
publishArtifact := false
)
skip.in(publish) := true
23 changes: 23 additions & 0 deletions project/Check.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import java.io.File
import java.util.zip.ZipFile

import scala.collection.JavaConverters._

object Check {

def onlyNamespace(ns: String, jar: File): Unit = {
val zf = new ZipFile(jar)
val unrecognized = zf.entries()
.asScala
.map(_.getName)
.filter { n =>
!n.startsWith("META-INF/") && !n.startsWith(ns + "/")
}
.toVector
.sorted
for (u <- unrecognized)
System.err.println(s"Unrecognized: $u")
assert(unrecognized.isEmpty)
}

}
31 changes: 8 additions & 23 deletions project/Mima.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,14 @@ object Mima {
.replace("-RC", "-")
.forall(c => c == '.' || c == '-' || c.isDigit)

def binaryCompatibilityVersions: Set[String] = {

val latest = Seq("git", "describe", "--tags", "--abbrev=0", "--match", "v*", "HEAD^")
def binaryCompatibilityVersions: Set[String] =
Seq("git", "tag", "--merged", "HEAD^")
.!!
.trim
.stripPrefix("v")

assert(latest.nonEmpty, "Could not find latest version")

if (stable(latest)) {
val prefix = latest.split('.').take(2).map(_ + ".").mkString

val previous = Seq("git", "tag", "--list", "v" + prefix + "*")
.!!
.linesIterator
.map(_.trim.stripPrefix("v"))
.filter(stable)
.toSet

assert(previous.contains(latest), "Something went wrong")
.linesIterator
.map(_.trim)
.filter(_.startsWith("v"))
.map(_.stripPrefix("v"))
.filter(stable)
.toSet

previous
} else
Set()
}
}
6 changes: 3 additions & 3 deletions project/Settings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import sbt.Keys._
object Settings {

private def scala211 = "2.11.12"
private def scala212 = "2.12.8"
def scala212 = "2.12.8"

lazy val shared = Seq(
scalaVersion := scala211,
scalaVersion := scala212,
crossScalaVersions := Seq(scala212, scala211),
scalacOptions += "-target:jvm-1.8",
javacOptions ++= Seq(
Expand All @@ -19,7 +19,7 @@ object Settings {
// mima
MimaPlugin.autoImport.mimaPreviousArtifacts := {
Mima.binaryCompatibilityVersions.map { ver =>
organization.value %% moduleName.value % ver
(organization.value % moduleName.value % ver).cross(crossVersion.value)
}
}
)
Expand Down
4 changes: 3 additions & 1 deletion project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.2.1")
addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.3.0")
addSbtPlugin("io.get-coursier" % "sbt-shading" % sbtCoursierVersion)
addSbtPlugin("com.lightbend.sbt" % "sbt-proguard" % "0.3.0")
addSbtCoursier

libraryDependencies += "io.get-coursier.jarjar" % "jarjar-core" % "1.0.1-coursier-1"

0 comments on commit 231fbac

Please sign in to comment.