You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2015/01/18 11:53:27 UTC

svn commit: r1652730 - in /subversion/trunk/subversion: libsvn_client/patch.c tests/cmdline/patch_tests.py

Author: philip
Date: Sun Jan 18 10:53:26 2015
New Revision: 1652730

URL: http://svn.apache.org/r1652730
Log:
* subversion/libsvn_client/patch.c
  (get_hunk_info): Only prefer reordered match if it is closer.

* subversion/tests/cmdline/patch_tests.py
  (patch_closest): New test.
  (test_list): Add new test.

Modified:
    subversion/trunk/subversion/libsvn_client/patch.c
    subversion/trunk/subversion/tests/cmdline/patch_tests.py

Modified: subversion/trunk/subversion/libsvn_client/patch.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/patch.c?rev=1652730&r1=1652729&r2=1652730&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/patch.c (original)
+++ subversion/trunk/subversion/libsvn_client/patch.c Sun Jan 18 10:53:26 2015
@@ -1802,7 +1802,7 @@ get_hunk_info(hunk_info_t **hi, patch_ta
                   if (matched_line
                       && matched_line - original_start < original_start)
                     search_start2
-                      = original_start - (matched_line - original_start);
+                      = original_start - (matched_line - original_start) + 1;
 
                   SVN_ERR(seek_to_line(content, search_start2, scratch_pool));
                   SVN_ERR(scan_for_match(&matched_line2, content, hunk, FALSE,

Modified: subversion/trunk/subversion/tests/cmdline/patch_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/patch_tests.py?rev=1652730&r1=1652729&r2=1652730&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/patch_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/patch_tests.py Sun Jan 18 10:53:26 2015
@@ -5195,6 +5195,251 @@ def patch_delete_modified(sbox):
                                        expected_output, expected_disk,
                                        expected_status, expected_skip)
 
+def patch_closest(sbox):
+  "find closest hunk"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  unidiff_patch = [
+    "Index: A/mu\n"
+    "===================================================================\n",
+    "--- A/mu\t(revision 2)\n",
+    "+++ A/mu\t(working copy)\n",
+    "@@ -47,7 +47,7 @@\n",
+    " 1\n",
+    " 2\n",
+    " 3\n",
+    "-hunk1\n",
+    "+hunk1-mod\n",
+    " 4\n",
+    " 5\n",
+    " 6\n",
+    "@@ -66,7 +66,7 @@\n",
+    " 1\n",
+    " 2\n",
+    " 3\n",
+    "-rejected-hunk2-\n",
+    "+rejected-hunk2-mod\n",
+    " 4\n",
+    " 5\n",
+    " 6\n",
+    "@@ -180,7 +180,7 @@\n",
+    " 1\n",
+    " 2\n",
+    " 3\n",
+    "-hunk3\n",
+    "+hunk3-mod\n",
+    " 4\n",
+    " 5\n",
+    " 6\n",
+    ]
+  patch_file_path = make_patch_path(sbox)
+  svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
+
+  # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+  # of -19 and +18, prefer +18 gives final offset +22
+  sbox.simple_append('A/mu',
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 30  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10,
+                     truncate=True)
+  sbox.simple_commit()
+
+  expected_output = [
+    'C         %s\n' % sbox.ospath('A/mu'),
+    '>         applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+    '>         applied hunk @@ -180,7 +180,7 @@ with offset 22\n',
+    '>         rejected hunk @@ -66,7 +66,7 @@\n',
+  ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+  expected_disk = svntest.main.greek_state.copy()
+  expected_disk.add({'A/mu.svnpatch.rej' : Item(contents=
+    "--- A/mu\n" +
+    "+++ A/mu\n" +
+    "@@ -66,7 +66,7 @@\n" +
+    " 1\n" +
+    " 2\n" +
+    " 3\n" +
+    "-rejected-hunk2-\n" +
+    "+rejected-hunk2-mod\n" +
+    " 4\n" +
+    " 5\n" +
+    " 6\n")})
+  expected_disk.tweak('A/mu', contents=
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 30  +
+                     '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10)
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('A/mu', status='M ', wc_rev=2)
+  expected_skip = wc.State('', { })
+  svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+                                       expected_output, expected_disk,
+                                       expected_status, expected_skip)
+
+  # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+  # of -19 and +20, prefer -19 gives final offset -15
+  sbox.simple_append('A/mu',
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 32  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10,
+                     truncate=True)
+  sbox.simple_commit()
+
+  expected_output = [
+    'C         %s\n' % sbox.ospath('A/mu'),
+    '>         applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+    '>         applied hunk @@ -180,7 +180,7 @@ with offset -15\n',
+    '>         rejected hunk @@ -66,7 +66,7 @@\n',
+  ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+  expected_disk.tweak('A/mu', contents=
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 32  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10)
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('A/mu', status='M ', wc_rev=3)
+  expected_skip = wc.State('', { })
+  svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+                                       expected_output, expected_disk,
+                                       expected_status, expected_skip)
+
+  # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+  # of -19 and +19, prefer -19 gives final offset -15
+  sbox.simple_append('A/mu',
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 31  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10,
+                     truncate=True)
+  sbox.simple_commit()
+
+  expected_output = [
+    'C         %s\n' % sbox.ospath('A/mu'),
+    '>         applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+    '>         applied hunk @@ -180,7 +180,7 @@ with offset -15\n',
+    '>         rejected hunk @@ -66,7 +66,7 @@\n',
+  ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+  expected_disk.tweak('A/mu', contents=
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 31  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10)
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('A/mu', status='M ', wc_rev=4)
+  expected_skip = wc.State('', { })
+  svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+                                       expected_output, expected_disk,
+                                       expected_status, expected_skip)
+
+  # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+  # of +173 and -173, prefer +173 gives final offset +177
+  sbox.simple_append('A/mu',
+                     'x\n' * 10  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 33 +
+                     '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 242  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10,
+                     truncate=True)
+  sbox.simple_commit()
+
+  expected_output = [
+    'C         %s\n' % sbox.ospath('A/mu'),
+    '>         applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+    '>         applied hunk @@ -180,7 +180,7 @@ with offset 177\n',
+    '>         rejected hunk @@ -66,7 +66,7 @@\n',
+  ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+  expected_disk.tweak('A/mu', contents=
+                     'x\n' * 10  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 33  +
+                     '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 242  +
+                     '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10)
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('A/mu', status='M ', wc_rev=5)
+  expected_skip = wc.State('', { })
+  svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+                                       expected_output, expected_disk,
+                                       expected_status, expected_skip)
+
+  # Previous offset for hunk3 is +4, hunk3 matches at relative offsets
+  # of +174 and -173, prefer -173 gives final offset -169
+  sbox.simple_append('A/mu',
+                     'x\n' * 10  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 33 +
+                     '1\n' '2\n' '3\n' 'hunk1\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 243  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10,
+                     truncate=True)
+  sbox.simple_commit()
+
+  expected_output = [
+    'C         %s\n' % sbox.ospath('A/mu'),
+    '>         applied hunk @@ -180,7 +180,7 @@ with offset -169\n',
+    '>         applied hunk @@ -47,7 +47,7 @@ with offset 4\n',
+    '>         rejected hunk @@ -66,7 +66,7 @@\n',
+  ] + svntest.main.summary_of_conflicts(text_conflicts=1)
+  expected_disk.tweak('A/mu', contents=
+                     'x\n' * 10  +
+                     '1\n' '2\n' '3\n' 'hunk3-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 33  +
+                     '1\n' '2\n' '3\n' 'hunk1-mod\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 50  +
+                     '1\n' '2\n' '3\n' 'hunk2\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 243  +
+                     '1\n' '2\n' '3\n' 'hunk3\n' '4\n' '5\n' '6\n' +
+                     'x\n' * 10)
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('A/mu', status='M ', wc_rev=6)
+  expected_skip = wc.State('', { })
+  svntest.actions.run_and_verify_patch(wc_dir, os.path.abspath(patch_file_path),
+                                       expected_output, expected_disk,
+                                       expected_status, expected_skip)
+
 ########################################################################
 #Run the tests
 
@@ -5253,6 +5498,7 @@ test_list = [ None,
               patch_hunk_reorder,
               patch_hunk_overlap,
               patch_delete_modified,
+              patch_closest,
             ]
 
 if __name__ == '__main__':