s...@apache.org writes:

> Author: stsp
> Date: Mon Nov 28 22:34:49 2011
> New Revision: 1207663

> +def patch_target_no_eol_at_eof(sbox):
> +  "patch target with no eol at eof"
> +
> +  sbox.build()
> +  wc_dir = sbox.wc_dir
> +
> +  patch_file_path = make_patch_path(sbox)
> +  iota_path = os.path.join(wc_dir, 'iota')
> +
> +  iota_contents = [
> +    "This is the file iota."
> +  ]
> +
> +  svntest.main.file_write(iota_path, ''.join(iota_contents))
> +  expected_output = svntest.wc.State(wc_dir, {
> +    'iota'  : Item(verb='Sending'),
> +    })
> +  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
> +  expected_status.tweak('iota', wc_rev=2)
> +  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
> +                                        expected_status, None, wc_dir)
> +  unidiff_patch = [
> +    "--- iota\t(revision 1)\n",
> +    "+++ iota\t(working copy)\n",
> +    "@@ -1,7 +1,7 @@\n",
> +    "-This is the file iota.\n"
> +    "\\ No newline at end of file\n",
> +    "+It is the file 'iota'.\n",
> +    "\\ No newline at end of file\n",
> +  ]
> +
> +  svntest.main.file_write(patch_file_path, ''.join(unidiff_patch))
> +
> +  iota_contents = [
> +    "It is the file 'iota'."
> +  ]
> +  expected_output = [
> +    'U         %s\n' % os.path.join(wc_dir, 'iota'),
> +  ]
> +
> +  expected_disk = svntest.main.greek_state.copy()
> +  expected_disk.tweak('iota', contents=''.join(iota_contents))
> +
> +  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
> +  expected_status.tweak('iota', 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,
> +                                       None, # expected err
> +                                       1, # check-props
> +                                       1) # dry-run

This test failed on the buildbot: 'iota' not showing status 'M'.  I
believe this is because there is no sleep between the commit allowing
the patching to be fast enough that the file's timestamp doesn't change
and the file shows as unmodified.  I can demonstrate that it is a
timestamp problem using:

Index: subversion/tests/cmdline/patch_tests.py
===================================================================
--- subversion/tests/cmdline/patch_tests.py     (revision 1207719)
+++ subversion/tests/cmdline/patch_tests.py     (working copy)
@@ -34,6 +34,7 @@
 import textwrap
 import zlib
 import posixpath
+import time
 
 # Our testing module
 import svntest
@@ -4036,6 +4037,10 @@
 
   expected_skip = wc.State('', { })
 
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r', '1', wc_dir)
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', sbox.ospath('iota'))
+  time.sleep(0.1)
+
   svntest.actions.run_and_verify_patch(wc_dir, 
os.path.abspath(patch_file_path),
                                        expected_output,
                                        expected_disk,

We need to sleep whenever a test relies on timestamp changes and in this
test there are two places: between the initial checkout and the
file_write, and between the commit and the patch.

Looking at the rest of the file I don't see do_sleep_for_timestamps or
explicit sleeps in any of the tests.  I suspect some of the others are
vulnerable to similar races.

-- 
Philip

Reply via email to