# HG changeset patch # User Patrick Mezard # Date 1285629084 -7200 # Node ID 05210e955bef6f5e6678ed7955d5e3b370af96bb # Parent be4b0a397470aa1c3107ecdd9861bc0d995657ed# Parent 1c9bb7e00f7182198b648d8126406ece67c25899 Merge with stable diff -r be4b0a397470 -r 05210e955bef mercurial/patch.py --- a/mercurial/patch.py Mon Sep 27 22:49:30 2010 +0200 +++ b/mercurial/patch.py Tue Sep 28 01:11:24 2010 +0200 @@ -1184,7 +1184,9 @@ gp.path = pathstrip(gp.path, strip - 1)[1] if gp.oldpath: gp.oldpath = pathstrip(gp.oldpath, strip - 1)[1] - if gp.op in ('COPY', 'RENAME'): + # Binary patches really overwrite target files, copying them + # will just make it fails with "target file exists" + if gp.op in ('COPY', 'RENAME') and not gp.binary: copyfn(gp.oldpath, gp.path, cwd) changed[gp.path] = gp else: @@ -1530,6 +1532,9 @@ header.append('new file mode %s\n' % mode) elif ctx2.flags(f): losedatafn(f) + # In theory, if tn was copied or renamed we should check + # if the source is binary too but the copy record already + # forces git mode. if util.binary(tn): if opts.git: dodiff = 'binary' @@ -1549,7 +1554,7 @@ else: header.append('deleted file mode %s\n' % gitmode[man1.flags(f)]) - elif not to: + elif not to or util.binary(to): # regular diffs cannot represent empty file deletion losedatafn(f) else: diff -r be4b0a397470 -r 05210e955bef tests/test-diff-upgrade.t --- a/tests/test-diff-upgrade.t Mon Sep 27 22:49:30 2010 +0200 +++ b/tests/test-diff-upgrade.t Tue Sep 28 01:11:24 2010 +0200 @@ -7,10 +7,13 @@ $ hg init repo $ cd repo + + make a combination of new, changed and deleted file $ echo regular > regular $ echo rmregular > rmregular + $ python -c "file('bintoregular', 'wb').write('\0')" $ touch rmempty $ echo exec > exec $ chmod +x exec @@ -23,6 +26,7 @@ $ python -c "file('rmbinary', 'wb').write('\0')" $ hg ci -Am addfiles adding binary + adding bintoregular adding exec adding regular adding rmbinary @@ -38,6 +42,7 @@ $ rm rmregular $ echo exec >> exec $ echo newexec > newexec + $ echo bintoregular > bintoregular $ chmod +x newexec $ rm rmexec $ chmod +x setexec @@ -58,40 +63,42 @@ git=no: regular diff for all files $ hg autodiff --git=no - diff -r b3f053cd7c7f binary + diff -r a66d19b9302d binary Binary file binary has changed - diff -r b3f053cd7c7f exec + diff -r a66d19b9302d bintoregular + Binary file bintoregular has changed + diff -r a66d19b9302d exec --- a/exec +++ b/exec @@ -1,1 +1,2 @@ exec +exec - diff -r b3f053cd7c7f newbinary + diff -r a66d19b9302d newbinary Binary file newbinary has changed - diff -r b3f053cd7c7f newexec + diff -r a66d19b9302d newexec --- /dev/null +++ b/newexec @@ -0,0 +1,1 @@ +newexec - diff -r b3f053cd7c7f newregular + diff -r a66d19b9302d newregular --- /dev/null +++ b/newregular @@ -0,0 +1,1 @@ +newregular - diff -r b3f053cd7c7f regular + diff -r a66d19b9302d regular --- a/regular +++ b/regular @@ -1,1 +1,2 @@ regular +regular - diff -r b3f053cd7c7f rmbinary + diff -r a66d19b9302d rmbinary Binary file rmbinary has changed - diff -r b3f053cd7c7f rmexec + diff -r a66d19b9302d rmexec --- a/rmexec +++ /dev/null @@ -1,1 +0,0 @@ -rmexec - diff -r b3f053cd7c7f rmregular + diff -r a66d19b9302d rmregular --- a/rmregular +++ /dev/null @@ -1,1 +0,0 @@ @@ -107,41 +114,39 @@ regular +regular -git=auto: regular diff for regular files and removals +git=auto: regular diff for regular files and non-binary removals - $ hg autodiff --git=auto regular newregular rmregular rmbinary rmexec - diff -r b3f053cd7c7f newregular + $ hg autodiff --git=auto regular newregular rmregular rmexec + diff -r a66d19b9302d newregular --- /dev/null +++ b/newregular @@ -0,0 +1,1 @@ +newregular - diff -r b3f053cd7c7f regular + diff -r a66d19b9302d regular --- a/regular +++ b/regular @@ -1,1 +1,2 @@ regular +regular - diff -r b3f053cd7c7f rmbinary - Binary file rmbinary has changed - diff -r b3f053cd7c7f rmexec + diff -r a66d19b9302d rmexec --- a/rmexec +++ /dev/null @@ -1,1 +0,0 @@ -rmexec - diff -r b3f053cd7c7f rmregular + diff -r a66d19b9302d rmregular --- a/rmregular +++ /dev/null @@ -1,1 +0,0 @@ -rmregular - $ for f in exec newexec setexec unsetexec binary newbinary newempty rmempty; do + $ for f in exec newexec setexec unsetexec binary newbinary newempty rmempty rmbinary bintoregular; do > echo > echo '% git=auto: git diff for' $f > hg autodiff --git=auto $f > done % git=auto: git diff for exec - diff -r b3f053cd7c7f exec + diff -r a66d19b9302d exec --- a/exec +++ b/exec @@ -1,1 +1,2 @@ @@ -190,52 +195,69 @@ % git=auto: git diff for rmempty diff --git a/rmempty b/rmempty deleted file mode 100644 + + % git=auto: git diff for rmbinary + diff --git a/rmbinary b/rmbinary + deleted file mode 100644 + Binary file rmbinary has changed + + % git=auto: git diff for bintoregular + diff --git a/bintoregular b/bintoregular + index f76dd238ade08917e6712764a16a22005a50573d..9c42f2b6427d8bf034b7bc23986152dc01bfd3ab + GIT binary patch + literal 13 + Uc$`bh%qz(+N=+}#Ni5<5043uE82|tP + git=warn: regular diff with data loss warnings $ hg autodiff --git=warn - diff -r b3f053cd7c7f binary + diff -r a66d19b9302d binary Binary file binary has changed - diff -r b3f053cd7c7f exec + diff -r a66d19b9302d bintoregular + Binary file bintoregular has changed + diff -r a66d19b9302d exec --- a/exec +++ b/exec @@ -1,1 +1,2 @@ exec +exec - diff -r b3f053cd7c7f newbinary + diff -r a66d19b9302d newbinary Binary file newbinary has changed - diff -r b3f053cd7c7f newexec + diff -r a66d19b9302d newexec --- /dev/null +++ b/newexec @@ -0,0 +1,1 @@ +newexec - diff -r b3f053cd7c7f newregular + diff -r a66d19b9302d newregular --- /dev/null +++ b/newregular @@ -0,0 +1,1 @@ +newregular - diff -r b3f053cd7c7f regular + diff -r a66d19b9302d regular --- a/regular +++ b/regular @@ -1,1 +1,2 @@ regular +regular - diff -r b3f053cd7c7f rmbinary + diff -r a66d19b9302d rmbinary Binary file rmbinary has changed - diff -r b3f053cd7c7f rmexec + diff -r a66d19b9302d rmexec --- a/rmexec +++ /dev/null @@ -1,1 +0,0 @@ -rmexec - diff -r b3f053cd7c7f rmregular + diff -r a66d19b9302d rmregular --- a/rmregular +++ /dev/null @@ -1,1 +0,0 @@ -rmregular data lost for: binary + data lost for: bintoregular data lost for: newbinary data lost for: newempty data lost for: newexec + data lost for: rmbinary data lost for: rmempty data lost for: setexec data lost for: unsetexec @@ -249,7 +271,7 @@ git=abort: succeed on regular file $ hg autodiff --git=abort regular - diff -r b3f053cd7c7f regular + diff -r a66d19b9302d regular --- a/regular +++ b/regular @@ -1,1 +1,2 @@ diff -r be4b0a397470 -r 05210e955bef tests/test-git-import.t --- a/tests/test-git-import.t Mon Sep 27 22:49:30 2010 +0200 +++ b/tests/test-git-import.t Tue Sep 28 01:11:24 2010 +0200 @@ -335,3 +335,24 @@ $ cat foo3 foo +Move text file and patch as binary + + $ echo a > text2 + $ hg ci -Am0 + adding text2 + $ hg import -d "1000000 0" -m rename-as-binary - <<"EOF" + > diff --git a/text2 b/binary2 + > rename from text2 + > rename to binary2 + > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757 + > GIT binary patch + > literal 5 + > Mc$`b*O5$Pw00T?_*Z=?k + > + > EOF + applying patch from stdin + $ python $TESTDIR/printrepr.py < binary2 + a + b + \x00 + $ hg st --copies --change . abort: unknown revision '.echo'!