Mercurial > emacs
changeset 46790:c217aa0214e2
Version 2.0.6.
(tramp-default-method): Change to "ssh" from "sm".
(tramp-wrong-passwd-regexp): Restructure. Add additional
alternative.
(tramp-su-program): New internal variable for method parameter.
(tramp-perl-encode-with-module, tramp-perl-decode-with-module):
New variables. Very short Perl one-liner, but requires Perl
module MIME::Base64 to be installed on the remote site.
(tramp-perl-encode, tramp-perl-decode): New base64
encoder/decoder. From Juanma Barranquero <lektu@terra.es>.
(tramp-handle-file-truename): Invoke Ange-FTP properly (even
though Ange-FTP doesn't do anything for this operation).
(tramp-handle-set-visited-file-modtime): Comment change.
(tramp-handle-make-directory): Save-excursion.
(tramp-handle-expand-many-files): Don't try to invoke Ange-FTP
twice, once is enough.
(tramp-action-permission-denied): Show *tramp/foo* buffer so the
user knows what's wrong.
(tramp-post-connection): Support the two Perl encoders and
decoders.
(tramp-coding-commands): Ditto. Add some todo items.
author | Kai Großjohann <kgrossjo@eu.uu.net> |
---|---|
date | Sat, 03 Aug 2002 09:23:25 +0000 |
parents | cf99f76fc3d4 |
children | e22c0d1c4c97 |
files | lisp/ChangeLog lisp/net/tramp.el |
diffstat | 2 files changed, 192 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Fri Aug 02 22:21:43 2002 +0000 +++ b/lisp/ChangeLog Sat Aug 03 09:23:25 2002 +0000 @@ -1,3 +1,27 @@ +2002-08-03 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> + + * net/tramp.el: Version 2.0.6. + (tramp-default-method): Change to "ssh" from "sm". + (tramp-wrong-passwd-regexp): Restructure. Add additional + alternative. + (tramp-su-program): New internal variable for method parameter. + (tramp-perl-encode-with-module, tramp-perl-decode-with-module): + New variables. Very short Perl one-liner, but requires Perl + module MIME::Base64 to be installed on the remote site. + (tramp-perl-encode, tramp-perl-decode): New base64 + encoder/decoder. From Juanma Barranquero <lektu@terra.es>. + (tramp-handle-file-truename): Invoke Ange-FTP properly (even + though Ange-FTP doesn't do anything for this operation). + (tramp-handle-set-visited-file-modtime): Comment change. + (tramp-handle-make-directory): Save-excursion. + (tramp-handle-expand-many-files): Don't try to invoke Ange-FTP + twice, once is enough. + (tramp-action-permission-denied): Show *tramp/foo* buffer so the + user knows what's wrong. + (tramp-post-connection): Support the two Perl encoders and + decoders. + (tramp-coding-commands): Ditto. Add some todo items. + 2002-08-02 Richard M. Stallman <rms@gnu.org> * international/mule.el (merge-coding-systems): New function.
--- a/lisp/net/tramp.el Fri Aug 02 22:21:43 2002 +0000 +++ b/lisp/net/tramp.el Sat Aug 03 09:23:25 2002 +0000 @@ -69,7 +69,10 @@ ;;; Code: -(defconst tramp-version "2.0.5" +;; In the Tramp CVS repository, the version numer is auto-frobbed from +;; the Makefile, so you should edit the top-level Makefile to change +;; the version number. +(defconst tramp-version "2.0.6" "This version of tramp.") (defconst tramp-bug-report-address "tramp-devel@mail.freesoftware.fsf.org" @@ -632,8 +635,7 @@ :group 'tramp :type '(repeat (list string function string))) -(defcustom tramp-default-method "sm" - ;;(if (featurep 'xemacs) "sm" "ftp") +(defcustom tramp-default-method "ssh" "*Default method to use for transferring files. See `tramp-methods' for possibilities. Also see `tramp-default-method-alist'. @@ -707,9 +709,22 @@ :type 'regexp) (defcustom tramp-wrong-passwd-regexp - (concat "^.*\\(Permission denied.\\|Login [Ii]ncorrect\\|" - "Received signal [0-9]+\\|Connection \\(refused\\|closed\\)\\|" - "Sorry, try again.\\|Name or service not known\\).*") + (concat "^.*" + ;; These strings should be on the last line + (regexp-opt '("Permission denied." + "Login incorrect" + "Login Incorrect" + "Connection refused" + "Connection closed" + "Sorry, try again." + "Name or service not known" + "Host key verification failed.") t) + ".*" + "\\|" + "^.*\\(" + ;; Here comes a list of regexes, separated by \\| + "Received signal [0-9]+" + "\\).*") "*Regexp matching a `login failed' message. The regexp should match at end of buffer." :group 'tramp @@ -1145,6 +1160,11 @@ In the connection buffer, this variable has the value of the like-named method parameter, as specified in `tramp-methods' (which see).") +(defvar tramp-su-program nil + "This internal variable holds a parameter for `tramp-methods'. +In the connection buffer, this variable has the value of the like-named +method parameter, as specified in `tramp-methods' (which see).") + ;; CCC `local in each buffer'? (defvar tramp-ls-command nil "This command is used to get a long listing with numeric user and group ids. @@ -1220,13 +1240,101 @@ ;; Escape sequence %s is replaced with name of Perl binary.") ;; These two use base64 encoding. +(defvar tramp-perl-encode-with-module + "perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)'" + "Perl program to use for encoding a file. +Escape sequence %s is replaced with name of Perl binary. +This implementation requires the MIME::Base64 Perl module to be installed +on the remote host.") + +(defvar tramp-perl-decode-with-module + "perl -MMIME::Base64 -0777 -ne 'print decode_base64($_)'" + "Perl program to use for decoding a file. +Escape sequence %s is replaced with name of Perl binary. +This implementation requires the MIME::Base64 Perl module to be installed +on the remote host.") + (defvar tramp-perl-encode - "perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)'" + "%s -e ' +# This script contributed by Juanma Barranquero <lektu@terra.es>. +# Copyright (C) 2002 Free Software Foundation, Inc. +use strict; + +my %trans = do { + my $i = 0; + map {(substr(unpack(q(B8), chr $i++), 2, 6), $_)} + split //, q(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/); +}; + +binmode(\*STDIN); + +# We read in chunks of 54 bytes, to generate output lines +# of 72 chars (plus end of line) +$/ = \54; + +while (my $data = <STDIN>) { + my $pad = q(); + + # Only for the last chunk, and only if did not fill the last three-byte packet + if (eof) { + my $mod = length($data) % 3; + $pad = q(=) x (3 - $mod) if $mod; + } + + # Not the fastest method, but it is simple: unpack to binary string, split + # by groups of 6 bits and convert back from binary to byte; then map into + # the translation table + print + join q(), + map($trans{$_}, + (substr(unpack(q(B*), $data) . q(00000), 0, 432) =~ /....../g)), + $pad, + qq(\n); +} +'" "Perl program to use for encoding a file. Escape sequence %s is replaced with name of Perl binary.") (defvar tramp-perl-decode - "perl -MMIME::Base64 -0777 -ne 'print decode_base64($_)'" + "%s -e ' +# This script contributed by Juanma Barranquero <lektu@terra.es>. +# Copyright (C) 2002 Free Software Foundation, Inc. +use strict; + +my %trans = do { + my $i = 0; + map {($_, sprintf(q(%06b), $i++))} + split //, q(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/) +}; + +my %bytes = map {(unpack(q(B8), chr $_), chr $_)} 0 .. 255; + +binmode(\*STDOUT); + +# We are going to accumulate into $pending to accept any line length +# (we do not check they are <= 76 chars as the RFC says) +my $pending = q(); + +while (my $data = <STDIN>) { + chomp $data; + + # If we find one or two =, we have reached the end and + # any following data is to be discarded + my $finished = $data =~ s/(==?).*/$1/; + $pending .= $data; + + my $len = length($pending); + my $chunk = substr($pending, 0, $len & ~3, q()); + + # Easy method: translate from chars to (pregenerated) six-bit packets, join, + # split in 8-bit chunks and convert back to char. + print join q(), + map $bytes{$_}, + ((join q(), map {$trans{$_} || q()} split //, $chunk) =~ /......../g); + + last if $finished; +} +'" "Perl program to use for decoding a file. Escape sequence %s is replaced with name of Perl binary.") @@ -1512,10 +1620,11 @@ (defun tramp-handle-file-truename (filename &optional counter prev-dirs) "Like `file-truename' for tramp files." (with-parsed-tramp-file-name filename nil - ;; Ange-FTP does not support truename processing. It returns the - ;; file name as-is. So that's what we do, too. + ;; Ange-FTP does not support truename processing, but for + ;; convenience we pretend it did and forward the call to Ange-FTP + ;; anyway. Ange-FTP then just invokes `identity'. (when (tramp-ange-ftp-file-name-p multi-method method) - filename) + (tramp-invoke-ange-ftp 'file-truename filename)) (let* ((steps (tramp-split-string path "/")) (pathdir (let ((directory-sep-char ?/)) (file-name-as-directory path))) @@ -1546,7 +1655,9 @@ (tramp-make-tramp-file-name multi-method method user host (mapconcat 'identity - (append '("") (reverse result) (list thisstep)) + (append '("") + (reverse result) + (list thisstep)) "/"))))) (cond ((string= "." thisstep) (tramp-message-for-buffer multi-method method user host @@ -1733,7 +1844,11 @@ (let ((f (buffer-file-name)) (coding-system-used nil)) (with-parsed-tramp-file-name f nil - ;; This operation is not handled by Ange-FTP! + ;; This operation is not handled by Ange-FTP! Compare this + ;; behavior with `file-truename' which Ange-FTP does not really + ;; handle, either, but at least it pretends to. I wonder if + ;; Ange-FTP should also pretend to grok + ;; `set-visited-file-modtime', for consistency? (when (tramp-ange-ftp-file-name-p multi-method method) (throw 'tramp-forward-to-ange-ftp (tramp-run-real-handler 'set-visited-file-modtime @@ -2297,13 +2412,14 @@ (with-parsed-tramp-file-name dir nil (when (tramp-ange-ftp-file-name-p multi-method method) (tramp-invoke-ange-ftp 'make-directory dir parents)) - (tramp-barf-unless-okay - multi-method method user host - (format " %s %s" - (if parents "mkdir -p" "mkdir") - (tramp-shell-quote-argument path)) - nil 'file-error - "Couldn't make directory %s" dir))) + (save-excursion + (tramp-barf-unless-okay + multi-method method user host + (format " %s %s" + (if parents "mkdir -p" "mkdir") + (tramp-shell-quote-argument path)) + nil 'file-error + "Couldn't make directory %s" dir)))) ;; CCC error checking? (defun tramp-handle-delete-directory (directory) @@ -3087,11 +3203,7 @@ (string-match "\\?" name) (string-match "\\[.*\\]" name)) (save-excursion - ;; Dissect NAME. (let (bufstr) - ;; Perhaps invoke Ange-FTP. - (when (string= method tramp-ftp-method) - (signal 'tramp-run-ange-ftp (list 0))) ;; CCC: To do it right, we should quote certain characters ;; in the file name, but since the echo command is going to ;; break anyway when there are spaces in the file names, we @@ -3485,9 +3597,9 @@ (defun tramp-action-permission-denied (p multi-method method user host) "Signal permission denied." + (pop-to-buffer (tramp-get-buffer multi-method method user host)) (tramp-message 9 "Permission denied by remote host.") (kill-process p) - (erase-buffer) (throw 'tramp-action 'permission-denied)) (defun tramp-action-yesno (p multi-method method user host) @@ -4399,7 +4511,7 @@ " -e '" tramp-perl-file-attributes "' $1 2>/dev/null\n" "}")) (tramp-wait-for-output) - (tramp-message 5 "Sending the Perl `mime-encode' implementation.") + (tramp-message 5 "Sending the Perl `mime-encode' implementations.") (tramp-send-linewise multi-method method user host (concat "tramp_encode () {\n" @@ -4407,13 +4519,27 @@ " 2>/dev/null" "\n}")) (tramp-wait-for-output) - (tramp-message 5 "Sending the Perl `mime-decode' implementation.") + (tramp-send-linewise + multi-method method user host + (concat "tramp_encode_with_module () {\n" + (format tramp-perl-encode-with-module tramp-remote-perl) + " 2>/dev/null" + "\n}")) + (tramp-wait-for-output) + (tramp-message 5 "Sending the Perl `mime-decode' implementations.") (tramp-send-linewise multi-method method user host (concat "tramp_decode () {\n" (format tramp-perl-decode tramp-remote-perl) " 2>/dev/null" "\n}")) + (tramp-wait-for-output) + (tramp-send-linewise + multi-method method user host + (concat "tramp_decode_with_module () {\n" + (format tramp-perl-decode-with-module tramp-remote-perl) + " 2>/dev/null" + "\n}")) (tramp-wait-for-output)))) ;; Find ln(1) (erase-buffer) @@ -4467,6 +4593,8 @@ nil uudecode-decode-region) ("uuencode xxx" "uudecode -p" nil uudecode-decode-region) + ("tramp_encode_with_module" "tramp_decode_with_module" + base64-encode-region base64-decode-region) ("tramp_encode" "tramp_decode" base64-encode-region base64-decode-region)) "List of coding commands for inline transfer. @@ -5537,11 +5665,22 @@ ;;; TODO: -;; * Revise the comments near the beginning of the file. +;; * Add fallback for inline encodings. This should be used +;; if the remote end doesn't support mimencode or a similar program. +;; For reading files from the remote host, we can just parse the output +;; of `od -b'. For writing files to the remote host, we construct +;; a shell program which contains only "safe" ascii characters +;; and which writes the right bytes to the file. We can use printf(1) +;; or "echo -e" or the printf function in awk and use octal escapes +;; for the "dangerous" characters. The null byte might be a problem. +;; On some systems, the octal escape doesn't work. So we try the following +;; two commands to write a null byte: +;; dd if=/dev/zero bs=1 count=1 +;; echo | tr '\n' '\000' ;; * Cooperate with PCL-CVS. It uses start-process, which doesn't ;; work for remote files. ;; * Rewrite `tramp-shell-quote-argument' to abstain from using -;; `shell-quote-argument'. +;; `shell-quote-argument'. ;; * Completion gets confused when you leave out the method name. ;; * Support `dired-compress-file' filename handler. ;; * In Emacs 21, `insert-directory' shows total number of bytes used