Skip to content

Commit

Permalink
support binary version in launcher
Browse files Browse the repository at this point in the history
  • Loading branch information
eed3si9n authored and harrah committed Jan 29, 2013
1 parent e47b8ab commit 125727b
Show file tree
Hide file tree
Showing 13 changed files with 165 additions and 293 deletions.
62 changes: 14 additions & 48 deletions ivy/src/main/scala/sbt/CrossVersion.scala
@@ -1,12 +1,14 @@
package sbt

import cross.CrossVersionUtil

final case class ScalaVersion(full: String, binary: String)

sealed trait CrossVersion
object CrossVersion
{
val TransitionScalaVersion = "2.10"
val TransitionSbtVersion = "0.12"
val TransitionScalaVersion = CrossVersionUtil.TransitionScalaVersion
val TransitionSbtVersion = CrossVersionUtil.TransitionSbtVersion

object Disabled extends CrossVersion { override def toString = "disabled" }
final class Binary(val remapVersion: String => String) extends CrossVersion {
Expand Down Expand Up @@ -71,58 +73,22 @@ object CrossVersion
def isStable(v: String): Boolean = isScalaApiCompatible(v)
@deprecated("Use CrossVersion.scalaApiVersion or CrossVersion.sbtApiVersion", "0.13.0")
def selectVersion(full: String, binary: String): String = if(isStable(full)) binary else full
def isSbtApiCompatible(v: String): Boolean = sbtApiVersion(v).isDefined
def isSbtApiCompatible(v: String): Boolean = CrossVersionUtil.isSbtApiCompatible(v)
/** Returns sbt binary interface x.y API compatible with the given version string v.
* RCs for x.y.0 are considered API compatible.
* Compatibile versions include 0.12.0-1 and 0.12.0-RC1 for Some(0, 12).
*/
def sbtApiVersion(v: String): Option[(Int, Int)] =
{
val ReleaseV = """(\d+)\.(\d+)\.(\d+)(-\d+)?""".r
val CandidateV = """(\d+)\.(\d+)\.(\d+)(-RC\d+)""".r
val NonReleaseV = """(\d+)\.(\d+)\.(\d+)(-\w+)""".r
v match {
case ReleaseV(x, y, z, ht) => Some((x.toInt, y.toInt))
case CandidateV(x, y, z, ht) => Some((x.toInt, y.toInt))
case NonReleaseV(x, y, z, ht) if z.toInt > 0 => Some((x.toInt, y.toInt))
case _ => None
}
}
def isScalaApiCompatible(v: String): Boolean = scalaApiVersion(v).isDefined
def sbtApiVersion(v: String): Option[(Int, Int)] = CrossVersionUtil.sbtApiVersion(v)
def isScalaApiCompatible(v: String): Boolean = CrossVersionUtil.isScalaApiCompatible(v)
/** Returns Scala binary interface x.y API compatible with the given version string v.
* Compatibile versions include 2.10.0-1 and 2.10.1-M1 for Some(2, 10), but not 2.10.0-RC1.
*/
def scalaApiVersion(v: String): Option[(Int, Int)] =
{
val ReleaseV = """(\d+)\.(\d+)\.(\d+)(-\d+)?""".r
val NonReleaseV = """(\d+)\.(\d+)\.(\d+)(-\w+)""".r
v match {
case ReleaseV(x, y, z, ht) => Some((x.toInt, y.toInt))
case NonReleaseV(x, y, z, ht) if z.toInt > 0 => Some((x.toInt, y.toInt))
case _ => None
}
}
val PartialVersion = """(\d+)\.(\d+)(?:\..+)?""".r
def partialVersion(s: String): Option[(Int,Int)] =
s match {
case PartialVersion(major, minor) => Some(major.toInt, minor.toInt)
case _ => None
}
private[this] def isNewer(major: Int, minor: Int, minMajor: Int, minMinor: Int): Boolean =
major > minMajor || (major == minMajor && minor >= minMinor)

def binaryScalaVersion(full: String): String = binaryVersionWithApi(full, TransitionScalaVersion)(scalaApiVersion)
def binarySbtVersion(full: String): String = binaryVersionWithApi(full, TransitionSbtVersion)(sbtApiVersion)
def scalaApiVersion(v: String): Option[(Int, Int)] = CrossVersionUtil.scalaApiVersion(v)
val PartialVersion = CrossVersionUtil.PartialVersion
def partialVersion(s: String): Option[(Int,Int)] = CrossVersionUtil.partialVersion(s)
def binaryScalaVersion(full: String): String = CrossVersionUtil.binaryScalaVersion(full)
def binarySbtVersion(full: String): String = CrossVersionUtil.binarySbtVersion(full)
@deprecated("Use CrossVersion.scalaApiVersion or CrossVersion.sbtApiVersion", "0.13.0")
def binaryVersion(full: String, cutoff: String): String = binaryVersionWithApi(full, cutoff)(scalaApiVersion)
private[this] def binaryVersionWithApi(full: String, cutoff: String)(apiVersion: String => Option[(Int,Int)]): String =
{
def sub(major: Int, minor: Int) = major + "." + minor
(apiVersion(full), partialVersion(cutoff)) match {
case (Some((major, minor)), None) => sub(major, minor)
case (Some((major, minor)), Some((minMajor, minMinor))) if isNewer(major, minor, minMajor, minMinor) => sub(major, minor)
case _ => full
}
}
}
def binaryVersion(full: String, cutoff: String): String = CrossVersionUtil.binaryVersion(full, cutoff)

}
218 changes: 0 additions & 218 deletions launch.specification

This file was deleted.

1 change: 1 addition & 0 deletions launch/interface/src/main/java/xsbti/ApplicationID.java
Expand Up @@ -11,6 +11,7 @@ public interface ApplicationID
public String mainClass();
public String[] mainComponents();
public boolean crossVersioned();
public CrossValue crossVersionedValue();

/** Files to add to the application classpath. */
public File[] classpathExtra();
Expand Down
6 changes: 6 additions & 0 deletions launch/interface/src/main/java/xsbti/CrossValue.java
@@ -0,0 +1,6 @@
package xsbti;

public enum CrossValue
{
Disabled, Full, Binary;
}
4 changes: 2 additions & 2 deletions launch/src/main/scala/xsbt/boot/ConfigurationParser.scala
Expand Up @@ -170,12 +170,12 @@ class ConfigurationParser
val (rev, m3) = getVersion(m2, name + " version", name + ".version")
val (main, m4) = id(m3, "class", "xsbt.Main")
val (components, m5) = ids(m4, "components", List("default"))
val (crossVersioned, m6) = id(m5, "cross-versioned", "true")
val (crossVersioned, m6) = id(m5, "cross-versioned", CrossVersionUtil.binaryString)
val (resources, m7) = ids(m6, "resources", Nil)
val (classifiers, m8) = getClassifiers(m7, "Application classifiers")
check(m8, "label")
val classpathExtra = toArray(toFiles(resources))
val app = new Application(org, name, rev, main, components, toBoolean(crossVersioned), classpathExtra)
val app = new Application(org, name, rev, main, components, LaunchCrossVersion(crossVersioned), classpathExtra)
(app, classifiers)
}
def getRepositories(m: LabelMap): List[Repository.Repository] =
Expand Down

0 comments on commit 125727b

Please sign in to comment.