Based on Ivy's behavior, bringing back approximation

I assumed 1.1+ should be treated as 1.+, but it seems like Ivy treats
it more as “any version that starts with 1.1” including 1.10.
Josh’s original implementation approximates this by making ranges for
multiple digits, 1.1~1.2, 1.10~1.20, etc.
This commit is contained in:
Eugene Yokota 2014-08-22 03:54:32 -04:00
parent b812cdc916
commit f99c5817f5
2 changed files with 26 additions and 11 deletions

View File

@ -210,17 +210,19 @@ class MakePom(val log: Logger) {
} }
val startSym = Set(']', '[', '(') val startSym = Set(']', '[', '(')
val stopSym = Set(']', '[', ')') val stopSym = Set(']', '[', ')')
val PlusPattern = """(.+)(\.\d*\+)""".r val DotPlusPattern = """(.+)\.\+""".r
val DotNumPlusPattern = """(.+)\.(\d+)\+""".r
val NumPlusPattern = """(\d+)\+""".r
val maxDigit = 5
try { try {
revision match { revision match {
case PlusPattern(base, tail) => plusRange(base) case "+" => "[0,)"
// There's no direct translation for a dynamic revision like "1+". case DotPlusPattern(base) => plusRange(base)
// This is likely the build user misunderstanding the meaning of "+", // This is a heuristic. Maven just doesn't support Ivy's notions of 1+, so
// which means pick the latest in the version segment. // we assume version ranges never go beyond 5 siginificant digits.
// So if someone wanted (1.0 <= x), then it should be "[1.0)" or "1.+". case NumPlusPattern(tail) => (0 until maxDigit).map(plusRange(tail, _)).mkString(",")
// Technically speaking, "1+" should convert to "LATEST", case DotNumPlusPattern(base, tail) => (0 until maxDigit).map(plusRange(base + "." + tail, _)).mkString(",")
// but that seems to be deprecated now, so picking the minimum version "0". case rev if rev endsWith "+" => sys.error(s"dynamic revision '$rev' cannot be translated to POM")
case rev if rev endsWith "+" => "[0,)"
case rev if startSym(rev(0)) && stopSym(rev(rev.length - 1)) => case rev if startSym(rev(0)) && stopSym(rev(rev.length - 1)) =>
val start = rev(0) val start = rev(0)
val stop = rev(rev.length - 1) val stop = rev(rev.length - 1)

View File

@ -47,14 +47,27 @@ class MakePomSpec extends Specification {
${convertTo("12.31.42.+", "[12.31.42,12.31.43)")} ${convertTo("12.31.42.+", "[12.31.42,12.31.43)")}
1.1+ should 1.1+ should
${convertTo("1.1+", "[1,2)")} ${convertTo("1.1+", "[1.1,1.2),[1.10,1.20),[1.100,1.200),[1.1000,1.2000),[1.10000,1.20000)")}
1+ should 1+ should
${convertTo("1+", "[0,)")} ${convertTo("1+", "[1,2),[10,20),[100,200),[1000,2000),[10000,20000)")}
+ should
${convertTo("+", "[0,)")}
foo+ should
${beParsedAsError("foo+")}
""" """
val mp = new MakePom(ConsoleLogger()) val mp = new MakePom(ConsoleLogger())
def convertTo(s: String, expected: String) = def convertTo(s: String, expected: String) =
mp.makeDependencyVersion(s) must_== expected mp.makeDependencyVersion(s) must_== expected
def beParsedAsError(s: String) =
try {
mp.makeDependencyVersion(s)
failure
} catch {
case e: Throwable => success
}
} }