# HG changeset patch # User Guillermo PĂ©rez # Date 2012-11-06 22:04:05 # Node ID d587925680d99e044c89d0a5022470ba151f9b93 # Parent 9c888b945b6548e3095729c92996353ac6fb15d1 diff: move b85diff to mdiff module b85diff generates a binary diff, so we move this code to mdiff module along with unidiff for text diffs. All diffing mechanisms will be in the same place. In an upcoming patch we will remove the responsibility to print the index header from b85diff and move it back to patch, since it's a patch metadata header, not part of the diff generation. diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py --- a/mercurial/mdiff.py +++ b/mercurial/mdiff.py @@ -7,7 +7,8 @@ from i18n import _ import bdiff, mpatch, util -import re, struct +import re, struct, base85, zlib +from node import hex, nullid def splitnewlines(text): '''like str.splitlines, but only split on newlines.''' @@ -314,6 +315,44 @@ def _unidiff(t1, t2, l1, l2, opts=defaul for x in yieldhunk(hunk): yield x +def b85diff(to, tn): + '''print base85-encoded binary diff''' + def gitindex(text): + if not text: + return hex(nullid) + l = len(text) + s = util.sha1('blob %d\0' % l) + s.update(text) + return s.hexdigest() + + def fmtline(line): + l = len(line) + if l <= 26: + l = chr(ord('A') + l - 1) + else: + l = chr(l - 26 + ord('a') - 1) + return '%c%s\n' % (l, base85.b85encode(line, True)) + + def chunk(text, csize=52): + l = len(text) + i = 0 + while i < l: + yield text[i:i + csize] + i += csize + + tohash = gitindex(to) + tnhash = gitindex(tn) + if tohash == tnhash: + return "" + + # TODO: deltas + ret = ['index %s..%s\nGIT binary patch\nliteral %s\n' % + (tohash, tnhash, len(tn))] + for l in chunk(zlib.compress(tn)): + ret.append(fmtline(l)) + ret.append('\n') + return ''.join(ret) + def patchtext(bin): pos = 0 t = [] diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -10,7 +10,7 @@ import cStringIO, email.Parser, os, errn import tempfile, zlib, shutil from i18n import _ -from node import hex, nullid, short +from node import hex, short import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error import context @@ -1514,44 +1514,6 @@ def changedfiles(ui, repo, patchpath, st finally: fp.close() -def b85diff(to, tn): - '''print base85-encoded binary diff''' - def gitindex(text): - if not text: - return hex(nullid) - l = len(text) - s = util.sha1('blob %d\0' % l) - s.update(text) - return s.hexdigest() - - def fmtline(line): - l = len(line) - if l <= 26: - l = chr(ord('A') + l - 1) - else: - l = chr(l - 26 + ord('a') - 1) - return '%c%s\n' % (l, base85.b85encode(line, True)) - - def chunk(text, csize=52): - l = len(text) - i = 0 - while i < l: - yield text[i:i + csize] - i += csize - - tohash = gitindex(to) - tnhash = gitindex(tn) - if tohash == tnhash: - return "" - - # TODO: deltas - ret = ['index %s..%s\nGIT binary patch\nliteral %s\n' % - (tohash, tnhash, len(tn))] - for l in chunk(zlib.compress(tn)): - ret.append(fmtline(l)) - ret.append('\n') - return ''.join(ret) - class GitDiffRequired(Exception): pass @@ -1789,7 +1751,7 @@ def trydiff(repo, revs, ctx1, ctx2, modi if dodiff: if dodiff == 'binary': - text = b85diff(to, tn) + text = mdiff.b85diff(to, tn) else: text = mdiff.unidiff(to, date1, # ctx2 date may be dynamic