• 
      

    Add a diff parser for DiffX files.

    Review Request #11765 — Created July 31, 2021 and submitted

    Information

    Review Board
    release-4.0.x

    Reviewers

    This introduces DiffXParser, a new diff parser that can parse DiffX
    files, using the pydiffx module. SCMTools can provide this as the diff
    parser if they permit DiffX files to be used (whether DiffX is used
    natively, or if they look for a #diffx: header in get_parser()).

    This parser first turns DiffX file contents into a series of DOM (DiffX
    Object Model) objects, which are then turned into ParsedDiff objects.
    The ParsedDiff objects are populated with all the information needed
    to reconstruct the DiffX file perfectly (options, preambles, metadata,
    and diff contents).

    That reconstruction happens when downloading a raw diff. With normal
    diff parsers, that reconstruction just builds up a byte string
    containing the diff content for each file (which may include metadata or
    special lines for that diff variant).

    With DiffXParser, the content is instead built up using that parsed
    information stored in extra_data, along with the actual diff content
    (that in a #...diff: section). It's assembled back into a DOM, and
    then serialized.

    All the extracted data is also exposed to the API, SCMTool
    implementations, and extensions. It's all stored in namespaces within a
    diffx key in the extra_data fields in DiffSet (for the main DiffX
    section), DiffCommit (for change sections), and FileDiff (for file
    sections).

    Along with this, a diff's encoding is extracted and stored in a
    top-level encoding key in FileDiff.extra_data (which is an existing
    established key that aids in diff processing).

    Unit tests pass on Python 2 and 3.

    Summary ID
    Add a diff parser for DiffX files.
    This introduces `DiffXParser`, a new diff parser that can parse DiffX files, using the `pydiffx` module. SCMTools can provide this as the diff parser if they permit DiffX files to be used (whether DiffX is used natively, or if they look for a `#diffx:` header in `get_parser()`). This parser first turns DiffX file contents into a series of DOM (DiffX Object Model) objects, which are then turned into `ParsedDiff` objects. The `ParsedDiff` objects are populated with all the information needed to reconstruct the DiffX file perfectly (options, preambles, metadata, and diff contents). That reconstruction happens when downloading a raw diff. With normal diff parsers, that reconstruction just builds up a byte string containing the diff content for each file (which may include metadata or special lines for that diff variant). With `DiffXParser`, the content is instead built up using that parsed information stored in `extra_data`, along with the actual diff content (that in a `#...diff:` section). It's assembled back into a DOM, and then serialized. All the extracted data is also exposed to the API, `SCMTool` implementations, and extensions. It's all stored in namespaces within a `diffx` key in the `extra_data` fields in `DiffSet` (for the main DiffX section), `DiffCommit` (for change sections), and `FileDiff` (for file sections). Along with this, a diff's encoding is extracted and stored in a top-level `encoding` key in `FileDiff.extra_data` (which is an existing established key that aids in diff processing).
    6fa0dc48b6413fe8e163704166df793eb44e9955
    chipx86
    david
    1. Ship It!
    2. 
        
    chipx86
    Review request changed
    Status:
    Completed
    Change Summary:
    Pushed to release-4.0.x (cdd0a55)