diff --git a/Cargo.lock b/Cargo.lock index e2318eac7263e912f69c66fcd16c55d05600497b..16d5028af3a7f791f96d9e6e8c614013a09f6dc7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4920,6 +4920,7 @@ dependencies = [ "serde", "settings", "shellexpand 2.1.2", + "smol", "telemetry", "toml 0.8.20", "unindent", diff --git a/crates/eval/Cargo.toml b/crates/eval/Cargo.toml index 67d9b821972c2214f4cda2457c54361c83a9dae1..e69af358fababc92124a3a7b507173814a0070dc 100644 --- a/crates/eval/Cargo.toml +++ b/crates/eval/Cargo.toml @@ -7,9 +7,9 @@ edition.workspace = true [dependencies] agent.workspace = true anyhow.workspace = true -async-watch.workspace = true assistant_tool.workspace = true assistant_tools.workspace = true +async-watch.workspace = true chrono.workspace = true clap.workspace = true client.workspace = true @@ -37,6 +37,7 @@ reqwest_client.workspace = true serde.workspace = true settings.workspace = true shellexpand.workspace = true +smol.workspace = true telemetry.workspace = true toml.workspace = true unindent.workspace = true diff --git a/crates/eval/src/example.rs b/crates/eval/src/example.rs index 65f5a659dc6aedcb61602f3b3b23e53765d2a921..ed445d3c682b9145843db24f7da5d245f78556d2 100644 --- a/crates/eval/src/example.rs +++ b/crates/eval/src/example.rs @@ -323,6 +323,13 @@ impl Example { return Err(anyhow!("Setup only mode")); } + let example_output_dir = this.example_output_directory(); + let last_diff_file_path = example_output_dir.join("last.diff"); + + // Write an empty "last.diff" so that it can be opened in Zed for convenient view of the + // history using undo/redo. + std::fs::write(&last_diff_file_path, "")?; + let thread_store = thread_store.await?; let thread = thread_store.update(cx, |thread_store, cx| thread_store.create_thread(cx))?; @@ -330,24 +337,43 @@ impl Example { thread.update(cx, |thread, _cx| { let mut request_count = 0; - let example_dir_path = this.example_output_directory(); - let last_request = Rc::clone(&last_request); + let previous_diff = Rc::new(RefCell::new("".to_string())); + let example_output_dir = example_output_dir.clone(); + let last_diff_file_path = last_diff_file_path.clone(); + let this = this.clone(); thread.set_request_callback(move |request, response_events| { *last_request.borrow_mut() = Some(request.clone()); request_count += 1; - let messages_file_path = example_dir_path.join(format!("{request_count}.messages.md")); - let last_messages_file_path = example_dir_path.join("last.messages.md"); + let messages_file_path = example_output_dir.join(format!("{request_count}.messages.md")); + let diff_file_path = example_output_dir.join(format!("{request_count}.diff")); + let last_messages_file_path = example_output_dir.join("last.messages.md"); let request_markdown = RequestMarkdown::new(request); let response_events_markdown = response_events_to_markdown(response_events); let messages = format!("{}\n\n{}", request_markdown.messages, response_events_markdown); - fs::write(messages_file_path, messages.clone()).expect("failed to write messages file"); - fs::write(last_messages_file_path, messages).expect("failed to write last messages file"); + fs::write(&messages_file_path, messages.clone()).expect("failed to write messages file"); + fs::write(&last_messages_file_path, messages).expect("failed to write last messages file"); + + let diff_result = smol::block_on(this.repository_diff()); + match diff_result { + Ok(diff) => { + if diff != previous_diff.borrow().clone() { + fs::write(&diff_file_path, &diff).expect("failed to write diff file"); + fs::write(&last_diff_file_path, &diff).expect("failed to write last diff file"); + *previous_diff.borrow_mut() = diff; + } + } + Err(err) => { + let error_message = format!("{err:?}"); + fs::write(&diff_file_path, &error_message).expect("failed to write diff error to file"); + fs::write(&last_diff_file_path, &error_message).expect("failed to write last diff file"); + } + } if request_count == 1 { - let tools_file_path = example_dir_path.join("tools.md"); + let tools_file_path = example_output_dir.join("tools.md"); fs::write(tools_file_path, request_markdown.tools).expect("failed to write tools file"); } }); @@ -460,11 +486,7 @@ impl Example { println!("{}Getting repository diff", this.log_prefix); let repository_diff = this.repository_diff().await?; - - let example_output_dir = this.example_output_directory(); - let repository_diff_path = example_output_dir.join("patch.diff"); - let mut repository_diff_output_file = File::create(&repository_diff_path)?; - writeln!(&mut repository_diff_output_file, "{}", &repository_diff).log_err(); + std::fs::write(last_diff_file_path, &repository_diff)?; println!("{}Getting diagnostics", this.log_prefix); let diagnostics_after = cx