changeset 14043:d44a43c284e7

(update-file-autoloads): Notice when searching found nothing at all. (update-autoloads-from-directory): New function. (batch-update-autoloads): Use it. (update-directory-autoloads, update-autoloads-here): Functions removed.
author Roland McGrath <roland@gnu.org>
date Sat, 06 Jan 1996 18:38:41 +0000
parents 161d50568707
children 1c331f9332ae
files lisp/emacs-lisp/autoload.el
diffstat 1 files changed, 63 insertions(+), 88 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/autoload.el	Sat Jan 06 01:03:24 1996 +0000
+++ b/lisp/emacs-lisp/autoload.el	Sat Jan 06 18:38:41 1996 +0000
@@ -156,6 +156,9 @@
 	      (set-buffer (get-buffer-create " *generate-autoload-file*"))
 	      (kill-all-local-variables)
 	      (erase-buffer)
+	      (setq buffer-undo-list t
+		    buffer-read-only nil)
+	      (emacs-lisp-mode)
 	      (insert-file-contents file nil))
 	    (save-excursion
 	      (save-restriction
@@ -286,7 +289,8 @@
     (save-excursion
       ;; We want to get a value for generated-autoload-file from
       ;; the local variables section if it's there.
-      (set-buffer (find-file-noselect file))
+      (if existing-buffer
+	  (set-buffer existing-buffer))
       (set-buffer (find-file-noselect generated-autoload-file))
       (save-excursion
 	(save-restriction
@@ -304,6 +308,7 @@
 		     (let ((begin (match-beginning 0))
 			   (last-time (nth 4 form))
 			   (file-time (nth 5 (file-attributes file))))
+		       (message "%s: las %s vs %s" file last-time file-time)
 		       (if (and (or (null existing-buffer)
 				    (not (buffer-modified-p existing-buffer)))
 				(listp last-time) (= (length last-time) 2)
@@ -326,106 +331,76 @@
 		     (goto-char (match-beginning 0))
 		     (setq found 'new)))))
 	  (or (eq found 'up-to-date)
-	      (and (eq found 'new)
+	      (and (memq found '(nil new))
 		   ;; Check that FILE has any cookies before generating a
 		   ;; new section for it.
 		   (save-excursion
-		     (set-buffer (find-file-noselect file))
+		     (if existing-buffer
+			 (set-buffer existing-buffer)
+		       ;; It is faster to avoid visiting the file.
+		       (set-buffer (get-buffer-create " *autoload-file*"))
+		       (kill-all-local-variables)
+		       (erase-buffer)
+		       (setq buffer-undo-list t
+			     buffer-read-only nil)
+		       (emacs-lisp-mode)
+		       (insert-file-contents file nil))
 		     (save-excursion
-		       (widen)
-		       (goto-char (point-min))
-		       (if (search-forward (concat "\n"
-						   generate-autoload-cookie)
-					   nil t)
-			   nil
-			 (if (interactive-p)
-			     (message file " has no autoloads"))
-			 t))))
+		       (save-restriction
+			 (widen)
+			 (goto-char (point-min))
+			 (prog1
+			     (if (search-forward
+				  (concat "\n" generate-autoload-cookie)
+				  nil t)
+				 nil
+			       (if (interactive-p)
+				   (message file " has no autoloads"))
+			       t)
+			   (or existing-buffer
+			       (kill-buffer (current-buffer))))))))
 	      (generate-file-autoloads file))))
-      (if (interactive-p) (save-buffer))
-      (if (and (null existing-buffer)
-	       (setq existing-buffer (get-file-buffer file)))
-	  (kill-buffer existing-buffer)))))
+      (if (interactive-p) (save-buffer)))))
 
 ;;;###autoload
-(defun update-autoloads-here ()
+(defun update-autoloads-from-directory (dir)
   "\
-Update sections of the current buffer generated by \\[update-file-autoloads]."
-  (interactive)
-  (let ((generated-autoload-file (buffer-file-name)))
+Update loaddefs.el with all the current autoloads from DIR, and no old ones.
+This uses `update-file-autoloads' (which see) do its work."
+  (interactive "DUpdate autoloads from directory: ")
+  (let ((files (directory-files dir nil "^[^=].*\\.el$")))
     (save-excursion
-      (goto-char (point-min))
-      (while (search-forward generate-autoload-section-header nil t)
-	(let* ((form (condition-case ()
-			 (read (current-buffer))
-		       (end-of-file nil)))
-	       (file (nth 3 form)))
-	  (if (and (stringp file)
-		   (or (get-file-buffer file)
-		       (file-exists-p file)))
-	      ()
-	    (setq file (if (y-or-n-p (format "Can't find library `%s'; remove its autoloads? "
-					     (nth 2 form) file))
-			   t
-			 (condition-case ()
-			     (read-file-name (format "Find `%s' load file: "
-						     (nth 2 form))
-					     nil nil t)
-			   (quit nil)))))
-	  (if file
-	      (let ((begin (match-beginning 0)))
-		(search-forward generate-autoload-section-trailer)
-		(delete-region begin (point))))
-	  (if (stringp file)
-	      (generate-file-autoloads file)))))))
-
-;;;###autoload
-(defun update-directory-autoloads (dir)
-  "Run \\[update-file-autoloads] on each .el file in DIR."
-  (interactive "DUpdate autoloads for directory: ")
-  (let ((enable-local-eval nil))
-    (mapcar 'update-file-autoloads
-	    (directory-files dir t "^[^=].*\\.el$")))
-  (if (interactive-p)
+      (set-buffer (find-file-noselect
+		   (if (file-exists-p generated-autoload-file)
+		       generated-autoload-file
+		     (expand-file-name generated-autoload-file
+				       dir))))
       (save-excursion
-	(set-buffer (find-file-noselect generated-autoload-file))
-	(save-buffer))))
+	(goto-char (point-min))
+	(while (search-forward generate-autoload-section-header nil t)
+	  (let* ((form (condition-case ()
+			   (read (current-buffer))
+			 (end-of-file nil)))
+		 (file (nth 3 form)))
+	    (cond ((not (stringp file)))
+		  ((not (file-exists-p (expand-file-name file dir)))
+		   ;; Remove the obsolete section.
+		   (let ((begin (match-beginning 0)))
+		     (search-forward generate-autoload-section-trailer)
+		     (delete-region begin (point))))
+		  (t
+		   (update-file-autoloads file)))
+	    (setq files (delete file files)))))
+      ;; Elements remaining in FILES have no existing autoload sections.
+      (mapcar 'update-file-autoloads files)
+      (save-buffer))))
 
 ;;;###autoload
 (defun batch-update-autoloads ()
-  "Update the autoloads for the files or directories on the command line.
-Runs \\[update-file-autoloads] on files and \\[update-directory-autoloads]
-on directories.  Must be used only with -batch, and kills Emacs on completion.
-Each file will be processed even if an error occurred previously.
-For example, invoke `emacs -batch -f batch-update-autoloads *.el'."
-  (if (not noninteractive)
-      (error "batch-update-autoloads is to be used only with -batch"))
-  (let ((lost nil)
-	(args command-line-args-left)
-	(enable-local-eval nil))	;Don't query in batch mode.
-    (message "Updating autoloads in %s..." generated-autoload-file)
-    (let ((frob (function
- 		 (lambda (file)
- 		   (condition-case lossage
- 		       (update-file-autoloads file)
- 		     (error
- 		      (princ ">>Error processing ")
- 		      (princ file)
- 		      (princ ": ")
-		      (princ (error-message-string lossage))
- 		      (princ "\n")
- 		      (setq lost t)))))))
-      (while args
- 	(if (file-directory-p (expand-file-name (car args)))
- 	    (let ((rest (directory-files (car args) t "\\.el$")))
- 	      (while rest
- 		(funcall frob (car rest))
- 		(setq rest (cdr rest))))
- 	  (funcall frob (car args)))
- 	(setq args (cdr args))))
-    (save-some-buffers t)
-    (message "Done")
-    (kill-emacs (if lost 1 0))))
+  "Update loaddefs.el autoloads in batch mode.
+Calls `update-autoloads-from-directory' on each command line argument."
+  (mapcar 'update-autoloads-from-directory command-line-args-left)
+  (setq command-line-args-left nil))
 
 (provide 'autoload)