diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py --- a/mercurial/mdiff.py +++ b/mercurial/mdiff.py @@ -8,7 +8,6 @@ from i18n import _ import bdiff, mpatch, util import re, struct, base85, zlib -from node import hex, nullid def splitnewlines(text): '''like str.splitlines, but only split on newlines.''' @@ -301,14 +300,6 @@ def _unidiff(t1, t2, l1, l2, opts=defaul 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: @@ -324,17 +315,22 @@ def b85diff(to, tn): yield text[i:i + csize] i += csize - tohash = gitindex(to) - tnhash = gitindex(tn) - if tohash == tnhash: - return "" + if to is None: + to = '' + if tn is None: + tn = '' + + if to == tn: + return '' # TODO: deltas - ret = ['index %s..%s\nGIT binary patch\nliteral %s\n' % - (tohash, tnhash, len(tn))] + ret = [] + ret.append('GIT binary patch\n') + ret.append('literal %s\n' % len(tn)) for l in chunk(zlib.compress(tn)): ret.append(fmtline(l)) ret.append('\n') + return ''.join(ret) def patchtext(bin): 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, short +from node import hex, nullid, short import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error import context @@ -1662,6 +1662,22 @@ def trydiff(repo, revs, ctx1, ctx2, modi header.append('old mode %s\n' % omode) header.append('new mode %s\n' % nmode) + def addindexmeta(meta, revs): + if opts.git: + i = len(revs) + if i==2: + meta.append('index %s..%s\n' % tuple(revs)) + elif i==3: + meta.append('index %s,%s..%s\n' % tuple(revs)) + + 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 diffline(a, b, revs): if opts.git: line = 'diff --git a/%s b/%s\n' % (a, b) @@ -1763,6 +1779,8 @@ def trydiff(repo, revs, ctx1, ctx2, modi header.insert(0, diffline(join(a), join(b), revs)) if dodiff == 'binary': text = mdiff.b85diff(to, tn) + if text: + addindexmeta(header, [gitindex(to), gitindex(tn)]) else: text = mdiff.unidiff(to, date1, # ctx2 date may be dynamic