From: Daiki Ueno Date: Wed, 5 Nov 2014 09:38:37 +0000 (+0900) Subject: epg: Collect output lines sent to stderr X-Git-Tag: emacs-25.0.90~2635^2~565 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5e28461482115baee4d1f28f514a322a50774b75;p=emacs.git epg: Collect output lines sent to stderr * epg.el (epg-context): Add new slot ERROR-OUTPUT. (epg-error-output): New buffer-local variable. (epg--start): Initialize epg-error-output. (epg--process-filter): Record output lines sent to stderr, in epg-error-output. (epg-wait-for-completion): Copy epg-error-output to ERROR-OUTPUT slot of context. * epa-file.el (epa-file-insert-file-contents): On error, display output sent to stderr. (epa-file-write-region): Likewise. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index dc17f8e3ffb..66c6c472991 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,16 @@ +2014-11-05 Daiki Ueno + + * epg.el (epg-context): Add new slot ERROR-OUTPUT. + (epg-error-output): New buffer-local variable. + (epg--start): Initialize epg-error-output. + (epg--process-filter): Record output lines sent to stderr, in + epg-error-output. + (epg-wait-for-completion): Copy epg-error-output to ERROR-OUTPUT + slot of context. + * epa-file.el (epa-file-insert-file-contents): On error, display + output sent to stderr. + (epa-file-write-region): Likewise. + 2014-11-05 Eli Zaretskii * jit-lock.el (jit-lock-stealth-fontify): Be tolerant to nil being diff --git a/lisp/epa-file.el b/lisp/epa-file.el index 20d34f82223..6f3bb188190 100644 --- a/lisp/epa-file.el +++ b/lisp/epa-file.el @@ -162,6 +162,11 @@ encryption is used." (add-hook 'find-file-not-found-functions 'epa-file--find-file-not-found-function nil t)) + (if (epg-context-error-output context) + (epa-display-info + (concat (format "Error while executing \"%s\":\n\n" + epg-gpg-program) + (epg-context-error-output context)))) (signal 'file-error (cons "Opening input file" (cdr error))))) (set-buffer buf) ;In case timer/filter changed/killed it (bug#16029)! @@ -257,6 +262,11 @@ If no one is selected, symmetric encryption will be performed. " (error (if (setq entry (assoc file epa-file-passphrase-alist)) (setcdr entry nil)) + (if (epg-context-error-output context) + (epa-display-info + (concat (format "Error while executing \"%s\":\n\n" + epg-gpg-program) + (epg-context-error-output context)))) (signal 'file-error (cons "Opening output file" (cdr error))))) (epa-file-run-real-handler #'write-region diff --git a/lisp/epg.el b/lisp/epg.el index 8b80de6295a..9c002e4ae30 100644 --- a/lisp/epg.el +++ b/lisp/epg.el @@ -40,6 +40,7 @@ (defvar epg-debug-buffer nil) (defvar epg-agent-file nil) (defvar epg-agent-mtime nil) +(defvar epg-error-output nil) ;; from gnupg/include/cipher.h (defconst epg-cipher-algorithm-alist @@ -210,7 +211,8 @@ output-file result operation - pinentry-mode) + pinentry-mode + error-output) ;; This is not an alias, just so we can mark it as autoloaded. ;;;###autoload @@ -639,7 +641,9 @@ callback data (if any)." (make-local-variable 'epg-agent-file) (setq epg-agent-file agent-file) (make-local-variable 'epg-agent-mtime) - (setq epg-agent-mtime agent-mtime)) + (setq epg-agent-mtime agent-mtime) + (make-local-variable 'epg-error-output) + (setq epg-error-output nil)) (with-file-modes 448 (setq process (apply #'start-process "epg" buffer (epg-context-program context) args))) @@ -673,7 +677,14 @@ callback data (if any)." (if (and symbol (fboundp symbol)) (funcall symbol epg-context string)) - (setq epg-last-status (cons status string)))) + (setq epg-last-status (cons status string))) + ;; Record other lines sent to stderr. This assumes + ;; that the process-filter receives output only from + ;; stderr and the FD specified with --status-fd. + (setq epg-error-output + (cons (buffer-substring (point) + (line-end-position)) + epg-error-output))) (forward-line) (setq epg-read-point (point))))))))) @@ -715,7 +726,10 @@ callback data (if any)." (redraw-frame)) (epg-context-set-result-for context 'error - (nreverse (epg-context-result-for context 'error)))) + (nreverse (epg-context-result-for context 'error))) + (with-current-buffer (process-buffer (epg-context-process context)) + (setf (epg-context-error-output context) + (mapconcat #'identity (nreverse epg-error-output) "\n")))) (defun epg-reset (context) "Reset the CONTEXT."