]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix searching for tags in compressed files
authorMauro Aranda <maurooaranda@gmail.com>
Thu, 12 Oct 2023 12:41:58 +0000 (09:41 -0300)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 15 Oct 2023 04:09:52 +0000 (00:09 -0400)
* lisp/progmodes/etags.el (etags--ensure-file): New function.
(etags--all-files): Make sure files in TAGS can be visited, even if
the files are compressed.  (Bug#2807)
(etags--xref-find-definitions): Report to xref a file that we are sure
it exists.  (Bug#44494)

lisp/progmodes/etags.el

index cb95f29b5fe3247a039d7e543bd5f1c0b8035701..d48dcc6659db9e50ccf1db8982a76f9f07a144bc 100644 (file)
@@ -1729,6 +1729,21 @@ if the file was newly read in, the value is the filename."
   (fileloop-next-file novisit)
   (switch-to-buffer (current-buffer)))
 
+(defun etags--ensure-file (file)
+  "Ensure FILE can be visited.
+
+FILE should be an expanded file name.
+This function tries to locate FILE, possibly adding it a suffix
+present in `tags-compression-info-list'.  If the file can't be found,
+signals an error.
+Else, returns the filename that can be visited for sure."
+  (let ((f (locate-file file nil (if auto-compression-mode
+                                    tags-compression-info-list
+                                  '("")))))
+    (unless f
+      (signal 'file-missing (list "Cannot locate file in TAGS" file)))
+    f))
+
 (defun tags--all-files ()
   (save-excursion
     (let ((cbuf (current-buffer))
@@ -1750,7 +1765,7 @@ if the file was newly read in, the value is the filename."
           ;; list later returned by (tags-table-files).
           (setf (if tail (cdr tail) files)
                 (mapcar #'expand-file-name (tags-table-files)))))
-      files)))
+      (mapcar #'etags--ensure-file files))))
 
 (make-obsolete-variable 'tags-loop-operate 'fileloop-initialize "27.1")
 (defvar tags-loop-operate nil
@@ -2137,7 +2152,7 @@ file name, add `tag-partial-file-name-match-p' to the list value.")
               (beginning-of-line)
               (pcase-let* ((tag-info (etags-snarf-tag))
                            (`(,hint ,line . _) tag-info))
-                (let* ((file (file-of-tag))
+                (let* ((file (etags--ensure-file (file-of-tag)))
                        (mark-key (cons file line)))
                   (unless (gethash mark-key marks)
                     (let ((loc (xref-make-etags-location