Return parse errors in the text format when a hunk description is parsed, but the hunk fails to parse
Dependencies
- [2]
AF5AKUTOCleanup after the text changes refactoring - [3]
NWIZ65KEAdjusting the parsing of new directories to the recent change in parsing binary changes from text patches - [4]
L5I5B4PVFixing another parsing issue preventing delete edit hunks to be recorded - [5]
NBM34JQZCorrect parsing of undelete hunks - [6]
YNDPMU3VFixing #792 - [7]
BU7OHMPWFixing the "repeated records" bug - [8]
4ODDR4JLFixing a crash (asserting that the contents of an edit is non-empty) - [9]
UGUWKK3IFixing conflicts - [10]
OOJNAY34allow LF or CRLF when parsing change headers - [11]
FVN4TICGRefusing to parse patches to binary files converted to text format, as there is no way to make sense of them - [12]
MQ7TZOT6Edits can delete lines too - [13]
FGIVSUFHFixing conflicts with the new patch parsing code, and introducing AddRoot - [14]
YQMLICLWFix the hunk_roundtrip test, simplify code, improve test coverage, fix some edge cases. - [15]
FMVDQHHCParsing binary file deletions in the change text format - [16]
HW7DZ2B4Fixing the change parser - [17]
7ABOS34CDebug statements and formatting - [18]
HODZ2KUFSolving a conflict - [19]
5FI6SBEZRe-implement change printing and parsing
Change contents
- replacement in libpijul/src/change/parse.rs at line 17
let (i, name) = preceded(space0, parse_string)(i)?;let (i, perms) = preceded(space0, parse_perms)(i)?;let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, name) = preceded(space0, parse_string)(i)?;let (i, perms) = preceded(space0, parse_perms)(i)?;let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, _) = tuple((space0, line_ending))(i)?; - replacement in libpijul/src/change/parse.rs at line 23
let (i, del) = parse_edges(i)?;let (i, del) = parse_edges(i)?; - replacement in libpijul/src/change/parse.rs at line 25[8.65393]→[8.65393:65559](∅→∅),[8.65559]→[8.52:86](∅→∅),[8.86]→[8.65589:65786](∅→∅),[8.65589]→[8.65589:65786](∅→∅)
let (i, up_context) = preceded(pair(space0, tag("up")), parse_context)(i)?;let (i, down_context) = preceded(pair(space0, tag(", down")), parse_context)(i)?;let (i, _) = line_ending(i)?;Ok((i,FileMoveV {path,name,perms,pos,up_context,down_context,del,},))let (i, up_context) = preceded(pair(space0, tag("up")), parse_context)(i)?;let (i, down_context) = preceded(pair(space0, tag(", down")), parse_context)(i)?;let (i, _) = line_ending(i)?;Ok((i,FileMoveV {path,name,perms,pos,up_context,down_context,del,},))};parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 47
let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, _) = tuple((space0, line_ending))(i)?; - replacement in libpijul/src/change/parse.rs at line 51
let (i, add) = parse_edges(i)?;let (i, del) = parse_edges(i)?;Ok((i,FileMoveE {path,pos,add,del,},))let (i, add) = parse_edges(i)?;let (i, del) = parse_edges(i)?;Ok((i,FileMoveE {path,pos,add,del,},))};parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 72[8.66447]→[8.66447:66571](∅→∅),[8.66571]→[8.139:190](∅→∅),[8.190]→[8.66618:66660](∅→∅),[8.66618]→[8.66618:66660](∅→∅),[8.66660]→[8.0:85](∅→∅),[8.85]→[8.0:48](∅→∅),[8.115]→[8.0:48](∅→∅),[8.48]→[7.0:214](∅→∅)
let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, del_edges) = parse_edges(i)?;let (i, content_edges) = map(opt(parse_edges), |o| o.unwrap_or(Vec::new()))(i)?;let (i, contents) = if encoding.is_none() {debug!("encoding none");// If the encoding is binary, we may have a base64 version of// the file.if let Ok((i, c)) = parse_contents('-', encoding.clone(), i) {(i, c)let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, del_edges) = parse_edges(i)?;let (i, content_edges) = map(opt(parse_edges), |o| o.unwrap_or(Vec::new()))(i)?;let (i, contents) = if encoding.is_none() {debug!("encoding none");// If the encoding is binary, we may have a base64 version of// the file.if let Ok((i, c)) = parse_contents('-', encoding.clone(), i) {(i, c)} else {(i, Vec::new())} - replacement in libpijul/src/change/parse.rs at line 88
(i, Vec::new())}} else {parse_contents('-', encoding.clone(), i)?parse_contents('-', encoding.clone(), i)?};Ok((i,FileDel {path,pos,encoding,del_edges,content_edges,contents,},)) - replacement in libpijul/src/change/parse.rs at line 102[8.142]→[8.86:86](∅→∅),[8.86]→[8.66773:66958](∅→∅),[8.142]→[8.66773:66958](∅→∅),[8.66773]→[8.66773:66958](∅→∅)
Ok((i,FileDel {path,pos,encoding,del_edges,content_edges,contents,},))parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 111[8.67153]→[8.67153:67277](∅→∅),[8.67277]→[8.191:242](∅→∅),[8.242]→[8.67324:67368](∅→∅),[8.67324]→[8.67324:67368](∅→∅),[8.67368]→[8.970:1055](∅→∅),[8.1055]→[5.0:182](∅→∅)
let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, undel_edges) = parse_edges(i)?;let (i, content_edges) = map(opt(parse_edges), |o| o.unwrap_or(Vec::new()))(i)?;let (i, contents) = if let Ok(x) = parse_contents('+', encoding.clone(), i) {x} else {// Contents is optional for FileUndel hunks.(i, Vec::new())let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, undel_edges) = parse_edges(i)?;let (i, content_edges) = map(opt(parse_edges), |o| o.unwrap_or(Vec::new()))(i)?;let (i, contents) = if let Ok(x) = parse_contents('+', encoding.clone(), i) {x} else {// Contents is optional for FileUndel hunks.(i, Vec::new())};Ok((i,FileUndel {path,pos,encoding,undel_edges,content_edges,contents,},)) - replacement in libpijul/src/change/parse.rs at line 135
Ok((i,FileUndel {path,pos,encoding,undel_edges,content_edges,contents,},))parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 144
let (i, parent) = preceded(delimited(space1, tag("in"), space1), parse_string)(i)?;let (i, perms) = preceded(space0, parse_perms)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending, multispace0))(i)?;let parse = |i, name| -> IResult<&str, PrintableHunk> {let (i, parent) = preceded(delimited(space1, tag("in"), space1), parse_string)(i)?;let (i, perms) = preceded(space0, parse_perms)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending, multispace0))(i)?; - replacement in libpijul/src/change/parse.rs at line 150
let (i, up_context) = preceded(tag("up"), parse_context)(i)?;let (i, (start, end)) = delimited(space0, parse_start_end, pair(space0, line_ending))(i)?;let (i, contents) = if let PrintablePerms::IsDir = perms {(i, Vec::new())} else {parse_contents('+', encoding.clone(), i)?let (i, up_context) = preceded(tag("up"), parse_context)(i)?;let (i, (start, end)) = delimited(space0, parse_start_end, pair(space0, line_ending))(i)?;let (i, contents) = if let PrintablePerms::IsDir = perms {(i, Vec::new())} else {parse_contents('+', encoding.clone(), i)?};Ok((i,FileAddition {name,parent,perms,encoding,up_context,start,end,contents,},)) - replacement in libpijul/src/change/parse.rs at line 171[3.157]→[8.96:96](∅→∅),[8.1123]→[8.96:96](∅→∅),[8.96]→[8.68356:68578](∅→∅),[8.389]→[8.68356:68578](∅→∅),[8.1123]→[8.68356:68578](∅→∅),[8.68356]→[8.68356:68578](∅→∅)
Ok((i,FileAddition {name,parent,perms,encoding,up_context,start,end,contents,},))parse(i, name).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 179[8.68765]→[8.68765:68939](∅→∅),[8.68939]→[8.404:455](∅→∅),[8.455]→[8.68986:69024](∅→∅),[8.68986]→[8.68986:69024](∅→∅),[8.69024]→[8.1124:1318](∅→∅),[8.1318]→[8.0:39](∅→∅),[8.83]→[8.83:228](∅→∅)
let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, change) = parse_atom(i)?;let (i, contents_plus) = parse_contents('+', encoding.clone(), i)?;let (i, contents_minus) = parse_contents('-', encoding.clone(), i)?;let contents = if contents_plus.is_empty() {if contents_minus.is_empty() {return Err(nom::Err::Error(nom::error::Error::new(i,nom::error::ErrorKind::Verify,)))let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, change) = parse_atom(i)?;let (i, contents_plus) = parse_contents('+', encoding.clone(), i)?;let (i, contents_minus) = parse_contents('-', encoding.clone(), i)?;let contents = if contents_plus.is_empty() {if contents_minus.is_empty() {return Err(nom::Err::Error(nom::error::Error::new(i,nom::error::ErrorKind::Verify,)));} else {contents_minus} - replacement in libpijul/src/change/parse.rs at line 197[6.17]→[6.17:44](∅→∅),[6.44]→[8.228:238](∅→∅),[8.228]→[8.228:238](∅→∅),[8.238]→[8.446:459](∅→∅),[8.513]→[8.446:459](∅→∅),[8.1341]→[8.446:459](∅→∅),[8.446]→[8.446:459](∅→∅),[8.459]→[8.1342:1364](∅→∅)
contents_minus}} else {contents_pluscontents_plus};Ok((i,Edit {path,line: line as usize,pos,encoding,change,contents,},)) - replacement in libpijul/src/change/parse.rs at line 211
Ok((i,Edit {path,line: line as usize,pos,encoding,change,contents,},))parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 220[8.69465]→[8.69465:69639](∅→∅),[8.69639]→[8.456:562](∅→∅),[8.562]→[8.69737:70232](∅→∅),[8.69737]→[8.69737:70232](∅→∅)
let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;// TODO: allow line_endings in between these lineslet (i, change) = parse_edges(i)?;let (i, replacement) = parse_new_vertex(i)?;let (i, change_contents) = parse_contents('-', encoding.clone(), i)?;let (i, replacement_contents) = parse_contents('+', encoding.clone(), i)?;Ok((i,Replace {path,line: line as usize,pos,encoding,change,replacement,change_contents,replacement_contents,},))let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;// TODO: allow line_endings in between these lineslet (i, change) = parse_edges(i)?;let (i, replacement) = parse_new_vertex(i)?;let (i, change_contents) = parse_contents('-', encoding.clone(), i)?;let (i, replacement_contents) = parse_contents('+', encoding.clone(), i)?;Ok((i,Replace {path,line: line as usize,pos,encoding,change,replacement,change_contents,replacement_contents,},))};parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 253[8.70440]→[8.70440:70651](∅→∅),[8.70651]→[8.563:614](∅→∅),[8.614]→[8.70698:70875](∅→∅),[8.70698]→[8.70698:70875](∅→∅)
let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, _) = tuple((space0, char(':'), space0))(i)?;let (i, names) = separated_list0(tuple((space0, char(','), space0)), parse_string)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, edges) = parse_edges(i)?;Ok((i,SolveNameConflict {path,pos,names,edges,},))let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, _) = tuple((space0, char(':'), space0))(i)?;let (i, names) = separated_list0(tuple((space0, char(','), space0)), parse_string)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, edges) = parse_edges(i)?;Ok((i,SolveNameConflict {path,pos,names,edges,},))};parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 278[8.71088]→[8.71088:71299](∅→∅),[8.71299]→[8.615:666](∅→∅),[8.666]→[8.71346:71525](∅→∅),[8.71346]→[8.71346:71525](∅→∅)
let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, _) = tuple((space0, char(':'), space0))(i)?;let (i, names) = separated_list0(tuple((space0, char(','), space0)), parse_string)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, edges) = parse_edges(i)?;Ok((i,UnsolveNameConflict {path,pos,names,edges,},))let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, _) = tuple((space0, char(':'), space0))(i)?;let (i, names) = separated_list0(tuple((space0, char(','), space0)), parse_string)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, edges) = parse_edges(i)?;Ok((i,UnsolveNameConflict {path,pos,names,edges,},))};parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 303[8.71736]→[8.71736:71910](∅→∅),[8.71910]→[8.667:718](∅→∅),[8.718]→[8.71957:72267](∅→∅),[8.71957]→[8.71957:72267](∅→∅)
let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space1, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, change) = parse_new_vertex(i)?;let (i, contents) = parse_contents('+', encoding.clone(), i)?;Ok((i,SolveOrderConflict {path,line: line as usize,pos,encoding,change,contents,},))let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space1, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, change) = parse_new_vertex(i)?;let (i, contents) = parse_contents('+', encoding.clone(), i)?;Ok((i,SolveOrderConflict {path,line: line as usize,pos,encoding,change,contents,},))};parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 331[8.72483]→[8.72483:72657](∅→∅),[8.72657]→[8.719:770](∅→∅),[8.770]→[8.72704:73011](∅→∅),[8.72704]→[8.72704:73011](∅→∅)
let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space1, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, change) = parse_edges(i)?;let (i, contents) = parse_contents('-', encoding.clone(), i)?;Ok((i,UnsolveOrderConflict {path,line: line as usize,pos,encoding,change,contents,},))let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space1, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, change) = parse_edges(i)?;let (i, contents) = parse_contents('-', encoding.clone(), i)?;Ok((i,UnsolveOrderConflict {path,line: line as usize,pos,encoding,change,contents,},))};parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 359[8.73219]→[8.73219:73393](∅→∅),[8.73393]→[8.771:822](∅→∅),[8.822]→[8.73440:73743](∅→∅),[8.73440]→[8.73440:73743](∅→∅)
let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, change) = parse_edges(i)?;let (i, contents) = parse_contents('+', encoding.clone(), i)?;Ok((i,ResurrectZombies {path,line: line as usize,pos,encoding,change,contents,},))let parse = |i, path| -> IResult<&str, PrintableHunk> {let (i, line) = preceded(char(':'), u64)(i)?;let (i, pos) = preceded(space0, parse_printable_pos)(i)?;let (i, encoding) = preceded(space0, parse_encoding)(i)?;let (i, _) = tuple((space0, line_ending))(i)?;let (i, change) = parse_edges(i)?;let (i, contents) = parse_contents('+', encoding.clone(), i)?;Ok((i,ResurrectZombies {path,line: line as usize,pos,encoding,change,contents,},))};parse(i, path).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 385[8.6983]→[8.823:887](∅→∅),[8.887]→[8.7043:7173](∅→∅),[8.7043]→[8.7043:7173](∅→∅),[8.7173]→[8.888:983](∅→∅),[8.983]→[8.7264:7380](∅→∅),[8.7264]→[8.7264:7380](∅→∅),[8.7380]→[2.4250:4296](∅→∅)
let (i, _) = tuple((space0, line_ending, multispace0))(i)?;debug!("root add {:?}", i);let (i, up_context) = preceded(tag("up"), parse_context)(i)?;debug!("root add {:?}", i);let (i, (start, end)) = delimited(space0, parse_start_end, pair(space0, line_ending))(i)?;debug!("root add {:?}", i);assert_eq!(&up_context[..], &[PrintablePos(1, 0)]);assert_eq!(start, end);Ok((i, PrintableHunk::AddRoot { start }))let parse = |i| -> IResult<&str, PrintableHunk> {let (i, _) = tuple((space0, line_ending, multispace0))(i)?;debug!("root add {:?}", i);let (i, up_context) = preceded(tag("up"), parse_context)(i)?;debug!("root add {:?}", i);let (i, (start, end)) = delimited(space0, parse_start_end, pair(space0, line_ending))(i)?;debug!("root add {:?}", i);assert_eq!(&up_context[..], &[PrintablePos(1, 0)]);assert_eq!(start, end);Ok((i, PrintableHunk::AddRoot { start }))};parse(i).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 402
let (i, _) = tuple((space0, line_ending))(i)?;let (i, name) = parse_edges(i)?;let (i, inode) = parse_edges(i)?;let parse = |i| -> IResult<&str, PrintableHunk> {let (i, _) = tuple((space0, line_ending))(i)?;let (i, name) = parse_edges(i)?;let (i, inode) = parse_edges(i)?; - replacement in libpijul/src/change/parse.rs at line 407
Ok((i, PrintableHunk::DelRoot { inode, name }))Ok((i, PrintableHunk::DelRoot { inode, name }))};parse(i).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify))) - replacement in libpijul/src/change/parse.rs at line 446
))))));