changeset 81602:ea507ef94ad6

Refactor for upcoming changes. (autoload-find-destination): New function extracted from update-file-autoloads. (update-file-autoloads): Use it.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 25 Jun 2007 03:01:22 +0000
parents 509be28863a8
children 6a5ecb520686
files lisp/ChangeLog lisp/emacs-lisp/autoload.el
diffstat 2 files changed, 76 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Jun 24 22:53:02 2007 +0000
+++ b/lisp/ChangeLog	Mon Jun 25 03:01:22 2007 +0000
@@ -1,3 +1,10 @@
+2007-06-25  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* emacs-lisp/autoload.el: Refactor for upcoming changes.
+	(autoload-find-destination): New function extracted from
+	update-file-autoloads.
+	(update-file-autoloads): Use it.
+
 2007-06-24  Jay Belanger  <jay.p.belanger@gmail.com>
 
 	* calc/calc-comb.el (math-init-random-base,math-prime-test):
@@ -6,7 +13,7 @@
 
 	* calc/calc-misc.el (math-div2-bignum): Use math-bignum-digit-size.
 
-	* calc/calc-math.el (math-scale-bignum-digit-size): Renamed from
+	* calc/calc-math.el (math-scale-bignum-digit-size): Rename from
 	math-scale-bignum-3.
 	(math-isqrt-bignum): Use math-scale-bignum-digit-size and
 	math-bignum-digit-size.
@@ -24,8 +31,8 @@
 	(bibtex-insert-kill, bibtex-mark-entry): Use push-mark.
 	(bibtex-format-entry, bibtex-reformat): Handle new options of
 	bibtex-entry-format.
-	(bibtex-field-re-init, bibtex-font-lock-cite, bibtex-dist): New
-	functions.
+	(bibtex-field-re-init, bibtex-font-lock-cite, bibtex-dist):
+	New functions.
 	(bibtex-complete-internal): Do not display messages while
 	minibuffer is used.  Do not leave around a completions buffer
 	that is out of date.
--- a/lisp/emacs-lisp/autoload.el	Sun Jun 24 22:53:02 2007 +0000
+++ b/lisp/emacs-lisp/autoload.el	Mon Jun 25 03:01:22 2007 +0000
@@ -412,74 +412,82 @@
 
 Return FILE if there was no autoload cookie in it, else nil."
   (interactive "fUpdate autoloads for file: \np")
