Skip to content

Commit 7b3f049

Browse files
authored
Prompt new files before binding remembered session (#275)
1 parent a42e9bb commit 7b3f049

2 files changed

Lines changed: 72 additions & 7 deletions

File tree

ai-code-backends-infra.el

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -601,16 +601,26 @@ Return a cons of (BUFFER . MISSING-P)."
601601
MISSING-MESSAGE is used when no target session exists.
602602
When PREFIX and WORKING-DIR are present, prefer the attached session for
603603
SOURCE-BUFFER unless FORCE-PROMPT is non-nil."
604-
(let* ((attached-state (and prefix working-dir
604+
(let* ((file-session-key (and prefix
605+
source-buffer
606+
(ai-code-backends-infra--file-session-map-key
607+
prefix
608+
source-buffer)))
609+
(attached-state (and prefix working-dir
605610
(ai-code-backends-infra--attached-file-session
606611
prefix
607612
source-buffer
608613
working-dir)))
609614
(attached-buffer (car-safe attached-state))
610615
(attached-missing (cdr-safe attached-state))
616+
(needs-initial-file-selection (and (null buffer-name)
617+
file-session-key
618+
(null attached-buffer)
619+
(not attached-missing)))
611620
(effective-force-prompt
612621
(or force-prompt
613-
attached-missing))
622+
attached-missing
623+
needs-initial-file-selection))
614624
(buffer (or (and buffer-name (get-buffer buffer-name))
615625
(and attached-buffer (not force-prompt) attached-buffer)
616626
(and prefix working-dir

test/test_ai-code-backends-infra.el

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -573,8 +573,8 @@
573573
(when (buffer-live-p buf)
574574
(kill-buffer buf))))))
575575

576-
(ert-deftest test-ai-code-backends-infra-send-line-unassociated-file-reuses-remembered-session ()
577-
"Unassociated file should reuse the remembered repo session."
576+
(ert-deftest test-ai-code-backends-infra-send-line-unassociated-file-prompts-before-binding ()
577+
"Unassociated file should prompt before it is bound to a repo session."
578578
(let* ((prefix "codex")
579579
(working-dir "/tmp/ai-code-file-new-association/")
580580
(source (generate-new-buffer " *ai-code-source-new-association*"))
@@ -618,7 +618,7 @@
618618
nil "missing" "line-2" prefix working-dir)))
619619

620620
(should (= selection-count 1))
621-
(should (equal (nreverse force-prompts) (list nil)))
621+
(should (equal (nreverse force-prompts) (list t)))
622622
(should (equal (nreverse send-targets)
623623
(list "*codex[file-new-association:b]*"
624624
"*codex[file-new-association:b]*")))
@@ -680,7 +680,7 @@
680680
(ai-code-backends-infra--send-line-to-session
681681
nil "missing" "line-2" prefix working-dir)))
682682

683-
(should (equal (nreverse force-prompts) (list nil t)))
683+
(should (equal (nreverse force-prompts) (list t t)))
684684
(should (equal (nreverse send-targets)
685685
(list "*codex[file-rebind:a]*"
686686
"*codex[file-rebind:b]*")))
@@ -744,6 +744,61 @@
744744
(when (buffer-live-p buf)
745745
(kill-buffer buf))))))
746746

747+
(ert-deftest test-ai-code-backends-infra-switch-new-file-prompts-when-remembered-session-exists ()
748+
"A newly opened file should still prompt when multiple repo sessions are active."
749+
(let* ((prefix "codex")
750+
(working-dir "/tmp/ai-code-file-multi-remembered/")
751+
(source (generate-new-buffer " *ai-code-source-multi-remembered*"))
752+
(session-a (get-buffer-create "*codex[file-multi-remembered:a]*"))
753+
(session-b (get-buffer-create "*codex[file-multi-remembered:b]*"))
754+
(captured-collection nil)
755+
(captured-default nil))
756+
(unwind-protect
757+
(progn
758+
(clrhash ai-code-backends-infra--directory-buffer-map)
759+
(when (boundp 'ai-code-backends-infra--file-session-map)
760+
(clrhash ai-code-backends-infra--file-session-map))
761+
762+
(with-current-buffer source
763+
(setq buffer-file-name "/tmp/ai-code-file-multi-remembered/main.el")
764+
(setq default-directory working-dir))
765+
(with-current-buffer session-a
766+
(setq-local ai-code-backends-infra--session-directory working-dir))
767+
(with-current-buffer session-b
768+
(setq-local ai-code-backends-infra--session-directory working-dir))
769+
(ai-code-backends-infra--remember-session-buffer prefix working-dir session-b)
770+
771+
(cl-letf (((symbol-function 'ai-code-backends-infra--find-session-buffers)
772+
(lambda (_prefix _dir)
773+
(list session-a session-b)))
774+
((symbol-function 'completing-read)
775+
(lambda (_prompt collection _predicate _require-match
776+
&optional _initial-input _hist def &rest _)
777+
(setq captured-collection collection)
778+
(setq captured-default def)
779+
"a"))
780+
((symbol-function 'get-buffer-window)
781+
(lambda (&rest _args) nil))
782+
((symbol-function 'ai-code-backends-infra--display-buffer-in-side-window)
783+
(lambda (_buffer) nil)))
784+
(with-current-buffer source
785+
(ai-code-backends-infra--switch-to-session-buffer
786+
nil
787+
"missing"
788+
prefix
789+
working-dir
790+
nil)))
791+
792+
(should (equal captured-collection '("b" "a")))
793+
(should (equal captured-default "b"))
794+
(should (eq (gethash
795+
(ai-code-backends-infra--file-session-map-key prefix source)
796+
ai-code-backends-infra--file-session-map)
797+
session-a)))
798+
(dolist (buf (list source session-a session-b))
799+
(when (buffer-live-p buf)
800+
(kill-buffer buf))))))
801+
747802
(ert-deftest test-ai-code-backends-infra-switch-force-prompt-prioritizes-attached-session ()
748803
"Force prompt should place attached file session at the top and as default."
749804
(let* ((prefix "codex")
@@ -900,7 +955,7 @@
900955
(ai-code-backends-infra--send-line-to-session
901956
nil "missing" "line-2" prefix working-dir)))
902957

903-
(should (equal (nreverse force-prompts) (list nil t)))
958+
(should (equal (nreverse force-prompts) (list t t)))
904959
(should (equal (nreverse send-targets)
905960
(list "*codex[file-missing:a]*"
906961
"*codex[file-missing:b]*")))

0 commit comments

Comments
 (0)