Function: tramp-handle-file-truename

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

Signature

(tramp-handle-file-truename FILENAME)

Documentation

Like file-truename for Tramp files.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp.el.gz
(defun tramp-handle-file-truename (filename)
  "Like `file-truename' for Tramp files."
  ;; Preserve trailing "/".
  (funcall
   (if (directory-name-p filename) #'file-name-as-directory #'identity)
   ;; Quote properly.
   (funcall
    (if (tramp-compat-file-name-quoted-p filename)
	#'tramp-compat-file-name-quote #'identity)
    (let ((result (tramp-compat-file-name-unquote (expand-file-name filename)))
	  (numchase 0)
	  ;; Don't make the following value larger than necessary.
	  ;; People expect an error message in a timely fashion when
	  ;; something is wrong; otherwise they might think that Emacs
	  ;; is hung.  Of course, correctness has to come first.
	  (numchase-limit 20)
	  ;; Unquoting could enable encryption.
	  tramp-crypt-enabled
	  symlink-target)
      (with-parsed-tramp-file-name result v1
	;; We cache only the localname.
	(tramp-make-tramp-file-name
	 v1
	 (with-tramp-file-property v1 v1-localname "file-truename"
	   (while (and (setq symlink-target (file-symlink-p result))
		       (< numchase numchase-limit))
	     (setq numchase (1+ numchase)
		   result
		   (with-parsed-tramp-file-name (expand-file-name result) v2
		     (tramp-make-tramp-file-name
		      v2
		      (if (stringp symlink-target)
			  (if (file-remote-p symlink-target)
			      (tramp-compat-file-name-quote symlink-target 'top)
			    (tramp-drop-volume-letter
			     (expand-file-name
			      symlink-target
			      (file-name-directory v2-localname))))
			v2-localname))))
	     (when (>= numchase numchase-limit)
	       (tramp-error
		v1 'file-error
		"Maximum number (%d) of symlinks exceeded" numchase-limit)))
	   (tramp-file-local-name (directory-file-name result)))))))))