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."
  (tramp-skeleton-copy-directory
      dirname newname keep-date parents copy-contents
    (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-error v 'file-missing 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 (expand-file-name newname) nil
	    (tramp-flush-file-properties v localname)))))))