Subject: bug#51754: closed (Re: bug#51754: 29.0.50; [PATCH] tramp-compat-file-name-concat work in wrong way)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 11 Nov 2021 11:00:02 +0000

Your bug report

#51754: 29.0.50; [PATCH] tramp-compat-file-name-concat work in wrong way

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
51754: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=51754
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#51754: 29.0.50; [PATCH] tramp-compat-file-name-concat work in wrong way
From: Michael Albinus <[email-masked]>
To: Aleksandr Vityazev <[email-masked]>
Cc: [email-masked]
Date: Thu, 11 Nov 2021 11:59:28 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Version: 28.1

Aleksandr Vityazev <[email-masked]> writes:

> Hello,

Hi Aleksandr,

> The current implementation of the tramp-compat-file-name-concat
> from lisp/net/tramp-compat.el fails test fileio-tests/file-name-concat
> from file test/src/fileio-tests.el for file-name-concat on Emacs where no
> file-name-concat.

Thanks for the report. I've applied your patch to the emacs-28 branch,
and merged this to the master branch. Closing the bug.

Best regards, Michael.

Subject: 29.0.50; [PATCH] tramp-compat-file-name-concat work in wrong way
From: Aleksandr Vityazev <[email-masked]>
To: [email-masked]
Date: Wed, 10 Nov 2021 18:56:49 +0000
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello, 

The current implementation of the tramp-compat-file-name-concat 
from lisp/net/tramp-compat.el fails test fileio-tests/file-name-concat
from file test/src/fileio-tests.el for file-name-concat on Emacs where no
file-name-concat.

#+begin_src elisp
(ert-deftest test-tramp-compat-file-name-concat ()
  (should (equal (tramp-compat-file-name-concat "foo" "bar") "foo/bar"))
  (should (equal (tramp-compat-file-name-concat "foo" "bar") "foo/bar"))
  (should (equal (tramp-compat-file-name-concat "foo" "bar" "zot") "foo/bar/zot"))
  (should (equal (tramp-compat-file-name-concat "foo/" "bar") "foo/bar"))
  (should (equal (tramp-compat-file-name-concat "foo//" "bar") "foo//bar"))
  (should (equal (tramp-compat-file-name-concat "foo/" "bar/" "zot") "foo/bar/zot"))
  (should (equal (tramp-compat-file-name-concat "fóo" "bar") "fóo/bar"))
  (should (equal (tramp-compat-file-name-concat "foo" "bár") "foo/bár"))
  (should (equal (tramp-compat-file-name-concat "fóo" "bár") "fóo/bár"))
  (let ((string (make-string 5 ?a)))
    (should (not (multibyte-string-p string)))
    (aset string 2 255)
    (should (not (multibyte-string-p string)))
    (should (equal (tramp-compat-file-name-concat "fóo" string) "fóo/aa\377aa")))
  (should (equal (tramp-compat-file-name-concat "foo") "foo"))
  (should (equal (tramp-compat-file-name-concat "foo/") "foo/"))
  (should (equal (tramp-compat-file-name-concat "foo" "") "foo"))
  (should (equal (tramp-compat-file-name-concat "foo" "" "" "" nil) "foo"))
  (should (equal (tramp-compat-file-name-concat "" "bar") "bar"))
  (should (equal (tramp-compat-file-name-concat "" "") "")))

(ert 'test-tramp-compat-file-name-concat)
#+end_src

Selector: test-tramp-compat-file-name-concat
Passed:  0
Failed:  1 (1 unexpected)
Skipped: 0
Total:   1/1

Started at:   2021-11-10 21:21:24+0300
Finished.
Finished at:  2021-11-10 21:21:25+0300

F

F test-tramp-compat-file-name-concat
    (wrong-type-argument characterp "zot")

Here is the patch to fix:
>From 1a0c540abfc129d67bf2e291c038c2163f7fee7f Mon Sep 17 00:00:00 2001
From: Aleksandr Vityazev <[email-masked]>
Date: Wed, 10 Nov 2021 21:36:16 +0300
Subject: [PATCH] * lisp/net/tramp-compat.el: Fix tramp-compat-file-name-concat

* lisp/net/tramp-compat.el: Make tramp-compat-file-name-concat
work like file-name-concat.
---
 lisp/net/tramp-compat.el | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index 213ab5857c..fbc3d684ce 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -386,14 +386,17 @@ CONDITION can also be a list of error conditions."
   (if (fboundp 'file-name-concat)
       #'file-name-concat
     (lambda (directory &rest components)
-      (unless (null directory)
-	(let ((components (delq nil components))
-	      file-name-handler-alist)
-	  (if (null components)
-	      directory
-	    (tramp-compat-file-name-concat
-	     (concat (file-name-as-directory directory) (car components))
-	     (cdr components))))))))
+      (let ((components (cl-remove-if (lambda (el)
+                                        (or (null el) (equal "" el)))
+                                      components))
+	    file-name-handler-alist)
+        (if (null components)
+	    directory
+          (apply #'tramp-compat-file-name-concat
+	         (concat (unless (or (equal "" directory) (null directory))
+                           (file-name-as-directory directory))
+                         (car components))
+	         (cdr components)))))))
 
 (dolist (elt (all-completions "tramp-compat-" obarray 'functionp))
   (put (intern elt) 'tramp-suppress-trace t))
-- 
2.33.1

-- 
Best regards,
Aleksandr Vityazev