]> git.eshelyaron.com Git - emacs.git/commitdiff
* net/tramp-compat.el (tramp-compat-call-process): Move function ...
authorMichael Albinus <michael.albinus@gmx.de>
Mon, 22 Apr 2013 10:26:09 +0000 (12:26 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Mon, 22 Apr 2013 10:26:09 +0000 (12:26 +0200)
* net/tramp.el (tramp-call-process): ... here
(tramp-set-completion-function, tramp-parse-putty):
* net/tramp-adb.el (tramp-adb-execute-adb-command):
* net/tramp-gvfs.el (tramp-gvfs-send-command):
* net/tramp-sh.el (tramp-sh-handle-set-file-times)
(tramp-set-file-uid-gid, tramp-sh-handle-write-region)
(tramp-call-local-coding-command): Use `tramp-call-process'
instead of `tramp-compat-call-process'.

* net/tramp-sh.el (tramp-perl-pack, tramp-perl-unpack): New defconst.
(tramp-local-coding-commands, tramp-remote-coding-commands): Use them.
(tramp-sh-handle-file-local-copy, tramp-sh-handle-write-region):
(tramp-find-inline-compress):Improve traces.
(tramp-maybe-send-script): Check for Perl binary.
(tramp-get-inline-coding): Do not redirect STDOUT for local decoding.

lisp/ChangeLog
lisp/net/tramp-adb.el
lisp/net/tramp-compat.el
lisp/net/tramp-gvfs.el
lisp/net/tramp-sh.el
lisp/net/tramp.el

index 9c3be36984b149cfa51ffd6d148f51890612364d..7f7757e750e27edaf4899184a1a4e35832d7b622 100644 (file)
@@ -1,3 +1,24 @@
+2013-04-22  Michael Albinus  <michael.albinus@gmx.de>
+
+       Fix pack/unpack coding.  Reported by David Smith <davidsmith@acm.org>.
+
+       * net/tramp-compat.el (tramp-compat-call-process): Move function ...
+       * net/tramp.el (tramp-call-process): ... here
+       (tramp-set-completion-function, tramp-parse-putty):
+       * net/tramp-adb.el (tramp-adb-execute-adb-command):
+       * net/tramp-gvfs.el (tramp-gvfs-send-command):
+       * net/tramp-sh.el (tramp-sh-handle-set-file-times)
+       (tramp-set-file-uid-gid, tramp-sh-handle-write-region)
+       (tramp-call-local-coding-command): Use `tramp-call-process'
+       instead of `tramp-compat-call-process'.
+
+       * net/tramp-sh.el (tramp-perl-pack, tramp-perl-unpack): New defconst.
+       (tramp-local-coding-commands, tramp-remote-coding-commands): Use them.
+       (tramp-sh-handle-file-local-copy, tramp-sh-handle-write-region):
+       (tramp-find-inline-compress):Improve traces.
+       (tramp-maybe-send-script): Check for Perl binary.
+       (tramp-get-inline-coding): Do not redirect STDOUT for local decoding.
+
 2013-04-22  Daiki Ueno  <ueno@gnu.org>
 
        * epg.el (epg-context-pinentry-mode): New function.
index a71df54db58e3059476aecbc48e77df574cd5b17..613b20679552ec15dd1c5a661058f7208c93618b 100644 (file)
@@ -982,11 +982,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
     (setq args (append (list "-s" (tramp-file-name-host vec)) args)))
   (with-temp-buffer
     (prog1
-       (unless (zerop (apply 'call-process tramp-adb-program nil t nil args))
+       (unless
+           (zerop (apply 'tramp-call-process tramp-adb-program nil t nil args))
          (buffer-string))
-      (tramp-message
-       vec 6 "%s %s\n%s"
-       tramp-adb-program (mapconcat 'identity args " ") (buffer-string)))))
+      (tramp-message vec 6 "%s" (buffer-string)))))
 
 (defun tramp-adb-find-test-command (vec)
   "Checks, whether the ash has a builtin \"test\" command.
index ed61fbcfa764c337ba4199a2ca3644d60b391ece..d4115352b34a3783ddf1f014508328b12327ac0a 100644 (file)
@@ -438,20 +438,6 @@ This is, the first, empty, element is omitted.  In XEmacs, the first
 element is not omitted."
   (delete "" (split-string string pattern)))
 
-(defun tramp-compat-call-process
-  (program &optional infile destination display &rest args)
-  "Calls `call-process' on the local host.
-This is needed because for some Emacs flavors Tramp has
-defadvised `call-process' to behave like `process-file'.  The
-Lisp error raised when PROGRAM is nil is trapped also, returning 1."
-  (let ((default-directory
-         (if (file-remote-p default-directory)
-             (tramp-compat-temporary-file-directory)
-           default-directory)))
-    (if (executable-find program)
-       (apply 'call-process program infile destination display args)
-      1)))
-
 (defun tramp-compat-process-running-p (process-name)
   "Returns `t' if system process PROCESS-NAME is running for `user-login-name'."
   (when (stringp process-name)
index 6f066f56a2bcd36f62536cb14e9bc7b4ee2d6a8d..7c3b393873c27ea8e9e747b723f075604deba346 100644 (file)
@@ -1572,7 +1572,7 @@ COMMAND is usually a command from the gvfs-* utilities.
       (tramp-gvfs-maybe-open-connection vec)
       (erase-buffer)
       (tramp-message vec 6 "%s %s" command (mapconcat 'identity args " "))
-      (setq result (apply 'tramp-compat-call-process command nil t nil args))
+      (setq result (apply 'tramp-call-process command nil t nil args))
       (tramp-message vec 6 "\n%s" (buffer-string))
       (zerop result))))
 
index f28df1ce1607198c6705e118c2690a222858b72d..e45c2cf8511ec3785d26cbac346677b3ca56f74c 100644 (file)
@@ -767,6 +767,16 @@ while (my $data = <STDIN>) {
 Escape sequence %s is replaced with name of Perl binary.
 This string is passed to `format', so percent characters need to be doubled.")
 
+(defconst tramp-perl-pack
+  "%s -e 'binmode STDIN; binmode STDOUT; print pack(q{u*}, join q{}, <>)'"
+  "Perl program to use for encoding a file.
+Escape sequence %s is replaced with name of Perl binary.")
+
+(defconst tramp-perl-unpack
+  "%s -e 'binmode STDIN; binmode STDOUT; print unpack(q{u*}, join q{}, <>)'"
+  "Perl program to use for decoding a file.
+Escape sequence %s is replaced with name of Perl binary.")
+
 (defconst tramp-vc-registered-read-file-names
   "echo \"(\"
 while read file; do
@@ -1309,7 +1319,7 @@ of."
     ;; without `set-file-times', this function is an alias for this.
     ;; We are local, so we don't need the UTC settings.
     (zerop
-     (tramp-compat-call-process
+     (tramp-call-process
       "touch" nil nil nil "-t"
       (format-time-string "%Y%m%d%H%M.%S" time)
       (tramp-shell-quote-argument filename)))))
@@ -1343,7 +1353,7 @@ be non-negative integers."
       ;; `set-file-uid-gid'.  On W32 "chown" might not work.
       (let ((uid (or (and (natnump uid) uid) (tramp-get-local-uid 'integer)))
            (gid (or (and (natnump gid) gid) (tramp-get-local-gid 'integer))))
-       (tramp-compat-call-process
+       (tramp-call-process
         "chown" nil nil nil
          (format "%d:%d" uid gid) (tramp-shell-quote-argument filename))))))
 
@@ -2891,40 +2901,39 @@ the result will be a local, non-Tramp, filename."
           (rem-enc
            (save-excursion
              (with-tramp-progress-reporter
-              v 3 (format "Encoding remote file %s" filename)
+              v 3
+              (format "Encoding remote file `%s' with `%s'" filename rem-enc)
               (tramp-barf-unless-okay
                v (format rem-enc (tramp-shell-quote-argument localname))
                "Encoding remote file failed"))
 
-             (if (functionp loc-dec)
-                 ;; If local decoding is a function, we call it.  We
-                 ;; must disable multibyte, because
-                 ;; `uudecode-decode-region' doesn't handle it
-                 ;; correctly.
-                 (with-temp-buffer
-                   (set-buffer-multibyte nil)
-                   (insert-buffer-substring (tramp-get-buffer v))
-                   (with-tramp-progress-reporter
-                       v 3 (format "Decoding remote file %s with function %s"
-                                   filename loc-dec)
+             (with-tramp-progress-reporter
+                 v 3 (format "Decoding local file `%s' with `%s'"
+                             tmpfile loc-dec)
+               (if (functionp loc-dec)
+                   ;; If local decoding is a function, we call it.
+                   ;; We must disable multibyte, because
+                   ;; `uudecode-decode-region' doesn't handle it
+                   ;; correctly.
+                   (with-temp-buffer
+                     (set-buffer-multibyte nil)
+                     (insert-buffer-substring (tramp-get-buffer v))
                      (funcall loc-dec (point-min) (point-max))
                      ;; Unset `file-name-handler-alist'.  Otherwise,
                      ;; epa-file gets confused.
                      (let (file-name-handler-alist
                            (coding-system-for-write 'binary))
-                       (write-region (point-min) (point-max) tmpfile))))
-
-               ;; If tramp-decoding-function is not defined for this
-               ;; method, we invoke tramp-decoding-command instead.
-               (let ((tmpfile2 (tramp-compat-make-temp-file filename)))
-                 ;; Unset `file-name-handler-alist'.  Otherwise,
-                 ;; epa-file gets confused.
-                 (let (file-name-handler-alist
-                       (coding-system-for-write 'binary))
-                   (write-region (point-min) (point-max) tmpfile2))
-                 (with-tramp-progress-reporter
-                     v 3 (format "Decoding remote file %s with command %s"
-                                 filename loc-dec)
+                       (write-region (point-min) (point-max) tmpfile)))
+
+                 ;; If tramp-decoding-function is not defined for this
+                 ;; method, we invoke tramp-decoding-command instead.
+                 (let ((tmpfile2 (tramp-compat-make-temp-file filename)))
+                   ;; Unset `file-name-handler-alist'.  Otherwise,
+                   ;; epa-file gets confused.
+                   (let (file-name-handler-alist
+                         (coding-system-for-write 'binary))
+                     (with-current-buffer (tramp-get-buffer v)
+                       (write-region (point-min) (point-max) tmpfile2)))
                    (unwind-protect
                        (tramp-call-local-coding-command
                         loc-dec tmpfile2 tmpfile)
@@ -3149,28 +3158,25 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
                  (with-temp-buffer
                    (set-buffer-multibyte nil)
                    ;; Use encoding function or command.
-                   (if (functionp loc-enc)
-                       (with-tramp-progress-reporter
-                           v 3 (format "Encoding region using function `%s'"
-                                       loc-enc)
-                         (let ((coding-system-for-read 'binary))
-                           (insert-file-contents-literally tmpfile))
-                         ;; The following `let' is a workaround for the
-                         ;; base64.el that comes with pgnus-0.84.  If
-                         ;; both of the following conditions are
+                   (with-tramp-progress-reporter
+                       v 3 (format "Encoding local file `%s' using `%s'"
+                                   tmpfile loc-enc)
+                     (if (functionp loc-enc)
+                         ;; The following `let' is a workaround for
+                         ;; the base64.el that comes with pgnus-0.84.
+                         ;; If both of the following conditions are
                          ;; satisfied, it tries to write to a local
                          ;; file in default-directory, but at this
                          ;; point, default-directory is remote.
                          ;; (`call-process-region' can't write to
                          ;; remote files, it seems.)  The file in
                          ;; question is a tmp file anyway.
-                         (let ((default-directory
+                         (let ((coding-system-for-read 'binary)
+                               (default-directory
                                  (tramp-compat-temporary-file-directory)))
-                           (funcall loc-enc (point-min) (point-max))))
+                           (insert-file-contents-literally tmpfile)
+                           (funcall loc-enc (point-min) (point-max)))
 
-                     (with-tramp-progress-reporter
-                         v 3 (format "Encoding region using command `%s'"
-                                     loc-enc)
                        (unless (zerop (tramp-call-local-coding-command
                                        loc-enc tmpfile t))
                          (tramp-error
@@ -3183,8 +3189,8 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
                    ;; writes to remote file.  Because this happens on
                    ;; the remote host, we cannot use the function.
                    (with-tramp-progress-reporter
-                       v 3
-                       (format "Decoding region into remote file %s" filename)
+                       v 3 (format "Decoding remote file `%s' using `%s'"
+                                   filename rem-dec)
                      (goto-char (point-max))
                      (unless (bolp) (newline))
                      (tramp-send-command
@@ -3204,7 +3210,7 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
                        (erase-buffer)
                        (and
                         ;; cksum runs locally, if possible.
-                        (zerop (tramp-compat-call-process "cksum" tmpfile t))
+                        (zerop (tramp-call-process "cksum" tmpfile t))
                         ;; cksum runs remotely.
                         (tramp-send-command-and-check
                          v
@@ -3382,6 +3388,9 @@ Only send the definition if it has not already been done."
     (unless (member name scripts)
       (with-tramp-progress-reporter vec 5 (format "Sending script `%s'" name)
        ;; The script could contain a call of Perl.  This is masked with `%s'.
+       (when (and (string-match "%s" script)
+                  (not (tramp-get-remote-perl vec)))
+         (tramp-error vec 'file-error "No Perl available on remote host"))
        (tramp-barf-unless-okay
         vec
         (format "%s () {\n%s\n}" name
@@ -3811,11 +3820,6 @@ process to set up.  VEC specifies the connection."
       (tramp-send-command
        vec (format "unset %s" (mapconcat 'identity unset " ")) t))))
 
-;; CCC: We should either implement a Perl version of base64 encoding
-;; and decoding.  Then we just use that in the last item.  The other
-;; alternative is to use the Perl version of UU encoding.  But then
-;; we need a Lisp version of uuencode.
-;;
 ;; Old text from documentation of tramp-methods:
 ;; Using a uuencode/uudecode inline method is discouraged, please use one
 ;; of the base64 methods instead since base64 encoding is much more
@@ -3832,11 +3836,9 @@ process to set up.  VEC specifies the connection."
 (autoload 'uudecode-decode-region "uudecode")
 
 (defconst tramp-local-coding-commands
-  '((b64 base64-encode-region base64-decode-region)
+  `((b64 base64-encode-region base64-decode-region)
     (uu  tramp-uuencode-region uudecode-decode-region)
-    (pack
-     "perl -e 'binmode STDIN; binmode STDOUT; print pack(q{u*}, join q{}, <>)'"
-     "perl -e 'binmode STDIN; binmode STDOUT; print unpack(q{u*}, join q{}, <>)'"))
+    (pack ,(format tramp-perl-pack "perl") ,(format tramp-perl-unpack "perl")))
   "List of local coding commands for inline transfer.
 Each item is a list that looks like this:
 
@@ -3871,9 +3873,7 @@ with the encoded or decoded results, respectively.")
     (uu  "uuencode xxx" "uudecode -o -")
     (uu  "uuencode xxx" "uudecode -p")
     (uu  "uuencode xxx" tramp-uudecode)
-    (pack
-     "perl -e 'binmode STDIN; binmode STDOUT; print pack(q{u*}, join q{}, <>)'"
-     "perl -e 'binmode STDIN; binmode STDOUT; print unpack(q{u*}, join q{}, <>)'"))
+    (pack tramp-perl-pack tramp-perl-unpack))
   "List of remote coding commands for inline transfer.
 Each item is a list that looks like this:
 
@@ -4014,7 +4014,7 @@ INPUT can also be nil which means `/dev/null'.
 OUTPUT can be a string (which specifies a filename), or t (which
 means standard output and thus the current buffer), or nil (which
 means discard it)."
-  (tramp-compat-call-process
+  (tramp-call-process
    tramp-encoding-shell
    (when (and input (not (string-match "%s" cmd))) input)
    (if (eq output t) t nil)
@@ -4022,7 +4022,7 @@ means discard it)."
    tramp-encoding-command-switch
    (concat
     (if (string-match "%s" cmd) (format cmd input) cmd)
-    (if (stringp output) (concat "" output) ""))))
+    (if (stringp output) (concat " >" output) ""))))
 
 (defconst tramp-inline-compress-commands
   '(("gzip" "gzip -d")
@@ -4051,7 +4051,7 @@ Goes through the list `tramp-inline-compress-commands'."
                decompress (nth 1 item))
          (tramp-message
           vec 5
-          "Checking local compress command `%s', `%s' for sanity"
+          "Checking local compress commands `%s', `%s' for sanity"
           compress decompress)
          (unless
              (zerop
@@ -4067,7 +4067,7 @@ Goes through the list `tramp-inline-compress-commands'."
            (throw 'next nil))
          (tramp-message
           vec 5
-          "Checking remote compress command `%s', `%s' for sanity"
+          "Checking remote compress commands `%s', `%s' for sanity"
           compress decompress)
          (unless (tramp-send-command-and-check
                   vec (format "echo %s | %s | %s" magic compress decompress) t)
@@ -4981,10 +4981,12 @@ function cell is returned to be applied on a buffer."
           ;; Windows shells need the program file name after
           ;; the pipe symbol be quoted if they use forward
           ;; slashes as directory separators.
-          (if (and (string-match "local" prop)
-                   (memq system-type '(windows-nt)))
-              "(%s | \"%s\" >%%s)"
-            "(%s | %s >%%s)")
+          (cond
+           ((and (string-match "local" prop)
+                 (memq system-type '(windows-nt)))
+              "(%s | \"%s\")")
+           ((string-match "local" prop) "(%s | %s)")
+           (t "(%s | %s >%%s)"))
           coding compress))
         (compress
          (format
@@ -4997,7 +4999,9 @@ function cell is returned to be applied on a buffer."
             "(%s <%%s | %s)")
           compress coding))
         ((string-match "decoding" prop)
-         (format "%s >%%s" coding))
+         (cond
+          ((string-match "local" prop) (format "%s" coding))
+          (t (format "%s >%%s" coding))))
         (t
          (format "%s <%%s" coding)))))))
 
index 7795d9f808c7c78d031970a4e3f31564d714b366..4ec3a4b782907687faa70588a130376935546cb5 100644 (file)
@@ -1717,7 +1717,7 @@ Example:
                       ;; Windows registry.
                       (and (memq system-type '(cygwin windows-nt))
                            (zerop
-                            (tramp-compat-call-process
+                            (tramp-call-process
                              "reg" nil nil nil "query" (nth 1 (car v)))))
                     ;; Configuration file.
                     (file-exists-p (nth 1 (car v)))))
@@ -2769,7 +2769,7 @@ User may be nil."
 User is always nil."
   (if (memq system-type '(windows-nt))
       (with-temp-buffer
-       (when (zerop (tramp-compat-call-process
+       (when (zerop (tramp-call-process
                      "reg" nil t nil "query" registry-or-dirname))
          (goto-char (point-min))
          (loop while (not (eobp)) collect
@@ -3897,6 +3897,24 @@ ALIST is of the form ((FROM . TO) ...)."
 
 ;;; Compatibility functions section:
 
+(defun tramp-call-process
+  (program &optional infile destination display &rest args)
+  "Calls `call-process' on the local host.
+This is needed because for some Emacs flavors Tramp has
+defadvised `call-process' to behave like `process-file'.  The
+Lisp error raised when PROGRAM is nil is trapped also, returning 1.
+Furthermore, traces are written with verbosity of 6."
+  (let ((default-directory
+         (if (file-remote-p default-directory)
+             (tramp-compat-temporary-file-directory)
+           default-directory)))
+    (tramp-message
+     (vector tramp-current-method tramp-current-user tramp-current-host nil nil)
+     6 "%s %s %s" program infile args)
+    (if (executable-find program)
+       (apply 'call-process program infile destination display args)
+      1)))
+
 ;;;###tramp-autoload
 (defun tramp-read-passwd (proc &optional prompt)
   "Read a password from user (compat function).