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), []))
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)