summaryrefslogtreecommitdiff
path: root/Lib/genericpath.py
diff options
context:
space:
mode:
authorBrian Curtin <brian@python.org>2012-12-26 07:03:03 -0600
committerBrian Curtin <brian@python.org>2012-12-26 07:03:03 -0600
commit490b32a3976d84eaf1d6ca8cdcb00eac0ce5055b (patch)
treef110633e5ef37e78cecac8701874bb7a02c250bf /Lib/genericpath.py
parent2bf61abe02d578a9812cb13d4d71e14f481c4cb5 (diff)
downloadcpython-git-490b32a3976d84eaf1d6ca8cdcb00eac0ce5055b.tar.gz
Fix #11939. Set st_dev attribute on Windows to simplify os.path.samefile.
By setting the st_dev attribute, we can then remove some Windows-specific code and move os.path.samefile/sameopenfile/samestat to Lib/genericpath.py so all platforms share the same implementation.
Diffstat (limited to 'Lib/genericpath.py')
-rw-r--r--Lib/genericpath.py28
1 files changed, 27 insertions, 1 deletions
diff --git a/Lib/genericpath.py b/Lib/genericpath.py
index 943fdb3efb..5292aa8fbd 100644
--- a/Lib/genericpath.py
+++ b/Lib/genericpath.py
@@ -7,7 +7,8 @@ import os
import stat
__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
- 'getsize', 'isdir', 'isfile']
+ 'getsize', 'isdir', 'isfile', 'samefile', 'sameopenfile',
+ 'samestat']
# Does a path exist?
@@ -75,6 +76,31 @@ def commonprefix(m):
return s1[:i]
return s1
+# Are two stat buffers (obtained from stat, fstat or lstat)
+# describing the same file?
+def samestat(s1, s2):
+ """Test whether two stat buffers reference the same file"""
+ return (s1.st_ino == s2.st_ino and
+ s1.st_dev == s2.st_dev)
+
+
+# Are two filenames really pointing to the same file?
+def samefile(f1, f2):
+ """Test whether two pathnames reference the same actual file"""
+ s1 = os.stat(f1)
+ s2 = os.stat(f2)
+ return samestat(s1, s2)
+
+
+# Are two open files really referencing the same file?
+# (Not necessarily the same file descriptor!)
+def sameopenfile(fp1, fp2):
+ """Test whether two open file objects reference the same file"""
+ s1 = os.fstat(fp1)
+ s2 = os.fstat(fp2)
+ return samestat(s1, s2)
+
+
# Split a path in root and extension.
# The extension is everything starting at the last dot in the last
# pathname component; the root is everything before that.