mirror of
https://github.com/martinvonz/jj.git
synced 2025-02-02 09:28:40 +00:00
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:
parent
8f3ad14012
commit
9bf8452411
1 changed files with 44 additions and 45 deletions
|
@ -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![]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue