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:
Eelco Dolstra 2021-04-15 14:11:51 +02:00 committed by GitHub
commit 3ee0ecdda0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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);
}
} }
} }
} }