Compare version strings in groovy
If we're going for the shortest answer, this must come close ;-)
String mostRecentVersion( List versions ) {
versions.sort( false ) { a, b ->
[a,b]*.tokenize('.')*.collect { it as int }.with { u, v ->
[u,v].transpose().findResult{ x,y-> x<=>y ?: null } ?: u.size() <=> v.size()
}
}[-1]
}
This appears to work
String mostRecentVersion(List versions) {
def sorted = versions.sort(false) { a, b ->
List verA = a.tokenize('.')
List verB = b.tokenize('.')
def commonIndices = Math.min(verA.size(), verB.size())
for (int i = 0; i < commonIndices; ++i) {
def numA = verA[i].toInteger()
def numB = verB[i].toInteger()
if (numA != numB) {
return numA <=> numB
}
}
// If we got this far then all the common indices are identical, so whichever version is longer must be more recent
verA.size() <=> verB.size()
}
println "sorted versions: $sorted"
sorted[-1]
}
Here is an inadequate set of tests. You should add some more.
assert mostRecentVersion(['02.2.02.01', '02.2.02.02', '02.2.03.01']) == '02.2.03.01'
assert mostRecentVersion(['4', '2']) == '4'
assert mostRecentVersion(['4.1', '4']) == '4.1'
assert mostRecentVersion(['4.1', '5']) == '5'
Run this code and the tests in the Groovy console to verify that it works