feat: copy diff review comments to configured clipboard

This commit is contained in:
Valdemar Lorenzen
2026-10-20 12:16:22 +02:00
parent eae3bdba16
commit a5a246db77
11 changed files with 248 additions and 81 deletions
+110
View File
@@ -7462,6 +7462,116 @@ mod system_clipboard {
}
}
#[test]
fn review_copy_uses_cli_text_and_configured_clipboard_without_saving_drafts() {
use crate::review::{Anchor, Comment, Review, Side, Store, Verdict};
for mode in ["system", "separate"] {
let fixture = Fixture::new();
let root = fixture.0.0.canonicalize().unwrap();
let storage = root.join("reviews");
let mut review = Review::new(root.clone());
review.summary = "Review summary".into();
review.verdict = Some(Verdict::ChangesRequested);
review.comments = vec![
Comment {
id: 1,
body: "First\nfeedback".into(),
resolved: false,
anchor: Anchor {
revision: "base".into(),
path: "file.txt".into(),
side: Side::Before,
start: TextPosition { row: 0, column: 1 },
end: TextPosition { row: 1, column: 1 },
content: "xe\u{301}👩‍💻\n界z".into(),
},
},
Comment {
id: 2,
body: "Resolved feedback".into(),
resolved: true,
anchor: Anchor {
revision: "stale".into(),
path: "other.rs".into(),
side: Side::After,
start: TextPosition { row: 0, column: 0 },
end: TextPosition { row: 0, column: 3 },
content: "old".into(),
},
},
];
let mut store = Store::open(&storage).unwrap();
store.save(&mut review).unwrap();
let id = review.storage_id.unwrap();
let expected = format!(
"Repository: {}\nReview {id} (revision 1): Review summary\n \
Verdict: changes_requested; 1 unresolved, 1 resolved (2 total)\n\
\nComment 1 [unresolved] file.txt (before) 0:1–1:1 @ base\n\
e\u{301}👩‍💻\n界\nFirst\nfeedback\n\
\nComment 2 [resolved] other.rs (after) 0:0–0:3 @ stale\n\
old\nResolved feedback\n",
root.display(),
);
let mut editor = fixture.editor();
editor.set_clipboard_mode(mode).unwrap();
editor.clipboard = vec!["internal".into()];
fixture.external("external");
editor.execute("diff.review.copy");
assert_eq!(editor.clipboard, ["internal"]);
assert_eq!(fixture.bytes("state"), b"external");
editor.set_review_directory(storage);
historical_diff(
&mut editor,
&root,
vec!["xe\u{301}👩‍💻".into(), "界z".into()],
vec!["new".into()],
);
editor.execute("diff.review.edit 1");
type_text(&mut editor, "A UNSAVED");
editor.handle(Input::Escape);
let draft = editor.context().text;
editor.execute("diff.review.copy");
assert_eq!(editor.context().text, draft);
assert!(editor.local_reviews_dirty());
let stored = store.load(&root, id).unwrap();
assert_eq!(stored.storage_revision, review.storage_revision);
assert_eq!(stored.comments, review.comments);
if mode == "system" {
assert_eq!(fixture.bytes("state"), expected.as_bytes());
assert_eq!(editor.clipboard, ["internal"]);
let owned = editor.owned_system_clipboard.clone();
fixture.fail("fail-write", true);
editor.execute("diff.review.copy");
assert_eq!(fixture.bytes("state"), expected.as_bytes());
assert_eq!(editor.owned_system_clipboard, owned);
} else {
assert_eq!(editor.clipboard, [expected.clone()]);
assert!(!editor.clipboard_linewise);
assert_eq!(fixture.bytes("state"), b"external");
assert!(fixture.bytes("writes").is_empty());
}
editor.execute("diff.review.copy unexpected");
editor.with_pane(editor.diff_owner.unwrap(), |editor| {
editor
.diff
.as_mut()
.unwrap()
.local_review
.document
.comments
.clear();
});
editor.execute("diff.review.copy");
if mode == "system" {
assert_eq!(fixture.bytes("state"), expected.as_bytes());
} else {
assert_eq!(editor.clipboard, [expected]);
}
}
}
#[test]
fn line_actions_clipboard_failure_preserves_carets_history_and_repeat() {
let fixture = Fixture::new();
+1 -1
View File
@@ -1,7 +1,7 @@
use super::*;
use vamp::{
plugin::TextPosition,
review::{Comment, Side},
review::{Anchor, Comment, Side},
};
#[test]