# HG changeset patch # User Thomas Arendsen Hein # Date 1172001323 -3600 # Node ID 226df1808f16312ffc2acc4a41a6fd5de2d5de71 # Parent e2ed92f4c0f759fe2a2803853bfcb92f135d85c5# Parent f5f171785e29c67b414023f2d1a7783ba0b4eb73 merge with crew-stable diff -r e2ed92f4c0f7 -r 226df1808f16 mercurial/mdiff.py --- 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) diff -r e2ed92f4c0f7 -r 226df1808f16 mercurial/patch.py --- 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) diff -r e2ed92f4c0f7 -r 226df1808f16 tests/test-diff-binary-file --- /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 diff -r e2ed92f4c0f7 -r 226df1808f16 tests/test-diff-binary-file.out --- /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$@)J0W$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 +zLdYlXB*ODN003Z&P17_@)3Pi=i0wb04&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 <> $HGRCPATH