Author: Armin Rigo <ar...@tunes.org>
Branch: py3.5
Changeset: r88831:093346994810
Date: 2016-12-02 17:54 +0100
http://bitbucket.org/pypy/pypy/changeset/093346994810/

Log:    os.chdir(fd)

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
@@ -700,12 +700,16 @@
         """Return the current working directory as a string."""
         return space.fsdecode(getcwdb(space))
 
-def chdir(space, w_path):
+@unwrap_spec(path=path_or_fd(allow_fd=rposix.HAVE_FCHDIR))
+def chdir(space, path):
     """Change the current working directory to the specified path."""
     try:
-        dispatch_filename(rposix.chdir)(space, w_path)
+        if rposix.HAVE_FCHDIR and path.as_fd != -1:
+            os.fchdir(path.as_fd)
+        else:
+            call_rposix(rposix.chdir, path)
     except OSError as e:
-        raise wrap_oserror2(space, e, w_path)
+        raise wrap_oserror2(space, e, path.w_path)
 
 @unwrap_spec(mode=c_int, dir_fd=DirFD(rposix.HAVE_MKDIRAT))
 def mkdir(space, w_path, mode=0o777, __kwonly__=None, dir_fd=DEFAULT_DIR_FD):
diff --git a/pypy/module/posix/test/test_posix2.py 
b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -818,19 +818,20 @@
         def test_fchdir(self):
             os = self.posix
             localdir = os.getcwd()
-            try:
-                os.mkdir(self.path2 + 'dir')
-                fd = os.open(self.path2 + 'dir', os.O_RDONLY)
+            os.mkdir(self.path2 + 'fchdir')
+            for func in [os.fchdir, os.chdir]:
                 try:
-                    os.fchdir(fd)
-                    mypath = os.getcwd()
+                    fd = os.open(self.path2 + 'fchdir', os.O_RDONLY)
+                    try:
+                        func(fd)
+                        mypath = os.getcwd()
+                    finally:
+                        os.close(fd)
+                    assert mypath.endswith('test_posix2-fchdir')
+                    raises(OSError, func, fd)
                 finally:
-                    os.close(fd)
-                assert mypath.endswith('test_posix2-dir')
-                raises(OSError, os.fchdir, fd)
-                raises(ValueError, os.fchdir, -1)
-            finally:
-                os.chdir(localdir)
+                    os.chdir(localdir)
+            raises(ValueError, os.fchdir, -1)
 
     def test_largefile(self):
         os = self.posix
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to