mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 07:17:55 +03:00
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:
parent
f655c9c8c8
commit
2c1f380e8a
@ -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):
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user