Fix the hunk_roundtrip test, simplify code, improve test coverage, fix some edge cases.
[?]
FHRXP5Jnb2MWLDrPrnLnkN2ryWcGCo6CRr1dXR9FW2YA
Dec 9, 2021, 3:00 PM
YQMLICLW2FABJBX5AQGPZIHICYLECR53TLPEBGUEH23YNKIMKC7ACDependencies
- [2]
HW7DZ2B4Fixing the change parser - [3]
5FI6SBEZRe-implement change printing and parsing - [4]
FGIVSUFHFixing conflicts with the new patch parsing code, and introducing AddRoot - [5]
5NHRJ5PYCleaner handling of binary changes in the text format - [6]
MQ7TZOT6Edits can delete lines too - [7]
7ABOS34CDebug statements and formatting
Change contents
- replacement in libpijul/src/change/printable.rs at line 456
if e[0].flag.deleted {if e.is_empty() || e[0].flag.deleted { - edit in libpijul/src/change/printable.rs at line 698
AddRoot {start: f(g),},DelRoot {name: f(g), inode: f(g)}, - replacement in libpijul/src/change/printable.rs at line 708
// Shrinking frequently blows stack. Investigate how to fix it.// You can disable shrinking by commenting out this function.// This may be best solved by switching to proptest crate/*// Shrinking frequently blows stack.// See https://github.com/BurntSushi/quickcheck/pull/294.// We can't really solve this problem without introducing a ton of boilerplate. - edit in libpijul/src/change/printable.rs at line 712
use std::iter::empty; - replacement in libpijul/src/change/printable.rs at line 714
FileMoveV { path, name, perms, pos, up_context, down_context, del } =>Box::new((path, name, perms, pos, up_context, down_context, del).shrink().map(|(path, name, perms, pos, up_context, down_context, del)|fix_encoding(FileMoveV { path, name, perms, pos, up_context, down_context, del }))),FileMoveE { path, pos, add, del } =>Box::new((path, pos, add, del).shrink().map(|(path, pos, add, del)|fix_encoding(FileMoveE { path, pos, add, del }))),FileAddition { name, parent, perms, encoding, up_context, start, end, contents } =>Box::new((name, parent, perms, encoding, up_context, start, end, contents).shrink().map(|(name, parent, perms, encoding, up_context, start, end, contents)|fix_encoding(FileAddition { name, parent, perms, encoding, up_context, start, end, contents }))),// Example of shrinking for future reference: - replacement in libpijul/src/change/printable.rs at line 716
FileDel { path, pos, encoding, del_edges, content_edges, contents } =>Box::new((path, pos, encoding, del_edges, content_edges, contents).shrink().map(|(path, pos, encoding, del_edges, content_edges, contents)|fix_encoding(FileDel { path, pos, encoding, del_edges, content_edges, contents }))),FileUndel { path, pos, encoding, undel_edges, content_edges, contents } =>Box::new((path, pos, encoding, undel_edges, content_edges, contents).shrink().map(|(path, pos, encoding, undel_edges, content_edges, contents)|fix_encoding(FileUndel { path, pos, encoding, undel_edges, content_edges, contents }))),Edit { path, line, pos, encoding, change, contents } =>Box::new((path, line, pos, encoding, change, contents).shrink().map(|(path, line, pos, encoding, change, contents)|fix_encoding(Edit { path, line, pos, encoding, change, contents }))),Replace { path, line, pos, encoding, change, replacement, change_contents, replacement_contents } =>Box::new((path, line, pos, encoding, change, replacement, change_contents, replacement_contents).shrink().map(|(path, line, pos, encoding, change, replacement, change_contents, replacement_contents)|fix_encoding(Replace { path, line, pos, encoding, change, replacement, change_contents, replacement_contents }))),SolveNameConflict { path, pos, names, edges } =>Box::new((path, pos, names, edges).shrink().map(|(path, pos, names, edges)|fix_encoding(SolveNameConflict { path, pos, names, edges }))),UnsolveNameConflict { path, pos, names, edges } =>Box::new((path, pos, names, edges).shrink().map(|(path, pos, names, edges)|fix_encoding(UnsolveNameConflict { path, pos, names, edges }))),SolveOrderConflict { path, line, pos, encoding, change, contents } =>Box::new((path, line, pos, encoding, change, contents).shrink().map(|(path, line, pos, encoding, change, contents)|fix_encoding(SolveOrderConflict { path, line, pos, encoding, change, contents }))),UnsolveOrderConflict { path, line, pos, encoding, change, contents } =>Box::new((path, line, pos, encoding, change, contents).shrink().map(|(path, line, pos, encoding, change, contents)|fix_encoding(UnsolveOrderConflict { path, line, pos, encoding, change, contents }))),ResurrectZombies { path, line, pos, encoding, change, contents } =>Box::new((path, line, pos, encoding, change, contents).shrink().map(|(path, line, pos, encoding, change, contents)|fix_encoding(ResurrectZombies { path, line, pos, encoding, change, contents }))),// FileMoveV { path, name, perms, pos, up_context, down_context, del } =>// Box::new((path, name, perms, pos, up_context, down_context, del)// .shrink().map(|(path, name, perms, pos, up_context, down_context, del)|// fix_encoding(FileMoveV { path, name, perms, pos, up_context, down_context, del }))),_ => Box::new(empty()), - edit in libpijul/src/change/printable.rs at line 723
*/ - replacement in libpijul/src/change/parse.rs at line 68
let (i, content_edges) = if let Ok(x) = parse_edges(i) {x} else {(i, Vec::new())};let (i, content_edges) = map(opt(parse_edges), |o| o.unwrap_or(Vec::new()))(i)?; - replacement in libpijul/src/change/parse.rs at line 92
let (i, content_edges) = if let Ok(x) = parse_edges(i) {x} else {(i, Vec::new())};let (i, content_edges) = map(opt(parse_edges), |o| o.unwrap_or(Vec::new()))(i)?; - replacement in libpijul/src/change/parse.rs at line 119
let (i, contents) = if let PrintablePerms::IsDir = perms {(i, Vec::new())} else {parse_contents('+', encoding.clone(), i)?};let (i, contents) = parse_contents('+', encoding.clone(), i)?; - replacement in libpijul/src/change/parse.rs at line 144
let (i, contents) = if let Ok(s) = parse_contents('+', encoding.clone(), i) {if s.1.is_empty() {parse_contents('-', encoding.clone(), i)?} else {s}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() {contents_minus - replacement in libpijul/src/change/parse.rs at line 149
parse_contents('-', encoding.clone(), i)?contents_plus - edit in libpijul/src/change/parse.rs at line 358
let has_encoding = encoding.is_some(); - replacement in libpijul/src/change/parse.rs at line 359[3.74618]→[2.514:721](∅→∅),[3.382]→[3.1000:1033](∅→∅),[2.721]→[3.1000:1033](∅→∅),[3.546]→[3.1000:1033](∅→∅)
let not_empty = if backslash.is_some() && vec[vec.len() - 1] == b'\n' {vec.pop().is_some()} else {!vec.is_empty()};if has_encoding || not_empty {return Ok((i, vec));if backslash.is_some() && vec[vec.len() - 1] == b'\n' {vec.pop(); - edit in libpijul/src/change/parse.rs at line 362
Ok((i, vec))} else {Err(nom::Err::Error(nom::error::Error::new(i,nom::error::ErrorKind::Verify,))) - edit in libpijul/src/change/parse.rs at line 369
Err(nom::Err::Error(nom::error::Error::new(i,nom::error::ErrorKind::Verify,)))