]> git.eshelyaron.com Git - emacs.git/commitdiff
add file name to autoload error messages.
authorStephen Leake <stephen_leake@stephe-leake.org>
Wed, 22 Jul 2015 09:29:38 +0000 (04:29 -0500)
committerStephen Leake <stephen_leake@stephe-leake.org>
Wed, 22 Jul 2015 09:31:44 +0000 (04:31 -0500)
* lisp/emacs-lisp/autoload.el (autoload-save-buffers): add condition-case
  to add file name to error message.

lisp/emacs-lisp/autoload.el

index 9d1abdddb2bba4a6167eea940fd79b4ac812153c..12d0a94127f54be6ceca87bb47405eddb09d8c39 100644 (file)
@@ -524,117 +524,130 @@ different from OUTFILE, then OUTBUF is ignored.
 Return non-nil if and only if FILE adds no autoloads to OUTFILE
 \(or OUTBUF if OUTFILE is nil).  The actual return value is
 FILE's modification time."
-  (let (load-name
-       (print-length nil)
-       (print-level nil)
-       (print-readably t)           ; This does something in Lucid Emacs.
-       (float-output-format nil)
-       (visited (get-file-buffer file))
-       (otherbuf nil)
-       (absfile (expand-file-name file))
-       ;; nil until we found a cookie.
-       output-start)
-    (when
-       (catch 'done
-         (with-current-buffer (or visited
-                                  ;; It is faster to avoid visiting the file.
-                                  (autoload-find-file file))
-           ;; Obey the no-update-autoloads file local variable.
-           (unless no-update-autoloads
-             (or noninteractive (message "Generating autoloads for %s..." file))
-             (setq load-name
-                   (if (stringp generated-autoload-load-name)
-                       generated-autoload-load-name
-                     (autoload-file-load-name absfile)))
-             ;; FIXME? Comparing file-names for equality with just equal
-             ;; is fragile, eg if one has an automounter prefix and one
-             ;; does not, but both refer to the same physical file.
-             (when (and outfile
-                        (not
-                         (if (memq system-type '(ms-dos windows-nt))
-                             (equal (downcase outfile)
-                                    (downcase (autoload-generated-file)))
-                           (equal outfile (autoload-generated-file)))))
-               (setq otherbuf t))
-             (save-excursion
-               (save-restriction
-                 (widen)
-                 (when autoload-builtin-package-versions
-                   (let ((version (lm-header "version"))
-                         package)
-                     (and version
-                          (setq version (ignore-errors (version-to-list version)))
-                          (setq package (or (lm-header "package")
-                                            (file-name-sans-extension
-                                             (file-name-nondirectory file))))
-                          (setq output-start (autoload--setup-output
-                                              otherbuf outbuf absfile load-name))
-                          (let ((standard-output (marker-buffer output-start))
-                                (print-quoted t))
-                            (princ `(push (purecopy
-                                           ',(cons (intern package) version))
-                                          package--builtin-versions))
-                            (princ "\n")))))
-
-                 (goto-char (point-min))
-                 (while (not (eobp))
-                   (skip-chars-forward " \t\n\f")
-                   (cond
-                    ((looking-at (regexp-quote generate-autoload-cookie))
-                     ;; If not done yet, figure out where to insert this text.
-                     (unless output-start
-                       (setq output-start (autoload--setup-output
-                                           otherbuf outbuf absfile load-name)))
-                     (autoload--print-cookie-text output-start load-name file))
-                    ((looking-at ";")
-                     ;; Don't read the comment.
-                     (forward-line 1))
-                    (t
-                     (forward-sexp 1)
-                     (forward-line 1))))))
-
-             (when output-start
-               (let ((secondary-autoloads-file-buf
-                      (if otherbuf (current-buffer))))
-                 (with-current-buffer (marker-buffer output-start)
-                   (save-excursion
-                     ;; Insert the section-header line which lists the file name
-                     ;; and which functions are in it, etc.
-                     (goto-char output-start)
-                     (let ((relfile (file-relative-name absfile)))
-                       (autoload-insert-section-header
-                        (marker-buffer output-start)
-                        () load-name relfile
-                        (if secondary-autoloads-file-buf
-                            ;; MD5 checksums are much better because they do not
-                            ;; change unless the file changes (so they'll be
-                            ;; equal on two different systems and will change
-                            ;; less often than time-stamps, thus leading to fewer
-                            ;; unneeded changes causing spurious conflicts), but
-                            ;; using time-stamps is a very useful optimization,
-                            ;; so we use time-stamps for the main autoloads file
-                            ;; (loaddefs.el) where we have special ways to
-                            ;; circumvent the "random change problem", and MD5
-                            ;; checksum in secondary autoload files where we do
-                            ;; not need the time-stamp optimization because it is
-                            ;; already provided by the primary autoloads file.
-                            (md5 secondary-autoloads-file-buf
-                                 ;; We'd really want to just use
-                                 ;; `emacs-internal' instead.
-                                 nil nil 'emacs-mule-unix)
-                          (nth 5 (file-attributes relfile))))
-                       (insert ";;; Generated autoloads from " relfile "\n")))
-                   (insert generate-autoload-section-trailer))))
-             (or noninteractive
-                 (message "Generating autoloads for %s...done" file)))
-           (or visited
-               ;; We created this buffer, so we should kill it.
-               (kill-buffer (current-buffer))))
-         (or (not output-start)
-             ;; If the entries were added to some other buffer, then the file
-             ;; doesn't add entries to OUTFILE.
-             otherbuf))
-      (nth 5 (file-attributes absfile)))))
+  ;; Include the file name in any error messages
+  (condition-case err
+      (let (load-name
+            (print-length nil)
+            (print-level nil)
+            (print-readably t)           ; This does something in Lucid Emacs.
+            (float-output-format nil)
+            (visited (get-file-buffer file))
+            (otherbuf nil)
+            (absfile (expand-file-name file))
+            ;; nil until we found a cookie.
+            output-start)
+        (when
+            (catch 'done
+              (with-current-buffer (or visited
+                                       ;; It is faster to avoid visiting the file.
+                                       (autoload-find-file file))
+                ;; Obey the no-update-autoloads file local variable.
+                (unless no-update-autoloads
+                  (or noninteractive (message "Generating autoloads for %s..." file))
+                  (setq load-name
+                        (if (stringp generated-autoload-load-name)
+                            generated-autoload-load-name
+                          (autoload-file-load-name absfile)))
+                  ;; FIXME? Comparing file-names for equality with just equal
+                  ;; is fragile, eg if one has an automounter prefix and one
+                  ;; does not, but both refer to the same physical file.
+                  (when (and outfile
+                             (not
+                              (if (memq system-type '(ms-dos windows-nt))
+                                  (equal (downcase outfile)
+                                         (downcase (autoload-generated-file)))
+                                (equal outfile (autoload-generated-file)))))
+                    (setq otherbuf t))
+                  (save-excursion
+                    (save-restriction
+                      (widen)
+                      (when autoload-builtin-package-versions
+                        (let ((version (lm-header "version"))
+                              package)
+                          (and version
+                               (setq version (ignore-errors (version-to-list version)))
+                               (setq package (or (lm-header "package")
+                                                 (file-name-sans-extension
+                                                  (file-name-nondirectory file))))
+                               (setq output-start (autoload--setup-output
+                                                   otherbuf outbuf absfile load-name))
+                               (let ((standard-output (marker-buffer output-start))
+                                     (print-quoted t))
+                                 (princ `(push (purecopy
+                                                ',(cons (intern package) version))
+                                               package--builtin-versions))
+                                 (princ "\n")))))
+
+                      (goto-char (point-min))
+                      (while (not (eobp))
+                        (skip-chars-forward " \t\n\f")
+                        (cond
+                         ((looking-at (regexp-quote generate-autoload-cookie))
+                          ;; If not done yet, figure out where to insert this text.
+                          (unless output-start
+                            (setq output-start (autoload--setup-output
+                                                otherbuf outbuf absfile load-name)))
+                          (autoload--print-cookie-text output-start load-name file))
+                         ((looking-at ";")
+                          ;; Don't read the comment.
+                          (forward-line 1))
+                         (t
+                          (forward-sexp 1)
+                          (forward-line 1))))))
+
+                  (when output-start
+                    (let ((secondary-autoloads-file-buf
+                           (if otherbuf (current-buffer))))
+                      (with-current-buffer (marker-buffer output-start)
+                        (save-excursion
+                          ;; Insert the section-header line which lists the file name
+                          ;; and which functions are in it, etc.
+                          (goto-char output-start)
+                          (let ((relfile (file-relative-name absfile)))
+                            (autoload-insert-section-header
+                             (marker-buffer output-start)
+                             () load-name relfile
+                             (if secondary-autoloads-file-buf
+                                 ;; MD5 checksums are much better because they do not
+                                 ;; change unless the file changes (so they'll be
+                                 ;; equal on two different systems and will change
+                                 ;; less often than time-stamps, thus leading to fewer
+                                 ;; unneeded changes causing spurious conflicts), but
+                                 ;; using time-stamps is a very useful optimization,
+                                 ;; so we use time-stamps for the main autoloads file
+                                 ;; (loaddefs.el) where we have special ways to
+                                 ;; circumvent the "random change problem", and MD5
+                                 ;; checksum in secondary autoload files where we do
+                                 ;; not need the time-stamp optimization because it is
+                                 ;; already provided by the primary autoloads file.
+                                 (md5 secondary-autoloads-file-buf
+                                      ;; We'd really want to just use
+                                      ;; `emacs-internal' instead.
+                                      nil nil 'emacs-mule-unix)
+                               (nth 5 (file-attributes relfile))))
+                            (insert ";;; Generated autoloads from " relfile "\n")))
+                        (insert generate-autoload-section-trailer))))
+                  (or noninteractive
+                      (message "Generating autoloads for %s...done" file)))
+                (or visited
+                    ;; We created this buffer, so we should kill it.
+                    (kill-buffer (current-buffer))))
+              (or (not output-start)
+                  ;; If the entries were added to some other buffer, then the file
+                  ;; doesn't add entries to OUTFILE.
+                  otherbuf))
+          (nth 5 (file-attributes absfile))))
+    (error
+     ;; Probably unbalanced parens in forward-sexp. In that case, the
+     ;; condition is scan-error, and the signal data includes point
+     ;; where the error was found; we'd like to convert that to
+     ;; line:col, but line-number-at-pos gets the wrong line in batch
+     ;; mode for some reason.
+     ;;
+     ;; At least this gets the file name in the error message; the
+     ;; developer can use goto-char to get to the error position.
+     (error "%s:0:0: error: %s: %s" file (car err) (cdr err)))
+    ))
 \f
 (defun autoload-save-buffers ()
   (while autoload-modified-buffers