Fix the hunk_roundtrip test, simplify code, improve test coverage, fix some edge cases.

[?]
FHRXP5Jnb2MWLDrPrnLnkN2ryWcGCo6CRr1dXR9FW2YA
Dec 9, 2021, 3:00 PM
YQMLICLW2FABJBX5AQGPZIHICYLECR53TLPEBGUEH23YNKIMKC7AC

Dependencies

  • [2] HW7DZ2B4 Fixing the change parser
  • [3] FGIVSUFH Fixing conflicts with the new patch parsing code, and introducing AddRoot
  • [4] 5NHRJ5PY Cleaner handling of binary changes in the text format
  • [5] 7ABOS34C Debug statements and formatting
  • [6] 5FI6SBEZ Re-implement change printing and parsing
  • [7] MQ7TZOT6 Edits can delete lines too

Change contents

  • replacement in libpijul/src/change/printable.rs at line 456
    [3.73][3.73:116]()
    if e[0].flag.deleted {
    [3.73]
    [3.116]
    if e.is_empty() || e[0].flag.deleted {
  • edit in libpijul/src/change/printable.rs at line 698
    [3.55511]
    [3.55511]
    AddRoot {
    start: f(g),
    },
    DelRoot {
    name: f(g), inode: f(g)
    },
  • replacement in libpijul/src/change/printable.rs at line 708
    [3.55556][3.55556:55759]()
    // 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
    /*
    [3.55556]
    [3.55759]
    // 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
    [3.55816]
    [3.55816]
    use std::iter::empty;
  • replacement in libpijul/src/change/printable.rs at line 714
    [3.55845][3.55845:56198](),[3.56198][3.56198:56199](),[3.56199][3.56199:56816]()
    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 }))),
    [3.55845]
    [3.56816]
    // Example of shrinking for future reference:
  • replacement in libpijul/src/change/printable.rs at line 716
    [3.56817][3.56817:59826]()
    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 }))),
    [3.56817]
    [3.59826]
    // 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
    [3.59842][3.59842:59849]()
    */
  • replacement in libpijul/src/change/parse.rs at line 68
    [3.66660][2.0:115]()
    let (i, content_edges) = if let Ok(x) = parse_edges(i) {
    x
    } else {
    (i, Vec::new())
    };
    [3.66660]
    [3.66706]
    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
    [3.67368][2.116:231]()
    let (i, content_edges) = if let Ok(x) = parse_edges(i) {
    x
    } else {
    (i, Vec::new())
    };
    [3.67368]
    [3.67414]
    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
    [3.68289][2.232:389]()
    let (i, contents) = if let PrintablePerms::IsDir = perms {
    (i, Vec::new())
    } else {
    parse_contents('+', encoding.clone(), i)?
    };
    [3.68289]
    [3.68356]
    let (i, contents) = parse_contents('+', encoding.clone(), i)?;
  • replacement in libpijul/src/change/parse.rs at line 144
    [3.69024][3.354:436](),[3.436][2.390:513]()
    let (i, contents) = if let Ok(s) = parse_contents('+', encoding.clone(), i) {
    if s.1.is_empty() {
    parse_contents('-', encoding.clone(), i)?
    } else {
    s
    }
    [3.69024]
    [3.446]
    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
    [3.459][3.459:509]()
    parse_contents('-', encoding.clone(), i)?
    [3.459]
    [3.509]
    contents_plus
  • edit in libpijul/src/change/parse.rs at line 358
    [3.74568][3.293:336]()
    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));
    [3.74618]
    [3.578]
    if backslash.is_some() && vec[vec.len() - 1] == b'\n' {
    vec.pop();
  • edit in libpijul/src/change/parse.rs at line 362
    [3.588]
    [3.74871]
    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
    [3.74877][3.589:695]()
    Err(nom::Err::Error(nom::error::Error::new(
    i,
    nom::error::ErrorKind::Verify,
    )))