Return parse errors in the text format when a hunk description is parsed, but the hunk fails to parse

pmeunier
Dec 17, 2023, 2:54 PM
ALKSQF2FA5VUUUU3IMCDOWRB5PL4AXINZUA5I27SGNKQPD6Z7J3QC

Dependencies

  • [2] AF5AKUTO Cleanup after the text changes refactoring
  • [3] NWIZ65KE Adjusting the parsing of new directories to the recent change in parsing binary changes from text patches
  • [4] L5I5B4PV Fixing another parsing issue preventing delete edit hunks to be recorded
  • [5] NBM34JQZ Correct parsing of undelete hunks
  • [6] YNDPMU3V Fixing #792
  • [7] BU7OHMPW Fixing the "repeated records" bug
  • [8] UGUWKK3I Fixing conflicts
  • [9] HODZ2KUF Solving a conflict
  • [10] FVN4TICG Refusing to parse patches to binary files converted to text format, as there is no way to make sense of them
  • [11] 4ODDR4JL Fixing a crash (asserting that the contents of an edit is non-empty)
  • [12] FGIVSUFH Fixing conflicts with the new patch parsing code, and introducing AddRoot
  • [13] FMVDQHHC Parsing binary file deletions in the change text format
  • [14] OOJNAY34 allow LF or CRLF when parsing change headers
  • [15] HW7DZ2B4 Fixing the change parser
  • [16] YQMLICLW Fix the hunk_roundtrip test, simplify code, improve test coverage, fix some edge cases.
  • [17] 5FI6SBEZ Re-implement change printing and parsing
  • [18] 7ABOS34C Debug statements and formatting
  • [19] MQ7TZOT6 Edits can delete lines too

Change contents

  • replacement in libpijul/src/change/parse.rs at line 17
    [8.65134][8.65134:65308](),[8.65308][8.0:51]()
    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)?;
    [8.65134]
    [8.65355]
    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
    [8.65356][8.65356:65392]()
    let (i, del) = parse_edges(i)?;
    [8.65356]
    [8.65392]
    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,
    },
    ))
    [8.65393]
    [8.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,
    },
    ))
    };
    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
    [8.65948][8.65948:66010](),[8.66010][8.87:138]()
    let (i, pos) = preceded(space0, parse_printable_pos)(i)?;
    let (i, _) = tuple((space0, line_ending))(i)?;
    [8.65948]
    [8.66057]
    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
    [8.66058][8.66058:66257]()
    let (i, add) = parse_edges(i)?;
    let (i, del) = parse_edges(i)?;
    Ok((
    i,
    FileMoveE {
    path,
    pos,
    add,
    del,
    },
    ))
    [8.66058]
    [8.66257]
    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)
    [8.66447]
    [7.214]
    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
    [7.231][7.231:269](),[7.269][8.72:135](),[8.72][8.72:135]()
    (i, Vec::new())
    }
    } else {
    parse_contents('-', encoding.clone(), i)?
    [7.231]
    [8.135]
    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,
    },
    ))
    [8.142]
    [8.66958]
    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())
    [8.67153]
    [5.182]
    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
    [5.189][8.67481:67670](),[8.67481][8.67481:67670]()
    Ok((
    i,
    FileUndel {
    path,
    pos,
    encoding,
    undel_edges,
    content_edges,
    contents,
    },
    ))
    [5.189]
    [8.67670]
    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
    [8.67865][8.67865:68071](),[8.68071][8.243:307]()
    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)?;
    [8.67865]
    [8.68131]
    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
    [8.68132][8.68132:68198](),[8.68198][8.0:95](),[8.95][3.0: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)?
    [8.68132]
    [3.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)?
    };
    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,
    },
    ))
    [3.157]
    [8.68578]
    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,
    )))
    [8.68765]
    [6.0]
    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_plus
    [6.17]
    [8.509]
    contents_plus
    };
    Ok((
    i,
    Edit {
    path,
    line: line as usize,
    pos,
    encoding,
    change,
    contents,
    },
    ))
  • replacement in libpijul/src/change/parse.rs at line 211
    [8.516][8.69091:69276](),[8.69091][8.69091:69276]()
    Ok((
    i,
    Edit {
    path,
    line: line as usize,
    pos,
    encoding,
    change,
    contents,
    },
    ))
    [8.516]
    [8.69276]
    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 lines
    let (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,
    },
    ))
    [8.69465]
    [8.70232]
    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 lines
    let (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,
    },
    ))
    [8.70440]
    [8.70875]
    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,
    },
    ))
    [8.71088]
    [8.71525]
    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,
    },
    ))
    [8.71736]
    [8.72267]
    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,
    },
    ))
    [8.72483]
    [8.73011]
    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,
    },
    ))
    [8.73219]
    [8.73743]
    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 }))
    [8.6983]
    [8.7469]
    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
    [8.7609][8.984:1035](),[8.1035][8.7656:7731](),[8.7656][8.7656:7731]()
    let (i, _) = tuple((space0, line_ending))(i)?;
    let (i, name) = parse_edges(i)?;
    let (i, inode) = parse_edges(i)?;
    [8.7609]
    [8.7731]
    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
    [8.7732][2.4297:4349]()
    Ok((i, PrintableHunk::DelRoot { inode, name }))
    [8.7732]
    [8.7827]
    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
    [4.161][4.161:177]()
    )))
    [4.161]
    [4.177]
    )));