Merge pull request #4679 from ony/feature/one-pass-canon-path
Optimize canonPath to resolve relative symlinks in one pass
This commit is contained in:
commit
3ee0ecdda0
|
@ -144,16 +144,18 @@ Path canonPath(const Path & path, bool resolveSymlinks)
|
||||||
s += '/';
|
s += '/';
|
||||||
while (i != end && *i != '/') s += *i++;
|
while (i != end && *i != '/') s += *i++;
|
||||||
|
|
||||||
/* If s points to a symlink, resolve it and restart (since
|
/* If s points to a symlink, resolve it and continue from there */
|
||||||
the symlink target might contain new symlinks). */
|
|
||||||
if (resolveSymlinks && isLink(s)) {
|
if (resolveSymlinks && isLink(s)) {
|
||||||
if (++followCount >= maxFollow)
|
if (++followCount >= maxFollow)
|
||||||
throw Error("infinite symlink recursion in path '%1%'", path);
|
throw Error("infinite symlink recursion in path '%1%'", path);
|
||||||
temp = absPath(readLink(s), dirOf(s))
|
temp = readLink(s) + string(i, end);
|
||||||
+ string(i, end);
|
i = temp.begin();
|
||||||
i = temp.begin(); /* restart */
|
|
||||||
end = temp.end();
|
end = temp.end();
|
||||||
s = "";
|
if (!temp.empty() && temp[0] == '/') {
|
||||||
|
s.clear(); /* restart for symlinks pointing to absolute path */
|
||||||
|
} else {
|
||||||
|
s = dirOf(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue