annotate lisp/efs/efs-dired.el @ 149:538048ae2ab8 r20-3b1

Import from CVS: tag r20-3b1
author cvs
date Mon, 13 Aug 2007 09:36:16 +0200
parents 7d55a9ba150c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
98
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1 ;; -*-Emacs-Lisp-*-
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
3 ;;
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
4 ;; File: efs-dired.el
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
5 ;; Release: $efs release: 1.15 $
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
6 ;; Version: #Revision: 1.32 $
98
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
7 ;; RCS:
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
8 ;; Description: Extends much of Dired to work under efs.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
9 ;; Authors: Sebastian Kremer <sk@thp.uni-koeln.de>,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
10 ;; Andy Norman <ange@hplb.hpl.hp.com>,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
11 ;; Sandy Rutherford <sandy@ibm550.sissa.it>
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
12 ;; Created: Throughout the ages.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
13 ;; Language: Emacs-Lisp
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
14 ;;
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
15 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
16
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
17 ;;; Provisions and requirements
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
18
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
19 (provide 'efs-dired)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
20 (require 'efs)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
21 (require 'dired)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
22 (autoload 'dired-shell-call-process "dired-shell")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
23
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
24 (defconst efs-dired-version
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
25 (concat (substring "$efs release: 1.15 $" 14 -2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
26 "/"
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
27 (substring "#Revision: 1.32 $" 11 -2)))
98
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
28
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
29 ;;;; ----------------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
30 ;;;; User Configuration Variables
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
31 ;;;; ----------------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
32
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
33 (defvar efs-dired-verify-modtime-host-regexp nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
34 "Regular expression determining on which hosts dired modtimes are checked.")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
35
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
36 (defvar efs-dired-verify-anonymous-modtime nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
37 "If non-nil, dired modtimes are checked for anonymous logins.")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
38
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
39 ;;; Internal Variables
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
40
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
41 (make-variable-buffer-local 'dired-ls-F-marks-symlinks)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
42
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
43 ;;;; -----------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
44 ;;;; Inserting Directories into Buffers
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
45 ;;;; -----------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
46
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
47 ;; The main command for inserting a directory listing in a buffer.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
48 ;; In Emacs 19 this is in files.el, and not specifically connected to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
49 ;; dired. Since our version of it uses some dired functions, it is
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
50 ;; included here, but there is an autoload for it in efs.el.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
51
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
52 (defun efs-insert-directory (file switches &optional wildcard full-directory-p
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
53 nowait marker-char)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
54 ;; Inserts a remote directory. Can do this asynch.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
55 (let* ((parsed (efs-ftp-path file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
56 (mk (point-marker))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
57 (host (car parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
58 (user (nth 1 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
59 (path (nth 2 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
60 (host-type (efs-host-type host))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
61 (dumb (memq host-type efs-dumb-host-types))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
62 (subdir (and (null (or full-directory-p wildcard))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
63 (condition-case nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
64 (dired-current-directory)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
65 (error nil))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
66 (case-fold-search nil) ; for testing switches
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
67 (parse (and full-directory-p (not wildcard)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
68 (or dumb (efs-parsable-switches-p switches))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
69 ;; In case dired-omit-silent isn't defined.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
70 (dired-omit-silent (and (boundp 'dired-omit-silent)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
71 dired-omit-silent)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
72
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
73 ;; Insert the listing. If it's not a wild-card, and not a full-dir,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
74 ;; then we are updating a dired-line. Do this asynch.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
75 ;; This way of doing the listing makes sure that the dired
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
76 ;; buffer is still around after the listing is obtained.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
77
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
78 (efs-ls
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
79 file switches t (if parse 'parse t) nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
80 ;; asynch, if we're inserting in a subdir. Do it nowait = 0, so
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
81 ;; updating the file line gets a high priority??
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
82 ;; Insert subdir listings NOWAIT = 0 also so 1-line
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
83 ;; updates don't toggle the mode line.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
84 (if (and subdir nowait) 0 nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
85 (efs-cont (listing) (host user file path wildcard
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
86 nowait marker-char
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
87 mk subdir parse switches dired-omit-silent)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
88 ;; We pass the value of dired-omit-silent from the caller to the cont.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
89 (let ((host-type (efs-host-type host))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
90 (listing-type (efs-listing-type host user)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
91 (if (marker-buffer mk)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
92 (efs-save-buffer-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
93 (set-buffer (marker-buffer mk))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
94 ;; parsing a listing, sometimes updates info
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
95 (if (and parse (eq major-mode 'dired-mode))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
96 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
97 (setq efs-dired-host-type host-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
98 efs-dired-listing-type listing-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
99 efs-dired-listing-type-string
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
100 (and efs-show-host-type-in-dired
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
101 (concat " "
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
102 (symbol-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
103 efs-dired-listing-type))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
104 (if (memq host-type '(bsd-unix next-unix))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
105 (setq dired-ls-F-marks-symlinks nil)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
106 (if (memq host-type '(sysV-unix apollo-unix))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
107 (setq dired-ls-F-marks-symlinks t)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
108 (if subdir
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
109 ;; a 1-line re-list
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
110 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
111 (efs-update-file-info
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
112 host-type file efs-data-buffer-name)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
113 (goto-char mk)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
114 (let ((new-subdir (condition-case nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
115 (dired-current-directory)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
116 (error nil)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
117 buffer-read-only)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
118 (if (and new-subdir
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
119 (string-equal subdir new-subdir))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
120 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
121 ;; Is there an existing entry?
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
122 (if (dired-goto-file file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
123 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
124 (delete-region
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
125 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
126 (skip-chars-backward "^\n\r")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
127 (1- (point)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
128 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
129 (skip-chars-forward "^\n\r")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
130 (point)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
131 (goto-char mk)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
132 (insert listing)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
133 (save-restriction
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
134 (narrow-to-region mk (point))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
135 (efs-dired-fixup-listing
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
136 listing-type file path switches wildcard)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
137 (efs-dired-ls-trim
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
138 listing-type)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
139 ;; save-excursion loses if fixup had to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
140 ;; remove and re-add the region. Say for
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
141 ;; sorting.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
142 (goto-char (point-max)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
143 (if (and nowait (eq major-mode 'dired-mode))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
144 (dired-after-add-entry
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
145 (marker-position mk)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
146 marker-char))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
147 (goto-char mk)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
148 (let (buffer-read-only)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
149 (insert listing)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
150 (save-restriction
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
151 (narrow-to-region mk (point))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
152 (efs-dired-fixup-listing
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
153 listing-type file path switches wildcard)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
154 (goto-char (point-max))))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
155 ;; Return 0 if synch, nil if asynch
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
156 (if nowait nil 0)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
157
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
158 ;;; Functions for cleaning listings.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
159
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
160 (efs-defun efs-dired-ls-trim nil ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
161 ;; Trims dir listings, so that the listing of a single file is one line.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
162 nil)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
163
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
164 (efs-defun efs-dired-fixup-listing nil (file path &optional switches wildcard)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
165 ;; FILE is in efs syntax.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
166 ;; PATH is just the remote path.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
167 ;; Some ftpd's put the whole directory name in front of each filename.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
168 ;; Seems to depend in a strange way on server-client interaction.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
169 ;; Walk down the listing generated and remove this stuff.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
170 ;; SWITCHES is a string.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
171 (if (memq efs-key efs-unix-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
172 (let ((continue t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
173 spot bol)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
174 (goto-char (point-min))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
175 (while (and (not (eobp)) continue)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
176 (and (setq bol (point)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
177 spot (dired-manual-move-to-filename nil bol))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
178 (setq continue (= (following-char) ?/))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
179 (dired-manual-move-to-end-of-filename t bol)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
180 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
181 (skip-chars-backward "^/")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
182 (delete-region spot (point))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
183 (forward-line 1))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
184 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
185 (if (and switches (string-match "R" switches)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
186 (not (string-match "d" switches)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
187 (let ((subdir-regexp "^\\(/[^ \n\r]+\\):[\n\r]")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
188 name)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
189 (goto-char (point-min))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
190 (while (re-search-forward subdir-regexp nil t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
191 (goto-char (match-beginning 0))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
192 ;; There may be /./ type nonsense.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
193 ;; expand-file-name will handle it.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
194 (setq name (expand-file-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
195 (buffer-substring (point) (match-end 0))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
196 (delete-region (point) (match-end 0))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
197 (insert (efs-replace-path-component file name)))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
198
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
199
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
200 ;;;; ------------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
201 ;;;; Tree Dired support
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
202 ;;;; ------------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
203
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
204 ;;; efs-dired keymap
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
205
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
206 (defvar efs-dired-map nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
207 "Keymap for efs commands in dired buffers.")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
208
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
209 (if efs-dired-map
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
210 ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
211 (setq efs-dired-map (make-sparse-keymap))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
212 (define-key efs-dired-map "c" 'efs-dired-close-ftp-process)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
213 (define-key efs-dired-map "k" 'efs-dired-kill-ftp-process)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
214 (define-key efs-dired-map "o" 'efs-dired-display-ftp-process-buffer)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
215 (define-key efs-dired-map "p" 'efs-dired-ping-connection))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
216
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
217 (fset 'efs-dired-prefix efs-dired-map)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
218
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
219 ;;; Functions for dealing with the FTP process
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
220
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
221 (defun efs-dired-close-ftp-process ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
222 "Close the FTP process for the current dired buffer.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
223 Closing causes the connection to be dropped, but efs will retain its
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
224 cached data for the connection. This will make it more efficient to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
225 reopen the connection."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
226 (interactive)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
227 (or efs-dired-host-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
228 (error "Dired buffer is not for a remote directory."))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
229 (efs-close-ftp-process (current-buffer))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
230 (let ((parsed (efs-ftp-path default-directory)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
231 (message "Closed FTP connection for %s@%s." (nth 1 parsed) (car parsed))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
232
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
233 (defun efs-dired-kill-ftp-process ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
234 "Kills the FTP process for the current dired buffer.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
235 Killing causes the connection to be closed, the process buffer to be killed,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
236 and most of efs's cached data to be wiped."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
237 (interactive)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
238 (or efs-dired-host-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
239 (error "Dired buffer is not for a remote directory."))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
240 (efs-kill-ftp-process (current-buffer))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
241 (let ((parsed (efs-ftp-path default-directory)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
242 (message "Killed FTP connection for %s@%s." (nth 1 parsed) (car parsed))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
243
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
244 (defun efs-dired-display-ftp-process-buffer ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
245 "Displays in another window the FTP process buffer for a dired buffer."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
246 (interactive)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
247 (or efs-dired-host-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
248 (error "Dired buffer is not for a remote directory."))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
249 (efs-display-ftp-process-buffer (current-buffer)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
250
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
251 (defun efs-dired-ping-connection ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
252 "Pings FTP connection associated with current dired buffer."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
253 (interactive)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
254 (or efs-dired-host-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
255 (error "Dired buffer is not for a remote directory."))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
256 (efs-ping-ftp-connection (current-buffer)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
257
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
258
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
259 ;;; Reading in dired buffers.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
260
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
261 (defun efs-dired-revert (&optional arg noconfirm)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
262 (let ((efs-ls-uncache t))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
263 (dired-revert arg noconfirm)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
264
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
265 (defun efs-dired-default-dir-function ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
266 (let* ((cd (dired-current-directory))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
267 (parsed (efs-ftp-path cd)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
268 (if parsed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
269 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
270 (let ((tail directory-abbrev-alist))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
271 (while tail
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
272 (if (string-match (car (car tail)) cd)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
273 (setq cd (concat (cdr (car tail))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
274 (substring cd (match-end 0)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
275 parsed nil))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
276 (setq tail (cdr tail)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
277 (apply 'efs-unexpand-parsed-filename
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
278 (or parsed (efs-ftp-path cd)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
279 cd)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
280
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
281 (defun efs-dired-before-readin ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
282 ;; Put in the dired-before-readin-hook.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
283 (let ((parsed (efs-ftp-path default-directory)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
284 (if parsed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
285 (let ((host (car parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
286 (user (nth 1 parsed)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
287 (setq efs-dired-listing-type (efs-listing-type host user)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
288 efs-dired-host-type (efs-host-type host)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
289 efs-dired-listing-type-string
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
290 (and efs-show-host-type-in-dired
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
291 (concat " " (symbol-name efs-dired-listing-type))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
292 (set (make-local-variable 'revert-buffer-function)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
293 (function efs-dired-revert))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
294 (set (make-local-variable 'default-directory-function)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
295 (function efs-dired-default-dir-function))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
296 (set (make-local-variable 'dired-verify-modtimes)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
297 (null (null (and
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
298 efs-dired-verify-modtime-host-regexp
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
299 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
300 (let ((case-fold-search t))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
301 (string-match
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
302 efs-dired-verify-modtime-host-regexp host))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
303 (or efs-dired-verify-anonymous-modtime
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
304 (not (efs-anonymous-p user))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
305 ;; The hellsoft ftp server mixes up cases.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
306 ;; However, we may not be able to catch this until
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
307 ;; after the first directory is listed.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
308 (if (and
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
309 (eq efs-dired-host-type 'hell)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
310 (not (string-equal default-directory
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
311 (setq default-directory
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
312 (downcase default-directory)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
313 (or (string-equal (buffer-name) (downcase (buffer-name)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
314 (rename-buffer (generate-new-buffer-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
315 (directory-file-name default-directory)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
316 ;; Setup the executable and directory regexps
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
317 (let ((eentry (assq efs-dired-listing-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
318 efs-dired-re-exe-alist))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
319 (dentry (assq efs-dired-listing-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
320 efs-dired-re-dir-alist)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
321 (if eentry
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
322 (set (make-local-variable 'dired-re-exe) (cdr eentry)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
323 (if dentry
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
324 (set (make-local-variable 'dired-re-dir) (cdr dentry))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
325 ;; No switches are sent to dumb hosts, so don't confuse dired.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
326 ;; I hope that dired doesn't get excited if it doesn't see the l
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
327 ;; switch. If it does, then maybe fake things by setting this to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
328 ;; "-Al".
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
329 (if (eq efs-dired-listing-type 'vms)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
330 (setq dired-internal-switches
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
331 (delq ?F dired-internal-switches))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
332 (if (memq efs-dired-host-type efs-dumb-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
333 (setq dired-internal-switches '(?l ?A)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
334 ;; Don't lie on the mode line
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
335 dired-sort-mode "")))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
336 ;; If the remote file system is version-based, don't set
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
337 ;; dired-kept-versions to 0. It will flag the most recent
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
338 ;; copy of the file for deletion -- this isn't really a backup.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
339 (if (memq efs-dired-host-type efs-version-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
340 (set (make-local-variable 'dired-kept-versions)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
341 (max 1 dired-kept-versions)))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
342
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
343 (efs-defun efs-dired-insert-headerline (&use efs-dired-listing-type) (dir)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
344 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
345 (efs-real-dired-insert-headerline dir))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
346
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
347 (defun efs-dired-uncache (file dir-p)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
348 ;; Remove FILE from cache.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
349 (if dir-p
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
350 (efs-del-from-ls-cache file nil t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
351 (efs-del-from-ls-cache file t nil)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
352
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
353 ;;; Checking modtimes of directories.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
354 ;;
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
355 ;; This only runs if efs-dired-verify-anonymous-modtime and
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
356 ;; efs-verify-modtime-host-regexp turn it on. Few (any?) FTP servers
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
357 ;; support getting MDTM for directories. As usual, we cache whether
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
358 ;; this works, and don't keep senselessly trying it if it doesn't.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
359
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
360 (defun efs-dired-file-modtime (file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
361 ;; Returns the modtime.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
362 (let* ((parsed (efs-ftp-path file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
363 (host (car parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
364 (user (nth 1 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
365 (rpath (nth 2 parsed)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
366 (and (null (efs-get-host-property host 'dir-mdtm-failed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
367 (let ((result (efs-send-cmd host user (list 'quote 'mdtm rpath)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
368 (and (eq efs-verbose t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
369 "Getting modtime")))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
370 mp)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
371 (if (and (null (car result))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
372 (setq mp (efs-parse-mdtime (nth 1 result))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
373 (let ((ent (efs-get-file-entry file)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
374 (if ent
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
375 (setcdr ent (list (nth 1 ent) (nth 2 ent)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
376 (nth 3 ent) (nth 4 ent) mp)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
377 parsed)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
378 (efs-set-host-property host 'dir-mdtm-failed t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
379 nil)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
380
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
381 (defun efs-dired-set-file-modtime (file alist)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
382 ;; This works asynch.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
383 (let* ((parsed (efs-ftp-path file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
384 (host (car parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
385 (user (nth 1 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
386 (path (nth 2 parsed)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
387 (if (efs-get-host-property host 'dir-mdtm-failed)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
388 (let ((elt (assoc file alist)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
389 (if elt (setcar (nthcdr 4 elt) nil)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
390 (efs-send-cmd
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
391 host user (list 'quote 'mdtm path) nil nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
392 (efs-cont (result line cont-lines) (file alist host)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
393 (let ((elt (assoc file alist))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
394 modtime)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
395 (if (and (null result) (setq modtime (efs-parse-mdtime line)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
396 (if elt (setcar (nthcdr 4 elt) modtime))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
397 (if elt (setcar (nthcdr 4 elt) nil))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
398 (efs-set-host-property host 'dir-mdtm-failed t))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
399 0) ; Always do this NOWAIT = 0
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
400 nil))) ; return NIL
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
401
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
402 ;;; Asynch insertion of subdirs. Used when renaming subdirs.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
403
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
404 (defun efs-dired-insert-subdir (dirname &optional noerror nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
405 (let ((buff (current-buffer))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
406 (switches (delq ?R (copy-sequence dired-internal-switches))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
407 (efs-ls
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
408 dirname (dired-make-switches-string switches)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
409 t nil noerror nowait
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
410 (efs-cont (listing) (dirname buff switches)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
411 (if (and listing (get-buffer buff))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
412 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
413 (set-buffer buff)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
414 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
415 (let ((elt (assoc dirname dired-subdir-alist))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
416 mark-list)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
417 (if elt
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
418 (setq mark-list (dired-insert-subdir-del elt))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
419 (dired-insert-subdir-newpos dirname))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
420 (dired-insert-subdir-doupdate
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
421 dirname
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
422 (efs-dired-insert-subdir-do-insert dirname listing)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
423 switches elt mark-list)))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
424
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
425 (defun efs-dired-insert-subdir-do-insert (dirname listing)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
426 (let ((begin (point))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
427 indent-tabs-mode end)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
428 (insert listing)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
429 (setq end (point-marker))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
430 (indent-rigidly begin end 2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
431 (goto-char begin)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
432 (dired-insert-headerline dirname)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
433 ;; If the listing has null lines `quote' them so that "\n\n" delimits
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
434 ;; subdirs. This is OK, because we aren't inserting -R listings.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
435 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
436 (while (search-forward "\n\n" end t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
437 (forward-char -1)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
438 (insert " ")))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
439 ;; point is now like in dired-build-subdir-alist
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
440 (prog1
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
441 (list begin (marker-position end))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
442 (set-marker end nil))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
443
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
444 ;;; Moving around in dired buffers.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
445
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
446 (efs-defun efs-dired-manual-move-to-filename (&use efs-dired-listing-type)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
447 (&optional raise-error bol eol)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
448 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
449 (efs-real-dired-manual-move-to-filename raise-error bol eol))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
450
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
451 (efs-defun efs-dired-manual-move-to-end-of-filename
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
452 (&use efs-dired-listing-type) (&optional no-error bol eol)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
453 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
454 (efs-real-dired-manual-move-to-end-of-filename no-error bol eol))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
455
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
456 (efs-defun efs-dired-make-filename-string (&use efs-dired-listing-type)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
457 (filename &optional reverse)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
458 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
459 ;; This translates file names from the way that they are displayed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
460 ;; in listings to the way that the user gives them in the minibuffer.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
461 ;; For example, in CMS this should take "FOO BAR" to "FOO.BAR".
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
462 filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
463
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
464 (defun efs-dired-find-file ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
465 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
466 (interactive)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
467 (find-file
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
468 (if (memq efs-dired-host-type efs-version-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
469 (efs-internal-file-name-sans-versions
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
470 efs-dired-host-type (dired-get-filename) t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
471 (dired-get-filename))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
472
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
473 (defun efs-dired-find-file-other-window (&optional display)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
474 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
475 (interactive "P")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
476 (if display
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
477 (dired-display-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
478 (let ((file (dired-get-filename)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
479 (if (memq efs-dired-host-type efs-version-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
480 (setq file (efs-internal-file-name-sans-versions
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
481 efs-dired-host-type file t)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
482 (find-file-other-window file))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
483
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
484 (defun efs-dired-display-file ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
485 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
486 (interactive)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
487 (let ((file (dired-get-filename)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
488 (if (memq efs-dired-host-type efs-version-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
489 (setq file (efs-internal-file-name-sans-versions
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
490 efs-dired-host-type file t)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
491 (display-buffer (find-file-noselect file))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
492
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
493 (defun efs-dired-find-file-other-frame ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
494 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
495 (interactive)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
496 (find-file-other-frame
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
497 (if (memq efs-dired-host-type efs-version-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
498 (efs-internal-file-name-sans-versions
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
499 efs-dired-host-type (dired-get-filename) t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
500 (dired-get-filename))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
501
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
502 ;;; Creating and deleting new directories.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
503
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
504 (defun efs-dired-recursive-delete-directory (fn)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
505 ;; Does recursive deletion of remote directories for dired.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
506 (or (file-exists-p fn)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
507 (signal 'file-error
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
508 (list "Removing old file name" "no such directory" fn)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
509 (efs-dired-internal-recursive-delete-directory fn))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
510
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
511 (defun efs-dired-internal-recursive-delete-directory (fn)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
512 (if (eq (car (file-attributes fn)) t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
513 (let ((files (efs-directory-files fn)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
514 (if files
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
515 (mapcar (function
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
516 (lambda (ent)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
517 (or (string-equal "." ent)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
518 (string-equal ".." ent)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
519 (efs-dired-internal-recursive-delete-directory
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
520 (expand-file-name ent fn)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
521 files))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
522 (efs-delete-directory fn))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
523 (condition-case err
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
524 (efs-delete-file fn)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
525 (ftp-error (if (and (nth 2 err) (stringp (nth 2 err))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
526 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
527 (string-match "^FTP Error: \"550 " (nth 2 err))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
528 (message "File %s already deleted." fn)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
529 (signal (car err) (cdr err)))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
530
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
531 ;;; File backups and versions.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
532
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
533 (efs-defun efs-dired-flag-backup-files
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
534 (&use efs-dired-host-type) (&optional unflag-p)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
535 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
536 (interactive "P")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
537 (efs-real-dired-flag-backup-files unflag-p))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
538
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
539 (efs-defun efs-dired-collect-file-versions (&use efs-dired-host-type) ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
540 ;; If it looks like a file has versions, return a list of the versions.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
541 ;; The return value is ((FILENAME . (VERSION1 VERSION2 ...)) ...)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
542 (efs-real-dired-collect-file-versions))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
543
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
544 ;;; Sorting dired buffers
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
545
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
546 (defun efs-dired-file-name-lessp (name1 name2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
547 (if (and efs-dired-host-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
548 (memq efs-dired-host-type efs-case-insensitive-host-types))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
549 (string< (downcase name1) (downcase name2))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
550 (string< name1 name2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
551
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
552 ;;; Support for async file creators.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
553
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
554 (defun efs-dired-copy-file (from to ok-flag &optional cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
555 ;; Version of dired-copy-file for remote files.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
556 ;; Assumes that filenames are already expanded.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
557 (dired-handle-overwrite to)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
558 (efs-copy-file-internal from (efs-ftp-path from) to (efs-ftp-path to)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
559 ok-flag dired-copy-preserve-time 0 cont nowait))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
560
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
561 (defun efs-dired-rename-file (from to ok-flag &optional cont nowait
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
562 insert-subdir)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
563 ;; Version of dired-rename-file for remote files.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
564 (dired-handle-overwrite to)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
565 (efs-rename-file-internal
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
566 from to ok-flag nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
567 (efs-cont (result line cont-lines) (from to cont insert-subdir)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
568 (if result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
569 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
570 (efs-call-cont cont result line cont-lines)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
571 (signal 'ftp-error
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
572 (list "Dired Renaming"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
573 (format "FTP Error: \"%s\"" line)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
574 from to)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
575 (dired-remove-file from)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
576 ;; Silently rename the visited file of any buffer visiting this file.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
577 ;; We do not maintain inserted subdirs for remote
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
578 (efs-dired-rename-update-buffers from to insert-subdir)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
579 (if cont (efs-call-cont cont result line cont-lines))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
580 nowait))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
581
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
582 (defun efs-dired-rename-update-buffers (from to &optional insert-subdir)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
583 (if (get-file-buffer from)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
584 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
585 (set-buffer (get-file-buffer from))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
586 (let ((modflag (buffer-modified-p)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
587 (set-visited-file-name to) ; kills write-file-hooks
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
588 (set-buffer-modified-p modflag)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
589 ;; It's a directory. More work to do.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
590 (let ((blist (buffer-list))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
591 (from-dir (file-name-as-directory from))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
592 (to-dir (file-name-as-directory to)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
593 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
594 (while blist
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
595 (set-buffer (car blist))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
596 (setq blist (cdr blist))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
597 (cond
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
598 (buffer-file-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
599 (if (dired-in-this-tree buffer-file-name from-dir)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
600 (let ((modflag (buffer-modified-p)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
601 (unwind-protect
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
602 (set-visited-file-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
603 (concat to-dir (substring buffer-file-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
604 (length from-dir))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
605 (set-buffer-modified-p modflag)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
606 (dired-directory
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
607 (if (string-equal from-dir (expand-file-name default-directory))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
608 ;; If top level directory was renamed, lots of things
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
609 ;; have to be updated.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
610 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
611 (dired-unadvertise from-dir)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
612 (setq default-directory to-dir
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
613 dired-directory
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
614 ;; Need to beware of wildcards.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
615 (expand-file-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
616 (file-name-nondirectory dired-directory)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
617 to-dir))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
618 (let ((new-name (file-name-nondirectory
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
619 (directory-file-name dired-directory))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
620 ;; Try to rename buffer, but just leave old name if new
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
621 ;; name would already exist (don't try appending "<%d>")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
622 ;; Why? --sandy 19-8-94
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
623 (or (get-buffer new-name)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
624 (rename-buffer new-name)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
625 (dired-advertise))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
626 (and insert-subdir
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
627 (assoc (file-name-directory (directory-file-name to))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
628 dired-subdir-alist)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
629 (if (efs-ftp-path to)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
630 (efs-dired-insert-subdir to t 1)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
631 (dired-insert-subdir to)))))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
632
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
633 (defun efs-dired-make-relative-symlink (from to ok-flag &optional cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
634 ;; efs version of dired-make-relative-symlink
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
635 ;; Called as a file-name-handler when dired-make-relative-symlink is
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
636 ;; called interactively.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
637 ;; efs-dired-create-files calls it directly to supply CONT
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
638 ;; and NOWAIT args.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
639 (setq from (directory-file-name from)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
640 to (directory-file-name to))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
641 (efs-make-symbolic-link-internal
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
642 (dired-make-relative from (file-name-directory to) t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
643 to ok-flag cont nowait))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
644
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
645 (defun efs-dired-create-files (file-creator operation fn-list name-constructor
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
646 &optional marker-char query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
647 implicit-to)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
648 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
649 (if (catch 'found
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
650 (let ((list fn-list)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
651 val)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
652 (while list
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
653 (if (setq val (efs-ftp-path (car list)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
654 (throw 'found val)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
655 (if (setq val (funcall name-constructor (car list)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
656 (throw 'found (efs-ftp-path val))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
657 (setq list (cdr list)))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
658 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
659 (cond ((eq file-creator 'dired-copy-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
660 (setq file-creator 'efs-dired-copy-file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
661 ((eq file-creator 'dired-rename-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
662 (setq file-creator 'efs-dired-rename-file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
663 ((eq file-creator 'make-symbolic-link)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
664 (setq file-creator 'efs-make-symbolic-link-internal))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
665 ((eq file-creator 'add-name-to-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
666 (setq file-creator 'efs-add-name-to-file-internal))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
667 ((eq file-creator 'dired-make-relative-symlink)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
668 (setq file-creator 'efs-dired-make-relative-symlink))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
669 ((eq file-creator 'dired-compress-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
670 (setq file-creator 'efs-dired-compress-file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
671 ((error "Unable to perform operation %s on remote hosts."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
672 file-creator)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
673 ;; use the process-filter driven routine rather than the iterative one.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
674 (efs-dcf-1 file-creator operation fn-list name-constructor
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
675 (if (eq marker-char t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
676 (mapcar 'dired-file-marker fn-list)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
677 marker-char)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
678 query (buffer-name (current-buffer))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
679 nil ;overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
680 nil ;dired-overwrite-backup-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
681 nil ;dired-file-creator-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
682 nil ;failures
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
683 nil ;skipped
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
684 0 ;success-count
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
685 (length fn-list) ;total
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
686 implicit-to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
687 (and (eq file-creator 'efs-dired-rename-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
688 (delq nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
689 (mapcar
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
690 (function
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
691 (lambda (x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
692 (and (assoc (file-name-as-directory x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
693 dired-subdir-alist)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
694 x)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
695 fn-list)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
696 ;; normal case... use the interative routine... much cheaper.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
697 (efs-real-dired-create-files file-creator operation fn-list
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
698 name-constructor marker-char query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
699 implicit-to)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
700
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
701 (defun efs-dcf-1 (file-creator operation fn-list name-constructor
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
702 markers query buffer-name overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
703 overwrite-backup-query file-creator-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
704 failures skipped success-count total
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
705 implicit-to insertions)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
706 (if (null fn-list)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
707 (efs-dcf-3 failures operation total skipped
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
708 success-count buffer-name)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
709 (let* ((from (car fn-list))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
710 ;; For dired-handle-overwrite and the file-creator-query,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
711 ;; need to set these 2 fluid vars according to the cont data.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
712 (dired-overwrite-backup-query overwrite-backup-query)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
713 (dired-file-creator-query file-creator-query)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
714 (to (funcall name-constructor from))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
715 (marker-char (if (consp markers)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
716 (prog1 (car markers)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
717 (setq markers (cdr markers)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
718 markers))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
719 (fn-list (cdr fn-list)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
720 (if to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
721 (if (equal to from)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
722 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
723 (dired-log buffer-name "Cannot %s to same file: %s\n"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
724 (downcase operation) from)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
725 (efs-dcf-1 file-creator operation fn-list name-constructor
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
726 markers query buffer-name overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
727 dired-overwrite-backup-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
728 dired-file-creator-query failures
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
729 (cons (dired-make-relative from nil t) skipped)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
730 success-count total implicit-to insertions))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
731 (if (or (null query)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
732 (funcall query from to))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
733 (let* ((overwrite (let (jka-compr-enabled)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
734 ;; Don't let jka-compr fool us.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
735 (file-exists-p to)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
736 (overwrite-confirmed ; for dired-handle-overwrite
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
737 (and overwrite
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
738 (let ((help-form '(format "\
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
739 Type SPC or `y' to overwrite file `%s',
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
740 DEL or `n' to skip to next,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
741 ESC or `q' to not overwrite any of the remaining files,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
742 `!' to overwrite all remaining files with no more questions." to)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
743 (dired-query 'overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
744 "Overwrite `%s'?" to)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
745 (condition-case err
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
746 (let ((dired-unhandle-add-files
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
747 (cons to dired-unhandle-add-files)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
748 (if implicit-to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
749 (funcall file-creator from overwrite-confirmed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
750 (list (function efs-dcf-2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
751 file-creator operation fn-list
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
752 name-constructor markers
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
753 query marker-char
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
754 buffer-name to from overwrite
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
755 overwrite-confirmed overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
756 dired-overwrite-backup-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
757 dired-file-creator-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
758 failures skipped success-count
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
759 total implicit-to insertions)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
760 t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
761 (apply file-creator from to overwrite-confirmed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
762 (list (function efs-dcf-2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
763 file-creator operation fn-list
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
764 name-constructor markers
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
765 query marker-char
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
766 buffer-name to from overwrite
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
767 overwrite-confirmed overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
768 dired-overwrite-backup-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
769 dired-file-creator-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
770 failures skipped success-count total
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
771 implicit-to insertions)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
772 (if insertions
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
773 (list t insertions)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
774 '(t)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
775 (error ; FILE-CREATOR aborted
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
776 (efs-dcf-2 'failed ;result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
777 (format "%s" err) ;line
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
778 "" file-creator operation fn-list
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
779 name-constructor markers query marker-char
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
780 buffer-name to from overwrite
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
781 overwrite-confirmed overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
782 dired-overwrite-backup-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
783 dired-file-creator-query failures skipped
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
784 success-count total implicit-to insertions))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
785 (efs-dcf-1 file-creator operation fn-list name-constructor
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
786 markers query buffer-name overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
787 dired-overwrite-backup-query dired-file-creator-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
788 failures
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
789 (cons (dired-make-relative from nil t) skipped)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
790 success-count total implicit-to insertions)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
791 (efs-dcf-1 file-creator operation fn-list name-constructor
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
792 markers query buffer-name overwrite-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
793 dired-overwrite-backup-query dired-file-creator-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
794 failures (cons (dired-make-relative from nil t) skipped)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
795 success-count total implicit-to insertions)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
796
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
797 (defun efs-dcf-2 (result line cont-lines file-creator operation fn-list
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
798 name-constructor markers query marker-char
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
799 buffer-name to from overwrite overwrite-confirmed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
800 overwrite-query overwrite-backup-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
801 file-creator-query failures skipped success-count
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
802 total implicit-to insertions)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
803 (if result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
804 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
805 (setq failures (cons (dired-make-relative from nil t) failures))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
806 (dired-log buffer-name "%s `%s' to `%s' failed:\n%s\n"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
807 operation from to line))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
808 (setq success-count (1+ success-count))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
809 (message "%s: %d of %d" operation success-count total)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
810 (let ((efs-ls-uncache t))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
811 (dired-add-file to marker-char)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
812 ;; iterate again
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
813 (efs-dcf-1 file-creator operation fn-list name-constructor
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
814 markers query buffer-name overwrite-query overwrite-backup-query
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
815 file-creator-query failures skipped success-count total
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
816 implicit-to insertions))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
817
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
818 (defun efs-dcf-3 (failures operation total skipped success-count buffer-name)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
819 (cond
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
820 (failures
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
821 (dired-log-summary buffer-name (format "%s failed for %d of %d file%s"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
822 operation (length failures) total
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
823 (dired-plural-s total)) failures))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
824 (skipped
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
825 (dired-log-summary buffer-name (format "%s: %d of %d file%s skipped"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
826 operation (length skipped) total
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
827 (dired-plural-s total)) skipped))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
828 (t
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
829 (message "%s: %s file%s."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
830 operation success-count
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
831 (dired-plural-s success-count)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
832
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
833 ;;; Running remote shell commands
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
834
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
835 ;;; This support isn't very good. efs is really about a virtual file system,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
836 ;;; and not remote processes. What is really required is low-level
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
837 ;;; support for start-process & call-process on remote hosts. This shouldn't
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
838 ;;; be part of efs, although.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
839
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
840 (defun efs-dired-shell-unhandle-file-name (filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
841 ;; Puts remote file names into a form where they can be passed to remsh.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
842 (nth 2 (efs-ftp-path filename)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
843
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
844 (defun efs-dired-shell-call-process (command dir &optional in-background)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
845 ;; Runs shell process on remote hosts.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
846 (let* ((parsed (efs-ftp-path dir))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
847 (host (car parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
848 (user (nth 1 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
849 (rdir (nth 2 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
850 (file-name-handler-alist nil))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
851 (or (string-equal (efs-internal-directory-file-name dir)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
852 (efs-expand-tilde "~" (efs-host-type host) host user))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
853 (string-match "^cd " command)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
854 (setq command (concat "cd " rdir "; " command)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
855 (setq command
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
856 (format "%s %s%s \"%s\"" ; remsh -l USER does not work well
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
857 ; on a hp-ux machine I tried
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
858 efs-remote-shell-file-name host
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
859 (if efs-remote-shell-takes-user
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
860 (concat " -l " user)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
861 "")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
862 command))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
863 (message "Doing shell command on %s..." host)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
864 (dired-shell-call-process
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
865 command (file-name-directory efs-tmp-name-template) in-background)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
866
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
867 ;;; Dired commands for running local processes on remote files.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
868 ;;
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
869 ;; Lots of things in this section need to be re-thunk.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
870
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
871 (defun efs-dired-call-process (program discard &rest arguments)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
872 "Documented as original."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
873 ;; PROGRAM is always one of those below in the cond in dired.el.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
874 ;; The ARGUMENTS are (nearly) always files.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
875 (if (efs-ftp-path default-directory)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
876 ;; Can't use efs-dired-host-type here because the current
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
877 ;; buffer is *dired-check-process output*
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
878 (condition-case oops
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
879 (cond
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
880 ((string-equal "efs-call-compress" program)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
881 (apply 'efs-call-compress arguments))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
882 ((string-equal "chmod" program)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
883 (efs-call-chmod arguments))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
884 (t (error "Unknown remote command: %s" program)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
885 (ftp-error (dired-log (buffer-name (current-buffer))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
886 (format "%s: %s, %s\n"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
887 (nth 1 oops)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
888 (nth 2 oops)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
889 (nth 3 oops))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
890 (error (dired-log (buffer-name (current-buffer))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
891 (format "%s\n" (nth 1 oops)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
892 (apply 'call-process program nil (not discard) nil arguments)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
893
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
894 (defun efs-dired-make-compressed-filename (name &optional method)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
895 ;; Version of dired-make-compressed-filename for efs.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
896 ;; If NAME is in the syntax of a compressed file (according to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
897 ;; dired-compression-method-alist), return the data (a list) from this
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
898 ;; alist on how to uncompress it. Otherwise, return a string, the
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
899 ;; uncompressed form of this file name. This is computed using the optional
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
900 ;; argument METHOD (a symbol). If METHOD is nil, the ambient value of
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
901 ;; dired-compression-method is used.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
902 (let* ((host-type (efs-host-type (car (efs-ftp-path name))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
903 (ef-alist (if (memq host-type efs-single-extension-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
904 (mapcar
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
905 (function
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
906 (lambda (elt)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
907 (list (car elt)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
908 (mapconcat
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
909 (function
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
910 (lambda (char)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
911 (if (= char ?.)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
912 "-"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
913 (char-to-string char))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
914 (nth 1 elt) "")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
915 (nth 2 elt)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
916 (nth 3 elt))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
917 dired-compression-method-alist)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
918 dired-compression-method-alist))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
919 (alist ef-alist)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
920 (len (length name))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
921 ext ext-len result)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
922 (if (memq host-type efs-version-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
923 (setq name (efs-internal-file-name-sans-versions host-type name)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
924 (if (memq host-type efs-case-insensitive-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
925 (let ((name (downcase name)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
926 (while alist
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
927 (if (and (> len
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
928 (setq ext-len (length (setq ext (nth 1 (car alist))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
929 (string-equal (downcase ext)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
930 (substring name (- ext-len))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
931 (setq result (car alist)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
932 alist nil)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
933 (setq alist (cdr alist)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
934 (while alist
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
935 (if (and (> len
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
936 (setq ext-len (length (setq ext (nth 1 (car alist))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
937 (string-equal ext (substring name (- ext-len))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
938 (setq result (car alist)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
939 alist nil)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
940 (setq alist (cdr alist)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
941 (or result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
942 (concat name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
943 (nth 1 (or (assq (or method dired-compression-method)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
944 ef-alist)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
945 (error "Unknown compression method: %s"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
946 (or method dired-compression-method))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
947
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
948 (defun efs-dired-compress-file (file ok-flag &optional cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
949 ;; Version of dired-compress-file for remote files.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
950 (let* ((compressed-fn (efs-dired-make-compressed-filename file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
951 (host (car (efs-ftp-path file)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
952 (host-type (efs-host-type host)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
953 (cond ((file-symlink-p file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
954 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
955 (efs-call-cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
956 cont 'failed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
957 (format "Cannot compress %s, a symbolic link." file) "")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
958 (signal 'file-error (list "Compress error:" file
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
959 "a symbolic link"))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
960 ((listp compressed-fn)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
961 (let ((newname (substring (if (memq host-type
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
962 efs-version-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
963 (efs-internal-file-name-sans-versions
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
964 host-type file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
965 file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
966 0 (- (length (nth 1 compressed-fn)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
967 (program (nth 3 compressed-fn)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
968 (if (and (memq host-type efs-unix-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
969 (null (efs-get-host-property host 'exec-failed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
970 (null (eq (efs-get-host-property
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
971 host
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
972 (intern
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
973 (concat
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
974 "exec-"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
975 (efs-compress-progname (car program)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
976 'failed)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
977 (efs-call-remote-compress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
978 program file newname t ok-flag
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
979 (efs-cont (result line cont-lines) (program file newname
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
980 cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
981 (if result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
982 (if (eq result 'unsupported)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
983 (efs-call-compress program file newname
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
984 t t cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
985 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
986 (efs-call-cont cont result line cont-lines)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
987 (signal 'ftp-error
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
988 (list "Uncompressing file"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
989 (format "FTP Error: \"%s\" " line)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
990 file))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
991 (if cont (efs-call-cont cont result line cont-lines))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
992 nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
993 (efs-call-compress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
994 program file newname t ok-flag cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
995 newname)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
996 ((stringp compressed-fn)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
997 (let ((program (nth 2 (assq dired-compression-method
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
998 dired-compression-method-alist))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
999 (if (and (memq host-type efs-unix-host-types)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1000 (null (efs-get-host-property host 'exec-failed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1001 (null (eq (efs-get-host-property
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1002 host
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1003 (intern
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1004 (concat
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1005 "exec-"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1006 (efs-compress-progname (car program)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1007 'failed)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1008 (efs-call-remote-compress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1009 program file compressed-fn nil ok-flag
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1010 (efs-cont (result line cont-lines) (program file
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1011 compressed-fn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1012 cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1013 (if result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1014 (if (eq result 'unsupported)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1015 (efs-call-compress program file compressed-fn nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1016 t cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1017 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1018 (efs-call-cont cont result line cont-lines)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1019 (signal 'ftp-error
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1020 (list "Compressing file"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1021 (format "FTP Error: \"%s\" " line)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1022 file))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1023 (if cont (efs-call-cont cont result line cont-lines))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1024 nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1025 (efs-call-compress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1026 program file compressed-fn nil ok-flag cont nowait)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1027 compressed-fn)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1028 (t (error "Strange error in efs-dired-compress-file.")))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1029
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1030 (defun efs-dired-print-file (command file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1031 ;; Version of dired-print-file for remote files.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1032 (let ((command (dired-trans-command command (list file) "")))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1033 ;; Only replace the first occurence of the file name?
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1034 (if (string-match (concat "[ ><|]\\(" (regexp-quote
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1035 (dired-shell-quote file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1036 "\\)\\($\\|[ |><&]\\)")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1037 command)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1038 (setq command (concat (substring command 0 (match-beginning 1))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1039 "%s"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1040 (substring command (match-end 1))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1041 (error "efs-print-command: strange error"))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1042 (efs-call-lpr file command)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1043
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1044 ;;;;----------------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1045 ;;;; Support for `processes' run on remote files.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1046 ;;;; Usually (but not necessarily) these are only called from dired.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1047 ;;;;----------------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1048
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1049 (defun efs-compress-progname (program)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1050 ;; Returns a canonicalized i.e. without the "un", version of a compress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1051 ;; program name.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1052 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1053 (if (string-equal program "gunzip")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1054 "gzip"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1055 (if (string-match "^un" program)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1056 (substring program (match-end 0))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1057 program))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1058
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1059 (defun efs-call-remote-compress (program filename newname &optional uncompress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1060 ok-if-already-exists cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1061 ;; Run a remote compress process using SITE EXEC.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1062 (if (or (not ok-if-already-exists)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1063 (numberp ok-if-already-exists))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1064 (efs-barf-or-query-if-file-exists
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1065 newname
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1066 (if uncompress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1067 "uncompress to it"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1068 "compress to it")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1069 (numberp ok-if-already-exists)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1070 (let* ((filename (expand-file-name filename))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1071 (parsed (efs-ftp-path filename))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1072 (host (car parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1073 (user (nth 1 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1074 (rpath (nth 2 parsed)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1075 (if (efs-get-host-property host 'exec-failed)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1076 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1077 (efs-call-cont cont 'unsupported "SITE EXEC not supported" "")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1078 (signal 'ftp-error (list "Unable to SITE EXEC" host)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1079 (let* ((progname (efs-compress-progname (car program)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1080 (propsym (intern (concat "exec-" progname)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1081 (prop (efs-get-host-property host propsym)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1082 (cond
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1083 ((eq prop 'failed)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1084 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1085 (efs-call-cont cont 'unsupported
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1086 (concat progname " not in FTP exec path") "")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1087 (signal 'ftp-error
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1088 (list (concat progname " not in FTP exec path") host))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1089 ((eq prop 'worked)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1090 (efs-send-cmd
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1091 host user
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1092 (list 'quote 'site 'exec
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1093 (concat (mapconcat 'identity program " ") " " rpath))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1094 (concat (if uncompress "Uncompressing " "Compressing ") filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1095 nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1096 (efs-cont (result line cont-lines) (host user filename cont)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1097 (if result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1098 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1099 (efs-set-host-property host 'exec-failed t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1100 (efs-error host user (concat "FTP exec Error: " line)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1101 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1102 (if (string-match "\n200-\\([^\n]*\\)" cont-lines)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1103 (let ((err (substring cont-lines (match-beginning 1)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1104 (match-end 1))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1105 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1106 (efs-call-cont cont 'failed err cont-lines)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1107 (efs-error host user (concat "FTP Error: " err))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1108 ;; This function only gets called for unix hosts, so
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1109 ;; we'll use the default version of efs-delete-file-entry
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1110 ;; and save a host-type lookup.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1111 (efs-delete-file-entry nil filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1112 (dired-remove-file filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1113 (if cont (efs-call-cont cont nil line cont-lines))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1114 nowait))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1115 (t ; (null prop)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1116 (efs-send-cmd
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1117 host user
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1118 (list 'quote 'site 'exec (concat progname " " "-V"))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1119 (format "Checking for %s executable" progname)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1120 nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1121 (efs-cont (result line cont-lines) (propsym host program filename
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1122 newname uncompress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1123 cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1124 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1125 (if (string-match "\n200-" cont-lines)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1126 (efs-set-host-property host propsym 'worked)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1127 (efs-set-host-property host propsym 'failed)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1128 (efs-call-remote-compress program filename newname uncompress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1129 t ; already tested for overwrite
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1130 cont nowait))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1131 nowait)))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1132
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1133 (defun efs-call-compress (program filename newname &optional uncompress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1134 ok-if-already-exists cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1135 "Perform a compress command on a remote file.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1136 PROGRAM is a list of the compression program and args. Works by taking a
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1137 copy of the file, compressing it and copying the file back. Returns 0 on
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1138 success, 1 or 2 on failure. If UNCOMPRESS is non-nil, does this instead."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1139 (let* ((filename (expand-file-name filename))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1140 (newname (expand-file-name newname))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1141 (parsed (efs-ftp-path filename))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1142 (tmp1 (car (efs-make-tmp-name nil (car parsed))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1143 (tmp2 (car (efs-make-tmp-name nil (car parsed))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1144 (program (mapconcat 'identity program " ")))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1145 (efs-copy-file-internal
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1146 filename parsed tmp1 nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1147 t nil 2
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1148 (efs-cont (result line cont-lines) (filename newname tmp1 tmp2 program
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1149 uncompress ok-if-already-exists
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1150 cont nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1151 (if result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1152 (signal 'ftp-error
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1153 (list "Opening input file"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1154 (format "FTP Error: \"%s\" " line) filename))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1155 (let ((err-buff (let ((default-major-mode 'fundamental-mode))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1156 (get-buffer-create
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1157 (generate-new-buffer-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1158 (format
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1159 " efs-call-compress %s" filename))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1160 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1161 (set-buffer err-buff)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1162 (set (make-local-variable 'efs-call-compress-filename) filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1163 (set (make-local-variable 'efs-call-compress-newname) newname)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1164 (set (make-local-variable 'efs-call-compress-tmp1) tmp1)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1165 (set (make-local-variable 'efs-call-compress-tmp2) tmp2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1166 (set (make-local-variable 'efs-call-compress-cont) cont)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1167 (set (make-local-variable 'efs-call-compress-nowait) nowait)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1168 (set (make-local-variable 'efs-call-compress-ok)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1169 ok-if-already-exists)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1170 (set (make-local-variable 'efs-call-compress-uncompress)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1171 uncompress)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1172 (set (make-local-variable 'efs-call-compress-abbr)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1173 (efs-relativize-filename filename))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1174 (if efs-verbose
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1175 (efs-message
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1176 (format "%s %s..."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1177 (if uncompress "Uncompressing" "Compressing")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1178 (symbol-value (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1179 'efs-call-compress-abbr)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1180 (set-process-sentinel
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1181 (start-process (format "efs-call-compress %s" filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1182 err-buff shell-file-name
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1183 "-c" (format "%s %s < %s > %s"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1184 program
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1185 ;; Hope -c makes the compress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1186 ;; program write to std out.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1187 "-c"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1188 tmp1 tmp2))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1189 (function
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1190 (lambda (proc str)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1191 (let ((buff (get-buffer (process-buffer proc))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1192 (if buff
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1193 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1194 (set-buffer buff)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1195 (if (/= (buffer-size) 0)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1196 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1197 (efs-call-cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1198 (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1199 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1200 'efs-call-compress-cont))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1201 'failed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1202 (concat
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1203 "failed to compress "
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1204 (symbol-value (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1205 'efs-call-compress-filename))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1206 ", "
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1207 (buffer-substring
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1208 (point-min)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1209 (progn (goto-char (point-min))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1210 (end-of-line) (point))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1211 (efs-del-tmp-name (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1212 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1213 'efs-call-compress-tmp1)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1214 (let ((tmp2 (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1215 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1216 'efs-call-compress-tmp2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1217 (newname (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1218 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1219 'efs-call-compress-newname)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1220 (filename (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1221 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1222 'efs-call-compress-filename)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1223 (cont (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1224 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1225 'efs-call-compress-cont)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1226 (nowait (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1227 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1228 'efs-call-compress-nowait)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1229 (ok (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1230 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1231 'efs-call-compress-ok)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1232 (uncompress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1233 (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1234 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1235 'efs-call-compress-uncompress))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1236 (if efs-verbose
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1237 (efs-message
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1238 (format "%s %s...done"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1239 (if uncompress
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1240 "Uncompressing"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1241 "Compressing")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1242 (symbol-value
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1243 (make-local-variable
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1244 'efs-call-compress-abbr)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1245 (kill-buffer (current-buffer))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1246 (efs-copy-file-internal
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1247 tmp2 nil newname (efs-ftp-path newname)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1248 ok nil 1
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1249 (efs-cont (result line cont-lines) (cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1250 tmp2
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1251 filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1252 (efs-del-tmp-name tmp2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1253 (or result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1254 (let (efs-verbose)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1255 (efs-delete-file filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1256 (dired-remove-file filename)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1257 (if cont
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1258 (efs-call-cont cont result line
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1259 cont-lines)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1260 nowait (if uncompress nil 'image)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1261 (error "Strange error: %s" proc))))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1262 nowait (if uncompress 'image nil))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1263
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1264 (defun efs-update-mode-string (perms modes)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1265 ;; For PERMS of the form `u+w', and MODES a unix 9-character mode string,
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1266 ;; computes the new mode string.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1267 ;; Doesn't call efs-save-match-data. The calling function should.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1268 (or (string-match "^[augo]+\\([+-]\\)[rwxst]+$" perms)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1269 (error "efs-update-mode-string: invalid perms %s" perms))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1270 (let* ((who (substring perms 0 (match-beginning 1)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1271 (add (= (aref perms (match-beginning 1)) ?+))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1272 (what (substring perms (match-end 1)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1273 (newmodes (copy-sequence modes))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1274 (read (string-match "r" what))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1275 (write (string-match "w" what))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1276 (execute (string-match "x" what))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1277 (sticky (string-match "t" what))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1278 (suid (string-match "s" what)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1279 (if (string-match "a" who)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1280 (if add
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1281 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1282 (if read
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1283 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1284 (aset newmodes 0 ?r)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1285 (aset newmodes 3 ?r)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1286 (aset newmodes 6 ?r)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1287 (if write
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1288 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1289 (aset newmodes 1 ?w)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1290 (aset newmodes 4 ?w)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1291 (aset newmodes 7 ?w)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1292 (if execute
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1293 (let ((curr (aref newmodes 2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1294 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1295 (aset newmodes 2 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1296 (if (= curr ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1297 (aset newmodes 2 ?s)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1298 (setq curr (aref newmodes 5))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1299 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1300 (aset newmodes 5 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1301 (if (= curr ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1302 (aset newmodes 5 ?s)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1303 (setq curr (aref newmodes 8))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1304 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1305 (aset newmodes 8 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1306 (if (= curr ?T)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1307 (aset newmodes 8 ?t)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1308 (if suid
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1309 (let ((curr (aref newmodes 2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1310 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1311 (aset newmodes 2 ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1312 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1313 (aset newmodes 2 ?s)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1314 (setq curr (aref newmodes 5))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1315 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1316 (aset newmodes 5 ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1317 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1318 (aset newmodes 5 ?s)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1319 (if sticky
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1320 (let ((curr (aref newmodes 8)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1321 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1322 (aset newmodes 8 ?T)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1323 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1324 (aset newmodes 8 ?t))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1325 (if read
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1326 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1327 (aset newmodes 0 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1328 (aset newmodes 3 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1329 (aset newmodes 6 ?-)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1330 (if write
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1331 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1332 (aset newmodes 1 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1333 (aset newmodes 4 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1334 (aset newmodes 7 ?-)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1335 (if execute
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1336 (let ((curr (aref newmodes 2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1337 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1338 (aset newmodes 2 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1339 (if (= curr ?s)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1340 (aset newmodes 2 ?S)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1341 (setq curr (aref newmodes 5))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1342 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1343 (aset newmodes 5 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1344 (if (= curr ?s)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1345 (aset newmodes 5 ?S)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1346 (setq curr (aref newmodes 8))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1347 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1348 (aset newmodes 8 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1349 (if (= curr ?t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1350 (aset newmodes 8 ?T)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1351 (if suid
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1352 (let ((curr (aref newmodes 2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1353 (if (= curr ?s)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1354 (aset newmodes 2 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1355 (if (= curr ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1356 (aset newmodes 2 ?-)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1357 (setq curr (aref newmodes 5))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1358 (if (= curr ?s)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1359 (aset newmodes 5 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1360 (if (= curr ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1361 (aset newmodes 5 ?-)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1362 (if sticky
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1363 (let ((curr (aref newmodes 8)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1364 (if (= curr ?t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1365 (aset newmodes 8 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1366 (if (= curr ?T)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1367 (aset newmodes 8 ?-))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1368 (if (string-match "u" who)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1369 (if add
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1370 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1371 (if read
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1372 (aset newmodes 0 ?r))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1373 (if write
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1374 (aset newmodes 1 ?w))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1375 (if execute
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1376 (let ((curr (aref newmodes 2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1377 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1378 (aset newmodes 2 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1379 (if (= curr ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1380 (aset newmodes 2 ?s)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1381 (if suid
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1382 (let ((curr (aref newmodes 2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1383 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1384 (aset newmodes 2 ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1385 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1386 (aset newmodes 2 ?s))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1387 (if read
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1388 (aset newmodes 0 ?-))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1389 (if write
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1390 (aset newmodes 1 ?-))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1391 (if execute
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1392 (let ((curr (aref newmodes 2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1393 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1394 (aset newmodes 2 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1395 (if (= curr ?s)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1396 (aset newmodes 2 ?S)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1397 (if suid
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1398 (let ((curr (aref newmodes 2)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1399 (if (= curr ?s)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1400 (aset newmodes 2 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1401 (if (= curr ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1402 (aset newmodes 2 ?-)))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1403 (if (string-match "g" who)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1404 (if add
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1405 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1406 (if read
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1407 (aset newmodes 3 ?r))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1408 (if write
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1409 (aset newmodes 4 ?w))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1410 (if execute
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1411 (let ((curr (aref newmodes 5)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1412 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1413 (aset newmodes 5 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1414 (if (= curr ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1415 (aset newmodes 5 ?s)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1416 (if suid
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1417 (let ((curr (aref newmodes 5)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1418 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1419 (aset newmodes 5 ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1420 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1421 (aset newmodes 5 ?s))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1422 (if read
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1423 (aset newmodes 3 ?-))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1424 (if write
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1425 (aset newmodes 4 ?-))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1426 (if execute
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1427 (let ((curr (aref newmodes 5)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1428 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1429 (aset newmodes 5 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1430 (if (= curr ?s)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1431 (aset newmodes 5 ?S)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1432 (if suid
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1433 (let ((curr (aref newmodes 5)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1434 (if (= curr ?s)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1435 (aset newmodes 5 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1436 (if (= curr ?S)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1437 (aset newmodes 5 ?-)))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1438 (if (string-match "o" who)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1439 (if add
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1440 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1441 (if read
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1442 (aset newmodes 6 ?r))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1443 (if write
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1444 (aset newmodes 7 ?w))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1445 (if execute
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1446 (let ((curr (aref newmodes 8)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1447 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1448 (aset newmodes 8 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1449 (if (= curr ?T)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1450 (aset newmodes 8 ?t)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1451 (if sticky
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1452 (let ((curr (aref newmodes 8)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1453 (if (= curr ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1454 (aset newmodes 8 ?T)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1455 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1456 (aset newmodes 5 ?t))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1457 (if read
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1458 (aset newmodes 6 ?-))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1459 (if write
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1460 (aset newmodes 7 ?-))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1461 (if execute
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1462 (let ((curr (aref newmodes 8)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1463 (if (= curr ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1464 (aset newmodes 8 ?-)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1465 (if (= curr ?t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1466 (aset newmodes 8 ?T)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1467 (if suid
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1468 (let ((curr (aref newmodes 8)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1469 (if (= curr ?t)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1470 (aset newmodes 8 ?x)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1471 (if (= curr ?T)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1472 (aset newmodes 8 ?-))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1473 newmodes))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1474
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1475 (defun efs-compute-chmod-arg (perms file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1476 ;; Computes the octal number, represented as a string, required to
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1477 ;; modify the permissions PERMS of FILE.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1478 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1479 (cond
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1480 ((string-match "^[0-7][0-7]?[0-7]?[0-7]?$" perms)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1481 perms)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1482 ((string-match "^[augo]+[-+][rwxst]+$" perms)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1483 (let ((curr-mode (nth 3 (efs-get-file-entry file))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1484 (or (and curr-mode
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1485 (stringp curr-mode)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1486 (= (length curr-mode) 10))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1487 (progn
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1488 ;; Current buffer is process error buffer
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1489 (insert "Require an octal integer to modify modes for "
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1490 file ".\n")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1491 (error "Require an octal integer to modify modes for %s." file)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1492 (format "%o"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1493 (efs-parse-mode-string
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1494 (efs-update-mode-string perms
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1495 (substring curr-mode 1))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1496 (t
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1497 (insert "Don't know how to set modes " perms " for " file ".\n")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1498 (error "Don't know how to set modes %s" perms)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1499
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1500 (defun efs-call-chmod (args)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1501 ;; Sends an FTP CHMOD command.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1502 (if (< (length args) 2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1503 (error "efs-call-chmod: missing mode and/or filename: %s" args))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1504 (let ((mode (car args))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1505 bombed)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1506 (mapcar
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1507 (function
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1508 (lambda (file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1509 (setq file (expand-file-name file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1510 (let ((parsed (efs-ftp-path file)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1511 (if parsed
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1512 (condition-case nil
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1513 (let* ((mode (efs-compute-chmod-arg mode file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1514 (host (nth 0 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1515 (user (nth 1 parsed))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1516 (path (efs-quote-string
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1517 (efs-host-type host user) (nth 2 parsed)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1518 (abbr (efs-relativize-filename file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1519 (result (efs-send-cmd host user
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1520 (list 'quote 'site 'chmod
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1521 mode path)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1522 (format "doing chmod %s"
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1523 abbr))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1524
98
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1525 (if (car result)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1526 (efs-dired-shell-call-process
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1527 (concat "chmod " mode " " (file-name-nondirectory file))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1528 (file-name-directory file)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1529
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1530 (efs-del-from-ls-cache file t))
98
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1531 (error (setq bombed t)))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1532 (cdr args))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1533 (if bombed 1 0))) ; return code
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1534
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1535 (defun efs-call-lpr (file command-format)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1536 "Print remote file FILE. SWITCHES are passed to the print program."
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1537 ;; Works asynch.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1538 (let* ((file (expand-file-name file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1539 (parsed (efs-ftp-path file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1540 (abbr (efs-relativize-filename file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1541 (temp (car (efs-make-tmp-name nil (car parsed)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1542 (efs-copy-file-internal
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1543 file parsed temp nil t nil 2
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1544 (efs-cont (result line cont-lines) (command-format file abbr temp)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1545 (if result
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1546 (signal 'ftp-error (list "Opening input file"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1547 (format "FTP Error: \"%s\" " line)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1548 file))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1549 (message "Spooling %s..." abbr)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1550 (set-process-sentinel
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1551 (start-process (format "*print %s /// %s*" abbr temp)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1552 (generate-new-buffer-name " *print temp*")
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1553 "sh" "-c" (format command-format temp))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1554 (function
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1555 (lambda (proc status)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1556 (let ((buff (process-buffer proc))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1557 (name (process-name proc)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1558 (if (and buff (get-buffer buff))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1559 (unwind-protect
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1560 (save-excursion
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1561 (set-buffer buff)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1562 (if (> (buffer-size) 0)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1563 (let ((log-buff (get-buffer-create
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1564 "*Shell Command Output*")))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1565 (set-buffer log-buff)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1566 (goto-char (point-max))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1567 (or (bobp)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1568 (insert "\n"))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1569 (insert-buffer-substring buff)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1570 (goto-char (point-max))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1571 (display-buffer log-buff))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1572 (condition-case nil (kill-buffer buff) (error nil))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1573 (efs-save-match-data
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1574 (if (string-match "^\\*print \\(.*\\) /// \\(.*\\)\\*$"
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1575 name)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1576 (let ((abbr (substring name (match-beginning 1)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1577 (match-end 1)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1578 (temp (substring name (match-beginning 2)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1579 (match-end 2))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1580 (or (= (match-beginning 2) (match-end 2))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1581 (efs-del-tmp-name temp))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1582 (message "Spooling %s...done" abbr))))))))))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1583 t)))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1584
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1585 ;;;; --------------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1586 ;;;; Attaching onto dired.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1587 ;;;; --------------------------------------------------------------
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1588
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1589 ;;; Look out for MULE
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1590 (if (or (boundp 'MULE) (featurep 'mule)) (load "efs-dired-mule"))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1591
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1592 ;;; Magic file name hooks for dired.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1593
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1594 (put 'dired-print-file 'efs 'efs-dired-print-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1595 (put 'dired-make-compressed-filename 'efs 'efs-dired-make-compressed-filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1596 (put 'dired-compress-file 'efs 'efs-dired-compress-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1597 (put 'dired-recursive-delete-directory 'efs
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1598 'efs-dired-recursive-delete-directory)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1599 (put 'dired-uncache 'efs 'efs-dired-uncache)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1600 (put 'dired-shell-call-process 'efs 'efs-dired-shell-call-process)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1601 (put 'dired-shell-unhandle-file-name 'efs 'efs-dired-shell-unhandle-file-name)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1602 (put 'dired-file-modtime 'efs 'efs-dired-file-modtime)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1603 (put 'dired-set-file-modtime 'efs 'efs-dired-set-file-modtime)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1604
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1605 ;;; Overwriting functions
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1606
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1607 (efs-overwrite-fn "efs" 'dired-call-process)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1608 (efs-overwrite-fn "efs" 'dired-insert-headerline)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1609 (efs-overwrite-fn "efs" 'dired-manual-move-to-filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1610 (efs-overwrite-fn "efs" 'dired-manual-move-to-end-of-filename)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1611 (efs-overwrite-fn "efs" 'dired-make-filename-string)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1612 (efs-overwrite-fn "efs" 'dired-flag-backup-files)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1613 (efs-overwrite-fn "efs" 'dired-create-files)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1614 (efs-overwrite-fn "efs" 'dired-find-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1615 (efs-overwrite-fn "efs" 'dired-find-file-other-window)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1616 (efs-overwrite-fn "efs" 'dired-find-file-other-frame)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1617 (efs-overwrite-fn "efs" 'dired-collect-file-versions)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1618 (efs-overwrite-fn "efs" 'dired-file-name-lessp)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1619
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1620 ;;; Hooks
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1621
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1622 (add-hook 'dired-before-readin-hook 'efs-dired-before-readin)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1623
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1624 ;;; Handle dired-grep.el too.
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1625
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1626 (if (featurep 'dired-grep)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1627 (efs-overwrite-fn "efs" 'dired-grep-delete-local-temp-file
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1628 'efs-diff/grep-del-temp-file)
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1629 (add-hook 'dired-grep-load-hook
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1630 (function
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1631 (lambda ()
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1632 (efs-overwrite-fn "efs" 'dired-grep-delete-local-temp-file
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1633 'efs-diff/grep-del-temp-file)))))
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1634
0d2f883870bc Import from CVS: tag r20-1b1
cvs
parents:
diff changeset
1635 ;;; end of efs-dired.el