Subject: bug#79356: 31.0.50; 'C-x p r' fails when there are .gpg files EPA can't decrypt

From: Sean Whitton <[email-masked]>
Date: Sun, 31 Aug 2025 17:25:27 +0100

X-debbugs-cc: [email-masked]

If you try to use 'C-x p r' in emacs.git it exits partway through
because insert-file-contents for etc/package-keyring.gpg cannot succeed.
EPA tries to decrypt the file but can't because it's a keyring.
It even suggests what the problem is:

--8<---------------cut here---------------start------------->8---
Error while decrypting with "/usr/bin/gpg2":

gpg: decrypt_message failed: Unexpected error

(File possibly not an encrypted file, but is perhaps a key ring file?)
--8<---------------cut here---------------end--------------->8---

The problem is a bit more general than just keyrings.  In other
repositories I work with there are encrypted files used as test suite
data.  I don't have the keys in my personal keyring; the keys too are
dummy test suite data, loaded up by the test suite.

In either case the presence of these files shouldn't make it impossible
to use 'C-x p r'.  So how about doing something like this:

--8<---------------cut here---------------start------------->8---
diff --git a/lisp/fileloop.el b/lisp/fileloop.el
index d7d2aa7e0d5..fd749353753 100644
--- a/lisp/fileloop.el
+++ b/lisp/fileloop.el
@@ -121,10 +121,17 @@ fileloop-next-file
         (kill-all-local-variables)
         (erase-buffer)
         (setq new next)
-        (condition-case nil
+        (condition-case err
             (insert-file-contents new nil)
           (file-missing
-           (fileloop-next-file novisit))))
+           (fileloop-next-file novisit))
+          (file-error
+           (unless
+               (and (equal (caddr err) "Can't decrypt")
+                    (y-or-n-p (substitute-quotes
+                               (format "Couldn't decrypt `%s'; skip it?"
+                                       (abbreviate-file-name new)))))
+             (signal (car err) (cdr err))))))
       new)))
 
 (defun fileloop-continue ()
--8<---------------cut here---------------end--------------->8---

-- 
Sean Whitton