Commits

larry committed 3e67795

Cleanup/rewrite shutil docs regarding follow_symlinks and copying attributes.

  • Participants
  • Parent commits b0ad15e

Comments (0)

Files changed (1)

File Doc/library/shutil.rst

 .. function:: copyfile(src, dst, *, follow_symlinks=True)
 
    Copy the contents (no metadata) of the file named *src* to a file named
-   *dst* and return *dst*.  *dst* must be the complete target file name; look at
-   :func:`shutil.copy` for a copy that accepts a target directory path.  If
-   *src* and *dst* are the same files, :exc:`Error` is raised.
+   *dst* and return *dst*.  *src* and *dst* are path names given as strings.
+   *dst* must be the complete target file name; look at :func:`shutil.copy`
+   for a copy that accepts a target directory path.  If *src* and *dst*
+   specify the same file, :exc:`Error` is raised.
 
-   The destination location must be writable; otherwise,  an :exc:`OSError` exception
-   will be raised. If *dst* already exists, it will be replaced.   Special files
-   such as character or block devices and pipes cannot be copied with this
-   function.  *src* and *dst* are path names given as strings.
+   The destination location must be writable; otherwise, an :exc:`OSError`
+   exception will be raised. If *dst* already exists, it will be replaced.
+   Special files such as character or block devices and pipes cannot be
+   copied with this function.
 
    If *follow_symlinks* is false and *src* is a symbolic link,
    a new symbolic link will be created instead of copying the
 .. function:: copymode(src, dst, *, follow_symlinks=True)
 
    Copy the permission bits from *src* to *dst*.  The file contents, owner, and
-   group are unaffected.  *src* and *dst* are path names given as strings.  If
-   *follow_symlinks* is false, *src* is a symbolic link, and the operating
-   system supports modes for symbolic links (for example BSD-based ones),
-   the mode of the link will be copied.
+   group are unaffected.  *src* and *dst* are path names given as strings.
+   If *follow_symlinks* is false, and both *src* and *dst* are symbolic links,
+   :func:`copymode` will attempt to modify the mode of *dst* itself (rather
+   than the file it points to).  This functionality is not available on every
+   platform; please see :func:`copystat` for more information.  If
+   :func:`copymode` cannot modify symbolic links on the local platform, and it
+   is asked to do so, it will do nothing and return.
 
    .. versionchanged:: 3.3
       Added *follow_symlinks* argument.
 
 .. function:: copystat(src, dst, *, follow_symlinks=True)
 
-   Copy the permission bits, last access time, last modification time, and flags
-   from *src* to *dst*.  The file contents, owner, and group are unaffected.  *src*
-   and *dst* are path names given as strings.  If *follow_symlinks* is false, and
-   *src* and *dst* are both symbolic links, the stats of the link will be copied as
-   far as the platform allows.  On Linux, :func:`copystat` also copies the
-   "extended attributes" where possible.
+   Copy the permission bits, last access time, last modification time, and
+   flags from *src* to *dst*.  On Linux, :func:`copystat` also copies the
+   "extended attributes" where possible.  The file contents, owner, and
+   group are unaffected.  *src* and *dst* are path names given as strings.
+
+   If *follow_symlinks* is false, and *src* and *dst* both
+   refer to symbolic links, :func:`copystat` will operate on
+   the symbolic links themselves rather than the files the
+   symbolic links refer to--reading the information from the
+   *src* symbolic link, and writing the information to the
+   *dst* symbolic link.
+
+   .. note::
+
+      Not all platforms provide the ability to examine and
+      modify symbolic links.  Python itself can tell you what
+      functionality is locally available.
+
+      * If ``os.chmod in os.supports_follow_symlinks`` is
+        ``True``, :func:`copystat` can modify the permission
+        bits of a symbolic link.
+
+      * If ``os.utime in os.supports_follow_symlinks`` is
+        ``True``, :func:`copystat` can modify the last access
+        and modification times of a symbolic link.
+
+      * If ``os.chflags in os.supports_follow_symlinks`` is
+        ``True``, :func:`copystat` can modify the flags of
+        a symbolic link.  (``os.chflags`` is not available on
+        all platforms.)
+
+      On platforms where some or all of this functionality
+      is unavailable, when asked to modify a symbolic link,
+      :func:`copystat` will copy everything it can.
+      :func:`copystat` never returns failure.
+
+      Please see :data:`os.supports_follow_symlinks`
+      for more information.
 
    .. versionchanged:: 3.3
       Added *follow_symlinks* argument and support for Linux extended attributes.
 
 .. function:: copy(src, dst, *, follow_symlinks=True)
 
-   Copy the file *src* to the file or directory *dst* and return the file's
-   destination.  If *dst* is a directory, a
-   file with the same basename as *src*  is created (or overwritten) in the
-   directory specified.  Permission bits are copied.  *src* and *dst* are path
-   names given as strings.  If *follow_symlinks* is false, symbolic
-   links won't be followed but recreated instead -- this resembles GNU's
-   :program:`cp -P`.
+   Copies the file *src* to the file or directory *dst*.  *src* and *dst*
+   should be strings.  If *dst* specifies a directory, the file will be
+   copied into *dst* using the base filename from *src*.  Returns the
+   path to the newly created file.
+
+   If *follow_symlinks* is false, and *src* is a symbolic link,
+   *dst* will be created as a symbolic link.  If *follow_symlinks*
+   is true and *src* is a symbolic link, *dst* will be a copy of
+   the file *src* refers to.
+
+   :func:`copy` copies the file data and the file's permission
+   mode (see :func:`os.chmod`).  Other metadata, like the
+   file's creation and modification times, is not preserved.
+   To preserve all file metadata from the original, use
+   :func:`~shutil.copy2` instead.
 
    .. versionchanged:: 3.3
       Added *follow_symlinks* argument.
-      Now returns *dst*.
+      Now returns path to the newly created file.
 
 .. function:: copy2(src, dst, *, follow_symlinks=True)
 
-   Similar to :func:`shutil.copy`, including that the destination is
-   returned, but metadata is copied as well. This is similar to the Unix
-   command :program:`cp -p`.  If *follow_symlinks* is false,
-   symbolic links won't be followed but recreated instead -- this resembles
-   GNU's :program:`cp -P`.
+   Identical to :func:`~shutil.copy` except that :func:`copy2`
+   also attempts to preserve all file metadata.
+
+   When *follow_symlinks* is false, and *src* is a symbolic
+   link, :func:`copy2` attempts to copy all metadata from the
+   *src* symbolic link to the newly-created *dst* symbolic link.
+   However, this functionality is not available on all platforms.
+   On platforms where some or all of this functionality is
+   unavailable, :func:`copy2` will preserve all the metadata
+   it can; :func:`copy2` never returns failure.
+
+   :func:`copy2` uses :func:`copystat` to copy the file metadata.
+   Please see :func:`copystat` for more information
+   about platform support for modifying symbolic link metadata.
 
    .. versionchanged:: 3.3
       Added *follow_symlinks* argument, try to copy extended
       file system attributes too (currently Linux only).
-      Now returns *dst*.
+      Now returns path to the newly created file.
 
 .. function:: ignore_patterns(\*patterns)