diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -1569,6 +1569,9 @@ def trydiff(repo, revs, ctx1, ctx2, modi 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' diff --git a/tests/test-diff-upgrade b/tests/test-diff-upgrade --- a/tests/test-diff-upgrade +++ b/tests/test-diff-upgrade @@ -20,6 +20,7 @@ echo unsetexec > unsetexec chmod +x unsetexec echo binary > binary python -c "file('rmbinary', 'wb').write('\0')" +python -c "file('bintoregular', 'wb').write('\0')" hg ci -Am addfiles echo regular >> regular echo newregular >> newregular @@ -28,6 +29,7 @@ touch newempty rm rmregular echo exec >> exec echo newexec > newexec +echo bintoregular > bintoregular chmod +x newexec rm rmexec chmod +x setexec @@ -46,7 +48,8 @@ hg autodiff --git=yes regular echo '% git=auto: regular diff for regular files and non-binary removals' hg autodiff --git=auto regular newregular rmregular rmexec -for f in exec newexec setexec unsetexec binary newbinary newempty rmempty rmbinary; do +for f in exec newexec setexec unsetexec binary newbinary newempty rmempty \ + rmbinary bintoregular; do echo '% git=auto: git diff for' $f hg autodiff --git=auto $f done diff --git a/tests/test-diff-upgrade.out b/tests/test-diff-upgrade.out --- a/tests/test-diff-upgrade.out +++ b/tests/test-diff-upgrade.out @@ -1,5 +1,6 @@ % make a combination of new, changed and deleted file adding binary +adding bintoregular adding exec adding regular adding rmbinary @@ -17,40 +18,42 @@ removing rmempty removing rmexec removing rmregular % git=no: regular diff for all files -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 @@ @@ -63,29 +66,29 @@ diff --git a/regular b/regular regular +regular % git=auto: regular diff for regular files and non-binary removals -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 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 % git=auto: git diff for exec -diff -r b3f053cd7c7f exec +diff -r a66d19b9302d exec --- a/exec +++ b/exec @@ -1,1 +1,2 @@ @@ -131,46 +134,56 @@ deleted file mode 100644 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 -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 @@ -181,7 +194,7 @@ data lost for: unsetexec % git=abort: fail on execute bit change abort: losing data for setexec % git=abort: succeed on regular file -diff -r b3f053cd7c7f regular +diff -r a66d19b9302d regular --- a/regular +++ b/regular @@ -1,1 +1,2 @@