in java/com/googlesource/gerrit/plugins/supermanifest/JiriUpdater.java [228:289]
static URI relativize(URI current, URI target) {
// We only handle bare paths for now.
if (!target.toString().equals(target.getPath())) {
return target;
}
if (!current.toString().equals(current.getPath())) {
return target;
}
String cur = current.normalize().getPath();
String dest = target.normalize().getPath();
if (cur.startsWith(SLASH) != dest.startsWith(SLASH)) {
return target;
}
while (cur.startsWith(SLASH)) {
cur = cur.substring(1);
}
while (dest.startsWith(SLASH)) {
dest = dest.substring(1);
}
if (cur.indexOf('/') == -1 || dest.indexOf('/') == -1) {
// Avoid having to special-casing in the next two ifs.
String prefix = "prefix/";
cur = prefix + cur;
dest = prefix + dest;
}
if (!cur.endsWith(SLASH)) {
// The current file doesn't matter.
int lastSlash = cur.lastIndexOf('/');
cur = cur.substring(0, lastSlash);
}
String destFile = "";
if (!dest.endsWith(SLASH)) {
// We always have to provide the destination file.
int lastSlash = dest.lastIndexOf('/');
destFile = dest.substring(lastSlash + 1, dest.length());
dest = dest.substring(0, dest.lastIndexOf('/'));
}
String[] cs = cur.split(SLASH);
String[] ds = dest.split(SLASH);
int common = 0;
while (common < cs.length && common < ds.length && cs[common].equals(ds[common])) {
common++;
}
StringJoiner j = new StringJoiner(SLASH);
for (int i = common; i < cs.length; i++) {
j.add("..");
}
for (int i = common; i < ds.length; i++) {
j.add(ds[i]);
}
j.add(destFile);
return URI.create(j.toString());
}