Author: Ronan Lamy <[email protected]>
Branch: follow_symlinks
Changeset: r83386:b7d85ab453c9
Date: 2016-03-26 04:14 +0000
http://bitbucket.org/pypy/pypy/changeset/b7d85ab453c9/
Log: Support *_dir_fd arguments in rename() and replace()
diff --git a/pypy/module/posix/interp_posix.py
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -849,8 +849,9 @@
"""
_chmod_fd(space, fd, mode)
-@unwrap_spec(src_dir_fd=DirFD(available=False),
dst_dir_fd=DirFD(available=False))
-def rename(space, w_old, w_new,
+@unwrap_spec(src_dir_fd=DirFD(rposix.HAVE_RENAMEAT),
+ dst_dir_fd=DirFD(rposix.HAVE_RENAMEAT))
+def rename(space, w_src, w_dst,
src_dir_fd=DEFAULT_DIR_FD, dst_dir_fd=DEFAULT_DIR_FD):
"""rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
@@ -862,12 +863,18 @@
src_dir_fd and dst_dir_fd, may not be implemented on your platform.
If they are unavailable, using them will raise a NotImplementedError."""
try:
- dispatch_filename_2(rposix.rename)(space, w_old, w_new)
+ if (src_dir_fd != DEFAULT_DIR_FD or dst_dir_fd != DEFAULT_DIR_FD):
+ src = space.fsencode_w(w_src)
+ dst = space.fsencode_w(w_dst)
+ rposix.renameat(src, dst, src_dir_fd, dst_dir_fd)
+ else:
+ dispatch_filename_2(rposix.rename)(space, w_src, w_dst)
except OSError, e:
raise wrap_oserror(space, e)
-@unwrap_spec(src_dir_fd=DirFD(available=False),
dst_dir_fd=DirFD(available=False))
-def replace(space, w_old, w_new,
+@unwrap_spec(src_dir_fd=DirFD(rposix.HAVE_RENAMEAT),
+ dst_dir_fd=DirFD(rposix.HAVE_RENAMEAT))
+def replace(space, w_src, w_dst,
src_dir_fd=DEFAULT_DIR_FD, dst_dir_fd=DEFAULT_DIR_FD):
"""replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
@@ -879,8 +886,13 @@
src_dir_fd and dst_dir_fd, may not be implemented on your platform.
If they are unavailable, using them will raise a NotImplementedError."""
try:
- dispatch_filename_2(rposix.replace)(space, w_old, w_new)
- except OSError, e:
+ if (src_dir_fd != DEFAULT_DIR_FD or dst_dir_fd != DEFAULT_DIR_FD):
+ src = space.fsencode_w(w_src)
+ dst = space.fsencode_w(w_dst)
+ rposix.renameat(src, dst, src_dir_fd, dst_dir_fd)
+ else:
+ dispatch_filename_2(rposix.replace)(space, w_src, w_dst)
+ except OSError as e:
raise wrap_oserror(space, e)
@unwrap_spec(mode=c_int, dir_fd=DirFD(rposix.HAVE_MKFIFOAT))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit