[pypy-commit] pypy follow_symlinks: Support *_dir_fd arguments in rename() and replace()
rlamy
pypy.commits at gmail.com
Sat Mar 26 00:15:39 EDT 2016
Author: Ronan Lamy <ronan.lamy at gmail.com>
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)
- at unwrap_spec(src_dir_fd=DirFD(available=False), dst_dir_fd=DirFD(available=False))
-def rename(space, w_old, w_new,
+ at 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)
- at unwrap_spec(src_dir_fd=DirFD(available=False), dst_dir_fd=DirFD(available=False))
-def replace(space, w_old, w_new,
+ at 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))
More information about the pypy-commit
mailing list