Mercurial > hg > xemacs-beta
view lisp/efs/efs-mts.el @ 98:0d2f883870bc r20-1b1
Import from CVS: tag r20-1b1
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:13:56 +0200 |
parents | 8fc7fe29b841 |
children | 8b8b7f3559a2 |
line wrap: on
line source
;; -*-Emacs-Lisp-*- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: efs-mts.el ;; Release: $efs release: 1.15 $ ;; Version: $Revision: 1.1 $ ;; RCS: ;; Description: MTS support for efs ;; Author: Sandy Rutherford <sandy@itp.ethz.ch> ;; Created: Fri Oct 23 08:51:29 1992 ;; Modified: Sun Nov 27 18:37:18 1994 by sandy on gandalf ;; Language: Emacs-Lisp ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; This file is part of efs. See efs.el for copyright ;;; (it's copylefted) and warrranty (there isn't one) information. (provide 'efs-mts) (require 'efs) (defconst efs-mts-version (concat (substring "$efs release: 1.15 $" 14 -2) "/" (substring "$Revision: 1.1 $" 11 -2))) ;;;; ------------------------------------------------------------ ;;;; MTS support ;;;; ------------------------------------------------------------ ;;; efs has full support, including tree dired support, for hosts running ;;; the Michigan terminal system. It should be able to automatically ;;; recognize any MTS machine. We would be grateful if you ;;; would report any failures to automatically recognize a MTS host as a bug. ;;; ;;; Filename syntax: ;;; ;;; MTS filenames are entered in a UNIX-y way. For example, if your account ;;; was YYYY, the file FILE in the account XXXX: on mtsg.ubc.ca would be ;;; entered as ;;; /YYYY@mtsg.ubc.ca:/XXXX:/FILE ;;; In other words, MTS accounts are treated as UNIX directories. Of course, ;;; to access a file in another account, you must have access permission for ;;; it. If FILE were in your own account, then you could enter it in a ;;; relative path fashion as ;;; /YYYY@mtsg.ubc.ca:FILE ;;; MTS filenames can be up to 12 characters. Like UNIX, the structure of the ;;; filename does not contain a TYPE (i.e. it can have as many "."'s as you ;;; like.) MTS filenames are always in upper case, and hence be sure to enter ;;; them as such! MTS is not case sensitive, but an EMACS running under UNIX ;;; is. (defconst efs-mts-date-regexp (concat " \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct" "\\|Nov\\|Dec\\) [ 123]?[0-9] ")) ;;; The following two functions are entry points to this file. ;;; They are put into the appropriate alists in efs.el (efs-defun efs-fix-path mts (path &optional reverse) ;; Convert PATH from UNIX-ish to MTS. ;; If REVERSE given then convert from MTS to UNIX-ish. (efs-save-match-data (if reverse (if (string-match "^\\([^:]+:\\)?\\(.*\\)$" path) (let (acct file) (if (match-beginning 1) (setq acct (substring path 0 (match-end 1)))) (if (match-beginning 2) (setq file (substring path (match-beginning 2) (match-end 2)))) (concat (and acct (concat "/" acct "/")) file)) (error "path %s didn't match" path)) (if (string-match "^/\\([^:]+:\\)/\\(.*\\)$" path) (concat (substring path 1 (match-end 1)) (substring path (match-beginning 2) (match-end 2))) ;; Let's hope that mts will recognize it anyway. path)))) (efs-defun efs-fix-dir-path mts (dir-path) ;; Convert path from UNIX-ish to MTS ready for a DIRectory listing. ;; Remember that there are no directories in MTS. (if (string-equal dir-path "/") (error "Cannot get listing for fictitious \"/\" directory.") (let ((dir-path (efs-fix-path 'mts dir-path))) (cond ((string-equal dir-path "") "?") ((efs-save-match-data (string-match ":$" dir-path)) (concat dir-path "?")) (dir-path))))) ; It's just a single file. (efs-defun efs-parse-listing mts (host user dir path &optional switches) ;; Parse the current buffer which is assumed to be in ;; mts ftp dir format. ;; HOST = remote host name ;; USER = remote user name ;; DIR = remote directory as a remote full path ;; PATH = directory as an efs full path ;; SWITCHES are never used here, but they ;; must be specified in the argument list for compatibility ;; with the unix version of this function. (let ((tbl (efs-make-hashtable)) perms) (goto-char (point-min)) (efs-save-match-data (while (re-search-forward efs-mts-date-regexp nil t) (beginning-of-line) (if (looking-at "[rwed]+") (setq perms (buffer-substring (match-beginning 0) (match-end 0))) (setq perms nil)) (end-of-line) (skip-chars-backward " ") (let ((end (point))) (skip-chars-backward "-A-Z0-9_.!") (efs-put-hash-entry (buffer-substring (point) end) (list nil nil nil perms) tbl)) (forward-line 1))) ;; Don't need to bother with .. (efs-put-hash-entry "." '(t) tbl) tbl)) (efs-defun efs-allow-child-lookup mts (host user dir file) ;; Returns t if FILE in directory DIR could possibly be a subdir ;; according to its file-name syntax, and therefore a child listing should ;; be attempted. ;; MTS file system is flat. Only "accounts" are subdirs. (string-equal "/" dir)) (efs-defun efs-internal-file-writable-p mts (user owner modes) (if (stringp modes) (efs-save-match-data (null (null (string-match "w" modes)))) t)) ; guess (efs-defun efs-internal-file-readable-p mts (user owner modes) (if (stringp modes) (efs-save-match-data (null (null (string-match "r" modes)))) t)) ; guess ;;; Tree dired support: ;; There aren't too many systems left that use MTS. This dired support will ;; work for the implementation of ftp on mtsg.ubc.ca. I hope other mts systems ;; implement ftp in the same way. If not, it might be necessary to make the ;; following more flexible. (defconst efs-dired-mts-re-exe nil) (or (assq 'mts efs-dired-re-exe-alist) (setq efs-dired-re-exe-alist (cons (cons 'mts efs-dired-mts-re-exe) efs-dired-re-exe-alist))) (defconst efs-dired-mts-re-dir nil) (or (assq 'mts efs-dired-re-dir-alist) (setq efs-dired-re-dir-alist (cons (cons 'mts efs-dired-mts-re-dir) efs-dired-re-dir-alist))) (efs-defun efs-dired-manual-move-to-filename mts (&optional raise-error bol eol) ;; In dired, move to first char of filename on this line. ;; Returns position (point) or nil if no filename on this line. ;; This is the MTS version. (or eol (setq eol (save-excursion (skip-chars-forward "^\n\r") (point)))) (if bol (goto-char bol) (skip-chars-backward "^\n\r")) (if (re-search-forward efs-mts-date-regexp eol t) (progn (skip-chars-forward " ") ; Eat blanks after date (skip-chars-forward "0-9:") ; Eat time or year (skip-chars-forward " ") ; one space before filename (point)) (and raise-error (error "No file on this line")))) (efs-defun efs-dired-manual-move-to-end-of-filename mts (&optional no-error bol eol) ;; Assumes point is at beginning of filename. ;; So, it should be called only after (dired-move-to-filename t). ;; On failure, signals an error or returns nil. ;; This is the MTS version. (let ((opoint (point))) (and selective-display (null no-error) (eq (char-after (1- (or bol (save-excursion (skip-chars-backward "^\r\n") (point))))) ?\r) ;; File is hidden or omitted. (cond ((dired-subdir-hidden-p (dired-current-directory)) (error (substitute-command-keys "File line is hidden. Type \\[dired-hide-subdir] to unhide."))) ((error (substitute-command-keys "File line is omitted. Type \\[dired-omit-toggle] to un-omit." ))))) (skip-chars-forward "-A-Z0-9._!") (if (or (= opoint (point)) (not (memq (following-char) '(?\r ?\n)))) (if no-error nil (error "No file on this line")) (point)))) (efs-defun efs-dired-fixup-listing mts (file path &optional switches wildcard) ;; If you're not listing your own account, MTS puts the ;; account name in front of each filename. Scrape them off. ;; PATH will have unix /'s on it. ;; file-name-directory is in case of wildcards (let ((len (length path))) (if (> len 2) (progn (if (= (aref path (1- len)) ?/) (setq path (substring path -2)) (setq path (substring path -1))) (goto-char (point-min)) (while (search-forward path nil t) (delete-region (match-beginning 0) (match-end 0))))))) (efs-defun efs-dired-insert-headerline mts (dir) ;; MTS has no total line, so we insert a blank line for ;; aesthetics. (insert "\n") (forward-char -1) (efs-real-dired-insert-headerline dir)) ;;; end of efs-mts.el