You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
3.4 KiB

  1. import sbt._
  2. import sbt.Keys._
  3. import HelpersImpl._
  4. object Helpers extends AnyRef with PropertyHelper with VersionHelper with PomHelper
  5. /* Note: This file is shared among many projects. Avoid putting project-specific things here. */
  6. object HelpersImpl {
  7. sealed trait PropertyHelper {
  8. private[this] lazy val boolNames = Set("yes", "y", "true", "t", "1")
  9. def getProp(name: String): Option[String] = sys.props.get(name) orElse sys.env.get(name)
  10. def parseBool(str: String): Boolean = boolNames(str.trim.toLowerCase)
  11. def boolFlag(name: String): Option[Boolean] = getProp(name).map(parseBool)
  12. def boolFlag(name: String, default: Boolean): Boolean = boolFlag(name) getOrElse default
  13. def intFlag(name: String) = getProp(name).map(_.toInt)
  14. def intFlag(name: String, default: Int): Int = intFlag(name) getOrElse default
  15. def opts(names: String*): Option[String] = names.collectFirst(Function.unlift(getProp))
  16. lazy val buildNumberOpt = sys.env.get("BUILD_NUMBER")
  17. lazy val isJenkins = buildNumberOpt.isDefined
  18. }
  19. sealed trait VersionHelper {
  20. final lazy val sver: Def.Initialize[SVer] = {
  21. Def.map(scalaBinaryVersion)(SVer.apply)
  22. }
  23. final lazy val forceOldInlineSyntax: Def.Initialize[Boolean] = {
  24. val pat = """(?x)^ 2\.12\.[0-2] (?:[^\d].*)? $""".r
  25. Def.map(scalaVersion) {
  26. case pat() => true
  27. case _ => false
  28. }
  29. }
  30. sealed trait Backend
  31. case object NewBackend extends Backend
  32. case object SupportsNewBackend extends Backend
  33. case object OldBackend extends Backend
  34. sealed trait SVer {
  35. val backend: Backend
  36. val requireJava8: Boolean
  37. def supportsNewBackend = backend match {
  38. case NewBackend => true
  39. case SupportsNewBackend => true
  40. case OldBackend => false
  41. }
  42. }
  43. object SVer {
  44. def apply(scalaVersion: String): SVer = {
  45. CrossVersion.partialVersion(scalaVersion) match {
  46. case Some((2, 10)) => SVer2_10
  47. case Some((2, 11)) => SVer2_11
  48. case Some((2, 12)) => SVer2_12
  49. case Some((2, n)) if n >= 13 => SVer2_13
  50. case _ =>
  51. throw new IllegalArgumentException(s"Scala version $scalaVersion is not supported")
  52. }
  53. }
  54. }
  55. case object SVer2_10 extends SVer {
  56. override final val backend = OldBackend
  57. override final val requireJava8 = false
  58. }
  59. case object SVer2_11 extends SVer {
  60. override final val backend = SupportsNewBackend
  61. override final val requireJava8 = false
  62. }
  63. case object SVer2_12 extends SVer {
  64. override final val backend = NewBackend
  65. override final val requireJava8 = true
  66. }
  67. case object SVer2_13 extends SVer {
  68. override final val backend = NewBackend
  69. override final val requireJava8 = true
  70. }
  71. }
  72. sealed trait PomHelper {
  73. import scala.xml.{ Node, NodeSeq }
  74. import scala.xml.transform.{ RewriteRule, RuleTransformer }
  75. def excludePomDeps(exclude: (String, String) => Boolean): Node => Node = { node: Node =>
  76. def shouldExclude(n: Node): Boolean =
  77. n.label == "dependency" && exclude((n \ "groupId").text, (n \ "artifactId").text)
  78. val rewriteRule = new RewriteRule {
  79. override def transform(n: Node): NodeSeq = if (shouldExclude(n)) NodeSeq.Empty else n
  80. }
  81. val transformer = new RuleTransformer(rewriteRule)
  82. transformer.transform(node).head
  83. }
  84. }
  85. }