Support resolving the latest sub-revision of a module

Components of revisions are separated by dots or hyphens.

In case you "end the revision with a `+`" (see [1]), the latest sub-revision of the
dependency module should be selected when resolving dependencies.

Accept revisions such as "1.2+" or "1.2.+" and "1.2.3-+".

Fixes #424.

[1]: http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html
This commit is contained in:
Claudio Bley 2017-05-31 22:55:40 +02:00
parent f6493a2d5a
commit 2851f7d364
2 changed files with 25 additions and 16 deletions

View File

@ -11,10 +11,14 @@ object Parse {
else Some(Version(trimmed)) else Some(Version(trimmed))
} }
// matches revisions with a '+' appended, e.g. "1.2.+", "1.2+" or "1.2.3-+"
private val latestSubRevision = "(.*[^.-])[.-]?[+]".r
def ivyLatestSubRevisionInterval(s: String): Option[VersionInterval] = def ivyLatestSubRevisionInterval(s: String): Option[VersionInterval] =
if (s.endsWith(".+")) { s match {
case latestSubRevision(prefix) =>
for { for {
from <- version(s.stripSuffix(".+")) from <- version(prefix)
if from.rawItems.nonEmpty if from.rawItems.nonEmpty
last <- Some(from.rawItems.last).collect { case n: Version.Numeric => n } last <- Some(from.rawItems.last).collect { case n: Version.Numeric => n }
// a bit loose, but should do the job // a bit loose, but should do the job
@ -26,8 +30,9 @@ object Parse {
if from.rawItems.init == to.rawItems.dropRight(2).init if from.rawItems.init == to.rawItems.dropRight(2).init
if to.rawItems.takeRight(2) == Seq(Version.Literal("a"), Version.Number(1)) if to.rawItems.takeRight(2) == Seq(Version.Literal("a"), Version.Number(1))
} yield VersionInterval(Some(from), Some(to), fromIncluded = true, toIncluded = false) } yield VersionInterval(Some(from), Some(to), fromIncluded = true, toIncluded = false)
} else case _ =>
None None
}
def versionInterval(s: String): Option[VersionInterval] = { def versionInterval(s: String): Option[VersionInterval] = {

View File

@ -20,6 +20,10 @@ object VersionConstraintTests extends TestSuite {
val c0 = Parse.versionConstraint("(,1.2]") val c0 = Parse.versionConstraint("(,1.2]")
assert(c0 == Some(VersionConstraint.interval(VersionInterval(None, Some(Version("1.2")), false, true)))) assert(c0 == Some(VersionConstraint.interval(VersionInterval(None, Some(Version("1.2")), false, true))))
} }
'latestSubRevision{
val c0 = Parse.versionConstraint("1.2.3-+")
assert(c0 == Some(VersionConstraint.interval(VersionInterval(Some(Version("1.2.3")), Some(Version("1.2.4-a1")), true, false))))
}
} }
'repr{ 'repr{