canonPath in one pass

This commit is contained in:
Mykola Orliuk 2021-03-31 04:20:41 +02:00
parent e7810665a7
commit f3f228700a

View file

@ -143,16 +143,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);
}
} }
} }
} }