emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/lisp/net tramp.el


From: Michael Albinus
Subject: [Emacs-diffs] emacs/lisp/net tramp.el
Date: Mon, 05 Oct 2009 11:30:32 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Michael Albinus <albinus>       09/10/05 11:30:32

Modified files:
        lisp/net       : tramp.el 

Log message:
        * net/tramp.el (tramp-verbose): Fix docstring.
        (tramp-methods): Add recursive option to `tramp-copy-args'.  Add
        `tramp-copy-recursive'.  Valid for "rcp", "scp", "scp1", "scp2",
        "scp1_old", "scp2_old", "rsync", "rsyncc".
        (tramp-default-method): Check also for
        `auth-source-user-or-password'.
        (tramp-file-name-handler-alist, tramp-file-name-for-operation):
        Add handler for `copy-directory'.
        (tramp-handle-copy-directory): New defun.
        (tramp-do-copy-or-rename-file-out-of-band): Handle directory case.
        (tramp-handle-start-file-process): Raise an error when PROGRAM is
        nil.  Optimize sent command.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/lisp/net/tramp.el?cvsroot=emacs&r1=1.257&r2=1.258

Patches:
Index: tramp.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/net/tramp.el,v
retrieving revision 1.257
retrieving revision 1.258
diff -u -b -r1.257 -r1.258
--- tramp.el    1 Oct 2009 15:34:56 -0000       1.257
+++ tramp.el    5 Oct 2009 11:30:31 -0000       1.258
@@ -187,7 +187,7 @@
   :type 'boolean)
 
 (defcustom tramp-verbose 3
-  "*Verbosity level for Tramp.
+  "*Verbosity level for Tramp messages.
 Any level x includes messages for all levels 1 .. x-1.  The levels are
 
  0  silent (no tramp messages at all)
@@ -203,7 +203,7 @@
   :group 'tramp
   :type 'integer)
 
-;; Emacs case
+;; Emacs case.
 (eval-and-compile
   (when (boundp 'backup-directory-alist)
     (defcustom tramp-backup-directory-alist nil
@@ -302,16 +302,19 @@
              (tramp-login-args           (("%h") ("-l" "%u")))
             (tramp-remote-sh            "/bin/sh")
             (tramp-copy-program         "rcp")
-            (tramp-copy-args            (("-p" "%k")))
+            (tramp-copy-args            (("-p" "%k") ("-r")))
             (tramp-copy-keep-date       t)
+            (tramp-copy-recursive       t)
             (tramp-password-end-of-line nil))
     ("scp"   (tramp-login-program        "ssh")
              (tramp-login-args           (("%h") ("-l" "%u") ("-p" "%p") ("-q")
                                          ("-e" "none")))
             (tramp-remote-sh            "/bin/sh")
             (tramp-copy-program         "scp")
-            (tramp-copy-args            (("-P" "%p") ("-p" "%k") ("-q")))
+            (tramp-copy-args            (("-P" "%p") ("-p" "%k")
+                                         ("-q") ("-r")))
             (tramp-copy-keep-date       t)
+            (tramp-copy-recursive       t)
             (tramp-password-end-of-line nil)
             (tramp-gw-args              (("-o"
                                           "GlobalKnownHostsFile=/dev/null")
@@ -324,8 +327,9 @@
             (tramp-remote-sh            "/bin/sh")
             (tramp-copy-program         "scp")
             (tramp-copy-args            (("-1") ("-P" "%p") ("-p" "%k")
-                                         ("-q")))
+                                         ("-q") ("-r")))
             (tramp-copy-keep-date       t)
+            (tramp-copy-recursive       t)
             (tramp-password-end-of-line nil)
             (tramp-gw-args              (("-o"
                                           "GlobalKnownHostsFile=/dev/null")
@@ -338,8 +342,9 @@
             (tramp-remote-sh            "/bin/sh")
             (tramp-copy-program         "scp")
             (tramp-copy-args            (("-2") ("-P" "%p") ("-p" "%k")
-                                         ("-q")))
+                                         ("-q") ("-r")))
             (tramp-copy-keep-date       t)
+            (tramp-copy-recursive       t)
             (tramp-password-end-of-line nil)
             (tramp-gw-args              (("-o"
                                           "GlobalKnownHostsFile=/dev/null")
@@ -352,8 +357,9 @@
                                          ("-e" "none")))
             (tramp-remote-sh            "/bin/sh")
             (tramp-copy-program         "scp1")
-            (tramp-copy-args            (("-p" "%k")))
+            (tramp-copy-args            (("-p" "%k") ("-r")))
             (tramp-copy-keep-date       t)
+            (tramp-copy-recursive       t)
             (tramp-password-end-of-line nil))
     ("scp2_old"
              (tramp-login-program        "ssh2")
@@ -361,8 +367,9 @@
                                          ("-e" "none")))
             (tramp-remote-sh            "/bin/sh")
             (tramp-copy-program         "scp2")
-            (tramp-copy-args            (("-p" "%k")))
+            (tramp-copy-args            (("-p" "%k") ("-r")))
             (tramp-copy-keep-date       t)
+            (tramp-copy-recursive       t)
             (tramp-password-end-of-line nil))
     ("sftp"  (tramp-login-program        "ssh")
              (tramp-login-args           (("%h") ("-l" "%u") ("-p" "%p")
@@ -377,23 +384,26 @@
                                          ("-e" "none")))
             (tramp-remote-sh            "/bin/sh")
             (tramp-copy-program         "rsync")
-            (tramp-copy-args            (("-e" "ssh") ("-t" "%k")))
+            (tramp-copy-args            (("-e" "ssh") ("-t" "%k") ("-r")))
             (tramp-copy-keep-date       t)
+            (tramp-copy-recursive       t)
             (tramp-password-end-of-line nil))
-    ("rsyncc" (tramp-login-program        "ssh")
+    ("rsyncc"
+             (tramp-login-program        "ssh")
              (tramp-login-args           (("%h") ("-l" "%u") ("-p" "%p")
                                          ("-o" "address@hidden:%%p")
                                          ("-o" "ControlMaster=yes")
                                          ("-e" "none")))
             (tramp-remote-sh            "/bin/sh")
             (tramp-copy-program         "rsync")
-            (tramp-copy-args            (("-t" "%k")))
+            (tramp-copy-args            (("-t" "%k") ("-r")))
             (tramp-copy-env             (("RSYNC_RSH")
                                          (,(concat
                                             "ssh"
                                             " -o address@hidden:%%p"
                                             " -o ControlMaster=auto"))))
             (tramp-copy-keep-date       t)
+            (tramp-copy-recursive       t)
             (tramp-password-end-of-line nil))
     ("remcp" (tramp-login-program        "remsh")
              (tramp-login-args           (("%h") ("-l" "%u")))
@@ -694,15 +704,16 @@
   ;; more performant for large files, and it hasn't too serious delays
   ;; for small files.  But it must be ensured that there aren't
   ;; permanent password queries.  Either a password agent like
-  ;; "ssh-agent" or "Pageant" shall run, or the optional password.el
-  ;; package shall be active for password caching.  "scpc" would be
-  ;; another good choice because of the "ControlMaster" option, but
-  ;; this is a more modern alternative in OpenSSH 4, which cannot be
-  ;; taken as default.
+  ;; "ssh-agent" or "Pageant" shall run, or the optional
+  ;; password-cache.el or auth-sources.el packages shall be active for
+  ;; password caching.  "scpc" would be another good choice because of
+  ;; the "ControlMaster" option, but this is a more modern alternative
+  ;; in OpenSSH 4, which cannot be taken as default.
   (cond
    ;; PuTTY is installed.
    ((executable-find "pscp")
     (if        (or (fboundp 'password-read)
+           (fboundp 'auth-source-user-or-password)
            ;; Pageant is running.
            (tramp-compat-process-running-p "Pageant"))
        "pscp"
@@ -710,6 +721,7 @@
    ;; There is an ssh installation.
    ((executable-find "scp")
     (if        (or (fboundp 'password-read)
+           (fboundp 'auth-source-user-or-password)
            ;; ssh-agent is running.
            (getenv "SSH_AUTH_SOCK")
            (getenv "SSH_AGENT_PID"))
@@ -1881,6 +1893,7 @@
     (file-name-completion . tramp-handle-file-name-completion)
     (add-name-to-file . tramp-handle-add-name-to-file)
     (copy-file . tramp-handle-copy-file)
+    (copy-directory . tramp-handle-copy-directory)
     (rename-file . tramp-handle-rename-file)
     (set-file-modes . tramp-handle-set-file-modes)
     (set-file-times . tramp-handle-set-file-times)
@@ -3159,6 +3172,35 @@
     (tramp-run-real-handler
      'copy-file (list filename newname ok-if-already-exists keep-date)))))
 
+(defun tramp-handle-copy-directory (dirname newname &optional keep-date 
parents)
+  "Like `copy-directory' for Tramp files."
+  (let ((t1 (tramp-tramp-file-p dirname))
+       (t2 (tramp-tramp-file-p newname)))
+    (with-parsed-tramp-file-name (if t1 dirname newname) nil
+      (if (and (tramp-get-method-parameter method 'tramp-copy-recursive)
+              ;; When DIRNAME and NEWNAME are remote, they must have
+              ;; the same method.
+              (or (null t1) (null t2)
+                  (string-equal (file-remote-p dirname 'method)
+                                (file-remote-p newname 'method))))
+         ;; scp or rsync DTRT.
+         (progn
+           (setq dirname (directory-file-name (expand-file-name dirname))
+                 newname (directory-file-name (expand-file-name newname)))
+           (if (and (file-directory-p newname)
+                    (not (string-equal (file-name-nondirectory dirname)
+                                       (file-name-nondirectory newname))))
+               (setq newname
+                     (expand-file-name
+                      (file-name-nondirectory dirname) newname)))
+           (if (not (file-directory-p (file-name-directory newname)))
+               (make-directory (file-name-directory newname) parents))
+           (tramp-do-copy-or-rename-file-out-of-band
+            'copy dirname newname keep-date))
+       ;; We must do it file-wise.
+       (tramp-run-real-handler
+        'copy-directory (list dirname newname keep-date parents))))))
+
 (defun tramp-handle-rename-file
   (filename newname &optional ok-if-already-exists)
   "Like `rename-file' for Tramp files."
@@ -3484,7 +3526,14 @@
 
        ;; Check which ones of source and target are Tramp files.
        (setq source (if t1 (tramp-make-copy-program-file-name v) filename)
-             target (if t2 (tramp-make-copy-program-file-name v) newname))
+             target (funcall
+                     (if (and (file-directory-p filename)
+                              (string-equal
+                               (file-name-nondirectory filename)
+                               (file-name-nondirectory newname)))
+                         'file-name-directory
+                       'identity)
+                     (if t2 (tramp-make-copy-program-file-name v) newname)))
 
        ;; Check for port number.  Until now, there's no need for handling
        ;; like method, user, host.
@@ -3950,9 +3999,16 @@
 ;; connection has been setup.
 (defun tramp-handle-start-file-process (name buffer program &rest args)
   "Like `start-file-process' for Tramp files."
+  (unless (stringp program)
+    (tramp-error
+     v 'file-error "pty association is not supported for `%s'" name))
   (with-parsed-tramp-file-name default-directory nil
     (unwind-protect
-       (let ((name1 name)
+       (let ((command (format "cd %s; exec %s"
+                              (tramp-shell-quote-argument localname)
+                              (mapconcat 'tramp-shell-quote-argument
+                                         (cons program args) " ")))
+             (name1 name)
              (i 0))
          (unless buffer
            ;; BUFFER can be nil.  We use a temporary buffer.
@@ -3971,17 +4027,9 @@
          (with-current-buffer (tramp-get-connection-buffer v)
            (clear-visited-file-modtime)
            (narrow-to-region (point-max) (point-max)))
-         ;; Goto working directory.  `tramp-send-command' opens a new
+         ;; Send the command.  `tramp-send-command' opens a new
          ;; connection.
-         (tramp-send-command
-          v (format "cd %s" (tramp-shell-quote-argument localname)))
-         ;; Send the command.
-         (tramp-send-command
-          v
-          (format "exec %s"
-                  (mapconcat 'tramp-shell-quote-argument
-                             (cons program args) " "))
-          nil t) ; nooutput
+         (tramp-send-command v command nil t) ; nooutput
          ;; Set query flag for this process.
          (tramp-set-process-query-on-exit-flag
           (tramp-get-connection-process v) t)
@@ -4091,6 +4139,7 @@
       (unless ret (setq ret (tramp-send-command-and-check v nil)))
       ;; Provide error file.
       (when tmpstderr (rename-file tmpstderr (cadr destination) t))
+
       ;; Cleanup.  We remove all file cache values for the connection,
       ;; because the remote process could have changed them.
       (when tmpinput (delete-file tmpinput))
@@ -4892,6 +4941,8 @@
            (list 'add-name-to-file 'copy-file 'expand-file-name
                  'file-name-all-completions 'file-name-completion
                  'file-newer-than-file-p 'make-symbolic-link 'rename-file
+                 ; Emacs 23 only
+                 'copy-directory
                  ; XEmacs only
                  'dired-make-relative-symlink
                  'vm-imap-move-mail 'vm-pop-move-mail 'vm-spool-move-mail))
@@ -6116,7 +6167,7 @@
 
 (defun tramp-process-actions (proc vec actions &optional timeout)
   "Perform actions until success or TIMEOUT."
-  ;; Enable auth-sorce and password-cache.
+  ;; Enable auth-source and password-cache.
   (tramp-set-connection-property proc "first-password-request" t)
   (let (exit)
     (while (not exit)
@@ -8016,8 +8067,6 @@
 ;; * Provide a local cache of old versions of remote files for the rsync
 ;;   transfer method to use.  (Greg Stark)
 ;; * Remove unneeded parameters from methods.
-;; * Invoke rsync once for copying a whole directory hierarchy.
-;;   (Francesco Potortì)
 ;; * Make it work for different encodings, and for different file name
 ;;   encodings, too.  (Daniel Pittman)
 ;; * Progress reports while copying files.  (Michael Kifer)
@@ -8079,6 +8128,7 @@
 ;;   rsync).
 ;; * Keep a second connection open for out-of-band methods like scp or
 ;;   rsync.
+;; * Support ptys in `tramp-handle-start-file-process'.
 
 ;; Functions for file-name-handler-alist:
 ;; diff-latest-backup-file -- in diff.el




reply via email to

[Prev in Thread] Current Thread [Next in Thread]