in rest-api/src/jetbrains/buildServer/server/rest/data/finder/impl/BuildArtifactsFinder.java [633:697]
public int compare(@NotNull String s1, final boolean isFile1, @NotNull String s2, final boolean isFile2) {
int n1 = s1.length();
int n2 = s2.length();
int min = Math.min(n1, n2);
int characterComparisonResult = n1 - n2;
boolean shouldStopOnFirstDiff = false;
boolean shouldStopOnFirstDiffSet = false;
int i;
for (i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
if (PS == c1) return -1;
if (PS == c2) return 1;
//logic like in standard String.CASE_INSENSITIVE_ORDER
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
characterComparisonResult = c1 - c2;
break;
}
}
// same char in different case
if (!shouldStopOnFirstDiffSet) {
shouldStopOnFirstDiff = !isFile1 || !isFile2 || s1.indexOf(PS, i) != -1 || s2.indexOf(PS, i) != -1;
shouldStopOnFirstDiffSet = true;
}
characterComparisonResult = s2.charAt(i) - s1.charAt(i); //order is reversed to make lowercase characters appear before upper case ones
if (shouldStopOnFirstDiff) {
break;
}
}
}
if (i == min && n1 == n2 && characterComparisonResult != 0) { // characterComparisonResult holds firstDiff
return characterComparisonResult; //define order for non-directories different only in case
}
//should go back and forth to scan a full digit
if (i < min && (Character.isDigit(s1.charAt(i)) || Character.isDigit(s2.charAt(i)))) {
long number1 = extractNumber(s1, i);
long number2 = extractNumber(s2, i);
if (number1 != -1 && number2 != -1 && number1 != number2) {
characterComparisonResult = number1 - number2 < 0 ? -1 : 1;
}
}
//noinspection SimplifiableConditionalExpression
boolean containsNested1 = i < n1 ? s1.indexOf(PS, i) != -1 : false;
//noinspection SimplifiableConditionalExpression
boolean containsNested2 = i < n2 ? s2.indexOf(PS, i) != -1 : false;
if (containsNested1 != containsNested2) {
if (!containsNested1) return isFile1 ? 1 : characterComparisonResult;
return isFile2 ? -1 : characterComparisonResult;
} else {
if (!containsNested1 && isFile1 != isFile2) {
return isFile1 ? 1 : -1;
} else {
return characterComparisonResult;
}
}
}