aboutsummaryrefslogtreecommitdiff
path: root/pearl.el
diff options
context:
space:
mode:
Diffstat (limited to 'pearl.el')
-rw-r--r--pearl.el46
1 files changed, 46 insertions, 0 deletions
diff --git a/pearl.el b/pearl.el
index abd0166..7d2210e 100644
--- a/pearl.el
+++ b/pearl.el
@@ -2081,6 +2081,52 @@ push-failed), `rewrite' abort -> (conflict aborted)."
(when outcome-cb (funcall outcome-cb 'failed 'push-failed))))))
(lambda () (when outcome-cb (funcall outcome-cb 'conflict 'aborted)))))))
+(defun pearl--read-atomic-conflict-resolution (label)
+ "Prompt for resolving an atomic-field conflict on LABEL, returning a symbol.
+One of `use-local' (push mine, overwrite Linear), `use-remote' (take Linear's),
+or `cancel'. There is no merge option -- an enum or relation value can't be
+combined. A bare RET defaults to `cancel'."
+ (let* ((choices '(("cancel -- leave the field in conflict" . cancel)
+ ("use local -- push my value, overwrite Linear" . use-local)
+ ("use remote -- take Linear's value" . use-remote)))
+ (default (caar choices))
+ (pick (completing-read
+ (format "Conflict on %s (RET cancels): " label)
+ (mapcar #'car choices) nil t nil nil default)))
+ (cdr (assoc pick choices))))
+
+(defun pearl--resolve-atomic-conflict
+ (label local-display remote-display push-local-fn take-remote-fn outcome-cb)
+ "Resolve an atomic-field (enum/relation) conflict on LABEL interactively.
+The sibling of `pearl--resolve-conflict' for fields whose value is a single
+id or scalar, not mergeable text -- so there is no smerge/rewrite branch and no
+SHA hash is written.
+
+LOCAL-DISPLAY and REMOTE-DISPLAY are human-readable values for the prompt.
+PUSH-LOCAL-FN takes a callback invoked with non-nil on a successful push of the
+local value (the caller advances the baseline on success). TAKE-REMOTE-FN
+adopts Linear's value locally and advances the baseline, with no push.
+OUTCOME-CB is called once with (STATUS REASON): `cancel' -> (conflict
+cancelled); `use-local' -> (pushed nil) or (failed push-failed); `use-remote'
+-> (resolved-remote nil)."
+ (pcase (pearl--read-atomic-conflict-resolution label)
+ ('cancel
+ (message "Left %s in conflict (refresh to see Linear's %s)" label remote-display)
+ (funcall outcome-cb 'conflict 'cancelled))
+ ('use-local
+ (funcall push-local-fn
+ (lambda (ok)
+ (if ok
+ (progn
+ (message "Pushed your %s (%s) to Linear" label local-display)
+ (funcall outcome-cb 'pushed nil))
+ (message "Failed to push %s" label)
+ (funcall outcome-cb 'failed 'push-failed)))))
+ ('use-remote
+ (funcall take-remote-fn)
+ (message "Took Linear's %s (%s)" label remote-display)
+ (funcall outcome-cb 'resolved-remote nil))))
+
;;; Compose Buffer
;;
;; A focused Org buffer for composing multi-line text (comments, descriptions)