[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/plz 9319470060 38/40: Merge branch 'wip/no-signal-from-
From: |
ELPA Syncer |
Subject: |
[elpa] externals/plz 9319470060 38/40: Merge branch 'wip/no-signal-from-sentinel-as-timer' |
Date: |
Mon, 26 Jun 2023 06:59:34 -0400 (EDT) |
branch: externals/plz
commit 9319470060a1750951b096eb5a04b760f9701412
Merge: a8ae654530 d2a7368699
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>
Merge branch 'wip/no-signal-from-sentinel-as-timer'
This branch has major improvements which have been in development for
a while. All lints and tests pass now, both locally and on GitHub CI.
This should be a major improvement and should make v0.7 a good
release.
Thanks to @josephmturner for his extensive help, and to USHIN,
Inc. for sponsoring some of this work.
---
.github/workflows/test.yml | 9 +-
README.org | 3 +-
plz.el | 407 +++++++++++++++++++++++++--------------------
plz.info | 32 ++--
tests/test-plz.el | 2 +-
5 files changed, 254 insertions(+), 199 deletions(-)
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 0c337b732a..3c38eac865 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -71,9 +71,12 @@ jobs:
# as failures, so linting and testing are run as separate steps.
- name: Lint
- # NOTE: Uncomment this line to treat lint failures as passing
- # so the job doesn't show failure.
- # continue-on-error: true
+ # NOTE: Uncomment this line to treat lint failures as passing so
+ # the job doesn't show failure. (Enabled for now because
+ # Emacs 29 indents some cl- forms differently, which
+ # causes lint-indent to fail, and what matters most is
+ # that the tests pass.)
+ continue-on-error: true
run: ./makem.sh -vv --sandbox=$SANDBOX_DIR lint
- name: Test
diff --git a/README.org b/README.org
index 05e9b84a7b..0e0e07ba51 100644
--- a/README.org
+++ b/README.org
@@ -46,8 +46,6 @@
The main public function is ~plz~, which sends an HTTP request and returns
either the result of the specified type (for a synchronous request), or the
~curl~ process object (for asynchronous requests). For asynchronous requests,
callback, error-handling, and finalizer functions may be specified, as well as
various other options.
-# TODO: Add ":body (file FILENAME)" to docs.
-
** Examples
Synchronously =GET= a URL and return the response body as a decoded string
(here, raw JSON):
@@ -188,6 +186,7 @@ You may also clear a queue with ~plz-clear~, which cancels
any active or queued
*Internal*
+ Tests now run against a local instance of
[[https://github.com/postmanlabs/httpbin][httpbin]] (since the ~httpbin.org~
server is often overloaded).
++ No buffer-local variables are defined anymore; process properties are used
instead.
** 0.6
diff --git a/plz.el b/plz.el
index 48901e7a37..a8e2732ab8 100644
--- a/plz.el
+++ b/plz.el
@@ -103,7 +103,6 @@
;;;; Errors
-;; FIXME: `condition-case' can't catch these...?
(define-error 'plz-error "plz error")
(define-error 'plz-curl-error "plz: Curl error" 'plz-error)
(define-error 'plz-http-error "plz: HTTP error" 'plz-error)
@@ -218,27 +217,6 @@ only LF).")
(90 . "SSL public key does not matched pinned public key"))
"Alist mapping curl error code integers to helpful error messages.")
-;;;; Variables
-
-(defvar-local plz-else nil
- "Callback function for unsuccessful completion of request.
-Called in current curl process buffer.")
-
-(defvar-local plz-then nil
- "Callback function for successful completion of request.
-Called in current curl process buffer.")
-
-(defvar-local plz-finally nil
- "Function called unconditionally after completion of request.
-Called after the then/else function, without arguments, outside
-the curl process buffer.")
-
-(defvar-local plz-result nil
- "Used when `plz' is called synchronously.")
-
-(defvar-local plz-sync nil
- "Used when `plz' is called synchronously.")
-
;;;; Customization
(defgroup plz nil
@@ -276,7 +254,7 @@ connection phase and waiting to receive the response (the
;;;;; Public
-(cl-defun plz (method url &key headers body else finally noquery
+(cl-defun plz (method url &rest rest &key headers body else finally noquery
(as 'string) (then 'sync)
(body-type 'text) (decode t decode-s)
(connect-timeout plz-connect-timeout) (timeout
plz-timeout))
@@ -321,18 +299,21 @@ For binary content, it should be nil. When AS is
`binary',
DECODE is automatically set to nil.
THEN is a callback function, whose sole argument is selected
-above with AS. Or THEN may be `sync' to make a synchronous
-request, in which case the result is returned directly.
+above with AS; if the request fails and no ELSE function is
+given (see below), the argument will be a `plz-error' structure
+describing the error. Or THEN may be `sync' to make a
+synchronous request, in which case the result is returned
+directly from this function.
ELSE is an optional callback function called when the request
fails (i.e. if curl fails, or if the HTTP response has a non-2xx
status code). It is called with one argument, a `plz-error'
-structure. If ELSE is nil, an error is signaled when the request
-fails, either `plz-curl-error' or `plz-http-error' as
-appropriate, with a `plz-error' structure as the error data. For
-synchronous requests, this argument is ignored.
+structure. If ELSE is nil, a `plz-curl-error' or
+`plz-http-error' is signaled when the request fails, with a
+`plz-error' structure as the error data. For synchronous
+requests, this argument is ignored.
-NOTE: In v0.8 of plz, only one error will be signaled:
+NOTE: In v0.8 of `plz', only one error will be signaled:
`plz-error'. The existing errors, `plz-curl-error' and
`plz-http-error', inherit from `plz-error' to allow applications
to update their code while using v0.7 (i.e. any `condition-case'
@@ -346,9 +327,11 @@ CONNECT-TIMEOUT and TIMEOUT are a number of seconds that
limit
how long it takes to connect to a host and to receive a response
from a host, respectively.
-NOQUERY is passed to `make-process', which see."
+NOQUERY is passed to `make-process', which see.
+
+\(To silence checkdoc, we mention the internal argument REST.)"
;; FIXME: Remove the note about error changes from the docstring in v0.8.
- ;; Inspired by and copied from `elfeed-curl-retrieve'.
+ ;; FIXME: Update error signals in docstring in v0.8.
(declare (indent defun))
(setf decode (if (and decode-s (not decode))
nil decode))
@@ -405,99 +388,139 @@ NOQUERY is passed to `make-process', which see."
(decode (pcase as
('binary nil)
(_ decode)))
+ (default-directory
+ ;; Avoid making process in a nonexistent directory (in case the
current
+ ;; default-directory has since been removed). It's unclear what
the best
+ ;; directory is, but this seems to make sense, and it should still
exist.
+ temporary-file-directory)
+ (process-buffer (generate-new-buffer " *plz-request-curl*"))
+ (stderr-process (make-pipe-process :name "plz-request-curl-stderr"
+ :buffer (generate-new-buffer "
*plz-request-curl-stderr*")
+ :noquery t
+ :sentinel #'plz--stderr-sentinel))
+ (process (make-process :name "plz-request-curl"
+ :buffer process-buffer
+ :coding 'binary
+ :command (append (list plz-curl-program)
curl-command-line-args)
+ :connection-type 'pipe
+ :sentinel #'plz--sentinel
+ :stderr stderr-process
+ :noquery noquery))
sync-p)
(when (eq 'sync then)
(setf sync-p t
- ;; FIXME: For sync requests, `else' should be forced nil.
then (lambda (result)
- (setf plz-result result))))
- (with-current-buffer (generate-new-buffer " *plz-request-curl*")
- ;; Avoid making process in a nonexistent directory (in case the current
- ;; default-directory has since been removed). It's unclear what the best
- ;; directory is, but this seems to make sense, and it should still exist.
- (let ((default-directory temporary-file-directory)
- (process (make-process :name "plz-request-curl"
- :buffer (current-buffer)
- :coding 'binary
- :command (append (list plz-curl-program)
curl-command-line-args)
- :connection-type 'pipe
- :sentinel #'plz--sentinel
- ;; FIXME: Set the stderr process sentinel
to ignore to prevent
- ;; "process finished" garbage in the buffer
(response body). See:
- ;;
<https://stackoverflow.com/questions/42810755/how-to-remove-process-finished-message-from-make-process-or-start-process-in-e>.
- :stderr (current-buffer)
- :noquery noquery))
- ;; The THEN function is called in the response buffer.
- (then (pcase-exhaustive as
- ((or 'binary 'string)
- (lambda ()
- (let ((coding-system (or (plz--coding-system) 'utf-8)))
- (pcase as
- ('binary (set-buffer-multibyte nil)))
- (plz--narrow-to-body)
- (when decode
- (decode-coding-region (point) (point-max)
coding-system))
- (funcall then (buffer-string)))))
- ('buffer (lambda ()
- (funcall then (current-buffer))))
- ('response (lambda ()
- (funcall then (plz--response :decode-p
decode))))
- ('file (lambda ()
- (set-buffer-multibyte nil)
+ (process-put process :plz-result result))
+ else nil))
+ (setf
+ ;; Set the callbacks, etc. as process properties.
+ (process-get process :plz-then)
+ (pcase-exhaustive as
+ ((or 'binary 'string)
+ (lambda ()
+ (let ((coding-system (or (plz--coding-system) 'utf-8)))
+ (pcase as
+ ('binary (set-buffer-multibyte nil)))
+ (plz--narrow-to-body)
+ (when decode
+ (decode-coding-region (point) (point-max) coding-system))
+ (funcall then (or (buffer-string)
+ (make-plz-error :message (format "buffer-string
is nil in buffer:%S" process-buffer)))))))
+ ('buffer (lambda ()
+ (funcall then (current-buffer))))
+ ('response (lambda ()
+ (funcall then (or (plz--response :decode-p decode)
+ (make-plz-error :message (format
"response is nil for buffer:%S buffer-string:%S"
+
process-buffer (buffer-string)))))))
+ ('file (lambda ()
+ (set-buffer-multibyte nil)
+ (plz--narrow-to-body)
+ (let ((filename (make-temp-file "plz-")))
+ (condition-case err
+ (progn
+ (write-region (point-min) (point-max) filename)
+ (funcall then filename))
+ ;; In case of an error writing to the file, delete the
temp file
+ ;; and signal the error. Ignore any errors encountered
while
+ ;; deleting the file, which would obscure the original
error.
+ (error (ignore-errors
+ (delete-file filename))
+ (funcall then (make-plz-error :message (format
"error while writing to file %S: %S" filename err))))))))
+ (`(file ,(and (pred stringp) filename))
+ (lambda ()
+ (set-buffer-multibyte nil)
+ (plz--narrow-to-body)
+ (condition-case err
+ (progn
+ (write-region (point-min) (point-max) filename nil nil nil
'excl)
+ (funcall then filename))
+ ;; Since we are creating the file, it seems sensible to delete it
in case of an
+ ;; error while writing to it (e.g. a disk-full error). And we
ignore any errors
+ ;; encountered while deleting the file, which would obscure the
original error.
+ (error (ignore-errors
+ (when (file-exists-p filename)
+ (delete-file filename)))
+ (funcall then (make-plz-error :message (format "error while
writing to file %S: %S" filename err)))))))
+ ((pred functionp) (lambda ()
+ (let ((coding-system (or (plz--coding-system)
'utf-8)))
(plz--narrow-to-body)
- (let ((filename (make-temp-file "plz-")))
- (condition-case err
- (write-region (point-min) (point-max)
filename)
- ;; In case of an error writing to the file,
delete the temp file
- ;; and signal the error. Ignore any errors
encountered while
- ;; deleting the file, which would obscure the
original error.
- (error (ignore-errors
- (delete-file filename))
- (signal (car err) (cdr err))))
- (funcall then filename))))
- (`(file ,(and (pred stringp) filename))
- (lambda ()
- (set-buffer-multibyte nil)
- (plz--narrow-to-body)
- (condition-case err
- (write-region (point-min) (point-max) filename nil
nil nil 'excl)
- ;; Since we are creating the file, it seems sensible
to delete it in case of an
- ;; error while writing to it (e.g. a disk-full
error). And we ignore any errors
- ;; encountered while deleting the file, which would
obscure the original error.
- (error (ignore-errors
- (when (file-exists-p filename)
- (delete-file filename)))
- (signal (car err) (cdr err))))
- (funcall then filename)))
- ((pred functionp) (lambda ()
- (let ((coding-system (or
(plz--coding-system) 'utf-8)))
- (plz--narrow-to-body)
- (when decode
- (decode-coding-region (point)
(point-max) coding-system))
- (funcall then (funcall as))))))))
- (setf plz-then then
- plz-else else
- plz-finally finally
- plz-sync sync-p)
- ;; Send --config arguments.
- (process-send-string process curl-config)
- (when body
- (cl-typecase body
- (string (process-send-string process body))
- ;; TODO: Document that BODY can be a buffer.
- (buffer (with-current-buffer body
- (process-send-region process (point-min) (point-max))))))
- (process-send-eof process)
- (if sync-p
+ (when decode
+ (decode-coding-region (point) (point-max)
coding-system))
+ (funcall then (funcall as))))))
+ (process-get process :plz-else) else
+ (process-get process :plz-finally) finally
+ (process-get process :plz-sync) sync-p
+ ;; Record list of arguments for debugging purposes (e.g. when
+ ;; using Edebug in a process buffer, this allows determining
+ ;; which request the buffer is for).
+ (process-get process :plz-args) (apply #'list method url rest)
+ ;; HACK: We set the result to a sentinel value so that any other
+ ;; value, even nil, means that the response was processed, and
+ ;; the sentinel does not need to be called again (see below).
+ (process-get process :plz-result) :plz-result)
+ ;; Send --config arguments.
+ (process-send-string process curl-config)
+ (when body
+ (cl-typecase body
+ (string (process-send-string process body))
+ (buffer (with-current-buffer body
+ (process-send-region process (point-min) (point-max))))))
+ (process-send-eof process)
+ (if sync-p
+ (unwind-protect
(progn
- (while
- ;; According to the Elisp manual, blocking on a process's
- ;; output is really this simple. And it seems to work.
- (accept-process-output process))
- (prog1 plz-result
- (unless (eq as 'buffer)
- (kill-buffer))))
- process)))))
+ ;; See Info node `(elisp)Accepting Output'.
+ (unless (and process stderr-process)
+ (error "Process unexpectedly nil"))
+ (while (accept-process-output process))
+ (while (accept-process-output stderr-process))
+ (when (eq :plz-result (process-get process :plz-result))
+ ;; HACK: Sentinel seems to not have been called: call it
again. (Although
+ ;; this is a hack, it seems to be a necessary one due to
Emacs's process
+ ;; handling.) See
<https://github.com/alphapapa/plz.el/issues/3> and
+ ;; <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=50166>.
+ (plz--sentinel process "finished\n")
+ (when (eq :plz-result (process-get process :plz-result))
+ (error "Plz: NO RESULT FROM PROCESS:%S ARGS:%S"
+ process rest)))
+ ;; Sentinel seems to have been called: check the result.
+ (pcase (process-get process :plz-result)
+ ((and (pred plz-error-p) data)
+ ;; The AS function signaled an error, which was collected
+ ;; into a `plz-error' struct: re-signal the error here,
+ ;; outside of the sentinel.
+ (if (plz-error-response data)
+ ;; FIXME: Signal only plz-error in v0.8.
+ (signal 'plz-http-error (list "HTTP error" data))
+ (signal 'plz-curl-error (list "Curl error" data))))
+ (else
+ ;; The AS function returned a value: return it.
+ else)))
+ (unless (eq as 'buffer)
+ (kill-buffer process-buffer))
+ (kill-buffer (process-buffer stderr-process)))
+ ;; Async request: return the process object.
+ process)))
;;;;; Queue
@@ -683,64 +706,92 @@ Includes active and queued requests."
;;;;; Private
-(defun plz--sentinel (process-or-buffer status)
- "Process buffer of curl output in PROCESS-OR-BUFFER.
-If PROCESS-OR-BUFFER if a process, uses its buffer; if a buffer,
-uses it. STATUS should be the process's event string (see info
-node `(elisp) Sentinels'). Kills the buffer before returning."
- ;; Inspired by and some code copied from `elfeed-curl--sentinel'.
- (let* ((buffer (cl-etypecase process-or-buffer
- (process (process-buffer process-or-buffer))
- (buffer process-or-buffer)))
- (finally (buffer-local-value 'plz-finally buffer))
- sync)
- (unwind-protect
- (with-current-buffer buffer
- (setf sync plz-sync)
- (pcase-exhaustive status
- ((or 0 "finished\n")
- ;; Curl exited normally: check HTTP status code.
- (goto-char (point-min))
- (plz--skip-proxy-headers)
- (while (plz--skip-redirect-headers))
- (pcase (plz--http-status)
- ((and status (guard (<= 200 status 299)))
- ;; Any 2xx response is considered successful.
- (ignore status) ; Byte-compiling in Emacs <28 complains
without this.
- (funcall plz-then))
- ;; Any other status code is considered unsuccessful
- ;; (for now, anyway).
- (_ (let ((err (make-plz-error :response (plz--response))))
- (pcase-exhaustive plz-else
- (`nil (signal 'plz-http-error (list "plz--sentinel: HTTP
error" err)))
- ((pred functionp) (funcall plz-else err)))))))
-
- ((or (and (pred numberp) code)
- (rx "exited abnormally with code " (let code (group (1+
digit)))))
- ;; Curl error.
- (let* ((curl-exit-code (cl-typecase code
- (string (string-to-number code))
- (number code)))
- (curl-error-message (alist-get curl-exit-code
plz-curl-errors))
- (err (make-plz-error :curl-error (cons curl-exit-code
curl-error-message))))
- (pcase-exhaustive plz-else
- ;; FIXME: Returning a plz-error structure which has a
curl-error slot, wrapped in a plz-curl-error, is confusing.
- (`nil (signal 'plz-curl-error (list "plz--sentinel: Curl
error" err)))
- ((pred functionp) (funcall plz-else err)))))
-
- ((and (or "killed\n" "interrupt\n") status)
- ;; Curl process killed or interrupted.
- (let* ((message (pcase status
- ("killed\n" "curl process killed")
- ("interrupt\n" "curl process interrupted")))
- (err (make-plz-error :message message)))
- (pcase-exhaustive plz-else
- (`nil (signal 'plz-curl-error (list "plz--sentinel: Curl
error" err)))
- ((pred functionp) (funcall plz-else err)))))))
- (when finally
- (funcall finally))
- (unless sync
- (kill-buffer buffer)))))
+(defun plz--sentinel (process status)
+ "Sentinel for curl PROCESS.
+STATUS should be the process's event string (see info
+node `(elisp) Sentinels'). Calls `plz--respond' to process the
+HTTP response (directly for synchronous requests, or from a timer
+for asynchronous ones)."
+ (pcase status
+ ((or "finished\n" "killed\n" "interrupt\n"
+ (pred numberp)
+ (rx "exited abnormally with code " (group (1+ digit))))
+ (let ((buffer (process-buffer process)))
+ (if (process-get process :plz-sync)
+ (plz--respond process buffer status)
+ (run-at-time 0 nil #'plz--respond process buffer status))))))
+
+(defun plz--respond (process buffer status)
+ "Respond to HTTP response from PROCESS in BUFFER.
+Parses the response and calls the THEN/ELSE callbacks
+accordingly. To be called from `plz--sentinel'. STATUS is the
+argument passed to `plz--sentinel', which see."
+ ;; Is it silly to call this function "please respond"? Perhaps, but
+ ;; naming things is hard. The term "process" has another meaning in
+ ;; this context, and the old standby, "handle," is much overused.
+ ;; "Respond" also means "to react to something," which is what this
+ ;; does--react to receiving the HTTP response--and it's an internal
+ ;; name, so why not.
+ (unwind-protect
+ (with-current-buffer buffer
+ (pcase-exhaustive status
+ ((or 0 "finished\n")
+ ;; Curl exited normally: check HTTP status code.
+ (goto-char (point-min))
+ (plz--skip-proxy-headers)
+ (while (plz--skip-redirect-headers))
+ (pcase (plz--http-status)
+ ((and status (guard (<= 200 status 299)))
+ ;; Any 2xx response is considered successful.
+ (ignore status) ; Byte-compiling in Emacs <28 complains without
this.
+ (funcall (process-get process :plz-then)))
+ (_
+ ;; TODO: If using ":as 'response", the HTTP response
+ ;; should be passed to the THEN function, regardless
+ ;; of the status code. Only for curl errors should
+ ;; the ELSE function be called. (Maybe in v0.8.)
+
+ ;; Any other status code is considered unsuccessful
+ ;; (for now, anyway).
+ (let ((err (make-plz-error :response (plz--response))))
+ (pcase-exhaustive (process-get process :plz-else)
+ (`nil (process-put process :plz-result err))
+ ((and (pred functionp) fn) (funcall fn err)))))))
+
+ ((or (and (pred numberp) code)
+ (rx "exited abnormally with code " (let code (group (1+
digit)))))
+ ;; Curl error.
+ (let* ((curl-exit-code (cl-typecase code
+ (string (string-to-number code))
+ (number code)))
+ (curl-error-message (alist-get curl-exit-code
plz-curl-errors))
+ (err (make-plz-error :curl-error (cons curl-exit-code
curl-error-message))))
+ (pcase-exhaustive (process-get process :plz-else)
+ (`nil (process-put process :plz-result err))
+ ((and (pred functionp) fn) (funcall fn err)))))
+
+ ((and (or "killed\n" "interrupt\n") status)
+ ;; Curl process killed or interrupted.
+ (let* ((message (pcase status
+ ("killed\n" "curl process killed")
+ ("interrupt\n" "curl process interrupted")))
+ (err (make-plz-error :message message)))
+ (pcase-exhaustive (process-get process :plz-else)
+ (`nil (process-put process :plz-result err))
+ ((and (pred functionp) fn) (funcall fn err)))))))
+ (when-let ((finally (process-get process :plz-finally)))
+ (funcall finally))
+ (unless (process-get process :plz-sync)
+ (kill-buffer buffer))))
+
+(defun plz--stderr-sentinel (process status)
+ "Sentinel for STDERR buffer.
+Arguments are PROCESS and STATUS (ok, checkdoc?)."
+ (pcase status
+ ((or "finished\n" "killed\n" "interrupt\n"
+ (pred numberp)
+ (rx "exited abnormally with code " (1+ digit)))
+ (kill-buffer (process-buffer process)))))
;;;;;; HTTP Responses
@@ -795,7 +846,7 @@ Assumes that point is at beginning of HTTP response."
(defun plz--coding-system (&optional headers)
"Return coding system for HTTP response in current buffer.
HEADERS may optionally be an alist of parsed HTTP headers to
-refer to rather than the current buffer's unparsed headers."
+refer to rather than the current buffer's un-parsed headers."
(let* ((headers (or headers (plz--headers)))
(content-type (alist-get 'content-type headers)))
(when content-type
diff --git a/plz.info b/plz.info
index fd7475cabb..5e6001a7b5 100644
--- a/plz.info
+++ b/plz.info
@@ -315,6 +315,8 @@ File: README.info, Node: 07-pre, Next: 06, Up: Changelog
• Tests now run against a local instance of httpbin
(https://github.com/postmanlabs/httpbin) (since the ‘httpbin.org’
server is often overloaded).
+ • No buffer-local variables are defined anymore; process properties
+ are used instead.
File: README.info, Node: 06, Next: 054, Prev: 07-pre, Up: Changelog
@@ -519,21 +521,21 @@ Node: Queueing6859
Node: Tips8242
Node: Changelog8543
Node: 07-pre8812
-Node: 069523
-Node: 05410138
-Node: 05310381
-Node: 05210697
-Node: 05110904
-Node: 0511156
-Node: 0411362
-Node: 0312268
-Node: 02112716
-Node: 0212867
-Node: 0112998
-Node: Credits13094
-Node: Development13460
-Node: Copyright assignment13974
-Node: License14562
+Node: 069619
+Node: 05410234
+Node: 05310477
+Node: 05210793
+Node: 05111000
+Node: 0511252
+Node: 0411458
+Node: 0312364
+Node: 02112812
+Node: 0212963
+Node: 0113094
+Node: Credits13190
+Node: Development13556
+Node: Copyright assignment14070
+Node: License14658
End Tag Table
diff --git a/tests/test-plz.el b/tests/test-plz.el
index c08715907b..f420847130 100644
--- a/tests/test-plz.el
+++ b/tests/test-plz.el
@@ -453,7 +453,7 @@ Also, any instance of \"URI-PREFIX\" in URL-PART is
replaced with
(plz-deftest plz-get-timeout-error-sync nil
(pcase-let* ((start-time (current-time))
- (`(,_signal . (,_string ,(cl-struct plz-error (curl-error
`(,code . ,message)))))
+ (`(,_signal . (,_message ,(cl-struct plz-error (curl-error
`(,code . ,message)))))
(should-error (plz 'get (plz-test-url "/delay/5")
:as 'string :then 'sync :timeout 1)
:type 'plz-error))
- [elpa] externals/plz de8e21f81d 29/40: Tidy: Docstrings, (continued)
- [elpa] externals/plz de8e21f81d 29/40: Tidy: Docstrings, ELPA Syncer, 2023/06/26
- [elpa] externals/plz f9f95a8544 34/40: Comment: Add TODO, ELPA Syncer, 2023/06/26
- [elpa] externals/plz c786bbf7d2 35/40: Tidy/Comment, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 438162db4e 13/40: WIP: Add request args to sentinel error, ELPA Syncer, 2023/06/26
- [elpa] externals/plz a1f8a10b0b 16/40: Comment: Add FIXME, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 880223e7c0 22/40: Tidy: (plz--sentinel), ELPA Syncer, 2023/06/26
- [elpa] externals/plz 53ef6a16ce 26/40: Comment: Tidy, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 582f0c5bb8 31/40: Tests: Enable continue-on-error for linting, ELPA Syncer, 2023/06/26
- [elpa] externals/plz b896c41d71 32/40: Change: Generate buffer for STDERR, ELPA Syncer, 2023/06/26
- [elpa] externals/plz d2a7368699 37/40: Tidy: (plz) Don't switch to process-buffer, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 9319470060 38/40: Merge branch 'wip/no-signal-from-sentinel-as-timer',
ELPA Syncer <=
- [elpa] externals/plz 5e63662e21 40/40: Docs: Update changelog, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 0cb20bc74d 03/40: Tidy, ELPA Syncer, 2023/06/26
- [elpa] externals/plz e28b4e8b6a 06/40: Tidy, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 8f263bfd0f 09/40: Comment: Remove old TODO, ELPA Syncer, 2023/06/26
- [elpa] externals/plz c181fd1565 10/40: Tidy: Error handling in THEN function, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 4735c8333d 17/40: Fix: (plz) Signal error with data as list, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 260840d3e7 18/40: Change: (plz--respond) Rename from plz--timer, ELPA Syncer, 2023/06/26
- [elpa] externals/plz b04b466d79 19/40: Change: Signal plz-curl/http-error again, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 5a60113110 21/40: Comment: Add links to bug reports, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 96710ad323 23/40: Tidy, ELPA Syncer, 2023/06/26