X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=emacs%2Fnotmuch-lib.el;h=08a86fd37afa757a39ca03ba29baa7b438b8783f;hb=23fb842e04938513517adfed860d8b40ad910096;hp=b8d0198db42988dd03e0cda766b731e434d5e518;hpb=ddc44ae0d02c7f92640b5e560fca5fddbd7b6c98;p=notmuch diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index b8d0198d..08a86fd3 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -355,6 +355,14 @@ user-friendly queries." "Return a query that matches the message with id ID." (concat "id:" (notmuch-escape-boolean-term id))) +(defun notmuch-hex-encode (str) + "Hex-encode STR (e.g., as used by batch tagging). + +This replaces spaces, percents, and double quotes in STR with +%NN where NN is the hexadecimal value of the character." + (replace-regexp-in-string + "[ %\"]" (lambda (match) (format "%%%02x" (aref match 0))) str)) + ;; (defun notmuch-common-do-stash (text) @@ -628,28 +636,55 @@ You may need to restart Emacs or upgrade your notmuch package.")) ;; `notmuch-logged-error' does not return. )))) +(defun notmuch-call-notmuch--helper (destination args) + "Helper for synchronous notmuch invocation commands. + +This wraps `call-process'. DESTINATION has the same meaning as +for `call-process'. ARGS is as described for +`notmuch-call-notmuch-process'." + + (let (stdin-string) + (while (keywordp (car args)) + (case (car args) + (:stdin-string (setq stdin-string (cadr args) + args (cddr args))) + (otherwise + (error "Unknown keyword argument: %s" (car args))))) + (if (null stdin-string) + (apply #'call-process notmuch-command nil destination nil args) + (insert stdin-string) + (apply #'call-process-region (point-min) (point-max) + notmuch-command t destination nil args)))) + (defun notmuch-call-notmuch-process (&rest args) - "Synchronously invoke \"notmuch\" with the given list of arguments. + "Synchronously invoke `notmuch-command' with ARGS. + +The caller may provide keyword arguments before ARGS. Currently +supported keyword arguments are: + + :stdin-string STRING - Write STRING to stdin If notmuch exits with a non-zero status, output from the process will appear in a buffer named \"*Notmuch errors*\" and an error will be signaled." (with-temp-buffer - (let ((status (apply #'call-process notmuch-command nil t nil args))) + (let ((status (notmuch-call-notmuch--helper t args))) (notmuch-check-exit-status status (cons notmuch-command args) (buffer-string))))) (defun notmuch-call-notmuch-sexp (&rest args) "Invoke `notmuch-command' with ARGS and return the parsed S-exp output. -If notmuch exits with a non-zero status, this will pop up a -buffer containing notmuch's output and signal an error." +This is equivalent to `notmuch-call-notmuch-process', but parses +notmuch's output as an S-expression and returns the parsed value. +Like `notmuch-call-notmuch-process', if notmuch exits with a +non-zero status, this will report its output and signal an +error." (with-temp-buffer (let ((err-file (make-temp-file "nmerr"))) (unwind-protect - (let ((status (apply #'call-process - notmuch-command nil (list t err-file) nil args))) + (let ((status (notmuch-call-notmuch--helper (list t err-file) args))) (notmuch-check-exit-status status (cons notmuch-command args) (buffer-string) err-file) (goto-char (point-min))