Function: tramp-file-name-for-operation

tramp-file-name-for-operation is a byte-compiled function defined in tramp.el.gz.

Signature

(tramp-file-name-for-operation OPERATION &rest ARGS)

Documentation

Return file name related to OPERATION file primitive.

ARGS are the arguments OPERATION has been called with.

It does not always return a Tramp file name, for example if the first argument of expand-file-name is absolute and not remote. Must be handled by the callers.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp.el.gz
;; We handle here all file primitives.  Most of them have the file
;; name as first parameter; nevertheless we check for them explicitly
;; in order to be signaled if a new primitive appears.  This
;; scenario is needed because there isn't a way to decide by
;; syntactical means whether a foreign method must be called.  It would
;; ease the life if `file-name-handler-alist' would support a decision
;; function as well but regexp only.
;; Operations added by external packages are kept in
;; `tramp-file-name-for-operation-external'.  They expect the file
;; name to be checked as first argument or, if there isn't any
;; argument, `default-directory'.
(defun tramp-file-name-for-operation (operation &rest args)
  "Return file name related to OPERATION file primitive.
ARGS are the arguments OPERATION has been called with.

It does not always return a Tramp file name, for example if the
first argument of `expand-file-name' is absolute and not remote.
Must be handled by the callers."
  (cond
   ;; FILE resp DIRECTORY.
   ((memq operation
	  '(access-file byte-compiler-base-file-name delete-directory
	    delete-file diff-latest-backup-file directory-file-name
	    directory-files directory-files-and-attributes dired-compress-file
	    dired-uncache file-acl file-accessible-directory-p file-attributes
	    file-directory-p file-executable-p file-exists-p file-local-copy
	    file-locked-p file-modes file-name-as-directory
	    file-name-case-insensitive-p file-name-directory
	    file-name-nondirectory file-name-sans-versions
	    file-notify-add-watch file-ownership-preserved-p file-readable-p
	    file-regular-p file-remote-p file-selinux-context file-symlink-p
	    file-system-info file-truename file-writable-p
	    find-backup-file-name get-file-buffer
	    insert-directory insert-file-contents load lock-file make-directory
	    make-lock-file-name set-file-acl set-file-modes
	    set-file-selinux-context set-file-times substitute-in-file-name
	    unhandled-file-name-directory unlock-file vc-registered
	    ;; Emacs 28- only.
	    make-directory-internal
	    ;; Emacs 29+ only.
	    abbreviate-file-name
	    ;; Tramp internal magic file name function.
	    tramp-set-file-uid-gid))
    (if (file-name-absolute-p (nth 0 args))
	(nth 0 args)
      default-directory))
   ;; STRING FILE.
   ((eq operation 'make-symbolic-link) (nth 1 args))
   ;; FILE DIRECTORY resp FILE1 FILE2.
   ((memq operation
	  '(add-name-to-file copy-directory copy-file
	    file-equal-p file-in-directory-p
	    file-name-all-completions file-name-completion
	    file-newer-than-file-p rename-file))
    (cond
     ((tramp-tramp-file-p (nth 0 args)) (nth 0 args))
     ((file-name-absolute-p (nth 1 args)) (nth 1 args))
     (t default-directory)))
   ;; FILE DIRECTORY resp FILE1 FILE2.
   ((eq operation 'expand-file-name)
    (cond
     ((file-name-absolute-p (nth 0 args)) (nth 0 args))
     ((tramp-tramp-file-p (nth 1 args)) (nth 1 args))
     (t default-directory)))
   ;; START END FILE.
   ((eq operation 'write-region)
    (if (file-name-absolute-p (nth 2 args))
	(nth 2 args)
      default-directory))
   ;; BUFFER.
   ((memq operation
	  '(make-auto-save-file-name
	    set-visited-file-modtime verify-visited-file-modtime))
    (buffer-file-name
     (if (bufferp (nth 0 args)) (nth 0 args) (current-buffer))))
   ;; COMMAND.
   ((memq operation
	  '(exec-path make-nearby-temp-file make-process process-file
	    shell-command start-file-process temporary-file-directory
	    ;; Emacs 29+ only.
            list-system-processes memory-info process-attributes
            ;; Emacs 30+ only.
	    file-group-gid file-user-uid))
    default-directory)
   ;; PROC.
   ((memq operation '(file-notify-rm-watch file-notify-valid-p))
    (when (processp (nth 0 args))
      (tramp-get-default-directory (process-buffer (nth 0 args)))))
   ;; VEC.
   ((memq operation
	  '(tramp-get-home-directory tramp-get-remote-gid
	    tramp-get-remote-groups tramp-get-remote-uid))
    (tramp-make-tramp-file-name (nth 0 args)))
   ;; FILE resp DIRECTORY.
   ((and (memq operation tramp-file-name-for-operation-external)
	 (or (stringp (nth 0 args)) (null (nth 0 args))))
    (if (and (stringp (nth 0 args)) (file-name-absolute-p (nth 0 args)))
	(nth 0 args)
      default-directory))
   ;; Unknown file primitive.
   (t (unless (member 'remote-file-error debug-ignored-errors)
	(tramp-error
	 nil 'remote-file-error "Unknown file I/O primitive: %s" operation)))))