aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland McGrath1994-02-07 22:19:05 +0000
committerRoland McGrath1994-02-07 22:19:05 +0000
commit72c19d97c1f5802878c9cfdc049407141101d6e2 (patch)
treebbe04952e3c82e3f0d1bb02694aed13b7cfa3c0f
parent014b16787148ace18e077925a49ec3045e549843 (diff)
downloademacs-72c19d97c1f5802878c9cfdc049407141101d6e2.tar.gz
emacs-72c19d97c1f5802878c9cfdc049407141101d6e2.zip
(autoload-trim-file-name): New function.
(generate-file-autoloads): Bind print-readably to t for Lucid. Use autoload-trim-file-name on FILE when inserting the name. Scan written text and fix up ^L to \f and ( at bol to \(. (update-file-autoloads): When we find a later file's section, set FOUND to 'new. If FOUND is 'new after loop, check file for autoload cookies and don't call generate-file-autoloads if none. (update-directory-autoloads): Get absolute file names from directory-files. (batch-update-autoloads): Rewrite from jwz to process later files in a directory after one file errs.
-rw-r--r--lisp/emacs-lisp/autoload.el189
1 files changed, 124 insertions, 65 deletions
diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el
index cce626f9a99..0a8ebb6524d 100644
--- a/lisp/emacs-lisp/autoload.el
+++ b/lisp/emacs-lisp/autoload.el
@@ -95,6 +95,14 @@ the section of autoloads for a file.")
95(put 'defconst 'doc-string-elt 3) 95(put 'defconst 'doc-string-elt 3)
96(put 'defmacro 'doc-string-elt 3) 96(put 'defmacro 'doc-string-elt 3)
97 97
98(defun autoload-trim-file-name (file)
99 ;; Returns a relative pathname of FILE including the last directory.
100 (setq file (expand-file-name file))
101 (file-relative-name file
102 (file-name-directory
103 (directory-file-name
104 (file-name-directory file)))))
105
98(defun generate-file-autoloads (file) 106(defun generate-file-autoloads (file)
99 "Insert at point a loaddefs autoload section for FILE. 107 "Insert at point a loaddefs autoload section for FILE.
100autoloads are generated for defuns and defmacros in FILE 108autoloads are generated for defuns and defmacros in FILE
@@ -109,6 +117,7 @@ are used."
109 (substring name 0 (match-beginning 0)) 117 (substring name 0 (match-beginning 0))
110 name))) 118 name)))
111 (print-length nil) 119 (print-length nil)
120 (print-readably t) ; This does something in Lucid Emacs.
112 (float-output-format nil) 121 (float-output-format nil)
113 (done-any nil) 122 (done-any nil)
114 (visited (get-file-buffer file)) 123 (visited (get-file-buffer file))
@@ -146,55 +155,76 @@ are used."
146 (search-forward generate-autoload-cookie) 155 (search-forward generate-autoload-cookie)
147 (skip-chars-forward " \t") 156 (skip-chars-forward " \t")
148 (setq done-any t) 157 (setq done-any t)
149 (if (eolp) 158 (let ((begin (save-excursion (set-buffer outbuf)
150 ;; Read the next form and make an autoload. 159 (point))))
151 (let* ((form (prog1 (read (current-buffer)) 160 (if (eolp)
152 (forward-line 1))) 161 ;; Read the next form and make an autoload.
153 (autoload (make-autoload form load-name)) 162 (let* ((form (prog1 (read (current-buffer))
154 (doc-string-elt (get (car-safe form) 163 (forward-line 1)))
155 'doc-string-elt))) 164 (autoload (make-autoload form load-name))
156 (if autoload 165 (doc-string-elt (get (car-safe form)
157 (setq autoloads-done (cons (nth 1 form) 166 'doc-string-elt)))
158 autoloads-done)) 167 (if autoload
159 (setq autoload form)) 168 (setq autoloads-done (cons (nth 1 form)
160 (if (and doc-string-elt 169 autoloads-done))
161 (stringp (nth doc-string-elt autoload))) 170 (setq autoload form))
162 ;; We need to hack the printing because the 171 (if (and doc-string-elt
163 ;; doc-string must be printed specially for 172 (stringp (nth doc-string-elt autoload)))
164 ;; make-docfile (sigh). 173 ;; We need to hack the printing because the
165 (let* ((p (nthcdr (1- doc-string-elt) 174 ;; doc-string must be printed specially for
166 autoload)) 175 ;; make-docfile (sigh).
167 (elt (cdr p))) 176 (let* ((p (nthcdr (1- doc-string-elt)
168 (setcdr p nil) 177 autoload))
169 (princ "\n(" outbuf) 178 (elt (cdr p)))
170 (let ((print-escape-newlines t)) 179 (setcdr p nil)
171 (mapcar (function (lambda (elt) 180 (princ "\n(" outbuf)
172 (prin1 elt outbuf) 181 (let ((print-escape-newlines t))
173 (princ " " outbuf))) 182 (mapcar (function (lambda (elt)
174 autoload)) 183 (prin1 elt outbuf)
175 (princ "\"\\\n" outbuf) 184 (princ " " outbuf)))
176 (princ (substring 185 autoload))
177 (prin1-to-string (car elt)) 1) 186 (princ "\"\\\n" outbuf)
178 outbuf) 187 (let ((begin (save-excursion
179 (if (null (cdr elt)) 188 (set-buffer outbuf)
180 (princ ")" outbuf) 189 (point))))
181 (princ " " outbuf)
182 (princ (substring 190 (princ (substring
183 (prin1-to-string (cdr elt)) 191 (prin1-to-string (car elt)) 1)
184 1) 192 outbuf)
185 outbuf)) 193 ;; Insert a backslash before each ( that
186 (terpri outbuf)) 194 ;; appears at the beginning of a line in
187 (print autoload outbuf))) 195 ;; the doc string.
188 ;; Copy the rest of the line to the output. 196 (save-excursion
189 (let ((begin (point))) 197 (set-buffer outbuf)
190 (forward-line 1) 198 (save-excursion
191 (princ (buffer-substring begin (point)) outbuf)))) 199 (while (search-backward "\n(" begin t)
192 ((looking-at ";") 200 (forward-char 1)
193 ;; Don't read the comment. 201 (insert "\\"))))
194 (forward-line 1)) 202 (if (null (cdr elt))
195 (t 203 (princ ")" outbuf)
196 (forward-sexp 1) 204 (princ " " outbuf)
197 (forward-line 1))))))) 205 (princ (substring
206 (prin1-to-string (cdr elt))
207 1)
208 outbuf))
209 (terpri outbuf))
210 (print autoload outbuf)))
211 ;; Copy the rest of the line to the output.
212 (let ((begin (point)))
213 (forward-line 1)
214 (princ (buffer-substring begin (point)) outbuf)))
215 (save-excursion
216 (set-buffer outbuf)
217 ;; Replace literal ^Ls with \f in what we just wrote.
218 (save-excursion
219 (while (search-backward "\f" begin t)
220 (delete-char 1)
221 (insert "\\f"))))))
222 ((looking-at ";")
223 ;; Don't read the comment.
224 (forward-line 1))
225 (t
226 (forward-sexp 1)
227 (forward-line 1)))))))
198 (or visited 228 (or visited
199 ;; We created this buffer, so we should kill it. 229 ;; We created this buffer, so we should kill it.
200 (kill-buffer (current-buffer))) 230 (kill-buffer (current-buffer)))
@@ -203,11 +233,13 @@ are used."
203 (if done-any 233 (if done-any
204 (progn 234 (progn
205 (insert generate-autoload-section-header) 235 (insert generate-autoload-section-header)
206 (prin1 (list 'autoloads autoloads-done load-name file 236 (prin1 (list 'autoloads autoloads-done load-name
237 (autoload-trim-file-name file)
207 (nth 5 (file-attributes file))) 238 (nth 5 (file-attributes file)))
208 outbuf) 239 outbuf)
209 (terpri outbuf) 240 (terpri outbuf)
210 (insert ";;; Generated autoloads from " file "\n") 241 (insert ";;; Generated autoloads from "
242 (autoload-trim-file-name file) "\n")
211 (goto-char output-end) 243 (goto-char output-end)
212 (insert generate-autoload-section-trailer))) 244 (insert generate-autoload-section-trailer)))
213 (message "Generating autoloads for %s...done" file))) 245 (message "Generating autoloads for %s...done" file)))
@@ -269,8 +301,23 @@ autoloads go somewhere else.")
269 ;; there must be no section for LOAD-NAME. We will 301 ;; there must be no section for LOAD-NAME. We will
270 ;; insert one before the section here. 302 ;; insert one before the section here.
271 (goto-char (match-beginning 0)) 303 (goto-char (match-beginning 0))
272 (setq found t))))) 304 (setq found 'new)))))
273 (if (eq found t) 305 (or (eq found 'up-to-date)
306 (and (eq found 'new)
307 ;; Check that FILE has any cookies before generating a
308 ;; new section for it.
309 (save-excursion
310 (set-buffer (find-file-noselect file))
311 (save-excursion
312 (widen)
313 (goto-char (point-min))
314 (if (search-forward (concat "\n"
315 generate-autoload-cookie)
316 nil t)
317 nil
318 (if (interactive-p)
319 (message file " has no autoloads"))
320 t))))
274 (generate-file-autoloads file)) 321 (generate-file-autoloads file))
275 (setq done t))) 322 (setq done t)))
276 (if (interactive-p) (save-buffer)) 323 (if (interactive-p) (save-buffer))
@@ -316,7 +363,7 @@ file \"%s\") doesn't exist. Remove its autoload section? "
316 "Run \\[update-file-autoloads] on each .el file in DIR." 363 "Run \\[update-file-autoloads] on each .el file in DIR."
317 (interactive "DUpdate autoloads for directory: ") 364 (interactive "DUpdate autoloads for directory: ")
318 (mapcar 'update-file-autoloads 365 (mapcar 'update-file-autoloads
319 (directory-files dir nil "\\.el$")) 366 (directory-files dir t "\\.el$"))
320 (if (interactive-p) 367 (if (interactive-p)
321 (save-excursion 368 (save-excursion
322 (set-buffer (find-file-noselect generated-autoload-file)) 369 (set-buffer (find-file-noselect generated-autoload-file))
@@ -332,18 +379,30 @@ For example, invoke \"emacs -batch -f batch-update-autoloads *.el\""
332 (if (not noninteractive) 379 (if (not noninteractive)
333 (error "batch-update-autoloads is to be used only with -batch")) 380 (error "batch-update-autoloads is to be used only with -batch"))
334 (let ((lost nil) 381 (let ((lost nil)
335 (args command-line-args-left)) 382 (args command-line-args-left)
336 (while args 383 (enable-local-eval nil)) ;Don't query in batch mode.
337 (catch 'file 384 (message "Updating autoloads in %s..." generated-autoload-file)
338 (condition-case lossage 385 (let ((frob (function
339 (if (file-directory-p (expand-file-name (car args))) 386 (lambda (file)
340 (update-directory-autoloads (car args)) 387 (condition-case lossage
341 (update-file-autoloads (car args))) 388 (update-file-autoloads file)
342 (error (progn (message ">>Error processing %s: %s" 389 (error
343 (car args) lossage) 390 (princ ">>Error processing ")
344 (setq lost t) 391 (princ file)
345 (throw 'file nil))))) 392 (princ ": ")
346 (setq args (cdr args))) 393 (if (fboundp 'display-error)
394 (display-error lossage nil)
395 (prin1 lossage))
396 (princ "\n")
397 (setq lost t)))))))
398 (while args
399 (if (file-directory-p (expand-file-name (car args)))
400 (let ((rest (directory-files (car args) t "\\.el$")))
401 (while rest
402 (funcall frob (car rest))
403 (setq rest (cdr rest))))
404 (funcall frob (car args)))
405 (setq args (cdr args)))
347 (save-some-buffers t) 406 (save-some-buffers t)
348 (message "Done") 407 (message "Done")
349 (kill-emacs (if lost 1 0)))) 408 (kill-emacs (if lost 1 0))))