in src/java/org/apache/ivy/plugins/latest/LatestRevisionStrategy.java [35:85]
public int compare(ModuleRevisionId o1, ModuleRevisionId o2) {
String rev1 = o1.getRevision();
String rev2 = o2.getRevision();
rev1 = rev1.replaceAll("([a-zA-Z])(\\d)", "$1.$2");
rev1 = rev1.replaceAll("(\\d)([a-zA-Z])", "$1.$2");
rev2 = rev2.replaceAll("([a-zA-Z])(\\d)", "$1.$2");
rev2 = rev2.replaceAll("(\\d)([a-zA-Z])", "$1.$2");
String[] parts1 = rev1.split("[\\._\\-\\+]");
String[] parts2 = rev2.split("[\\._\\-\\+]");
int i = 0;
for (; i < parts1.length && i < parts2.length; i++) {
if (parts1[i].equals(parts2[i])) {
continue;
}
boolean is1Number = isNumber(parts1[i]);
boolean is2Number = isNumber(parts2[i]);
if (is1Number && !is2Number) {
return 1;
}
if (is2Number && !is1Number) {
return -1;
}
if (is1Number && is2Number) {
return Long.valueOf(parts1[i]).compareTo(Long.valueOf(parts2[i]));
}
// both are strings, we compare them taking into account special meaning
Map<String, Integer> specialMeanings = getSpecialMeanings();
Integer sm1 = specialMeanings.get(parts1[i].toLowerCase(Locale.US));
Integer sm2 = specialMeanings.get(parts2[i].toLowerCase(Locale.US));
if (sm1 != null) {
if (sm2 == null) {
sm2 = new Integer(0);
}
return sm1.compareTo(sm2);
}
if (sm2 != null) {
return new Integer(0).compareTo(sm2);
}
return parts1[i].compareTo(parts2[i]);
}
if (i < parts1.length) {
return isNumber(parts1[i]) ? 1 : -1;
}
if (i < parts2.length) {
return isNumber(parts2[i]) ? -1 : 1;
}
return 0;
}