Author: Armin Rigo <[email protected]>
Branch: py3.5-scandir
Changeset: r86705:e69a949f6bcb
Date: 2016-08-29 17:17 +0200
http://bitbucket.org/pypy/pypy/changeset/e69a949f6bcb/
Log: inode()
diff --git a/pypy/module/posix/interp_scandir.py
b/pypy/module/posix/interp_scandir.py
--- a/pypy/module/posix/interp_scandir.py
+++ b/pypy/module/posix/interp_scandir.py
@@ -94,9 +94,10 @@
break
#
known_type = rposix_scandir.get_known_type(entry)
+ inode = rposix_scandir.get_inode(entry)
finally:
self._in_next = False
- direntry = W_DirEntry(self, name, known_type)
+ direntry = W_DirEntry(self, name, known_type, inode)
return space.wrap(direntry)
@@ -122,10 +123,11 @@
class W_DirEntry(W_Root):
w_path = None
- def __init__(self, scandir_iterator, name, known_type):
+ def __init__(self, scandir_iterator, name, known_type, inode):
self.space = scandir_iterator.space
self.scandir_iterator = scandir_iterator
self.name = name # always bytes on Posix
+ self.inode = inode
self.flags = known_type
assert known_type == (known_type & 255)
#
@@ -281,6 +283,9 @@
st = self.get_stat_or_lstat(follow_symlinks)
return build_stat_result(self.space, st)
+ def descr_inode(self, space):
+ return space.wrap(self.inode)
+
W_DirEntry.typedef = TypeDef(
'posix.DirEntry',
@@ -294,5 +299,6 @@
is_file = interp2app(W_DirEntry.descr_is_file),
is_symlink = interp2app(W_DirEntry.descr_is_symlink),
stat = interp2app(W_DirEntry.descr_stat),
+ inode = interp2app(W_DirEntry.descr_inode),
)
W_DirEntry.typedef.acceptable_as_base_class = False
diff --git a/pypy/module/posix/test/test_scandir.py
b/pypy/module/posix/test/test_scandir.py
--- a/pypy/module/posix/test/test_scandir.py
+++ b/pypy/module/posix/test/test_scandir.py
@@ -157,3 +157,10 @@
def test_fdopendir_unsupported(self):
posix = self.posix
raises(TypeError, posix.scandir, 1234)
+
+ def test_inode(self):
+ posix = self.posix
+ d = next(posix.scandir(self.dir1))
+ assert d.name == 'file1'
+ ino = d.inode()
+ assert ino == d.stat().st_ino
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -623,7 +623,8 @@
class CConfig:
_compilation_info_ = eci
DIRENT = rffi_platform.Struct('struct dirent',
- [('d_name', lltype.FixedSizeArray(rffi.CHAR, 1))]
+ [('d_name', lltype.FixedSizeArray(rffi.CHAR, 1)),
+ ('d_ino', lltype.Signed)]
+ [('d_type', rffi.INT)] if HAVE_D_TYPE else [])
if HAVE_D_TYPE:
DT_UNKNOWN = rffi_platform.ConstantInteger('DT_UNKNOWN')
diff --git a/rpython/rlib/rposix_scandir.py b/rpython/rlib/rposix_scandir.py
--- a/rpython/rlib/rposix_scandir.py
+++ b/rpython/rlib/rposix_scandir.py
@@ -50,3 +50,6 @@
if rposix.HAVE_D_TYPE:
return rffi.getintfield(direntp, 'c_d_type')
return DT_UNKNOWN
+
+def get_inode(direntp):
+ return rffi.getintfield(direntp, 'c_d_ino')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit