Author: Armin Rigo <[email protected]>
Branch: py3.5
Changeset: r86712:9c68dd229e4f
Date: 2016-08-29 21:18 +0200
http://bitbucket.org/pypy/pypy/changeset/9c68dd229e4f/
Log: hg merge py3.5-scandir
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)
#
@@ -134,6 +136,10 @@
w_name = self.space.fsdecode(w_name)
self.w_name = w_name
+ def descr_repr(self, space):
+ u = space.unicode_w(space.repr(self.w_name))
+ return space.wrap(u"<DirEntry %s>" % u)
+
def fget_name(self, space):
return self.w_name
@@ -281,9 +287,13 @@
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',
+ __repr__ = interp2app(W_DirEntry.descr_repr),
name = GetSetProperty(W_DirEntry.fget_name,
doc="the entry's base filename, relative to "
'scandir() "path" argument'),
@@ -294,5 +304,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,15 @@
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
+
+ def test_repr(self):
+ posix = self.posix
+ d = next(posix.scandir(self.dir1))
+ assert repr(d) == "<DirEntry 'file1'>"
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