aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Albinus2009-10-08 15:21:31 +0000
committerMichael Albinus2009-10-08 15:21:31 +0000
commit288f783b7a54b4e68676ab0fff0d107db7d24401 (patch)
treeaa4c4549ffd985476f7708fa0a8b5cbcc26546c7
parenta17632c1dc8fdcfc956f1a779e66cdea81f4a755 (diff)
downloademacs-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/ChangeLog12
-rw-r--r--lisp/net/tramp-smb.el113
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 @@
12009-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
12009-10-08 Chong Yidong <cyd@stupidchicken.com> 132009-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