Function: tramp-smb-handle-rename-file

tramp-smb-handle-rename-file is a byte-compiled function defined in tramp-smb.el.gz.

Signature

(tramp-smb-handle-rename-file FILENAME NEWNAME &optional OK-IF-ALREADY-EXISTS)

Documentation

Like rename-file for Tramp files.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp-smb.el.gz
(defun tramp-smb-handle-rename-file
  (filename newname &optional ok-if-already-exists)
  "Like `rename-file' for Tramp files."
  (setq filename (expand-file-name filename)
	newname (expand-file-name newname))

  (with-parsed-tramp-file-name
      (if (tramp-tramp-file-p filename) filename newname) nil
    (unless (file-exists-p filename)
      (tramp-compat-file-missing v filename))
    (when (and (not ok-if-already-exists) (file-exists-p newname))
      (tramp-error v 'file-already-exists newname))
    (when (and (file-directory-p newname)
	       (not (directory-name-p newname)))
      (tramp-error v 'file-error "File is a directory %s" newname))

    (with-tramp-progress-reporter
	v 0 (format "Renaming %s to %s" filename newname)

      (if (and (not (file-exists-p newname))
	       (tramp-equal-remote filename newname)
	       (string-equal
		(tramp-smb-get-share (tramp-dissect-file-name filename))
		(tramp-smb-get-share (tramp-dissect-file-name newname))))
	  ;; We can rename directly.
	  (with-parsed-tramp-file-name filename v1
	    (with-parsed-tramp-file-name newname v2

	      ;; We must also flush the cache of the directory, because
	      ;; `file-attributes' reads the values from there.
	      (tramp-flush-file-properties v1 v1-localname)
	      (tramp-flush-file-properties v2 v2-localname)
	      (unless (tramp-smb-get-share v2)
		(tramp-error
		 v2 'file-error
		 "Target `%s' must contain a share name" newname))
	      (unless (tramp-smb-send-command
		       v2 (format "rename \"%s\" \"%s\""
				  (tramp-smb-get-localname v1)
				  (tramp-smb-get-localname v2)))
		(tramp-error v2 'file-error "Cannot rename `%s'" filename))))

	;; We must rename via copy.
	(copy-file
	 filename newname ok-if-already-exists 'keep-time 'preserve-uid-gid)
	(if (file-directory-p filename)
	    (delete-directory filename 'recursive)
	  (delete-file filename))))))