]> git.eshelyaron.com Git - emacs.git/commitdiff
Tramp requires Emacs 24.4
authorMichael Albinus <michael.albinus@gmx.de>
Fri, 28 Jun 2019 14:32:12 +0000 (16:32 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Fri, 28 Jun 2019 14:32:12 +0000 (16:32 +0200)
* doc/misc/tramp.texi (Frequently Asked Questions):
Use `with-eval-after-load'. in example.

* doc/misc/trampver.texi: Set variable emacsver.

* lisp/net/tramp.el (tramp-send-string, tramp-call-process)
(tramp-call-process-region, tramp-process-lines):
* lisp/net/tramp-adb.el (tramp-adb-handle-file-truename)
(tramp-adb-sh-fix-ls-output, tramp-adb-maybe-open-connection):
* lisp/net/tramp-gvfs.el (tramp-gvfs-get-directory-attributes)
(tramp-gvfs-handle-file-notify-add-watch)
* lisp/net/tramp-sh.el (tramp-sh-handle-file-truename)
(tramp-do-copy-or-rename-file-out-of-band)
(tramp-sh-handle-file-notify-add-watch, tramp-find-executable)
(tramp-set-remote-path)
(tramp-open-connection-setup-interactive-shell)
(tramp-maybe-open-connection, tramp-send-command):
* lisp/net/tramp-smb.el (tramp-smb-handle-copy-directory)
(tramp-smb-handle-file-acl, tramp-smb-handle-process-file)
(tramp-smb-handle-set-file-acl)
(tramp-smb-handle-start-file-process)
(tramp-smb-maybe-open-connection):
* lisp/net/tramp-sudoedit.el (tramp-sudoedit-handle-set-file-acl):
(tramp-sudoedit-send-command): Use `string-join' and `string-empty-p'.

* lisp/net/tramp-adb.el:
* lisp/net/tramp-archive.el:
* lisp/net/tramp-integration.el:
* lisp/net/tramp-ftp.el: Use `with-eval-after-load'.

* lisp/net/tramp-cmds.el (tramp-cleanup-connection)
(tramp-cleanup-all-connections): Cancel timer.

* lisp/net/tramp-compat.el (subr-x): Require.
(default-toplevel-value): Don't make it a defalias.

* lisp/net/tramp-gvfs.el: Use `dbus-event-error-functions'.  Do
not special handle `split-string'.

* lisp/net/tramp.el: Require Emacs 24.4.
(tramp-password-prompt-regexp): Use `password-word-equivalents'.
(tramp-user-error): Use `user-error'.
(tramp-replace-environment-variables): Use `substitute-env-vars'.
(tramp-wait-for-regexp): Rearrange `with-current-buffer' call.
(tramp-get-local-gid): Use `group-gid'.

* lisp/net/trampver.el: Check for Emacs 24.4.

* test/lisp/net/tramp-tests.el (tramp-test02-file-name-dissect)
(tramp-test02-file-name-dissect-simplified)
(tramp-test02-file-name-dissect-separate)
(tramp-test03-file-name-host-rules)
(tramp-test03-file-name-method-rules): Don't check for `user-error'.

15 files changed:
doc/misc/tramp.texi
doc/misc/trampver.texi
lisp/net/tramp-adb.el
lisp/net/tramp-archive.el
lisp/net/tramp-cmds.el
lisp/net/tramp-compat.el
lisp/net/tramp-ftp.el
lisp/net/tramp-gvfs.el
lisp/net/tramp-integration.el
lisp/net/tramp-sh.el
lisp/net/tramp-smb.el
lisp/net/tramp-sudoedit.el
lisp/net/tramp.el
lisp/net/trampver.el
test/lisp/net/tramp-tests.el

index dc01f119e7a16a5af29acede2fdcb6e220c62c45..df8ae6f7f40b76280cec4467ffc84d6717704584 100644 (file)
@@ -4204,10 +4204,8 @@ directory to the cache:
 
 @lisp
 @group
-@c `with-eval-after-load' has been introduced with Emacs 24.4.  Shall
-@c be used when appropriate.
-(eval-after-load "filecache"
-  '(file-cache-add-directory
+(with-eval-after-load 'filecache
+  (file-cache-add-directory
     "@trampfn{ssh,news@@news.my.domain,/opt/news/etc/}"))
 @end group
 @end lisp
index 5b1408a49740f4ed48aced793fee7c70b5896f9f..03f9e01ce21859cf8c4d028e8177faa927a99522 100644 (file)
@@ -5,10 +5,12 @@
 @c Copyright (C) 2003-2019 Free Software Foundation, Inc.
 @c See file doclicense.texi for copying conditions.
 
-@c In the Tramp GIT, the version number is auto-frobbed from tramp.el,
-@c and the bug report address is auto-frobbed from configure.ac.
+@c In the Tramp GIT, the version numbers are auto-frobbed from
+@c tramp.el, and the bug report address is auto-frobbed from
+@c configure.ac.
 @set trampver 2.4.2-pre
 @set tramp-bug-report-address tramp-devel@@gnu.org
+@set emacsver 24.4
 
 @c Other flags from configuration.
 @set instprefix /usr/local
index 008a5cedd8b34aa83d9cd3ba554eb14db9450881..c8b9e7ae09ca4626f69001df3dddd4a5de6c20a3 100644 (file)
@@ -257,17 +257,15 @@ pass to the OPERATION."
              (setq thisstep (pop steps))
              (tramp-message
               v 5 "Check %s"
-              (mapconcat #'identity
-                         (append '("") (reverse result) (list thisstep))
-                         "/"))
+              (string-join
+               (append '("") (reverse result) (list thisstep)) "/"))
              (setq symlink-target
                    (tramp-compat-file-attribute-type
                     (file-attributes
                      (tramp-make-tramp-file-name
-                      v (mapconcat #'identity
-                                   (append
-                                    '("") (reverse result) (list thisstep))
-                                   "/")))))
+                      v
+                      (string-join
+                       (append '("") (reverse result) (list thisstep)) "/")))))
              (cond ((string= "." thisstep)
                     (tramp-message v 5 "Ignoring step `.'"))
                    ((string= ".." thisstep)
@@ -302,9 +300,9 @@ pass to the OPERATION."
            ;; Combine list to form string.
            (setq result
                  (if result
-                     (mapconcat #'identity (cons "" result) "/")
+                     (string-join (cons "" result) "/")
                    "/"))
-           (when (and is-dir (or (string= "" result)
+           (when (and is-dir (or (string-empty-p result)
                                  (not (string= (substring result -1) "/"))))
              (setq result (concat result "/"))))
 
@@ -479,7 +477,7 @@ Emacs dired can't find files."
                 #'tramp-adb-ls-output-time-less-p
               #'tramp-adb-ls-output-name-less-p))))
       (delete-region (point-min) (point-max))
-      (insert "  " (mapconcat #'identity sorted-lines "\n  ")))
+      (insert "  " (string-join sorted-lines "\n  ")))
     ;; Add final newline.
     (goto-char (point-max))
     (unless (bolp) (insert "\n"))))
@@ -1232,7 +1230,7 @@ connection if a previous connection has died for some reason."
                 (prompt (md5 (concat (prin1-to-string process-environment)
                                      (current-time-string)))))
            (tramp-message
-            vec 6 "%s" (mapconcat #'identity (process-command p) " "))
+            vec 6 "%s" (string-join (process-command p) " "))
            ;; Wait for initial prompt.  On some devices, it needs an
            ;; initial RET, in order to get it.
             (sleep-for 0.1)
@@ -1300,16 +1298,16 @@ connection if a previous connection has died for some reason."
 
 ;; `connection-local-set-profile-variables' and
 ;; `connection-local-set-profiles' exists since Emacs 26.1.
-(eval-after-load "shell"
-  '(progn
-     (tramp-compat-funcall
-      'connection-local-set-profile-variables
-      'tramp-adb-connection-local-default-profile
-      tramp-adb-connection-local-default-profile)
-     (tramp-compat-funcall
-      'connection-local-set-profiles
-      `(:application tramp :protocol ,tramp-adb-method)
-      'tramp-adb-connection-local-default-profile)))
+(with-eval-after-load 'shell
+  (progn
+    (tramp-compat-funcall
+     'connection-local-set-profile-variables
+     'tramp-adb-connection-local-default-profile
+     tramp-adb-connection-local-default-profile)
+    (tramp-compat-funcall
+     'connection-local-set-profiles
+     `(:application tramp :protocol ,tramp-adb-method)
+     'tramp-adb-connection-local-default-profile)))
 
 (add-hook 'tramp-unload-hook
          (lambda ()
index 7e17fde7306ffd749fcc7af040ef50b2abb61de6..b329d4a1b117d1c40518fb7ae34bcd2af5a8a117 100644 (file)
@@ -372,14 +372,14 @@ pass to the OPERATION."
 ;; `tramp-archive-file-name-handler' must be placed before `url-file-handler'.
 (when url-handler-mode (tramp-register-file-name-handlers))
 
-(eval-after-load 'url-handler
-  '(progn
-     (add-hook 'url-handler-mode-hook #'tramp-register-file-name-handlers)
-     (add-hook
-      'tramp-archive-unload-hook
-      (lambda ()
-       (remove-hook
-        'url-handler-mode-hook #'tramp-register-file-name-handlers)))))
+(with-eval-after-load 'url-handler
+  (progn
+    (add-hook 'url-handler-mode-hook #'tramp-register-file-name-handlers)
+    (add-hook
+     'tramp-archive-unload-hook
+     (lambda ()
+       (remove-hook
+       'url-handler-mode-hook #'tramp-register-file-name-handlers)))))
 
 \f
 ;; File name conversions.
index f1e1d8271ffbb2be55ac2df2090d7c91216526ea..007b98f94fe16674ceca0ee63a414cd7e50997f0 100644 (file)
@@ -116,6 +116,12 @@ When called interactively, a Tramp connection has to be selected."
       (delete-process (tramp-get-connection-process vec)))
     (tramp-flush-connection-properties vec)
 
+    ;; Cancel timer.
+    (dolist (timer timer-list)
+      (when (and (eq (timer--function timer) 'tramp-timeout-session)
+                (tramp-file-name-equal-p vec (car (timer--args timer))))
+       (cancel-timer timer)))
+
     ;; Remove buffers.
     (dolist
        (buf (list (get-buffer (tramp-buffer-name vec))
@@ -163,9 +169,12 @@ This includes password cache, file cache, connection cache, buffers."
                (delete (car proxies) tramp-default-proxies-alist)
                proxies tramp-default-proxies-alist)
        (setq proxies (cdr proxies)))))
-    (when (and tramp-default-proxies-alist tramp-save-ad-hoc-proxies)
-      (customize-save-variable
-       'tramp-default-proxies-alist tramp-default-proxies-alist))
+  (when (and tramp-default-proxies-alist tramp-save-ad-hoc-proxies)
+    (customize-save-variable
+     'tramp-default-proxies-alist tramp-default-proxies-alist))
+
+  ;; Cancel timers.
+  (cancel-function-timers 'tramp-timeout-session)
 
   ;; Remove buffers.
   (dolist (name (tramp-list-tramp-buffers))
index 15b737d281bdf081e2ebd72d1981d58cb0dec6e3..4f01f8d372f8f3f7854a558e28d30d1c5c64adc4 100644 (file)
@@ -39,6 +39,7 @@
 (require 'ls-lisp)  ;; Due to `tramp-handle-insert-directory'.
 (require 'parse-time)
 (require 'shell)
+(require 'subr-x)
 
 (declare-function tramp-handle-temporary-file-directory "tramp")
 
@@ -81,7 +82,7 @@ Add the extension of F, if existing."
      ((fboundp 'w32-window-exists-p)
       (tramp-compat-funcall 'w32-window-exists-p process-name process-name))
 
-     ;; GNU Emacs 23.
+     ;; GNU Emacs 23+.
      ((and (fboundp 'list-system-processes) (fboundp 'process-attributes))
       (let (result)
        (dolist (pid (tramp-compat-funcall 'list-system-processes) result)
@@ -97,10 +98,6 @@ Add the extension of F, if existing."
                                     process-name))))
              (setq result t)))))))))
 
-;; `default-toplevel-value' has been declared in Emacs 24.4.
-(unless (fboundp 'default-toplevel-value)
-  (defalias 'default-toplevel-value #'symbol-value))
-
 ;; `file-attribute-*' are introduced in Emacs 25.1.
 
 (defalias 'tramp-compat-file-attribute-type
@@ -306,9 +303,4 @@ A nil value for either argument stands for the current time."
 
 (provide 'tramp-compat)
 
-;;; TODO:
-
-;; * When we get rid of Emacs 24, replace "(mapconcat #'identity" by
-;;   "(string-join".
-
 ;;; tramp-compat.el ends here
index d1aae22a484f171c90d399f2acb8164c0afb1f9f..2a4fccf57e7e84c5845fdb25b9d7bd4a575def06 100644 (file)
@@ -53,8 +53,8 @@ present for backward compatibility."
     (setq file-name-handler-alist
          (delete a1 (delete a2 file-name-handler-alist)))))
 
-(eval-after-load "ange-ftp"
-  '(tramp-disable-ange-ftp))
+(with-eval-after-load 'ange-ftp
+  (tramp-disable-ange-ftp))
 
 ;;;###tramp-autoload
 (defun tramp-ftp-enable-ange-ftp ()
index cee7a1209bd7b42ac9bea1dee82e9675d37570f1..e3da20aa88fbad3e0f83342cda0578188a32521e 100644 (file)
@@ -724,12 +724,7 @@ is no information where to trace the message.")
     (tramp-message tramp-gvfs-dbus-event-vector 6 "%S" event)
     (tramp-error tramp-gvfs-dbus-event-vector 'file-error "%s" (cadr err))))
 
-;; `dbus-event-error-hooks' has been renamed to
-;; `dbus-event-error-functions' in Emacs 24.3.
-(add-hook
- (if (boundp 'dbus-event-error-functions)
-     'dbus-event-error-functions 'dbus-event-error-hooks)
- #'tramp-gvfs-dbus-event-error)
+(add-hook 'dbus-event-error-functions #'tramp-gvfs-dbus-event-error)
 
 \f
 ;; File name primitives.
@@ -942,7 +937,7 @@ file names."
        ;; Send command.
        (tramp-gvfs-send-command
         v "gvfs-ls" "-h" "-n" "-a"
-        (mapconcat #'identity tramp-gvfs-file-attributes ",")
+        (string-join tramp-gvfs-file-attributes ",")
         (tramp-gvfs-url-file-name directory))
        ;; Parse output.
        (with-current-buffer (tramp-get-connection-buffer v)
@@ -1183,7 +1178,7 @@ If FILE-SYSTEM is non-nil, return file system attributes."
          (tramp-error
           v 'file-notify-error "Monitoring not supported for `%s'" file-name)
        (tramp-message
-        v 6 "Run `%s', %S" (mapconcat #'identity (process-command p) " ") p)
+        v 6 "Run `%s', %S" (string-join (process-command p) " ") p)
        (process-put p 'vector v)
        (process-put p 'events events)
        (process-put p 'watch-name localname)
@@ -1997,15 +1992,12 @@ VEC is used only for traces."
        (list user host)))
    (zeroconf-list-services service)))
 
-;; We use the TRIM argument of `split-string', which exist since Emacs
-;; 24.4.  I mask this for older Emacs versions, there is no harm.
 (defun tramp-gvfs-parse-device-names (service)
   "Return a list of (user host) tuples allowed to access.
 This uses \"avahi-browse\" in case D-Bus is not enabled in Avahi."
   (let ((result
         (ignore-errors
-          (tramp-compat-funcall
-           'split-string
+          (split-string
            (shell-command-to-string (format "avahi-browse -trkp %s" service))
            "[\n\r]+" 'omit "^\\+;.*$"))))
     (delete-dups
@@ -2013,8 +2005,7 @@ This uses \"avahi-browse\" in case D-Bus is not enabled in Avahi."
       (lambda (x)
        (let* ((list (split-string x ";"))
               (host (nth 6 list))
-              (text (tramp-compat-funcall
-                     'split-string (nth 9 list) "\" \"" 'omit "\""))
+              (text (split-string (nth 9 list) "\" \"" 'omit "\""))
               user)
          ;; A user is marked in a TXT field like "u=guest".
          (while text
index 35d2eb38e6085c91dd414f06eb2a4749ada94d1b..5960871ca7adeb49cd836bf75ff4e660a04fb974 100644 (file)
@@ -123,18 +123,18 @@ been set up by `rfn-eshadow-setup-minibuffer'."
        (mapconcat
         #'identity (butlast (tramp-compat-exec-path)) path-separator)))
 
-(eval-after-load "esh-util"
-  '(progn
-     (add-hook 'eshell-mode-hook
-              #'tramp-eshell-directory-change)
-     (add-hook 'eshell-directory-change-hook
-              #'tramp-eshell-directory-change)
-     (add-hook 'tramp-integration-unload-hook
-              (lambda ()
-                (remove-hook 'eshell-mode-hook
-                             #'tramp-eshell-directory-change)
-                (remove-hook 'eshell-directory-change-hook
-                             #'tramp-eshell-directory-change)))))
+(with-eval-after-load 'esh-util
+  (progn
+    (add-hook 'eshell-mode-hook
+             #'tramp-eshell-directory-change)
+    (add-hook 'eshell-directory-change-hook
+             #'tramp-eshell-directory-change)
+    (add-hook 'tramp-integration-unload-hook
+             (lambda ()
+               (remove-hook 'eshell-mode-hook
+                            #'tramp-eshell-directory-change)
+               (remove-hook 'eshell-directory-change-hook
+                            #'tramp-eshell-directory-change)))))
 
 ;;; Integration of recentf.el:
 
@@ -158,18 +158,18 @@ NAME must be equal to `tramp-current-connection'."
     (let ((recentf-exclude '(file-remote-p)))
       (recentf-cleanup))))
 
-(eval-after-load "recentf"
-  '(progn
-     (add-hook 'tramp-cleanup-connection-hook
-              #'tramp-recentf-cleanup)
-     (add-hook 'tramp-cleanup-all-connections-hook
-              #'tramp-recentf-cleanup-all)
-     (add-hook 'tramp-integration-unload-hook
-              (lambda ()
-                (remove-hook 'tramp-cleanup-connection-hook
-                             #'tramp-recentf-cleanup)
-                (remove-hook 'tramp-cleanup-all-connections-hook
-                             #'tramp-recentf-cleanup-all)))))
+(with-eval-after-load 'recentf
+  (progn
+    (add-hook 'tramp-cleanup-connection-hook
+             #'tramp-recentf-cleanup)
+    (add-hook 'tramp-cleanup-all-connections-hook
+             #'tramp-recentf-cleanup-all)
+    (add-hook 'tramp-integration-unload-hook
+             (lambda ()
+               (remove-hook 'tramp-cleanup-connection-hook
+                            #'tramp-recentf-cleanup)
+               (remove-hook 'tramp-cleanup-all-connections-hook
+                            #'tramp-recentf-cleanup-all)))))
 
 ;;; Default connection-local variables for Tramp:
 
@@ -180,16 +180,16 @@ NAME must be equal to `tramp-current-connection'."
 
 ;; `connection-local-set-profile-variables' and
 ;; `connection-local-set-profiles' exists since Emacs 26.1.
-(eval-after-load "shell"
-  '(progn
-     (tramp-compat-funcall
-      'connection-local-set-profile-variables
-      'tramp-connection-local-default-profile
-      tramp-connection-local-default-profile)
-     (tramp-compat-funcall
-      'connection-local-set-profiles
-      `(:application tramp)
-      'tramp-connection-local-default-profile)))
+(with-eval-after-load 'shell
+  (progn
+    (tramp-compat-funcall
+     'connection-local-set-profile-variables
+     'tramp-connection-local-default-profile
+     tramp-connection-local-default-profile)
+    (tramp-compat-funcall
+     'connection-local-set-profiles
+     `(:application tramp)
+     'tramp-connection-local-default-profile)))
 
 (add-hook 'tramp-unload-hook
          (lambda () (unload-feature 'tramp-integration 'force)))
index a42ae9363ca8366e00af1ed21ae9374f6fefd335..cee61f15d20039f87ab003151bfee3a7ca3fdb92 100644 (file)
@@ -1135,19 +1135,15 @@ component is used as the target of the symlink."
                  (setq thisstep (pop steps))
                  (tramp-message
                   v 5 "Check %s"
-                  (mapconcat #'identity
-                             (append '("") (reverse result) (list thisstep))
-                             "/"))
+                  (string-join
+                   (append '("") (reverse result) (list thisstep)) "/"))
                  (setq symlink-target
                        (tramp-compat-file-attribute-type
                         (file-attributes
                          (tramp-make-tramp-file-name
                           v
-                          (mapconcat #'identity
-                                     (append '("")
-                                             (reverse result)
-                                             (list thisstep))
-                                     "/")
+                          (string-join
+                           (append '("") (reverse result) (list thisstep)) "/")
                           'nohop))))
                  (cond ((string= "." thisstep)
                         (tramp-message v 5 "Ignoring step `.'"))
@@ -1173,12 +1169,8 @@ component is used as the target of the symlink."
                   "Maximum number (%d) of symlinks exceeded" numchase-limit))
                (setq result (reverse result))
                ;; Combine list to form string.
-               (setq result
-                     (if result
-                         (mapconcat #'identity (cons "" result) "/")
-                       "/"))
-               (when (string= "" result)
-                 (setq result "/")))))
+               (setq result (if result (string-join (cons "" result) "/") "/"))
+               (when (string-empty-p result) (setq result "/")))))
 
          ;; Detect cycle.
          (when (and (file-symlink-p filename)
@@ -1993,7 +1985,6 @@ file names."
          (t2 (tramp-tramp-file-p newname))
          (length (tramp-compat-file-attribute-size
                   (file-attributes (file-truename filename))))
-         ;; `file-extended-attributes' exists since Emacs 24.4.
          (attributes (and preserve-extended-attributes
                           (apply #'file-extended-attributes (list filename)))))
 
@@ -2065,7 +2056,6 @@ file names."
 
          ;; Handle `preserve-extended-attributes'.  We ignore possible
          ;; errors, because ACL strings could be incompatible.
-         ;; `set-file-extended-attributes' exists since Emacs 24.4.
          (when attributes
            (ignore-errors
              (apply #'set-file-extended-attributes (list newname attributes))))
@@ -2364,7 +2354,7 @@ The method used must be an out-of-band method."
               (mapcar
                (lambda (x)
                  (setq x (mapcar (lambda (y) (format-spec y spec)) x))
-                 (unless (member "" x) (mapconcat #'identity x " ")))
+                 (unless (member "" x) (string-join x " ")))
                (tramp-get-method-parameter v 'tramp-copy-env)))
 
              remote-copy-program
@@ -3636,8 +3626,8 @@ Fall back to normal file name handler if no Tramp handler exists."
          (tramp-error
           v 'file-notify-error
           "`%s' failed to start on remote host"
-          (mapconcat #'identity sequence " "))
-       (tramp-message v 6 "Run `%s', %S" (mapconcat #'identity sequence " ") p)
+          (string-join sequence " "))
+       (tramp-message v 6 "Run `%s', %S" (string-join sequence " ") p)
        (process-put p 'vector v)
        ;; Needed for process filter.
        (process-put p 'events events)
@@ -3928,7 +3918,7 @@ This function expects to be in the right *tramp* buffer."
                           "%s\n%s"))
                 progname progname progname
                 tramp-end-of-heredoc
-                (mapconcat #'identity dirlist "\n")
+                (string-join dirlist "\n")
                 tramp-end-of-heredoc))
        (goto-char (point-max))
        (when (search-backward "tramp_executable " nil t)
@@ -3946,8 +3936,8 @@ I.e., for each directory in `tramp-remote-path', it is tested
 whether it exists and if so, it is added to the environment
 variable PATH."
   (let ((command
-        (format "PATH=%s; export PATH"
-                (mapconcat #'identity (tramp-get-remote-path vec) ":")))
+        (format
+         "PATH=%s; export PATH" (string-join (tramp-get-remote-path vec) ":")))
        (pipe-buf
         (or (with-tramp-connection-property vec "pipe-buf"
               (tramp-send-command-and-read
@@ -4290,7 +4280,7 @@ process to set up.  VEC specifies the connection."
                     (append `(,(tramp-get-remote-locale vec))
                             (copy-sequence tramp-remote-process-environment))))
        (setq item (split-string item "=" 'omit))
-       (setcdr item (mapconcat #'identity (cdr item) "="))
+       (setcdr item (string-join (cdr item) "="))
        (if (and (stringp (cdr item)) (not (string-equal (cdr item) "")))
            (push (format "%s %s" (car item) (cdr item)) vars)
          (push (car item) unset)))
@@ -4300,12 +4290,12 @@ process to set up.  VEC specifies the connection."
         (format
          "while read var val; do export $var=\"$val\"; done <<'%s'\n%s\n%s"
          tramp-end-of-heredoc
-         (mapconcat #'identity vars "\n")
+         (string-join vars "\n")
          tramp-end-of-heredoc)
         t))
       (when unset
        (tramp-send-command
-        vec (format "unset %s" (mapconcat #'identity unset " ")) t)))))
+        vec (format "unset %s" (string-join unset " ")) t)))))
 
 ;; Old text from documentation of tramp-methods:
 ;; Using a uuencode/uudecode inline method is discouraged, please use one
@@ -4873,8 +4863,7 @@ connection if a previous connection has died for some reason."
                (set-process-query-on-exit-flag p nil)
                (setq tramp-current-connection (cons vec (current-time)))
 
-               (tramp-message
-                vec 6 "%s" (mapconcat #'identity (process-command p) " "))
+               (tramp-message vec 6 "%s" (string-join (process-command p) " "))
 
                ;; Check whether process is alive.
                (tramp-barf-if-no-shell-prompt
@@ -4951,7 +4940,7 @@ connection if a previous connection has died for some reason."
                       (mapcar
                        (lambda (x)
                          (setq x (mapcar (lambda (y) (format-spec y spec)) x))
-                         (unless (member "" x) (mapconcat #'identity x " ")))
+                         (unless (member "" x) (string-join x " ")))
                        login-env))
                      (while login-env
                        (setq command
@@ -4980,7 +4969,7 @@ connection if a previous connection has died for some reason."
                      (mapconcat
                       (lambda (x)
                         (setq x (mapcar (lambda (y) (format-spec y spec)) x))
-                        (unless (member "" x) (mapconcat #'identity x " ")))
+                        (unless (member "" x) (string-join x " ")))
                       login-args " ")
                      ;; Local shell could be a Windows COMSPEC.  It
                      ;; doesn't know the ";" syntax, but we must exit
@@ -5041,7 +5030,7 @@ function waits for output unless NOOUTPUT is set."
       ;; `tramp-echo-mark', so the remote shell sees two consecutive
       ;; trailing line endings and sends two prompts after executing
       ;; the command, which confuses `tramp-wait-for-output'.
-      (when (and (not (string= command ""))
+      (when (and (not (string-empty-p command))
                 (string-equal (substring command -1) "\n"))
        (setq command (substring command 0 -1)))
       ;; No need to restore a trailing newline here since `tramp-send-string'
index 37c40a07f29e3246f3026980a02e490daeecd048..695f552b0616981ea94718013abdbd054f401be7 100644 (file)
@@ -513,7 +513,7 @@ pass to the OPERATION."
                               tramp-smb-program args)))
 
                      (tramp-message
-                      v 6 "%s" (mapconcat #'identity (process-command p) " "))
+                      v 6 "%s" (string-join (process-command p) " "))
                      (process-put p 'vector v)
                      (process-put p 'adjust-window-size-function #'ignore)
                      (set-process-query-on-exit-flag p nil)
@@ -774,7 +774,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
                            tramp-smb-acl-program args)))
 
                    (tramp-message
-                    v 6 "%s" (mapconcat #'identity (process-command p) " "))
+                    v 6 "%s" (string-join (process-command p) " "))
                    (process-put p 'vector v)
                    (process-put p 'adjust-window-size-function #'ignore)
                    (set-process-query-on-exit-flag p nil)
@@ -1258,7 +1258,7 @@ component is used as the target of the symlink."
        (setq outbuf (current-buffer))))
 
       ;; Construct command.
-      (setq command (mapconcat #'identity (cons program args) " ")
+      (setq command (string-join (cons program args) " ")
            command (if input
                        (format
                         "get-content %s | & %s"
@@ -1425,8 +1425,7 @@ component is used as the target of the symlink."
                          (tramp-get-connection-buffer v)
                          tramp-smb-acl-program args)))
 
-                 (tramp-message
-                  v 6 "%s" (mapconcat #'identity (process-command p) " "))
+                 (tramp-message v 6 "%s" (string-join (process-command p) " "))
                  (process-put p 'vector v)
                  (process-put p 'adjust-window-size-function #'ignore)
                  (set-process-query-on-exit-flag p nil)
@@ -1470,7 +1469,7 @@ component is used as the target of the symlink."
                (get-buffer-create buffer)
              ;; BUFFER can be nil.  We use a temporary buffer.
              (generate-new-buffer tramp-temp-buffer-name)))
-          (command (mapconcat #'identity (cons program args) " "))
+          (command (string-join (cons program args) " "))
           (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer)))
           (name1 name)
           (i 0))
@@ -1965,8 +1964,7 @@ If ARGUMENT is non-nil, use it as argument for
                                   tramp-smb-winexe-program tramp-smb-program)
                               args))))
 
-             (tramp-message
-              vec 6 "%s" (mapconcat #'identity (process-command p) " "))
+             (tramp-message vec 6 "%s" (string-join (process-command p) " "))
              (process-put p 'vector vec)
              (process-put p 'adjust-window-size-function #'ignore)
              (set-process-query-on-exit-flag p nil)
@@ -2039,8 +2037,8 @@ Removes smb prompt.  Returns nil if an error message has appeared."
 
       ;; Read pending output.
       (while (not (re-search-forward tramp-smb-prompt nil t))
-       (while (tramp-accept-process-output p 0)
-         (goto-char (point-min))))
+       (while (tramp-accept-process-output p 0))
+       (goto-char (point-min)))
       (tramp-message vec 6 "\n%s" (buffer-string))
 
       ;; Remove prompt.
index f056e73366e6221c90b58c7f729c431e29f2a3b2..bbe780099d5f5678354008d018ada6a7793e7d9b 100644 (file)
@@ -232,7 +232,6 @@ absolute file names."
          (file-times (tramp-compat-file-attribute-modification-time
                       (file-attributes filename)))
          (file-modes (tramp-default-file-modes filename))
-         ;; `file-extended-attributes' exists since Emacs 24.4.
          (attributes (and preserve-extended-attributes
                           (apply #'file-extended-attributes (list filename))))
          (sudoedit-operation
@@ -284,7 +283,6 @@ absolute file names."
 
        ;; Handle `preserve-extended-attributes'.  We ignore possible
        ;; errors, because ACL strings could be incompatible.
-       ;; `set-file-extended-attributes' exists since Emacs 24.4.
        (when attributes
          (ignore-errors
            (apply #'set-file-extended-attributes (list newname attributes))))
@@ -660,8 +658,7 @@ component is used as the target of the symlink."
   (with-parsed-tramp-file-name (expand-file-name filename) nil
     (when (and (stringp acl-string) (tramp-sudoedit-remote-acl-p v))
       ;; Massage `acl-string'.
-      (setq acl-string
-           (mapconcat #'identity (split-string acl-string "\n" 'omit) ","))
+      (setq acl-string (string-join (split-string acl-string "\n" 'omit) ","))
       (prog1
          (tramp-sudoedit-send-command
           v "setfacl" "-m"
@@ -830,7 +827,7 @@ in case of error, t otherwise."
           (tramp-verbose (if (= tramp-verbose 3) 2 tramp-verbose))
           ;; We do not want to save the password.
           auth-source-save-behavior)
-      (tramp-message vec 6 "%s" (mapconcat #'identity (process-command p) " "))
+      (tramp-message vec 6 "%s" (string-join (process-command p) " "))
       ;; Avoid process status message in output buffer.
       (set-process-sentinel p #'ignore)
       (process-put p 'vector vec)
index 3efac8d74f9496033c0a94d96ebd347c3d4d9765..90f7491bf51a7d9543b5144f0e117a2f3a21edb0 100644 (file)
@@ -8,7 +8,7 @@
 ;; Keywords: comm, processes
 ;; Package: tramp
 ;; Version: 2.4.2-pre
-;; Package-Requires: ((emacs "24.1"))
+;; Package-Requires: ((emacs "24.4"))
 ;; URL: https://savannah.gnu.org/projects/tramp
 
 ;; This file is part of GNU Emacs.
@@ -572,10 +572,7 @@ This regexp must match both `tramp-initial-end-of-output' and
   :type 'regexp)
 
 (defcustom tramp-password-prompt-regexp
-  (format "^.*\\(%s\\).*:\^@? *"
-         ;; `password-word-equivalents' has been introduced with Emacs 24.4.
-          (regexp-opt (or (bound-and-true-p password-word-equivalents)
-                          '("password" "passphrase"))))
+  (format "^.*\\(%s\\).*:\^@? *" (regexp-opt password-word-equivalents))
   "Regexp matching password-like prompts.
 The regexp should match at end of buffer.
 
@@ -1862,10 +1859,7 @@ an input event arrives.  The other arguments are passed to `tramp-error'."
 (defun tramp-user-error (vec-or-proc fmt-string &rest arguments)
   "Signal a user error (or \"pilot error\")."
   (unwind-protect
-      (apply
-       #'tramp-error vec-or-proc
-       ;; `user-error' has appeared in Emacs 24.3.
-       (if (fboundp 'user-error) 'user-error 'error) fmt-string arguments)
+      (apply #'tramp-error vec-or-proc 'user-error fmt-string arguments)
     ;; Save exit.
     (when (and tramp-message-show-message
               (not (zerop tramp-verbose))
@@ -2103,21 +2097,7 @@ value of `default-file-modes', without execute permissions."
 (defun tramp-replace-environment-variables (filename)
  "Replace environment variables in FILENAME.
 Return the string with the replaced variables."
- (or (ignore-errors
-       ;; Optional arg has been introduced with Emacs 24.4.
-       (tramp-compat-funcall 'substitute-env-vars filename 'only-defined))
-     ;; We need an own implementation.
-     (save-match-data
-       (let ((idx (string-match "\\$\\(\\w+\\)" filename)))
-        ;; `$' is coded as `$$'.
-        (when (and idx
-                   (or (zerop idx) (not (eq ?$ (aref filename (1- idx)))))
-                   (getenv (match-string 1 filename)))
-          (setq filename
-                (replace-match
-                 (substitute-in-file-name (match-string 0 filename))
-                 t nil filename)))
-        filename))))
+ (substitute-env-vars filename 'only-defined))
 
 (defun tramp-find-file-name-coding-system-alist (filename tmpname)
   "Like `find-operation-coding-system' for Tramp filenames.
@@ -4149,31 +4129,34 @@ Erase echoed commands if exists."
 Expects the output of PROC to be sent to the current buffer.  Returns
 the string that matched, or nil.  Waits indefinitely if TIMEOUT is
 nil."
-  (with-current-buffer (process-buffer proc)
-    (let ((found (tramp-check-for-regexp proc regexp)))
-      (cond (timeout
-            (with-timeout (timeout)
-              (while (not found)
-                (tramp-accept-process-output proc)
-                (unless (process-live-p proc)
-                  (tramp-error-with-buffer
-                   nil proc 'file-error "Process has died"))
-                (setq found (tramp-check-for-regexp proc regexp)))))
-           (t
+  (let ((found (tramp-check-for-regexp proc regexp)))
+    (cond (timeout
+          (with-timeout (timeout)
             (while (not found)
               (tramp-accept-process-output proc)
               (unless (process-live-p proc)
                 (tramp-error-with-buffer
                  nil proc 'file-error "Process has died"))
               (setq found (tramp-check-for-regexp proc regexp)))))
-      (tramp-message proc 6 "\n%s" (buffer-string))
-      (unless found
-       (if timeout
-           (tramp-error
-            proc 'file-error "[[Regexp `%s' not found in %d secs]]"
-            regexp timeout)
-         (tramp-error proc 'file-error "[[Regexp `%s' not found]]" regexp)))
-      found)))
+         (t
+          (while (not found)
+            (tramp-accept-process-output proc)
+            (unless (process-live-p proc)
+              (tramp-error-with-buffer
+               nil proc 'file-error "Process has died"))
+            (setq found (tramp-check-for-regexp proc regexp)))))
+    ;; The process could have timed out, for example due to session
+    ;; timeout of sudo.  The process buffer does not exist any longer then.
+    (ignore-errors
+      (with-current-buffer (process-buffer proc)
+       (tramp-message proc 6 "\n%s" (buffer-string))))
+    (unless found
+      (if timeout
+         (tramp-error
+          proc 'file-error "[[Regexp `%s' not found in %d secs]]"
+          regexp timeout)
+       (tramp-error proc 'file-error "[[Regexp `%s' not found]]" regexp)))
+    found))
 
 ;; It seems that Tru64 Unix does not like it if long strings are sent
 ;; to it in one go.  (This happens when sending the Perl
@@ -4200,7 +4183,7 @@ the remote host use line-endings as defined in the variable
       (setq string
            (mapconcat
             #'identity (split-string string "\n") tramp-rsh-end-of-line))
-      (unless (or (string= string "")
+      (unless (or (string-empty-p string)
                  (string-equal (substring string -1) tramp-rsh-end-of-line))
        (setq string (concat string tramp-rsh-end-of-line)))
       ;; Send the string.
@@ -4408,12 +4391,10 @@ ID-FORMAT valid values are `string' and `integer'."
   ;; We use key nil for local connection properties.
   (with-tramp-connection-property nil (format "gid-%s" id-format)
     (cond
-     ;; `group-gid' has been introduced with Emacs 24.4.
-     ((and (fboundp 'group-gid) (equal id-format 'integer))
-      (tramp-compat-funcall 'group-gid))
+     ((equal id-format 'integer) (group-gid))
      ;; `group-name' has been introduced with Emacs 27.1.
      ((and (fboundp 'group-name) (equal id-format 'string))
-      (tramp-compat-funcall 'group-name (tramp-compat-funcall 'group-gid)))
+      (tramp-compat-funcall 'group-name (group-gid)))
      ((tramp-compat-file-attribute-group-id
        (file-attributes "~/" id-format))))))
 
@@ -4647,7 +4628,7 @@ are written with verbosity of 6."
        output error result)
     (tramp-message
      vec 6 "`%s %s' %s %s"
-     program (mapconcat #'identity args " ") infile destination)
+     program (string-join args " ") infile destination)
     (condition-case err
        (with-temp-buffer
          (setq result
@@ -4680,7 +4661,7 @@ are written with verbosity of 6."
        result)
     (tramp-message
      vec 6 "`%s %s' %s %s %s %s"
-     program (mapconcat #'identity args " ") start end delete buffer)
+     program (string-join args " ") start end delete buffer)
     (condition-case err
        (progn
          (setq result
@@ -4709,7 +4690,7 @@ verbosity of 6."
        (vec (or vec (car tramp-current-connection)))
        result)
     (if args
-       (tramp-message vec 6 "%s %s" program (mapconcat #'identity args " "))
+       (tramp-message vec 6 "%s %s" program (string-join args " "))
       (tramp-message vec 6 "%s" program))
     (setq result
          (condition-case err
index 4e1be417a0515dde6fe83925cfa9528806a07c8f..79e2b079858c4aa866e540527968d18531dea197 100644 (file)
@@ -63,7 +63,7 @@
   "The repository revision of the Tramp sources.")
 
 ;; Check for Emacs version.
-(let ((x   (if (not (string-lessp emacs-version "24.1"))
+(let ((x   (if (not (string-lessp emacs-version "24.4"))
       "ok"
     (format "Tramp 2.4.2-pre is not fit for %s"
             (replace-regexp-in-string "\n" "" (emacs-version))))))
index 525f62a3c0be476374a25a305df5e1a35e79a05e..afe6488ea713fc012253103ddf70f1d58d84cf03 100644 (file)
@@ -19,8 +19,6 @@
 
 ;;; Commentary:
 
-;; The tests require a recent ert.el from Emacs 24.4.
-
 ;; Some of the tests require access to a remote host files.  Since
 ;; this could be problematic, a mock-up connection method "mock" is
 ;; used.  Emulating a remote connection, it simply calls "sh -i".
@@ -410,9 +408,6 @@ properly.  BODY shall not contain a timeout."
 
 (ert-deftest tramp-test02-file-name-dissect ()
   "Check remote file name components."
-  ;; `user-error' has appeared in Emacs 24.3.
-  (skip-unless (fboundp 'user-error))
-
   (let ((tramp-default-method "default-method")
        (tramp-default-user "default-user")
        (tramp-default-host "default-host")
@@ -863,9 +858,6 @@ properly.  BODY shall not contain a timeout."
 (ert-deftest tramp-test02-file-name-dissect-simplified ()
   "Check simplified file name components."
   :tags '(:expensive-test)
-  ;; `user-error' has appeared in Emacs 24.3.
-  (skip-unless (fboundp 'user-error))
-
   (let ((tramp-default-method "default-method")
        (tramp-default-user "default-user")
        (tramp-default-host "default-host")
@@ -1197,9 +1189,6 @@ properly.  BODY shall not contain a timeout."
 (ert-deftest tramp-test02-file-name-dissect-separate ()
   "Check separate file name components."
   :tags '(:expensive-test)
-  ;; `user-error' has appeared in Emacs 24.3.
-  (skip-unless (fboundp 'user-error))
-
   (let ((tramp-default-method "default-method")
        (tramp-default-user "default-user")
        (tramp-default-host "default-host")
@@ -1889,8 +1878,6 @@ properly.  BODY shall not contain a timeout."
   "Check host name rules for host-less methods."
   (skip-unless (tramp--test-enabled))
   (skip-unless (tramp--test-sh-p))
-  ;; `user-error' has appeared in Emacs 24.3.
-  (skip-unless (fboundp 'user-error))
 
   ;; Host names must match rules in case the command template of a
   ;; method doesn't use them.
@@ -1914,8 +1901,6 @@ properly.  BODY shall not contain a timeout."
 (ert-deftest tramp-test03-file-name-method-rules ()
   "Check file name rules for some methods."
   (skip-unless (tramp--test-enabled))
-  ;; `user-error' has appeared in Emacs 24.3.
-  (skip-unless (fboundp 'user-error))
 
   ;; Multi hops are allowed for inline methods only.
   (should-error