예제 #1
0
 def snapshotdiff(data1, data2, path):
     uheaders, hunks = mdiff.unidiff(
         data1,
         date1,
         data2,
         date2,
         path,
         path,
         opts=kwargs.get("opts"),
         check_binary=False,
     )
     return "".join(sum((list(hlines) for hrange, hlines in hunks), []))
예제 #2
0
파일: arcdiff.py 프로젝트: leszfb/eden
def _diff2o(ui, repo, rev1, rev2, *pats, **opts):
    # Phabricator revs are often filtered (hidden)
    # First reconstruct textual diffs for rev1 and rev2 independently.
    def changediff(node):
        nodebase = repo[node].p1().node()
        m = scmutil.matchall(repo)
        diff = patch.diffhunks(repo,
                               nodebase,
                               node,
                               m,
                               opts=mdiff.diffopts(context=0))
        filepatches = {}
        for _fctx1, _fctx2, headerlines, hunks in diff:
            difflines = []
            for hunkrange, hunklines in hunks:
                difflines += list(hunklines)
            header = patch.header(headerlines)
            filepatches[header.files()[0]] = b"".join(difflines)
        return (set(filepatches.keys()), filepatches, node)

    rev1node = repo[rev1].node()
    rev2node = repo[rev2].node()
    files1, filepatches1, node1 = changediff(rev1node)
    files2, filepatches2, node2 = changediff(rev2node)

    ui.write(_("Phabricator rev: %s\n") % hex(node1)),
    ui.write(_("Local rev: %s (%s)\n") % (hex(node2), rev2))

    # For files have changed, produce a diff of the diffs first using a normal
    # text diff of the input diffs, then fixing-up the output for readability.
    changedfiles = files1 & files2
    for f in changedfiles:
        opts["context"] = 0
        diffopts = mdiff.diffopts(**opts)
        header, hunks = mdiff.unidiff(filepatches1[f],
                                      "",
                                      filepatches2[f],
                                      "",
                                      f,
                                      f,
                                      opts=diffopts)
        hunklines = []
        for hunk in hunks:
            hunklines += hunk[1]
        changelines = []
        i = 0
        while i < len(hunklines):
            line = pycompat.decodeutf8(hunklines[i], errors="replace")
            i += 1
            if line[:2] == "++":
                changelines.append("+" + line[2:])
            elif line[:2] == "+-":
                changelines.append("-" + line[2:])
            elif line[:2] == "-+":
                changelines.append("-" + line[2:])
            elif line[:2] == "--":
                changelines.append("+" + line[2:])
            elif line[:2] == "@@" or line[1:3] == "@@":
                if len(changelines) < 1 or changelines[-1] != "...\n":
                    changelines.append("...\n")
            else:
                changelines.append(line)
        if len(changelines):
            ui.write(_("Changed: %s\n") % f)
            for line in changelines:
                ui.write("| " + line)
    wholefilechanges = files1 ^ files2
    for f in wholefilechanges:
        ui.write(_("Added/removed: %s\n") % f)