Function: tramp-get-remote-path

tramp-get-remote-path is an autoloaded and byte-compiled function defined in tramp-sh.el.gz.

Signature

(tramp-get-remote-path VEC)

Documentation

Compile list of remote directories for PATH.

Nonexistent directories are removed from spec.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp-sh.el.gz
;;;###tramp-autoload
(defun tramp-get-remote-path (vec)
  "Compile list of remote directories for PATH.
Nonexistent directories are removed from spec."
  (with-current-buffer (tramp-get-connection-buffer vec)
    ;; Expand connection-local variables.
    (tramp-set-connection-local-variables vec)
    (with-tramp-connection-property (tramp-get-process vec) "remote-path"
      (let* ((remote-path (copy-tree tramp-remote-path))
	     (elt1 (memq 'tramp-default-remote-path remote-path))
	     (elt2 (memq 'tramp-own-remote-path remote-path))
	     (default-remote-path
	      (when elt1
		(or
		 (with-tramp-connection-property
		     (tramp-get-process vec) "default-remote-path"
		   (tramp-send-command-and-read
		    vec
                    (format
                     "echo \\\"`getconf PATH 2>%s`\\\""
                     (tramp-get-remote-null-device vec))
                    'noerror))
		 ;; Default if "getconf" is not available.
		 (progn
		   (tramp-message
		    vec 3
		    "`getconf PATH' not successful, using default value \"%s\"."
		    "/bin:/usr/bin")
		   "/bin:/usr/bin"))))
	     (own-remote-path
	      ;; The login shell could return more than just the $PATH
	      ;; string.  So we use `tramp-end-of-heredoc' as marker.
	      (when elt2
		(or
		 (with-tramp-connection-property
		     (tramp-get-process vec) "own-remote-path"
		   (tramp-send-command-and-read
		    vec
		    (format
		     "%s %s %s 'echo %s \\\"$PATH\\\"'"
		     (tramp-get-method-parameter vec 'tramp-remote-shell)
		     (string-join
		      (tramp-get-method-parameter vec 'tramp-remote-shell-login)
		      " ")
		     (string-join
		      (tramp-get-method-parameter vec 'tramp-remote-shell-args)
		      " ")
		     (tramp-shell-quote-argument tramp-end-of-heredoc))
		    'noerror (rx (literal tramp-end-of-heredoc))))
		 (progn
		   (tramp-warning
		    vec "Could not retrieve `tramp-own-remote-path'")
		   nil)))))

	;; Replace place holder `tramp-default-remote-path'.
	(when elt1
	  (setcdr elt1
		  (append
                   (split-string (or default-remote-path "") ":" 'omit)
		   (cdr elt1)))
	  (setq remote-path (delq 'tramp-default-remote-path remote-path)))

	;; Replace place holder `tramp-own-remote-path'.
	(when elt2
	  (setcdr elt2
		  (append
                   (split-string (or own-remote-path "") ":" 'omit)
		   (cdr elt2)))
	  (setq remote-path (delq 'tramp-own-remote-path remote-path)))

	;; Remove double entries.
	(setq remote-path
	      (cl-remove-duplicates
	       remote-path :test #'string-equal :from-end t))

	;; Remove non-existing directories.
	(let (remote-file-name-inhibit-cache)
	  (tramp-bundle-read-file-names vec remote-path)
	  (cl-remove-if
	   (lambda (x) (not (tramp-get-file-property vec x "file-directory-p")))
	   remote-path))))))