--- a/mercurial/mdiff.py Sat Feb 17 04:50:06 2007 -0200
+++ b/mercurial/mdiff.py Tue Feb 20 20:55:23 2007 +0100
@@ -5,7 +5,7 @@
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
-import bdiff, mpatch, re, struct, util
+import bdiff, mpatch, re, struct, util, md5
def splitnewlines(text):
'''like str.splitlines, but only split on newlines.'''
@@ -57,6 +57,11 @@
epoch = util.datestr((0, 0))
if not opts.text and (util.binary(a) or util.binary(b)):
+ def h(v):
+ # md5 is used instead of sha1 because md5 is supposedly faster
+ return md5.new(v).digest()
+ if a and b and len(a) == len(b) and h(a) == h(b):
+ return ""
l = ['Binary file %s has changed\n' % fn]
elif not a:
b = splitnewlines(b)
--- a/mercurial/patch.py Sat Feb 17 04:50:06 2007 -0200
+++ b/mercurial/patch.py Tue Feb 20 20:55:23 2007 +0100
@@ -412,16 +412,18 @@
yield text[i:i+csize]
i += csize
- if to == tn:
- return
+ tohash = gitindex(to)
+ tnhash = gitindex(tn)
+ if tohash == tnhash:
+ return ""
+
# TODO: deltas
- l = len(tn)
- fp.write('index %s..%s\nGIT binary patch\nliteral %s\n' %
- (gitindex(to), gitindex(tn), len(tn)))
-
- tn = ''.join([fmtline(l) for l in chunk(zlib.compress(tn))])
- fp.write(tn)
- fp.write('\n')
+ 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 diff(repo, node1=None, node2=None, files=None, match=util.always,
fp=None, changes=None, opts=None):
@@ -578,14 +580,14 @@
dodiff = 'binary'
r = None
header.insert(0, 'diff --git a/%s b/%s\n' % (a, b))
- if dodiff == 'binary':
- fp.write(''.join(header))
- b85diff(fp, to, tn)
- elif dodiff:
- text = mdiff.unidiff(to, date1,
- # ctx2 date may be dynamic
- tn, util.datestr(ctx2.date()),
- f, r, opts=opts)
+ if dodiff:
+ if dodiff == 'binary':
+ text = b85diff(fp, to, tn)
+ else:
+ text = mdiff.unidiff(to, date1,
+ # ctx2 date may be dynamic
+ tn, util.datestr(ctx2.date()),
+ f, r, opts=opts)
if text or len(header) > 1:
fp.write(''.join(header))
fp.write(text)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-diff-binary-file Tue Feb 20 20:55:23 2007 +0100
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+hg init a
+cd a
+cp $TESTDIR/binfile.bin .
+hg add binfile.bin
+hg ci -m 'add binfile.bin' -d '0 0'
+
+echo >> binfile.bin
+hg ci -m 'change binfile.bin' -d '0 0'
+
+hg revert -r 0 binfile.bin
+hg ci -m 'revert binfile.bin' -d '0 0'
+
+echo % diff -r 0 -r 1
+hg diff --nodates -r 0 -r 1
+
+echo % diff -r 0 -r 2
+hg diff --nodates -r 0 -r 2
+
+echo % diff --git -r 0 -r 1
+hg diff --git -r 0 -r 1
+
+echo % diff --git -r 0 -r 2
+hg diff --git -r 0 -r 2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-diff-binary-file.out Tue Feb 20 20:55:23 2007 +0100
@@ -0,0 +1,23 @@
+% diff -r 0 -r 1
+diff -r 48b371597640 -r acea2ab458c8 binfile.bin
+Binary file binfile.bin has changed
+% diff -r 0 -r 2
+% diff --git -r 0 -r 1
+diff --git a/binfile.bin b/binfile.bin
+index 37ba3d1c6f17137d9c5f5776fa040caf5fe73ff9..58dc31a9e2f40f74ff3b45903f7d620b8e5b7356
+GIT binary patch
+literal 594
+zc$@)J0<HatP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00009a7bBm000XU
+z000XU0RWnu7ytkO2XskIMF-Uh9TW;VpMjwv0005-Nkl<ZD9@FWPs=e;7{<>W$NUkd
+zX$nnYLt$-$V!?uy+1V%`z&Eh=ah|duER<4|QWhju3gb^nF*8iYobxWG-qqXl=2~5M
+z*IoDB)sG^CfNuoBmqLTVU^<;@nwHP!1wrWd`{(mHo6VNXWtyh{alzqmsH*yYzpvLT
+zLdY<T=ks|woh-`&01!ej#(xbV1f|pI*=%;d-%F*E*X#ZH`4I%6SS+$EJDE&ct=8po
+ziN#{?_j|kD%Cd|oiqds`xm@;oJ-^?NG3Gdqrs?5u*zI;{nogxsx~^|Fn^Y?Gdc6<;
+zfMJ+iF1J`LMx&A2?dEwNW8ClebzPTbIh{@$hS6*`kH@1d%Lo7fA#}N1)oN7`gm$~V
+z+wDx#)OFqMcE{s!JN0-xhG8ItAjVkJwEcb`3WWlJfU2r?;Pd%dmR+q@mSri5q9_W-
+zaR2~ECX?B2w+zELozC0s*6Z~|QG^f{3I#<`?)Q7U-JZ|q5W;9Q8i_=pBuSzunx=U;
+z9C)5jBoYw9^?EHyQl(M}1OlQcCX>lXB*ODN003Z&P17_@)3Pi=i0wb04<W?v-u}7K
+zXmmQA+wDgE!qR9o8jr`%=ab_&uh(l?R=r;Tjiqon91I2-hIu?57~@*4h7h9uORK#=
+gQItJW-{SoTm)8|5##k|m00000NkvXXu0mjf3JwksH2?qr
+
+% diff --git -r 0 -r 2
--- a/tests/test-notify Sat Feb 17 04:50:06 2007 -0200
+++ b/tests/test-notify Tue Feb 20 20:55:23 2007 +0100
@@ -33,7 +33,7 @@
echo '% pull (minimal config)'
hg --traceback --cwd b pull ../a 2>&1 | sed -e 's/\(Message-Id:\).*/\1/' \
- -e 's/changeset \([0-9a-f]* \)\?in .*test-notif/changeset \1in test-notif/' \
+ -e 's/changeset \([0-9a-f]* \)*in .*test-notif/changeset \1in test-notif/' \
-e 's/^details: .*test-notify/details: test-notify/'
cat <<EOF >> $HGRCPATH