]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-135648: Document that `shutil.copyfileobj` doesn't flush (GH-135737) (...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 24 Jun 2025 01:22:07 +0000 (03:22 +0200)
committerGitHub <noreply@github.com>
Tue, 24 Jun 2025 01:22:07 +0000 (01:22 +0000)
Adds a note about flush/close on copyfileobj, and updates
the Emscripten build script to follow documented advice.
(cherry picked from commit 34393cbdd46fd965de86f1e7bc89ab111f506723)

Co-authored-by: Russell Keith-Magee <russell@keith-magee.com>
Doc/library/shutil.rst
Tools/wasm/emscripten/__main__.py

index e7c4c4f46bd0117c6a157ffce33ae11eff34cd6b..2dde40c9d92f452b4977128278c35281c6a01ed5 100644 (file)
@@ -47,6 +47,13 @@ Directory and files operations
    0, only the contents from the current file position to the end of the file will
    be copied.
 
+   :func:`copyfileobj` will *not* guarantee that the destination stream has
+   been flushed on completion of the copy. If you want to read from the
+   destination at the completion of the copy operation (for example, reading
+   the contents of a temporary file that has been copied from a HTTP stream),
+   you must ensure that you have called :func:`~io.IOBase.flush` or
+   :func:`~io.IOBase.close` on the file-like object before attempting to read
+   the destination file.
 
 .. function:: copyfile(src, dst, *, follow_symlinks=True)
 
index 849bd5de44eb7b634b2f5a49b729aeaeaa0ea120..c0d58aeaadd2cf89ba2d59182d2f927ac6a91b53 100644 (file)
@@ -167,11 +167,12 @@ def make_build_python(context, working_dir):
 @subdir(HOST_BUILD_DIR, clean_ok=True)
 def make_emscripten_libffi(context, working_dir):
     shutil.rmtree(working_dir / "libffi-3.4.6", ignore_errors=True)
-    with tempfile.NamedTemporaryFile(suffix=".tar.gz") as tmp_file:
+    with tempfile.NamedTemporaryFile(suffix=".tar.gz", delete_on_close=False) as tmp_file:
         with urlopen(
             "https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz"
         ) as response:
             shutil.copyfileobj(response, tmp_file)
+        tmp_file.close()
         shutil.unpack_archive(tmp_file.name, working_dir)
     call(
         [EMSCRIPTEN_DIR / "make_libffi.sh"],