+  (let ((existing-buffer (get-file-buffer file)))
+    (with-temp-buffer
+      ;; Let's presume the file is not visited, so we call
+      ;; autoload-find-destination from a dummy buffer, except if the file
+      ;; is visited, in which case we use that buffer instead.
+      (if existing-buffer (set-buffer existing-buffer))
+
+      (catch 'up-to-date
+        (let ((buf (autoload-find-destination file)))
+          (with-current-buffer buf
+            (let ((no-autoloads (generate-file-autoloads file)))
+              
+              (and save-after
+                   (buffer-modified-p)
+                   (save-buffer))
+
+              (if no-autoloads file))))))))
+
+(defun autoload-find-destination (file)
+  "Find the destination point of the current buffer's autoloads.
+FILE is the file name of the current buffer.
+Returns a buffer whose point is placed at the requested location.
+Throws `up-to-date' if the file's autoloads are uptodate, otherwise
+removes any prior now out-of-date autoload entries.
+The current buffer only matters if it is visiting a file or if it has a buffer-local
+value for some variables such as `generated-autoload-file', so it's OK
+to call it from a dummy buffer if FILE is not currently visited."
+  ;; (message "autoload-find-destination %S" file)
   (let ((load-name (autoload-file-load-name file))
-	(found nil)
-	(existing-buffer (get-file-buffer file))
-	(no-autoloads nil))
-    (save-excursion
-      ;; We want to get a value for generated-autoload-file from
-      ;; the local variables section if it's there.
-      (if existing-buffer
-	  (set-buffer existing-buffer))
-      ;; We must read/write the file without any code conversion,
-      ;; but still decode EOLs.
-      (let ((coding-system-for-read 'raw-text))
-	(set-buffer (find-file-noselect
-		     (autoload-ensure-default-file (autoload-generated-file))))
-	;; This is to make generated-autoload-file have Unix EOLs, so
-	;; that it is portable to all platforms.
-	(setq buffer-file-coding-system 'raw-text-unix))
+        (existing-buffer (if buffer-file-name (current-buffer)))
+	(found nil))
+    (with-current-buffer
+        ;; We must read/write the file without any code conversion,
+        ;; but still decode EOLs.
+        (let ((coding-system-for-read 'raw-text))
+          (find-file-noselect
+           (autoload-ensure-default-file (autoload-generated-file))))
+      ;; This is to make generated-autoload-file have Unix EOLs, so
+      ;; that it is portable to all platforms.
+      (setq buffer-file-coding-system 'raw-text-unix)
       (or (> (buffer-size) 0)
 	  (error "Autoloads file %s does not exist" buffer-file-name))
       (or (file-writable-p buffer-file-name)
 	  (error "Autoloads file %s is not writable" buffer-file-name))
-      (save-excursion
-	(save-restriction
-	  (widen)
-	  (goto-char (point-min))
-	  ;; Look for the section for LOAD-NAME.
-	  (while (and (not found)
-		      (search-forward generate-autoload-section-header nil t))
-	    (let ((form (autoload-read-section-header)))
-	      (cond ((string= (nth 2 form) load-name)
-		     ;; We found the section for this file.
-		     ;; Check if it is up to date.
-		     (let ((begin (match-beginning 0))
-			   (last-time (nth 4 form))
+      (widen)
+      (goto-char (point-min))
+      ;; Look for the section for LOAD-NAME.
+      (while (and (not found)
+                  (search-forward generate-autoload-section-header nil t))
+        (let ((form (autoload-read-section-header)))
+          (cond ((string= (nth 2 form) load-name)
+                 ;; We found the section for this file.
+                 ;; Check if it is up to date.
+                 (let ((begin (match-beginning 0))
+                       (last-time (nth 4 form))
 			   (file-time (nth 5 (file-attributes file))))
 		       (if (and (or (null existing-buffer)
 				    (not (buffer-modified-p existing-buffer)))
 				(listp last-time) (= (length last-time) 2)
 				(not (time-less-p last-time file-time)))
-			   (progn
-			     (if (interactive-p)
-				 (message "\
-Autoload section for %s is up to date."
-					  file))
-			     (setq found 'up-to-date))
-			 (search-forward generate-autoload-section-trailer)
-			 (delete-region begin (point))
-			 (setq found t))))
-		    ((string< load-name (nth 2 form))
-		     ;; We've come to a section alphabetically later than
-		     ;; LOAD-NAME.  We assume the file is in order and so
-		     ;; there must be no section for LOAD-NAME.  We will
-		     ;; insert one before the section here.
-		     (goto-char (match-beginning 0))
-		     (setq found 'new)))))
-	  (or found
-	      (progn
-		(setq found 'new)
-		;; No later sections in the file.  Put before the last page.
-		(goto-char (point-max))
-		(search-backward "\f" nil t)))
-	  (or (eq found 'up-to-date)
-	      (setq no-autoloads (generate-file-autoloads file)))))
-      (and save-after
-	   (buffer-modified-p)
-	   (save-buffer))
-
-      (if no-autoloads file))))
+                       (throw 'up-to-date nil)
+                     (autoload-remove-section (match-beginning 0))
+                     (setq found t))))
+                ((string< load-name (nth 2 form))
+                 ;; We've come to a section alphabetically later than
+                 ;; LOAD-NAME.  We assume the file is in order and so
+                 ;; there must be no section for LOAD-NAME.  We will
+                 ;; insert one before the section here.
+                 (goto-char (match-beginning 0))
+                 (setq found t)))))
+      (or found
+          (progn
+            ;; No later sections in the file.  Put before the last page.
+            (goto-char (point-max))
+            (search-backward "\f" nil t)))
+      (current-buffer))))
 
 (defun autoload-remove-section (begin)
   (goto-char begin)