]> git.eshelyaron.com Git - emacs.git/commitdiff
Make copy-directory act like copy-file etc.
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 11 Sep 2017 05:07:30 +0000 (22:07 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 11 Sep 2017 05:31:23 +0000 (22:31 -0700)
Do the special dance with the destination only if it is a
directory name, for consistency with copy-file etc. (Bug#27986).
* doc/emacs/files.texi (Copying and Naming):
* doc/lispref/files.texi (Create/Delete Dirs):
* etc/NEWS: Document this.
* lisp/files.el (copy-directory): Treat NEWNAME as special
only if it is a directory name.

doc/emacs/files.texi
doc/lispref/files.texi
etc/NEWS
lisp/files.el

index 0cf46b6df1cc5f2e0b2fe3a40d521388be62e861..ca4f223953742cef307411abd708cd8919cb63b2 100644 (file)
@@ -1572,10 +1572,10 @@ file @var{new}.
 
 @findex copy-directory
   @kbd{M-x copy-directory} copies directories, similar to the
-@command{cp -r} shell command.  If @var{new} is an existing directory,
-it creates a copy of the @var{old} directory and puts it in @var{new}.
-If @var{new} is not an existing directory, it copies all the contents
-of @var{old} into a new directory named @var{new}.
+@command{cp -r} shell command.  If @var{new} is a directory name, it
+creates a copy of the @var{old} directory and puts it in @var{new}.
+Otherwise it copies all the contents of @var{old} into a new directory
+named @var{new}.
 
 @cindex renaming files
 @findex rename-file
index eacaf046370302b6a75366dd4031d812cd9dadb5..901382fe9bdf4c5f710e75f4fa62e083e0746bfe 100644 (file)
@@ -2976,8 +2976,9 @@ if they don't already exist.
 
 @deffn Command copy-directory dirname newname &optional keep-time parents copy-contents
 This command copies the directory named @var{dirname} to
-@var{newname}.  If @var{newname} names an existing directory,
+@var{newname}.  If @var{newname} is a directory name,
 @var{dirname} will be copied to a subdirectory there.
+@xref{Directory Names}.
 
 It always sets the file modes of the copied files to match the
 corresponding original file.
@@ -2992,7 +2993,7 @@ this happens by default.
 
 The fifth argument @var{copy-contents}, if non-@code{nil}, means to
 copy the contents of @var{dirname} directly into @var{newname} if the
-latter is an existing directory, instead of copying @var{dirname} into
+latter is a directory name, instead of copying @var{dirname} into
 it as a subdirectory.
 @end deffn
 
index 4187dd8a30a20288b997b25490b7d56501d5ffa0..136d4582544310615ed84798fa50a4804ec1cada 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1285,8 +1285,8 @@ documentation and had inherent races that led to security holes.  A
 call like (rename-file C D) that used the old, undocumented behavior
 can be written as (rename-file C (file-name-as-directory D)), a
 formulation portable to both older and newer versions of Emacs.
-Affected functions include add-name-to-file, copy-file,
-make-symbolic-link, and rename-file.
+Affected functions include add-name-to-file, copy-directory,
+copy-file, make-symbolic-link, and rename-file.
 
 \f
 * Lisp Changes in Emacs 26.1
index 85e649fbb592dd452a1feec99664471016a36f88..7ab6f769a8f79a7a85542cec9c7e2872f13c13d2 100644 (file)
@@ -5501,10 +5501,10 @@ Noninteractively, the last argument PARENTS says whether to
 create parent directories if they don't exist.  Interactively,
 this happens by default.
 
-If NEWNAME names an existing directory, copy DIRECTORY as a
-subdirectory there.  However, if called from Lisp with a non-nil
-optional argument COPY-CONTENTS, copy the contents of DIRECTORY
-directly into NEWNAME instead."
+If NEWNAME is a directory name, copy DIRECTORY as a subdirectory
+there.  However, if called from Lisp with a non-nil optional
+argument COPY-CONTENTS, copy the contents of DIRECTORY directly
+into NEWNAME instead."
   (interactive
    (let ((dir (read-directory-name
               "Copy directory: " default-directory default-directory t nil)))
@@ -5526,19 +5526,17 @@ directly into NEWNAME instead."
 
       ;; Compute target name.
       (setq directory (directory-file-name (expand-file-name directory))
-           newname   (directory-file-name (expand-file-name newname)))
+           newname (expand-file-name newname))
 
-      (cond ((not (file-directory-p newname))
-            ;; If NEWNAME is not an existing directory, create it;
+      (cond ((not (directory-name-p newname))
+            ;; If NEWNAME is not a directory name, create it;
             ;; that is where we will copy the files of DIRECTORY.
             (make-directory newname parents))
-           ;; If NEWNAME is an existing directory and COPY-CONTENTS
+           ;; If NEWNAME is a directory name and COPY-CONTENTS
            ;; is nil, copy into NEWNAME/[DIRECTORY-BASENAME].
            ((not copy-contents)
-            (setq newname (concat
-                           (file-name-as-directory newname)
-                           (file-name-nondirectory
-                            (directory-file-name directory))))
+            (setq newname (concat newname
+                           (file-name-nondirectory directory)))
             (and (file-exists-p newname)
                  (not (file-directory-p newname))
                  (error "Cannot overwrite non-directory %s with a directory"