diff options
| author | Michael Albinus | 2009-10-08 15:21:31 +0000 |
|---|---|---|
| committer | Michael Albinus | 2009-10-08 15:21:31 +0000 |
| commit | 288f783b7a54b4e68676ab0fff0d107db7d24401 (patch) | |
| tree | aa4c4549ffd985476f7708fa0a8b5cbcc26546c7 | |
| parent | a17632c1dc8fdcfc956f1a779e66cdea81f4a755 (diff) | |
| download | emacs-288f783b7a54b4e68676ab0fff0d107db7d24401.tar.gz emacs-288f783b7a54b4e68676ab0fff0d107db7d24401.zip | |
* net/tramp-smb.el (tramp-smb-handle-copy-directory): Handle the
case both directories are remote.
(tramp-smb-handle-expand-file-name): Implement "~" expansion.
(tramp-smb-maybe-open-connection): Flush the cache only if
necessary.
| -rw-r--r-- | lisp/ChangeLog | 12 | ||||
| -rw-r--r-- | lisp/net/tramp-smb.el | 113 |
2 files changed, 77 insertions, 48 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 946195bfcd6..cd49df78e1d 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,15 @@ | |||
| 1 | 2009-10-08 Michael Albinus <michael.albinus@gmx.de> | ||
| 2 | |||
| 3 | * net/tramp.el (tramp-file-name-real-user, tramp-file-name-domain) | ||
| 4 | (tramp-file-name-real-host, tramp-file-name-port): Apply | ||
| 5 | `save-match-data. | ||
| 6 | |||
| 7 | * net/tramp-smb.el (tramp-smb-handle-copy-directory): Handle the | ||
| 8 | case both directories are remote. | ||
| 9 | (tramp-smb-handle-expand-file-name): Implement "~" expansion. | ||
| 10 | (tramp-smb-maybe-open-connection): Flush the cache only if | ||
| 11 | necessary. | ||
| 12 | |||
| 1 | 2009-10-08 Chong Yidong <cyd@stupidchicken.com> | 13 | 2009-10-08 Chong Yidong <cyd@stupidchicken.com> |
| 2 | 14 | ||
| 3 | * cedet/ede/proj-obj.el (ede-gcc-linker): New var. | 15 | * cedet/ede/proj-obj.el (ede-gcc-linker): New var. |
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el index ff2a5d13cb7..b139b3de189 100644 --- a/lisp/net/tramp-smb.el +++ b/lisp/net/tramp-smb.el | |||
| @@ -218,40 +218,53 @@ pass to the OPERATION." | |||
| 218 | (let ((t1 (tramp-tramp-file-p dirname)) | 218 | (let ((t1 (tramp-tramp-file-p dirname)) |
| 219 | (t2 (tramp-tramp-file-p newname))) | 219 | (t2 (tramp-tramp-file-p newname))) |
| 220 | (with-parsed-tramp-file-name (if t1 dirname newname) nil | 220 | (with-parsed-tramp-file-name (if t1 dirname newname) nil |
| 221 | (if (or (null t1) (null t2)) | 221 | (cond |
| 222 | ;; We can copy recursively. | 222 | ((and t1 t2) |
| 223 | (let ((prompt (tramp-smb-send-command v "prompt")) | 223 | ;; We must copy, using a local temporary directory. |
| 224 | (recurse (tramp-smb-send-command v "recurse"))) | 224 | (let ((tmpdir |
| 225 | (unless (file-directory-p newname) | 225 | (make-temp-name |
| 226 | (make-directory newname parents)) | 226 | (expand-file-name |
| 227 | (unwind-protect | 227 | tramp-temp-name-prefix |
| 228 | (unless | 228 | (tramp-compat-temporary-file-directory))))) |
| 229 | (and | 229 | (unwind-protect |
| 230 | prompt recurse | 230 | (progn |
| 231 | (tramp-smb-send-command | 231 | (copy-directory dirname tmpdir keep-date parents) |
| 232 | v (format "cd \"%s\"" | 232 | (copy-directory tmpdir newname keep-date parents)) |
| 233 | (tramp-smb-get-localname localname t))) | 233 | (delete-directory tmpdir 'recursive)))) |
| 234 | (tramp-smb-send-command | 234 | ((or t1 t2) |
| 235 | v (format "lcd \"%s\"" (if t1 newname dirname))) | 235 | ;; We can copy recursively. |
| 236 | (if t1 | 236 | (let ((prompt (tramp-smb-send-command v "prompt")) |
| 237 | (tramp-smb-send-command v "mget *") | 237 | (recurse (tramp-smb-send-command v "recurse"))) |
| 238 | (tramp-smb-send-command v "mput *"))) | 238 | (unless (file-directory-p newname) |
| 239 | ;; Error. | 239 | (make-directory newname parents)) |
| 240 | (with-current-buffer (tramp-get-connection-buffer v) | 240 | (unwind-protect |
| 241 | (goto-char (point-min)) | 241 | (unless |
| 242 | (search-forward-regexp tramp-smb-errors nil t) | 242 | (and |
| 243 | (tramp-error | 243 | prompt recurse |
| 244 | v 'file-error | 244 | (tramp-smb-send-command |
| 245 | "%s `%s'" (match-string 0) (if t1 dirname newname)))) | 245 | v (format "cd \"%s\"" |
| 246 | ;; Always go home. | 246 | (tramp-smb-get-localname localname t))) |
| 247 | (tramp-smb-send-command v (format "cd \\")) | 247 | (tramp-smb-send-command |
| 248 | ;; Toggle prompt and recurse OFF. | 248 | v (format "lcd \"%s\"" (if t1 newname dirname))) |
| 249 | (if prompt (tramp-smb-send-command v "prompt")) | 249 | (if t1 |
| 250 | (if recurse (tramp-smb-send-command v "recurse")))) | 250 | (tramp-smb-send-command v "mget *") |
| 251 | 251 | (tramp-smb-send-command v "mput *"))) | |
| 252 | ;; Error. | ||
| 253 | (with-current-buffer (tramp-get-connection-buffer v) | ||
| 254 | (goto-char (point-min)) | ||
| 255 | (search-forward-regexp tramp-smb-errors nil t) | ||
| 256 | (tramp-error | ||
| 257 | v 'file-error | ||
| 258 | "%s `%s'" (match-string 0) (if t1 dirname newname)))) | ||
| 259 | ;; Always go home. | ||
| 260 | (tramp-smb-send-command v (format "cd \\")) | ||
| 261 | ;; Toggle prompt and recurse OFF. | ||
| 262 | (if prompt (tramp-smb-send-command v "prompt")) | ||
| 263 | (if recurse (tramp-smb-send-command v "recurse"))))) | ||
| 264 | (t | ||
| 252 | ;; We must do it file-wise. | 265 | ;; We must do it file-wise. |
| 253 | (tramp-run-real-handler | 266 | (tramp-run-real-handler |
| 254 | 'copy-directory (list dirname newname keep-date parents)))))) | 267 | 'copy-directory (list dirname newname keep-date parents))))))) |
| 255 | 268 | ||
| 256 | (defun tramp-smb-handle-copy-file | 269 | (defun tramp-smb-handle-copy-file |
| 257 | (filename newname &optional ok-if-already-exists keep-date preserve-uid-gid) | 270 | (filename newname &optional ok-if-already-exists keep-date preserve-uid-gid) |
| @@ -400,17 +413,18 @@ PRESERVE-UID-GID is completely ignored." | |||
| 400 | (tramp-run-real-handler 'expand-file-name (list name nil)) | 413 | (tramp-run-real-handler 'expand-file-name (list name nil)) |
| 401 | ;; Dissect NAME. | 414 | ;; Dissect NAME. |
| 402 | (with-parsed-tramp-file-name name nil | 415 | (with-parsed-tramp-file-name name nil |
| 403 | (unless (tramp-run-real-handler 'file-name-absolute-p (list localname)) | ||
| 404 | (setq localname (concat "/" localname))) | ||
| 405 | ;; Tilde expansion if necessary. We use the user name as share, | 416 | ;; Tilde expansion if necessary. We use the user name as share, |
| 406 | ;; which is offen the case in work groups. | 417 | ;; which is offen the case in domains. |
| 407 | (when (string-match "\\`~[^/]*" localname) | 418 | (when (string-match "\\`/?~\\([^/]*\\)" localname) |
| 408 | (setq localname | 419 | (setq localname |
| 409 | (replace-match | 420 | (replace-match |
| 410 | (if (zerop (length (match-string 0 localname))) | 421 | (if (zerop (length (match-string 1 localname))) |
| 411 | (tramp-file-name-real-user v) | 422 | (tramp-file-name-real-user v) |
| 412 | (match-string 0 localname)) | 423 | (match-string 1 localname)) |
| 413 | nil nil localname))) | 424 | nil nil localname))) |
| 425 | ;; Make the file name absolute. | ||
| 426 | (unless (tramp-run-real-handler 'file-name-absolute-p (list localname)) | ||
| 427 | (setq localname (concat "/" localname))) | ||
| 414 | ;; No tilde characters in file name, do normal | 428 | ;; No tilde characters in file name, do normal |
| 415 | ;; `expand-file-name' (this does "/./" and "/../"). | 429 | ;; `expand-file-name' (this does "/./" and "/../"). |
| 416 | (tramp-make-tramp-file-name | 430 | (tramp-make-tramp-file-name |
| @@ -1000,11 +1014,12 @@ connection if a previous connection has died for some reason." | |||
| 1000 | (unless (string-equal | 1014 | (unless (string-equal |
| 1001 | smbclient-version | 1015 | smbclient-version |
| 1002 | (tramp-get-connection-property vec "smbclient-version" "")) | 1016 | (tramp-get-connection-property vec "smbclient-version" "")) |
| 1003 | (tramp-flush-directory-property vec "") | 1017 | (when (tramp-get-connection-property vec "smbclient-version" nil) |
| 1004 | (tramp-flush-connection-property vec) | 1018 | (tramp-flush-directory-property vec "") |
| 1019 | (tramp-flush-connection-property vec) | ||
| 1020 | ); (setq buf (tramp-get-buffer vec))) | ||
| 1005 | (tramp-set-connection-property | 1021 | (tramp-set-connection-property |
| 1006 | vec "smbclient-version" smbclient-version) | 1022 | vec "smbclient-version" smbclient-version)))) |
| 1007 | (setq buf (tramp-get-buffer vec))))) | ||
| 1008 | 1023 | ||
| 1009 | ;; If too much time has passed since last command was sent, look | 1024 | ;; If too much time has passed since last command was sent, look |
| 1010 | ;; whether there has been an error message; maybe due to | 1025 | ;; whether there has been an error message; maybe due to |
| @@ -1089,12 +1104,14 @@ connection if a previous connection has died for some reason." | |||
| 1089 | (search-forward-regexp | 1104 | (search-forward-regexp |
| 1090 | "Domain=\\[[^]]*\\] OS=\\[[^]]*\\] Server=\\[[^]]*\\]" nil t) | 1105 | "Domain=\\[[^]]*\\] OS=\\[[^]]*\\] Server=\\[[^]]*\\]" nil t) |
| 1091 | (let ((smbserver-version (match-string 0))) | 1106 | (let ((smbserver-version (match-string 0))) |
| 1092 | (when (not (string-equal | 1107 | (unless (string-equal |
| 1093 | smbserver-version | 1108 | smbserver-version |
| 1094 | (tramp-get-connection-property | 1109 | (tramp-get-connection-property |
| 1095 | vec "smbserver-version" ""))) | 1110 | vec "smbserver-version" "")) |
| 1096 | (tramp-flush-directory-property vec "") | 1111 | (when (tramp-get-connection-property |
| 1097 | (tramp-flush-connection-property vec) | 1112 | vec "smbserver-version" nil) |
| 1113 | (tramp-flush-directory-property vec "") | ||
| 1114 | (tramp-flush-connection-property vec)) | ||
| 1098 | (tramp-set-connection-property | 1115 | (tramp-set-connection-property |
| 1099 | vec "smbserver-version" smbserver-version)))) | 1116 | vec "smbserver-version" smbserver-version)))) |
| 1100 | 1117 | ||