Hi,

I'm currently trying to put together a regression test for issue #4647
[1] in order to serve as a test/validation for the patch proposed in [2].

I think I got to the point where the test actually does what I want it
to do, but it currently unexpectedly fails with the following output
upon the svn resolve -R --accept base call:

Any idea what I'm doing wrong? (see attached patch file for the code)

Testing Release configuration on local repository.
START: resolve_tests.py
W: Unexpected output
W: EXPECTED STDOUT (unordered):
W: | Resolved conflicted state of 's'
W: | Resolved conflicted state of 'v'
W: | Resolved conflicted state of 'n'
W: | Resolved conflicted state of '-'
W: | Resolved conflicted state of 't'
W: | Resolved conflicted state of 'e'
W: | Resolved conflicted state of 's'
W: | Resolved conflicted state of 't'
W: | Resolved conflicted state of '-'
W: | Resolved conflicted state of 'w'
W: | Resolved conflicted state of 'o'
W: | Resolved conflicted state of 'r'
W: | Resolved conflicted state of 'k'
W: | Resolved conflicted state of '\'
W: | Resolved conflicted state of 'w'
W: | Resolved conflicted state of 'o'
W: | Resolved conflicted state of 'r'
W: | Resolved conflicted state of 'k'
W: | Resolved conflicted state of 'i'
W: | Resolved conflicted state of 'n'
W: | Resolved conflicted state of 'g'
W: | Resolved conflicted state of '_'
W: | Resolved conflicted state of 'c'
W: | Resolved conflicted state of 'o'
W: | Resolved conflicted state of 'p'
W: | Resolved conflicted state of 'i'
W: | Resolved conflicted state of 'e'
W: | Resolved conflicted state of 's'
W: | Resolved conflicted state of '\'
W: | Resolved conflicted state of 'r'
W: | Resolved conflicted state of 'e'
W: | Resolved conflicted state of 's'
W: | Resolved conflicted state of 'o'
W: | Resolved conflicted state of 'l'
W: | Resolved conflicted state of 'v'
W: | Resolved conflicted state of 'e'
W: | Resolved conflicted state of '_'
W: | Resolved conflicted state of 't'
W: | Resolved conflicted state of 'e'
W: | Resolved conflicted state of 's'
W: | Resolved conflicted state of 't'
W: | Resolved conflicted state of 's'
W: | Resolved conflicted state of '-'
W: | Resolved conflicted state of '8'
W: ACTUAL STDOUT:
W: DIFF STDOUT (unordered):
W: | --- EXPECTED STDOUT (unordered)
W: | +++ ACTUAL STDOUT
W: | @@ -1,44 +0,0 @@
W: | -Resolved conflicted state of 's'
W: | -Resolved conflicted state of 'v'
W: | -Resolved conflicted state of 'n'
W: | -Resolved conflicted state of '-'
W: | -Resolved conflicted state of 't'
W: | -Resolved conflicted state of 'e'
W: | -Resolved conflicted state of 's'
W: | -Resolved conflicted state of 't'
W: | -Resolved conflicted state of '-'
W: | -Resolved conflicted state of 'w'
W: | -Resolved conflicted state of 'o'
W: | -Resolved conflicted state of 'r'
W: | -Resolved conflicted state of 'k'
W: | -Resolved conflicted state of '\'
W: | -Resolved conflicted state of 'w'
W: | -Resolved conflicted state of 'o'
W: | -Resolved conflicted state of 'r'
W: | -Resolved conflicted state of 'k'
W: | -Resolved conflicted state of 'i'
W: | -Resolved conflicted state of 'n'
W: | -Resolved conflicted state of 'g'
W: | -Resolved conflicted state of '_'
W: | -Resolved conflicted state of 'c'
W: | -Resolved conflicted state of 'o'
W: | -Resolved conflicted state of 'p'
W: | -Resolved conflicted state of 'i'
W: | -Resolved conflicted state of 'e'
W: | -Resolved conflicted state of 's'
W: | -Resolved conflicted state of '\'
W: | -Resolved conflicted state of 'r'
W: | -Resolved conflicted state of 'e'
W: | -Resolved conflicted state of 's'
W: | -Resolved conflicted state of 'o'
W: | -Resolved conflicted state of 'l'
W: | -Resolved conflicted state of 'v'
W: | -Resolved conflicted state of 'e'
W: | -Resolved conflicted state of '_'
W: | -Resolved conflicted state of 't'
W: | -Resolved conflicted state of 'e'
W: | -Resolved conflicted state of 's'
W: | -Resolved conflicted state of 't'
W: | -Resolved conflicted state of 's'
W: | -Resolved conflicted state of '-'
W: | -Resolved conflicted state of '8'
W: CWD: G:\Projekte\MaxSVN\trunk\Release\subversion\tests\cmdline
W: EXCEPTION: SVNLineUnequal
Traceback (most recent call last):
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\svntest\main.py",
line 1852, in run
    rc = self.pred.run(sandbox)
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\svntest\testcase.py",
line 178, in run
    result = self.func(sandbox)
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\resolve_tests.py",
line 647, in automatic_binary_conflict_resolution
    A_COPY_path)
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\svntest\actions.py",
line 1909, in run_and_verify_resolve
    _run_and_verify_resolve('resolve', expected_paths, *args)
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\svntest\actions.py",
line 1903, in _run_and_verify_resolve
    cmd, *args)
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\svntest\actions.py",
line 313, in run_and_verify_svn
    expected_exit, *varargs)
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\svntest\actions.py",
line 353, in run_and_verify_svn2
    expected_stdout, expected_stderr)
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\svntest\verify.py",
line 453, in verify_outputs
    compare_and_display_lines(message, label, expected, actual, raisable)
  File
