Function: tramp-sh-handle-copy-directory

tramp-sh-handle-copy-directory is a byte-compiled function defined in tramp-sh.el.gz.

Signature

(tramp-sh-handle-copy-directory DIRNAME NEWNAME &optional KEEP-DATE PARENTS COPY-CONTENTS)

Documentation

Like copy-directory for Tramp files.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp-sh.el.gz
(defun tramp-sh-handle-copy-directory
  (dirname newname &optional keep-date parents copy-contents)
  "Like `copy-directory' for Tramp files."
  (let ((t1 (tramp-tramp-file-p dirname))
	(t2 (tramp-tramp-file-p newname))
	target)
    (with-parsed-tramp-file-name (if t1 dirname newname) nil
      (unless (file-exists-p dirname)
	(tramp-compat-file-missing v dirname))

      ;; `copy-directory-create-symlink' exists since Emacs 28.1.
      (if (and (bound-and-true-p copy-directory-create-symlink)
	       (setq target (file-symlink-p dirname))
	       (tramp-equal-remote dirname newname))
	  (make-symbolic-link
	   target
	   (if (directory-name-p newname)
	       (concat newname (file-name-nondirectory dirname)) newname)
	   t)

	(if (and (not copy-contents)
		 (tramp-get-method-parameter v 'tramp-copy-recursive)
		 ;; When DIRNAME and NEWNAME are remote, they must
		 ;; have the same method.
		 (or (null t1) (null t2)
		     (string-equal
		      (tramp-file-name-method (tramp-dissect-file-name dirname))
		      (tramp-file-name-method
		       (tramp-dissect-file-name newname)))))
	    ;; scp or rsync DTRT.
	    (progn
	      (when (and (file-directory-p newname)
			 (not (directory-name-p newname)))
		(tramp-error v 'file-already-exists newname))
	      (setq dirname (directory-file-name (expand-file-name dirname))
		    newname (directory-file-name (expand-file-name newname)))
	      (when (and (file-directory-p newname)
			 (not (string-equal (file-name-nondirectory dirname)
					    (file-name-nondirectory newname))))
		(setq newname
		      (expand-file-name
		       (file-name-nondirectory dirname) newname)))
	      (unless (file-directory-p (file-name-directory newname))
		(make-directory (file-name-directory newname) parents))
	      (tramp-do-copy-or-rename-file-out-of-band
	       'copy dirname newname 'ok-if-already-exists keep-date))

	  ;; We must do it file-wise.
	  (tramp-run-real-handler
	   #'copy-directory
	   (list dirname newname keep-date parents copy-contents))))

      ;; When newname did exist, we have wrong cached values.
      (when t2
	(with-parsed-tramp-file-name newname nil
	  (tramp-flush-file-properties v localname))))))