Subject: Re: bug#64516: [PATCH] docview: Only enable imenu when supported

From: Morgan Smith <[email-masked]>
Date: Tue, 11 Jul 2023 14:22:49 -0400

>From d2315c945d6fd87a2371eefb82ec0241287e66a1 Mon Sep 17 00:00:00 2001
From: Morgan Smith <[email-masked]>
Date: Tue, 11 Jul 2023 14:08:24 -0400
Subject: [PATCH] docview: imenu: check return value of 'mutool'

While 'mutool' supports many filetypes, 'mutool show' only supports
PDF files.  This would lead to cryptic imenu errors when opening other
file types (like EPUB) since we would parse the error output.  During
my testing this caused 'imenu--index-alist' to have a value of '(nil).

* lisp/doc-view.el (doc-view--pdf-outline): Error when 'mutool' returns
an error.  Use 'call-process' to get the return value and remove the
call to 'shell-quote-argument' as 'call-process' doesn't want any
escapes.
(doc-view-mode): Run 'doc-view-imenu-setup' in the
'doc-view-mode-hook' so that errors don't prevent displaying the
document.
---
 lisp/doc-view.el | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index b14655fb274..f64c3a9719b 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -147,6 +147,8 @@
 (require 'filenotify)
 (eval-when-compile (require 'subr-x))
 
+(autoload 'imenu-unavailable-error "imenu")
+
 ;;;; Customization Options
 
 (defgroup doc-view nil
@@ -1910,9 +1912,10 @@ doc-view--pdf-outline
   (let ((fn (or file-name (buffer-file-name))))
     (when fn
       (let ((outline nil)
-            (fn (shell-quote-argument (expand-file-name fn))))
+            (fn (expand-file-name fn)))
         (with-temp-buffer
-          (insert (shell-command-to-string (format "mutool show %s outline" fn)))
+          (unless (= 0 (call-process "mutool" nil (current-buffer) nil "show" fn "outline"))
+            (imenu-unavailable-error "Unable to create imenu index using `mutool'"))
           (goto-char (point-min))
           (while (re-search-forward doc-view--outline-rx nil t)
             (push `((level . ,(length (match-string 1)))
@@ -2236,7 +2239,7 @@ doc-view-mode
     (setq mode-name "DocView"
 	  buffer-read-only t
 	  major-mode 'doc-view-mode)
-    (doc-view-imenu-setup)
+    (add-hook 'doc-view-mode-hook #'doc-view-imenu-setup nil t)
     (doc-view-initiate-display)
     ;; Switch off view-mode explicitly, because doc-view-mode is the
     ;; canonical view mode for PDF/PS/DVI files.  This could be
-- 
2.40.1

Hello,

I apologize for my "oops I figured it out immediately after I sent the
email" syndrome.  I was trying to find the answer in the bug reports
when the answer was in the code and quite obvious.

Anyways here is a patch that unconditionally enables imenu but checks
the return value of mutool and will raise an imenu-unavailable-error
when it is not successful.  However, that error stops docview from
displaying the document so I decided to put the setup function in a hook
so the error occurs after the document is displayed.

I looked briefly for documentation on how errors work in hooks but could
not find any.  I don't want this error to prevent the other hooks from
being run (which would be user defined hooks.  we don't currently use
this hook).

Thanks,

Morgan