Mercurial > hg > xemacs-beta
diff lisp/efs/efs-mts.el @ 22:8fc7fe29b841 r19-15b94
Import from CVS: tag r19-15b94
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:50:29 +0200 |
parents | |
children | 8b8b7f3559a2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/efs/efs-mts.el Mon Aug 13 08:50:29 2007 +0200 @@ -0,0 +1,239 @@ +;; -*-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