in src/main/java/org/apache/maven/shared/utils/PathTool.java [263:323]
private static String buildRelativePath(
@Nonnull String toPath, @Nonnull String fromPath, final char separatorChar) {
// use tokeniser to traverse paths and for lazy checking
StringTokenizer toTokeniser = new StringTokenizer(toPath, String.valueOf(separatorChar));
StringTokenizer fromTokeniser = new StringTokenizer(fromPath, String.valueOf(separatorChar));
int count = 0;
// walk along the to path looking for divergence from the from path
while (toTokeniser.hasMoreTokens() && fromTokeniser.hasMoreTokens()) {
if (separatorChar == '\\') {
if (!fromTokeniser.nextToken().equalsIgnoreCase(toTokeniser.nextToken())) {
break;
}
} else {
if (!fromTokeniser.nextToken().equals(toTokeniser.nextToken())) {
break;
}
}
count++;
}
// reinitialise the tokenisers to count positions to retrieve the
// gobbled token
toTokeniser = new StringTokenizer(toPath, String.valueOf(separatorChar));
fromTokeniser = new StringTokenizer(fromPath, String.valueOf(separatorChar));
while (count-- > 0) {
fromTokeniser.nextToken();
toTokeniser.nextToken();
}
StringBuilder relativePath = new StringBuilder();
// add back refs for the rest of from location.
while (fromTokeniser.hasMoreTokens()) {
fromTokeniser.nextToken();
relativePath.append("..");
if (fromTokeniser.hasMoreTokens()) {
relativePath.append(separatorChar);
}
}
if (relativePath.length() != 0 && toTokeniser.hasMoreTokens()) {
relativePath.append(separatorChar);
}
// add fwd fills for whatevers left of newPath.
while (toTokeniser.hasMoreTokens()) {
relativePath.append(toTokeniser.nextToken());
if (toTokeniser.hasMoreTokens()) {
relativePath.append(separatorChar);
}
}
return relativePath.toString();
}