[PATCH 1 of 1] patch: generate .rej wihtout eol adaptation

Shun-ichi Goto shunichi.goto at gmail.com
Thu Dec 2 20:44:14 CST 2010


# HG changeset patch
# User Shun-ichi GOTO <shunichi.goto at gmail.com>
# Date 1291344030 -32400
# Node ID ad4e934ef9dbe2a82d9477f5aed39ec0df6fc7d2
# Parent  cec6140b0f3c8c00515dbf3589068d1e2d233fdf
patch: generate .rej wihtout eol adaptation

When patch.eol=auto and patch has CRLF content, incorrect .rej file
having CRCRLF is generated because patchfile.write_rej() uses
patchfile.writelines() which makes eol adaptation.

This changeset add optional boolean argument 'strict' to writelines()
to choose eol adaptation.

Add test for this issue. To reproduce this issue:
 1. make taget file having CRLF line ending
 2. make patch file having CRLF content line ending
 3. prepare patch which would conflict
 4. applying patch with option 'patch.eol=auto'
 5. check .rej file has CRCRLF <= incorrect!

diff -r cec6140b0f3c -r ad4e934ef9db mercurial/patch.py
--- a/mercurial/patch.py	Thu Dec 02 18:14:04 2010 +0900
+++ b/mercurial/patch.py	Fri Dec 03 11:40:30 2010 +0900
@@ -425,7 +425,7 @@
         finally:
             fp.close()
 
-    def writelines(self, fname, lines):
+    def writelines(self, fname, lines, strict=False):
         # Ensure supplied data ends in fname, being a regular file or
         # a symlink. cmdutil.updatedir will -too magically- take care
         # of setting it to the proper type afterwards.
@@ -435,7 +435,9 @@
         else:
             fp = self.opener(fname, 'w')
         try:
-            if self.eolmode == 'auto':
+            if strict:
+                eol = None
+            elif self.eolmode == 'auto':
                 eol = self.eol
             elif self.eolmode == 'crlf':
                 eol = '\r\n'
@@ -508,7 +510,7 @@
                     if l[-1] != '\n':
                         yield "\n\ No newline at end of file\n"
 
-        self.writelines(fname, rejlines())
+        self.writelines(fname, rejlines(), strict=True)
 
     def apply(self, h):
         if not h.complete():
diff -r cec6140b0f3c -r ad4e934ef9db tests/test-mq-eol.t
--- a/tests/test-mq-eol.t	Thu Dec 02 18:14:04 2010 +0900
+++ b/tests/test-mq-eol.t	Fri Dec 03 11:40:30 2010 +0900
@@ -141,3 +141,94 @@
   $ hg qpop
   popping eol.diff
   patch queue now empty
+
+
+.rej file should not apply eol adaptaion.
+For example, .rej should not have CRCRLF agaist CRLF file when eol=auto.
+
+  $ echo "[extensions]" >> $HGRCPATH
+  $ echo "mq=" >> $HGRCPATH
+
+  $ hg init r
+  $ cd r
+
+  $ printf '1 hello\r\n' >> a.txt
+  $ printf '2 hello\r\n' >> a.txt
+  $ printf '3 hello\r\n' >> a.txt
+  $ printf '4 hello\r\n' >> a.txt
+
+  $ hg ci -Am 1
+  adding a.txt
+
+  $ rm a.txt
+  $ printf '1 hello\r\n' >> a.txt
+  $ printf '2 hello\r\n' >> a.txt
+  $ printf '3 HELLO\r\n' >> a.txt
+  $ printf '4 hello\r\n' >> a.txt
+
+  $ hg qnew -fm "patch" m1
+  $ hg qpop
+  popping m1
+  patch queue now empty
+
+  $ rm a.txt
+  $ printf '1 hello\r\n' >> a.txt
+  $ printf '2 good morning\r\n' >> a.txt
+  $ printf '3 HELLO\r\n' >> a.txt
+  $ printf '4 hello\r\n' >> a.txt
+
+  $ hg ci -m 2
+
+  $ hg --config 'patch.eol=LF' qpush
+  applying m1
+  patching file a.txt
+  Hunk #1 FAILED at 0
+  1 out of 1 hunks FAILED -- saving rejects to file a.txt.rej
+  patch failed, unable to continue (try -v)
+  patch failed, rejects left in working dir
+  errors during apply, please fix and refresh m1
+  [2]
+  $ hg qpop
+  popping m1
+  patch queue now empty
+  $ cat a.txt
+  1 hello\r (esc)
+  2 good morning\r (esc)
+  3 HELLO\r (esc)
+  4 hello\r (esc)
+  $ cat a.txt.rej
+  --- a.txt
+  +++ a.txt
+  @@ -1,4 +1,4 @@
+   1 hello\r (esc)
+   2 hello\r (esc)
+  -3 hello\r (esc)
+  +3 HELLO\r (esc)
+   4 hello\r (esc)
+
+  $ hg --config 'patch.eol=auto' qpush
+  applying m1
+  patching file a.txt
+  Hunk #1 FAILED at 0
+  1 out of 1 hunks FAILED -- saving rejects to file a.txt.rej
+  patch failed, unable to continue (try -v)
+  patch failed, rejects left in working dir
+  errors during apply, please fix and refresh m1
+  [2]
+  $ hg qpop
+  popping m1
+  patch queue now empty
+  $ cat a.txt
+  1 hello\r (esc)
+  2 good morning\r (esc)
+  3 HELLO\r (esc)
+  4 hello\r (esc)
+  $ cat a.txt.rej
+  --- a.txt
+  +++ a.txt
+  @@ -1,4 +1,4 @@
+   1 hello\r (esc)
+   2 hello\r (esc)
+  -3 hello\r (esc)
+  +3 HELLO\r (esc)
+   4 hello\r (esc)


More information about the Mercurial-devel mailing list