From 2c1f380e8ae5eda0b06e365567f2da881b0d6ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillermo=20P=C3=A9rez?= Date: Thu, 15 Nov 2012 15:16:41 -0800 Subject: [PATCH] diff: move index header generation to patch In an upcoming patch, we will add index information to all git diffs, not only binary diffs, so this code needs to be moved to a more appropriate place. Also, since this information is used for patch headers, it makes more sense to be in the patch module, along with other patch-related metadata. --- mercurial/mdiff.py | 26 +++++++++++--------------- mercurial/patch.py | 20 +++++++++++++++++++- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py index 1a7f382e66..c88430e996 100644 --- 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=defaultopts): 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 index 340d133d75..1242cf45ed 100644 --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -10,7 +10,7 @@ import cStringIO, email.Parser, os, errno, re 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, modified, added, removed, 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, modified, added, removed, 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