[apply-patch] Fix applypatch for heredocs (#2477)
## Summary Follow up to #2186 for #2072 - we added handling for `applypatch` in default commands, but forgot to add detection to the heredocs logic. ## Testing - [x] Added unit tests
This commit is contained in:
@@ -22,6 +22,8 @@ use tree_sitter_bash::LANGUAGE as BASH;
|
|||||||
/// Detailed instructions for gpt-4.1 on how to use the `apply_patch` tool.
|
/// Detailed instructions for gpt-4.1 on how to use the `apply_patch` tool.
|
||||||
pub const APPLY_PATCH_TOOL_INSTRUCTIONS: &str = include_str!("../apply_patch_tool_instructions.md");
|
pub const APPLY_PATCH_TOOL_INSTRUCTIONS: &str = include_str!("../apply_patch_tool_instructions.md");
|
||||||
|
|
||||||
|
const APPLY_PATCH_COMMANDS: [&str; 2] = ["apply_patch", "applypatch"];
|
||||||
|
|
||||||
#[derive(Debug, Error, PartialEq)]
|
#[derive(Debug, Error, PartialEq)]
|
||||||
pub enum ApplyPatchError {
|
pub enum ApplyPatchError {
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
@@ -82,7 +84,6 @@ pub struct ApplyPatchArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn maybe_parse_apply_patch(argv: &[String]) -> MaybeApplyPatch {
|
pub fn maybe_parse_apply_patch(argv: &[String]) -> MaybeApplyPatch {
|
||||||
const APPLY_PATCH_COMMANDS: [&str; 2] = ["apply_patch", "applypatch"];
|
|
||||||
match argv {
|
match argv {
|
||||||
[cmd, body] if APPLY_PATCH_COMMANDS.contains(&cmd.as_str()) => match parse_patch(body) {
|
[cmd, body] if APPLY_PATCH_COMMANDS.contains(&cmd.as_str()) => match parse_patch(body) {
|
||||||
Ok(source) => MaybeApplyPatch::Body(source),
|
Ok(source) => MaybeApplyPatch::Body(source),
|
||||||
@@ -91,7 +92,9 @@ pub fn maybe_parse_apply_patch(argv: &[String]) -> MaybeApplyPatch {
|
|||||||
[bash, flag, script]
|
[bash, flag, script]
|
||||||
if bash == "bash"
|
if bash == "bash"
|
||||||
&& flag == "-lc"
|
&& flag == "-lc"
|
||||||
&& script.trim_start().starts_with("apply_patch") =>
|
&& APPLY_PATCH_COMMANDS
|
||||||
|
.iter()
|
||||||
|
.any(|cmd| script.trim_start().starts_with(cmd)) =>
|
||||||
{
|
{
|
||||||
match extract_heredoc_body_from_apply_patch_command(script) {
|
match extract_heredoc_body_from_apply_patch_command(script) {
|
||||||
Ok(body) => match parse_patch(&body) {
|
Ok(body) => match parse_patch(&body) {
|
||||||
@@ -262,7 +265,10 @@ pub fn maybe_parse_apply_patch_verified(argv: &[String], cwd: &Path) -> MaybeApp
|
|||||||
fn extract_heredoc_body_from_apply_patch_command(
|
fn extract_heredoc_body_from_apply_patch_command(
|
||||||
src: &str,
|
src: &str,
|
||||||
) -> std::result::Result<String, ExtractHeredocError> {
|
) -> std::result::Result<String, ExtractHeredocError> {
|
||||||
if !src.trim_start().starts_with("apply_patch") {
|
if !APPLY_PATCH_COMMANDS
|
||||||
|
.iter()
|
||||||
|
.any(|cmd| src.trim_start().starts_with(cmd))
|
||||||
|
{
|
||||||
return Err(ExtractHeredocError::CommandDidNotStartWithApplyPatch);
|
return Err(ExtractHeredocError::CommandDidNotStartWithApplyPatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,6 +779,33 @@ PATCH"#,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_heredoc_applypatch() {
|
||||||
|
let args = strs_to_strings(&[
|
||||||
|
"bash",
|
||||||
|
"-lc",
|
||||||
|
r#"applypatch <<'PATCH'
|
||||||
|
*** Begin Patch
|
||||||
|
*** Add File: foo
|
||||||
|
+hi
|
||||||
|
*** End Patch
|
||||||
|
PATCH"#,
|
||||||
|
]);
|
||||||
|
|
||||||
|
match maybe_parse_apply_patch(&args) {
|
||||||
|
MaybeApplyPatch::Body(ApplyPatchArgs { hunks, patch: _ }) => {
|
||||||
|
assert_eq!(
|
||||||
|
hunks,
|
||||||
|
vec![Hunk::AddFile {
|
||||||
|
path: PathBuf::from("foo"),
|
||||||
|
contents: "hi\n".to_string()
|
||||||
|
}]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
result => panic!("expected MaybeApplyPatch::Body got {result:?}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_add_file_hunk_creates_file_with_contents() {
|
fn test_add_file_hunk_creates_file_with_contents() {
|
||||||
let dir = tempdir().unwrap();
|
let dir = tempdir().unwrap();
|
||||||
|
|||||||
Reference in New Issue
Block a user