Subject: bug#64278: 29.0.92; tramp-rclone.el seems to be in a defunct state

From: Michael Albinus <[email-masked]>
Date: Sun, 25 Jun 2023 14:55:59 +0200

Sebastian Miele <[email-masked]> writes:

Hi Sebastian,

Thanks for the report.

I've never tried the memory type of rclone. I have two test entries in
~/.config/rclone/rclone.conf:

--8<---------------cut here---------------start------------->8---
[local_drive]
type = local
nounc = true

[gdrive]
type = drive
scope = drive
...
--8<---------------cut here---------------end--------------->8---

Both work, and they are tested regularly in my regression tests. So I
wouldn't say that tramp-rclone.el is in a defunct state.

> I am using the Tramp built into the most recent emacs-29 from the Emacs
> repository.  Steps to reproduce the first problem:
>
> Augment ~/.config/rclone/rclone.conf with:
>
>   [memory]
>   type = memory
>
> I tried to debug the issue for myself for a while.  The first issue I
> encountered, is that ‘tramp-rclone’ contains a call to
> ‘tramp-call-process’ with a DESTINATION of 0.  ‘tramp-call-process’
> contains
>
>   (tramp-get-buffer-string destination)
>
> which in that case yields an error.  I tried changing "destination" in
> that line into:
>
>   (unless (eq destination 0) destination)

Reproduced here. I've pushed a fix to the emacs-29 branch in git.

Furthermore, there is indeed a problem detecting a mount point for
rclone memory type. The appended patch should fix this.

However, calling "emacs /rclone:memory:" with the rclone.conf entry
given by you.conf results in in an empty directory. No file visible
there, even if I copy something.

I've tried the rclone memory type manually in a shell

--8<---------------cut here---------------start------------->8---
# mount -t fuse.rclone
local_drive:/ on /tmp/tramp.rclone.local_drive type fuse.rclone (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
memory: on /tmp/tramp.rclone.memory type fuse.rclone (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

# ls -al /tmp/tramp.rclone.memory
total 0
drwxr-xr-x.  1 albinus albinus    0 Jun 25 14:49 .
drwxrwxrwt. 99 root    root    7800 Jun 25 14:49 ..

# rclone copyto ~/tmp memory:

# ls -al /tmp/tramp.rclone.memory
total 0
drwxr-xr-x.  1 albinus albinus    0 Jun 25 14:49 .
drwxrwxrwt. 99 root    root    7800 Jun 25 14:51 ..
--8<---------------cut here---------------end--------------->8---

So I'm a little bit undecided what the memory type of rclone is good
for, and how it works. Do I miss something?

Best regards, Michael.

diff --git a/lisp/net/tramp-fuse.el b/lisp/net/tramp-fuse.el
index e1ad0c2e5d2..c10c715d70e 100644
--- a/lisp/net/tramp-fuse.el
+++ b/lisp/net/tramp-fuse.el
@@ -175,13 +175,24 @@ tramp-fuse-mounted-p
     (or (tramp-get-file-property vec "/" "mounted")
         (let* ((default-directory tramp-compat-temporary-file-directory)
                (command (format "mount -t fuse.%s" (tramp-file-name-method vec)))
-	       (mount (shell-command-to-string command)))
+	       (mount (shell-command-to-string command))
+	       (mount-spec (split-string (tramp-fuse-mount-spec vec) ":" 'omit)))
           (tramp-message vec 6 "%s\n%s" command mount)
+	  ;; The mount-spec contains a trailing local file name part,
+	  ;; which might not be visible, for example with rclone
+	  ;; mounts of type "memory" or "gdrive".  Make it optional.
+	  (setq mount-spec
+		(if (cdr mount-spec)
+		    (tramp-compat-rx
+		     (literal (car mount-spec))
+		     ":" (? (literal (cadr mount-spec))))
+		  (car mount-spec)))
           (tramp-set-file-property
 	   vec "/" "mounted"
            (when (string-match
 	          (tramp-compat-rx
-		   bol (group (literal (tramp-fuse-mount-spec vec))) blank)
+		   bol (group (regexp mount-spec))
+		   " on " (group (+ (not blank))) blank)
 	          mount)
              (match-string 1 mount)))))))