conflicts: simplify state management of parse_conflict_hunk()

We no longer need body_seen because the header lines are deterministic.
This commit is contained in:
Yuya Nishihara 2022-09-20 13:35:44 +09:00
parent 8f3ad14012
commit 9bf8452411

View file

@ -278,60 +278,59 @@ pub fn parse_conflict(input: &[u8], num_removes: usize, num_adds: usize) -> Opti
} }
fn parse_conflict_hunk(input: &[u8]) -> MergeHunk { fn parse_conflict_hunk(input: &[u8]) -> MergeHunk {
let mut diff_seen = false; enum State {
let mut minus_seen = false; Diff,
let mut plus_seen = false; Minus,
let mut body_seen = false; Plus,
Unknown,
}
let mut state = State::Unknown;
let mut removes = vec![]; let mut removes = vec![];
let mut adds = vec![]; let mut adds = vec![];
for line in input.split_inclusive(|b| *b == b'\n') { for line in input.split_inclusive(|b| *b == b'\n') {
if line == CONFLICT_DIFF_LINE { match line {
diff_seen = true; CONFLICT_DIFF_LINE => {
if body_seen { state = State::Diff;
minus_seen = false; removes.push(vec![]);
plus_seen = false; adds.push(vec![]);
body_seen = false; continue;
} }
removes.push(vec![]); CONFLICT_MINUS_LINE => {
adds.push(vec![]); state = State::Minus;
} else if line == CONFLICT_MINUS_LINE { removes.push(vec![]);
minus_seen = true; continue;
if body_seen {
diff_seen = false;
plus_seen = false;
body_seen = false;
} }
removes.push(vec![]); CONFLICT_PLUS_LINE => {
} else if line == CONFLICT_PLUS_LINE { state = State::Plus;
plus_seen = true; adds.push(vec![]);
if body_seen { continue;
diff_seen = false;
minus_seen = false;
body_seen = false;
} }
adds.push(vec![]); _ => {}
} else if diff_seen { };
body_seen = true; match state {
if let Some(rest) = line.strip_prefix(b"-") { State::Diff => {
removes.last_mut().unwrap().extend_from_slice(rest); if let Some(rest) = line.strip_prefix(b"-") {
} else if let Some(rest) = line.strip_prefix(b"+") { removes.last_mut().unwrap().extend_from_slice(rest);
adds.last_mut().unwrap().extend_from_slice(rest); } else if let Some(rest) = line.strip_prefix(b"+") {
} else if let Some(rest) = line.strip_prefix(b" ") { adds.last_mut().unwrap().extend_from_slice(rest);
removes.last_mut().unwrap().extend_from_slice(rest); } else if let Some(rest) = line.strip_prefix(b" ") {
adds.last_mut().unwrap().extend_from_slice(rest); removes.last_mut().unwrap().extend_from_slice(rest);
} else { adds.last_mut().unwrap().extend_from_slice(rest);
} else {
// Doesn't look like a conflict
return MergeHunk::Resolved(vec![]);
}
}
State::Minus => {
removes.last_mut().unwrap().extend_from_slice(line);
}
State::Plus => {
adds.last_mut().unwrap().extend_from_slice(line);
}
State::Unknown => {
// Doesn't look like a conflict // Doesn't look like a conflict
return MergeHunk::Resolved(vec![]); return MergeHunk::Resolved(vec![]);
} }
} else if minus_seen {
body_seen = true;
removes.last_mut().unwrap().extend_from_slice(line);
} else if plus_seen {
body_seen = true;
adds.last_mut().unwrap().extend_from_slice(line);
} else {
// Doesn't look like a conflict
return MergeHunk::Resolved(vec![]);
} }
} }