Gene Goykhman <g...@indigo1.com> writes:

Hi Gene,

>> No. Don't do that. Instead, bind tramp-last-hop-directory to nil in that
>> let-clause:
>
> I'm not sure how best to handle the lifetime of
> tramp--last-hop-directory. It needs to be explicity set to nil in
> tramp-completion-handle-file-name-all-completions UNLESS we're
> completing a multi-hop path, and only in that case should it be set to
> the parsed last hop directory.

As I have said above: Bind it in a let-clause.

> That value is then consumed later by
> tramp-container--completion-function. The value remains set after use
> however, so it is important that it is subsequently reset to nil the
> next time tramp-completion-handle-file-name-all-completions is called,
> otherwise we could end up with a stale value of
> tramp--last-hop-directory for a subsequent single-hop TRAMP
> connection.
>
> If you can suggest a better way to handle this I'd appreciate it.

The let-clause shall be the one in
tramp-completion-handle-file-name-all-completions, see below. When you
leave that clause, the original value (nil) is re-set, everything is fine.

>> Replace this by
>
>>       (setq hop (match-string 1 fullname)
>>          fullname (replace-match "" nil nil fullname 1)
>>          tramp-last-hop-directory
>>          (file-remote-p
>>           (tramp-make-tramp-file-name (tramp-dissect-hop-name hop)))))
>
> I tried this but ended up with a tramp--last-hop-directory that I wasn't able 
> to use to execute the container executable remotely.
>
> Here is a specific example. For the path:
>
> /ssh:in...@line5.timetiger.com|sudo:line5.timetiger.com|docker:
>
> My original patch produces this value of tramp--last-hop-directory:
>
> #("/sudo:r...@line5.timetiger.com:/" 6 10
>   (tramp-default t))
>
> When I set this as the default-directory, I am able to run the container 
> program on the remote host and obtain the list of completion candidates 
> (running containers).
>
> After incorporating your suggested changes, the value of 
> tramp--last-hop-directory becomes:
>
> "/ssh:in...@line5.timetiger.com|sudo:line5.timetiger.com:"
>
> Setting this as the default-directory, I am /not/ able to run the container 
> program (TRAMP seems to hang, at least on my macOS system).
>
> I think that, at least on my system, the root@ is required, and I think the 
> multi-hop path also doesn't work as a default-directory.

Well, testing everything I was hit by a similar problem. It took me a
while of debugging until I found the culprit.

For good reasons, tramp-completion-handle-file-name-all-completions
binds tramp-default-user and friends to nil. This is in order to get
proper completion results. But then, the code I have proposed above does
not expand to root@.

The solution is, that computing tramp-last-hop-directory must happen in
time, before tramp-default-* variables are let-bound to nil. The
following has worked in my tests:

--8<---------------cut here---------------start------------->8---
(defun tramp-completion-handle-file-name-all-completions (filename directory)
  "Like `file-name-all-completions' for partial Tramp files."
  (let ((fullname
         (tramp-drop-volume-letter (expand-file-name filename directory)))
        (directory (tramp-drop-volume-letter directory))
        tramp-last-hop-directory hop result result1)

    ;; Suppress hop from completion.
    (when (string-match
           (rx
            (regexp tramp-prefix-regexp)
            (group (+ (regexp tramp-remote-file-name-spec-regexp)
                      (regexp tramp-postfix-hop-regexp))))
           fullname)
      (setq hop (match-string 1 fullname)
            fullname (replace-match "" nil nil fullname 1)
            tramp-last-hop-directory
            (tramp-make-tramp-file-name (tramp-dissect-hop-name hop))))

    (let (;; When `tramp-syntax' is `simplified', we need a default method.
          (tramp-default-method
           (and (string-empty-p tramp-postfix-method-format)
                tramp-default-method))
          (tramp-default-method-alist
           (and (string-empty-p tramp-postfix-method-format)
                tramp-default-method-alist))
          tramp-default-user tramp-default-user-alist
          tramp-default-host tramp-default-host-alist)

      ;; Possible completion structures.
      (dolist (elt (tramp-completion-dissect-file-name fullname))
      ...
--8<---------------cut here---------------end--------------->8---

> Thanks for your help so far!

Best regards, Michael.

Reply via email to