merge with crew-stable
authorThomas Arendsen Hein <thomas@intevation.de>
Tue, 20 Feb 2007 20:55:23 +0100
changeset 4108 226df1808f16
parent 4101 e2ed92f4c0f7 (current diff)
parent 4107 f5f171785e29 (diff)
child 4109 c097b6f4f082
child 4110 20af6a2f0b0e
merge with crew-stable
mercurial/mdiff.py
mercurial/patch.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)
--- 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