Steve Dower <steve.do...@python.org> added the comment:

That was a long set of replies, so here's my summary proposed behaviour:

(Where "links" are the generic term for the set that includes "reparse point", 
"symlink", "mount point", "junction", etc.)

os.lstat(path): returns attributes for path without traversing any kind of links

os.stat(path): traverses any links supported by the OS and returns attributes 
for the final file
- on Windows, if the OS reports that a link is not followable (e.g. 
appexeclink), then the original link is reported. So if S_IFLNK is set in the 
result, the caller should, use os.path.realpath() to traverse as many links as 
possible to reach the unfollowable link

os.exists(path): now returns True for links that exist but the OS reports are 
not followable - previously returned False (links that are followable but the 
target does not exist continue to return False)

os.path.is_dir(path): now returns False for directory links where the target 
does not exist

os.unlink(path): unchanged (still removes the junction, not the contents)

os.scandir(path): DirEntry.is_symlink() and DirEntry.is_dir() will now both be 
True for junctions (this was always the case for symlinks to directories). 
DirEntry.stat(follow_symlinks=False).st_reparse_tag == 
stat.IO_REPARSE_TAG_MOUNT_POINT is how to specifically detect a junction.

shutil.copytree(path): Unchanged. (requires a minor fix to continue to 
recursively copy through junctions (using above test), but not symlinks.)

shutil.rmtree(path): Will now remove a junction rather than recursively 
deleting its contents (net improvement, IMHO)


And as I said at the end of the long post, my main goals are:
* the result of _using_ the returned information should be consistent across OS
* there are ways of getting more specific information when needed

The most impactful change would seem to be the one to DirEntry, in that users 
may now treat junction points more like symlinks than real directories 
depending on how they've set up their checks. But for the other benefits - 
particularly the more reliable exists() checks - I think this is worth it 
overall.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue37834>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to