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.
This commit is contained in:
Guillermo Pérez 2012-11-15 15:16:41 -08:00
parent f655c9c8c8
commit 2c1f380e8a
2 changed files with 30 additions and 16 deletions

View File

@ -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):

View File

@ -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