changeset 12825:61f48581d8ef stable

Test applying context diffs
author Patrick Mezard <pmezard@gmail.com>
date Sun, 24 Oct 2010 12:56:38 +0200
parents 93d6559a9cbc
children 4d622380ab39
files mercurial/patch.py tests/test-import-context.t
diffstat 2 files changed, 131 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/patch.py	Sun Oct 24 12:55:29 2010 +0200
+++ b/mercurial/patch.py	Sun Oct 24 12:56:38 2010 +0200
@@ -686,6 +686,7 @@
         for x in xrange(self.lena):
             l = lr.readline()
             if l.startswith('---'):
+                # lines addition, old block is empty
                 lr.push(l)
                 break
             s = l[2:]
@@ -719,11 +720,15 @@
         for x in xrange(self.lenb):
             l = lr.readline()
             if l.startswith('\ '):
+                # XXX: the only way to hit this is with an invalid line range.
+                # The no-eol marker is not counted in the line range, but I
+                # guess there are diff(1) out there which behave differently.
                 s = self.b[-1][:-1]
                 self.b[-1] = s
                 self.hunk[hunki - 1] = s
                 continue
             if not l:
+                # line deletions, new block is empty and we hit EOF
                 lr.push(l)
                 break
             s = l[2:]
@@ -732,7 +737,7 @@
             elif l.startswith('  '):
                 u = ' ' + s
             elif len(self.b) == 0:
-                # this can happen when the hunk does not add any lines
+                # line deletions, new block is empty
                 lr.push(l)
                 break
             else:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-import-context.t	Sun Oct 24 12:56:38 2010 +0200
@@ -0,0 +1,125 @@
+Test applying context diffs
+
+  $ cat > writepatterns.py <<EOF
+  > import sys
+  > 
+  > path = sys.argv[1]
+  > lasteol = sys.argv[2] == '1'
+  > patterns = sys.argv[3:]
+  > 
+  > fp = file(path, 'wb')
+  > for i, pattern in enumerate(patterns):
+  >     count = int(pattern[0:-1])
+  >     char = pattern[-1] + '\n'
+  >     if not lasteol and i == len(patterns) - 1:
+  >         fp.write((char*count)[:-1])
+  >     else:
+  >         fp.write(char*count)
+  > fp.close()
+  > EOF
+  $ cat > cat.py <<EOF
+  > import sys
+  > sys.stdout.write(repr(file(sys.argv[1], 'rb').read()) + '\n')
+  > EOF
+
+Initialize the test repository
+
+  $ hg init repo
+  $ cd repo
+  $ python ../writepatterns.py a 0 5A 1B 5C 1D
+  $ python ../writepatterns.py b 1 1A 1B
+  $ python ../writepatterns.py c 1 5A
+  $ python ../writepatterns.py d 1 5A 1B
+  $ hg add
+  adding a
+  adding b
+  adding c
+  adding d
+  $ hg ci -m addfiles
+
+Add file, missing a last end of line
+
+  $ hg import --no-commit - <<EOF
+  > *** /dev/null	2010-10-16 18:05:49.000000000 +0200
+  > --- b/newnoeol	2010-10-16 18:23:26.000000000 +0200
+  > ***************
+  > *** 0 ****
+  > --- 1,2 ----
+  > + a
+  > + b
+  > \ No newline at end of file
+  > *** a/a	Sat Oct 16 16:35:51 2010
+  > --- b/a	Sat Oct 16 16:35:51 2010
+  > ***************
+  > *** 3,12 ****
+  >   A
+  >   A
+  >   A
+  > ! B
+  >   C
+  >   C
+  >   C
+  >   C
+  >   C
+  > ! D
+  > \ No newline at end of file
+  > --- 3,13 ----
+  >   A
+  >   A
+  >   A
+  > ! E
+  >   C
+  >   C
+  >   C
+  >   C
+  >   C
+  > ! F
+  > ! F
+  > 
+  > *** a/b	2010-10-16 18:40:38.000000000 +0200
+  > --- /dev/null	2010-10-16 18:05:49.000000000 +0200
+  > ***************
+  > *** 1,2 ****
+  > - A
+  > - B
+  > --- 0 ----
+  > *** a/c	Sat Oct 16 21:34:26 2010
+  > --- b/c	Sat Oct 16 21:34:27 2010
+  > ***************
+  > *** 3,5 ****
+  > --- 3,7 ----
+  >   A
+  >   A
+  >   A
+  > + B
+  > + B
+  > *** a/d	Sat Oct 16 21:47:20 2010
+  > --- b/d	Sat Oct 16 21:47:22 2010
+  > ***************
+  > *** 2,6 ****
+  >   A
+  >   A
+  >   A
+  > - A
+  > - B
+  > --- 2,4 ----
+  > EOF
+  applying patch from stdin
+  $ hg st
+  M a
+  M c
+  M d
+  A newnoeol
+  R b
+
+What's in a
+
+  $ python ../cat.py a
+  'A\nA\nA\nA\nA\nE\nC\nC\nC\nC\nC\nF\nF\n'
+  $ python ../cat.py newnoeol
+  'a\nb'
+  $ python ../cat.py c
+  'A\nA\nA\nA\nA\nB\nB\n'
+  $ python ../cat.py d
+  'A\nA\nA\nA\n'
+