codex: address apply_patch grammar review feedback

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
starr-openai
2026-05-07 18:28:31 -07:00
parent 07866e78d9
commit 101eabf6af
4 changed files with 66 additions and 24 deletions

View File

@@ -19,8 +19,6 @@ use ParseError::*;
#[derive(Debug, Default, Clone)]
pub struct StreamingPatchParser {
allow_environment_id: bool,
saw_environment_id: bool,
line_buffer: String,
state: StreamingParserState,
line_number: usize,
@@ -32,11 +30,15 @@ struct StreamingParserState {
hunks: Vec<Hunk>,
}
#[derive(Debug, Default, Clone)]
#[derive(Debug, Clone)]
enum StreamingParserMode {
#[default]
NotStarted,
StartedPatch,
NotStarted {
allow_environment_id: bool,
},
StartedPatch {
allow_environment_id: bool,
saw_environment_id: bool,
},
AddFile,
DeleteFile,
UpdateFile {
@@ -45,9 +47,29 @@ enum StreamingParserMode {
EndedPatch,
}
impl Default for StreamingParserMode {
fn default() -> Self {
Self::NotStarted {
allow_environment_id: false,
}
}
}
impl StreamingPatchParser {
pub fn set_allow_environment_id(&mut self, allow_environment_id: bool) {
self.allow_environment_id = allow_environment_id;
match &mut self.state.mode {
StreamingParserMode::NotStarted {
allow_environment_id: current,
}
| StreamingParserMode::StartedPatch {
allow_environment_id: current,
..
} => *current = allow_environment_id,
StreamingParserMode::AddFile
| StreamingParserMode::DeleteFile
| StreamingParserMode::UpdateFile { .. }
| StreamingParserMode::EndedPatch => {}
}
}
fn ensure_update_hunk_is_not_empty(&self, line: &str) -> Result<(), ParseError> {
@@ -158,18 +180,26 @@ impl StreamingPatchParser {
fn process_line(&mut self, line: &str) -> Result<(), ParseError> {
let trimmed = line.trim();
match self.state.mode.clone() {
StreamingParserMode::NotStarted => {
StreamingParserMode::NotStarted {
allow_environment_id,
} => {
if trimmed == BEGIN_PATCH_MARKER {
self.state.mode = StreamingParserMode::StartedPatch;
self.state.mode = StreamingParserMode::StartedPatch {
allow_environment_id,
saw_environment_id: false,
};
return Ok(());
}
Err(InvalidPatchError(
"The first line of the patch must be '*** Begin Patch'".to_string(),
))
}
StreamingParserMode::StartedPatch => {
if self.allow_environment_id
&& !self.saw_environment_id
StreamingParserMode::StartedPatch {
allow_environment_id,
saw_environment_id,
} => {
if allow_environment_id
&& !saw_environment_id
&& let Some(environment_id) = trimmed.strip_prefix(ENVIRONMENT_ID_MARKER)
{
if environment_id.trim().is_empty() {
@@ -177,7 +207,10 @@ impl StreamingPatchParser {
"Environment ID cannot be empty".to_string(),
));
}
self.saw_environment_id = true;
self.state.mode = StreamingParserMode::StartedPatch {
allow_environment_id,
saw_environment_id: true,
};
return Ok(());
}
if self.handle_hunk_headers_and_end_patch(trimmed)? {