Mercurial > hg > xemacs-beta
comparison lisp/dired/ange-ftp.el @ 4:b82b59fe008d r19-15b3
Import from CVS: tag r19-15b3
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:46:56 +0200 |
parents | ac2d302a0011 |
children |
comparison
equal
deleted
inserted
replaced
3:30df88044ec6 | 4:b82b59fe008d |
---|---|
1457 (list "Opening directory" | 1457 (list "Opening directory" |
1458 (if (file-exists-p directory) | 1458 (if (file-exists-p directory) |
1459 "not a directory" | 1459 "not a directory" |
1460 "no such file or directory") | 1460 "no such file or directory") |
1461 directory)))) | 1461 directory)))) |
1462 | |
1463 ;;;; ------------------------------------------------------------ | |
1464 ;;;; Remote file name syntax support. | |
1465 ;;;; ------------------------------------------------------------ | |
1466 (defvar ange-ftp-name-format | |
1467 '("^/\\(\\([^@/:]*\\)@\\)?\\([^@/:]*[^@/:.]\\):\\(.*\\)" . (3 2 4)) | |
1468 "*Format of a fully expanded remote file name. | |
1469 This is a list of the form \(REGEXP HOST USER NAME\), | |
1470 where REGEXP is a regular expression matching | |
1471 the full remote name, and HOST, USER, and NAME are the numbers of | |
1472 parenthesized expressions in REGEXP for the components (in that order).") | |
1473 | |
1474 (defun ange-ftp-real-load (&rest args) | |
1475 (ange-ftp-run-real-handler 'load args)) | |
1476 | |
1477 (defmacro ange-ftp-ftp-name-component (n ns name) | |
1478 "Extract the Nth ftp file name component from NS." | |
1479 (` (let ((elt (nth (, n) (, ns)))) | |
1480 (if (match-beginning elt) | |
1481 (substring (, name) (match-beginning elt) (match-end elt)))))) | |
1482 | |
1483 (defvar ange-ftp-ftp-name-arg "") | |
1484 (defvar ange-ftp-ftp-name-res nil) | |
1485 | |
1486 ;; Parse NAME according to `ange-ftp-name-format' (which see). | |
1487 ;; Returns a list (HOST USER NAME), or nil if NAME does not match the format. | |
1488 (defun ange-ftp-ftp-name (name) | |
1489 (if (string-equal name ange-ftp-ftp-name-arg) | |
1490 ange-ftp-ftp-name-res | |
1491 (setq ange-ftp-ftp-name-arg name | |
1492 ange-ftp-ftp-name-res | |
1493 (save-match-data | |
1494 (if (posix-string-match (car ange-ftp-name-format) name) | |
1495 (let* ((ns (cdr ange-ftp-name-format)) | |
1496 (host (ange-ftp-ftp-name-component 0 ns name)) | |
1497 (user (ange-ftp-ftp-name-component 1 ns name)) | |
1498 (name (ange-ftp-ftp-name-component 2 ns name))) | |
1499 (if (zerop (length user)) | |
1500 (setq user (ange-ftp-get-user host))) | |
1501 (list host user name)) | |
1502 nil))))) | |
1503 | |
1504 ;; Take a FULLNAME that matches according to ange-ftp-name-format and | |
1505 ;; replace the name component with NAME. | |
1506 (defun ange-ftp-replace-name-component (fullname name) | |
1507 (save-match-data | |
1508 (if (posix-string-match (car ange-ftp-name-format) fullname) | |
1509 (let* ((ns (cdr ange-ftp-name-format)) | |
1510 (elt (nth 2 ns))) | |
1511 (concat (substring fullname 0 (match-beginning elt)) | |
1512 name | |
1513 (substring fullname (match-end elt))))))) | |
1514 | |
1515 (defun ange-ftp-file-local-copy (file) | |
1516 (let* ((fn1 (expand-file-name file)) | |
1517 (pa1 (ange-ftp-ftp-name fn1))) | |
1518 (if pa1 | |
1519 (let ((tmp1 (ange-ftp-make-tmp-name (car pa1)))) | |
1520 (ange-ftp-copy-file-internal fn1 tmp1 t nil | |
1521 (format "Getting %s" fn1)) | |
1522 tmp1)))) | |
1523 | |
1524 (defun ange-ftp-load (file &optional noerror nomessage nosuffix) | |
1525 (if (ange-ftp-ftp-name file) | |
1526 (let ((tryfiles (if nosuffix | |
1527 (list file) | |
1528 (list (concat file ".elc") (concat file ".el") file))) | |
1529 copy) | |
1530 (while (and tryfiles (not copy)) | |
1531 (condition-case error | |
1532 (setq copy (ange-ftp-file-local-copy (car tryfiles))) | |
1533 (ftp-error nil)) | |
1534 (setq tryfiles (cdr tryfiles))) | |
1535 (if copy | |
1536 (unwind-protect | |
1537 (funcall 'load copy noerror nomessage nosuffix) | |
1538 (delete-file copy)) | |
1539 (or noerror | |
1540 (signal 'file-error (list "Cannot open load file" file))))) | |
1541 (ange-ftp-real-load file noerror nomessage nosuffix))) | |
1542 (put 'load 'ange-ftp 'ange-ftp-load) | |
1462 | 1543 |
1463 ;;;; ------------------------------------------------------------ | 1544 ;;;; ------------------------------------------------------------ |
1464 ;;;; FTP process filter support. | 1545 ;;;; FTP process filter support. |
1465 ;;;; ------------------------------------------------------------ | 1546 ;;;; ------------------------------------------------------------ |
1466 | 1547 |
4956 (ange-ftp-overwrite-fn 'file-name-as-directory) | 5037 (ange-ftp-overwrite-fn 'file-name-as-directory) |
4957 (ange-ftp-overwrite-fn 'directory-file-name) | 5038 (ange-ftp-overwrite-fn 'directory-file-name) |
4958 (ange-ftp-overwrite-fn 'expand-file-name) | 5039 (ange-ftp-overwrite-fn 'expand-file-name) |
4959 (ange-ftp-overwrite-fn 'file-name-all-completions) | 5040 (ange-ftp-overwrite-fn 'file-name-all-completions) |
4960 (ange-ftp-overwrite-fn 'file-name-completion) | 5041 (ange-ftp-overwrite-fn 'file-name-completion) |
5042 (ange-ftp-overwrite-fn 'load) | |
4961 | 5043 |
4962 (or (memq 'ange-ftp-set-buffer-mode find-file-hooks) | 5044 (or (memq 'ange-ftp-set-buffer-mode find-file-hooks) |
4963 (setq find-file-hooks | 5045 (setq find-file-hooks |
4964 (cons 'ange-ftp-set-buffer-mode find-file-hooks))) | 5046 (cons 'ange-ftp-set-buffer-mode find-file-hooks))) |
4965 | 5047 |