diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-25 07:38:30 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-25 07:38:30 -0500 |
| commit | 8ad9fce0f469cecd4d4b682c25272348f35259b2 (patch) | |
| tree | bd0a8ebde6855a35c9b41c4f1c69943c422ab1e7 /pearl.el | |
| parent | 8bd689aca28bee00bd71e1e7a3149e803fe1049a (diff) | |
| download | pearl-8ad9fce0f469cecd4d4b682c25272348f35259b2.tar.gz pearl-8ad9fce0f469cecd4d4b682c25272348f35259b2.zip | |
fix: guard issue async callbacks against a killed buffer
pearl--push-issue-field (the field setters) and pearl-refresh-current-issue ran goto-char on the captured marker in their success callbacks with no liveness check. If the buffer was killed before the async response returned, the dead marker signaled "Marker does not point anywhere" from the callback. I wrapped the buffer work in a buffer-live-p check; the field setters still report the remote success, and refresh reports that the buffer was closed.
This closes the last gap in the command/context test-coverage task. The other seven items it named were already covered by the quick-bug batch's tests; this adds the killed-buffer regression for the issue paths (delete-current-comment already had its own).
Diffstat (limited to 'pearl.el')
| -rw-r--r-- | pearl.el | 32 |
1 files changed, 20 insertions, 12 deletions
@@ -2418,13 +2418,18 @@ proceeds and the subtree is replaced with Linear's version." (message "Issue %s is no longer on Linear (deleted or no access); not refreshing" issue-id)) (raw - (save-excursion - (goto-char marker) - (pearl--replace-issue-subtree-at-point - (pearl--normalize-issue raw))) - (pearl-highlight-comments) - (pearl--surface-buffer (marker-buffer marker)) - (message "Refreshed %s from Linear" issue-id))))))))) + ;; The fetch may complete after the buffer was killed; only + ;; rewrite it when it's still live. + (if (buffer-live-p (marker-buffer marker)) + (progn + (save-excursion + (goto-char marker) + (pearl--replace-issue-subtree-at-point + (pearl--normalize-issue raw))) + (pearl-highlight-comments) + (pearl--surface-buffer (marker-buffer marker)) + (message "Refreshed %s from Linear" issue-id)) + (message "Refreshed %s; its buffer was closed" issue-id)))))))))) (defun pearl--create-comment-async (issue-id body callback) "Create a comment with BODY on ISSUE-ID via commentCreate. @@ -2657,12 +2662,15 @@ tail of the field-setter commands (priority/state/assignee/labels)." issue-id fields (lambda (result) (if (plist-get result :success) + ;; The push may complete after the buffer was killed; only touch it + ;; when it's still live, but still report the (remote) success. (progn - (save-excursion - (goto-char marker) - (funcall on-success)) - (message "%s" success-message) - (pearl--surface-buffer (marker-buffer marker))) + (when (buffer-live-p (marker-buffer marker)) + (save-excursion + (goto-char marker) + (funcall on-success)) + (pearl--surface-buffer (marker-buffer marker))) + (message "%s" success-message)) (message "%s" fail-message))))) (defun pearl-set-priority (priority-name) |