"G:\Projekte\MaxSVN\trunk\subversion\tests\cmdline\svntest\verify.py",
line 426, in compare_and_display_lines
    raise raisable
SVNLineUnequal
FAIL:  resolve_tests.py 8: resolve -R --accept [base | mf | tf] binary file
END: resolve_tests.py
ELAPSED: resolve_tests.py 0:00:02.872000

Traceback (most recent call last):
  File "win-tests.py", line 1106, in <module>
    failed = th.run(tests_to_run)
  File "G:\Projekte\MaxSVN\trunk\build\run_tests.py", line 585, in run
    log_lines = self.log.readlines()
AttributeError: 'NoneType' object has no attribute 'readlines'

[1] = https://issues.apache.org/jira/browse/SVN-4647
[2] = http://svn.haxx.se/dev/archive-2016-08/0020.shtml

Regards,
Stefan

Index: subversion/tests/cmdline/resolve_tests.py
===================================================================
--- subversion/tests/cmdline/resolve_tests.py	(revision 1743999)
+++ subversion/tests/cmdline/resolve_tests.py	(working copy)
@@ -598,7 +598,68 @@
   svntest.main.run_svn(None, 'merge', '-c4,3', '^/iota', 'iota',
                        '--accept=theirs-conflict')
 
+#----------------------------------------------------------------------
 
+# Test for issue #4647 'auto resolution mine-full fails on binary file'
+@XFail()
+@Issue(4647)
+def automatic_binary_conflict_resolution(sbox):
+  "resolve -R --accept [base | mf | tf] binary file"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # Some paths we'll care about
+  A_COPY_path = os.path.join(wc_dir, "A_COPY")
+
+  # Add a binary file to the project in revision 2.
+  theta_contents = open(os.path.join(sys.path[0], "theta.bin"), 'rb').read()
+  theta_path = sbox.ospath('A/theta')
+  svntest.main.file_write(theta_path, theta_contents, 'wb')
+  svntest.main.run_svn(None, 'add', theta_path)
+  svntest.main.run_svn(None, 'commit', '-m', 'log msg', wc_dir)
+
+  # Branch A to A_COPY in revision 3.
+  svntest.main.run_svn(None, 'copy',  wc_dir + "/A",  A_COPY_path)
+  svntest.main.run_svn(None, 'commit', '-m', 'log msg', wc_dir)
+
+  # Modify the binary file on trunk and in the branch, so that both versions
+  # differ.
+  theta_branch_path = sbox.ospath('A_COPY/theta')
+  svntest.main.file_append_binary(theta_path, theta_contents)
+  svntest.main.run_svn(None, 'commit', '-m', 'log msg', wc_dir)
+  svntest.main.file_append_binary(theta_branch_path, theta_contents)
+  svntest.main.file_append_binary(theta_branch_path, theta_contents)
+  svntest.main.run_svn(None, 'commit', '-m', 'log msg', wc_dir)
+
+  # Run an svn update now to prevent mixed-revision working copy [1:4] error.
+  svntest.main.run_svn(None, 'update', wc_dir)
+
+
+  def do_binary_conflicting_merge():
+    svntest.actions.run_and_verify_svn(None, [],
+                                       'revert', '--recursive', A_COPY_path)
+    svntest.main.run_svn(None, 'merge', sbox.repo_url + "/A_COPY/theta", wc_dir + "/A/theta")
+
+  # Test 'svn resolve -R --accept base'
+  do_binary_conflicting_merge()
+  svntest.actions.run_and_verify_resolve(wc_dir,
+                                         '-R', '--accept', 'base',
+                                         A_COPY_path)
+
+  # Test 'svn resolve -R --accept mine-full'
+  do_binary_conflicting_merge()
+  svntest.actions.run_and_verify_resolve(wc_dir,
+                                         '-R', '--accept', 'mine-full',
+                                         A_COPY_path)
+
+  # Test 'svn resolve -R --accept theirs-full'
+  do_binary_conflicting_merge()
+  svntest.actions.run_and_verify_resolve(wc_dir,
+                                         '-R', '--accept', 'tf',
+                                         A_COPY_path)
+
+
 ########################################################################
 # Run the tests
 
@@ -611,6 +672,7 @@
               resolved_on_deleted_item,
               theirs_conflict_in_subdir,
               multi_range_merge_with_accept,
+              automatic_binary_conflict_resolution,
              ]
 
 if __name__ == '__main__':

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to