Daniel Becroft wrote on Tue, Jan 18, 2011 at 07:13:12 +1000: > Hi guys, > > I was looking through the "Getting Involved" section of the Subversion > website, and decided to start by writing a regression test for an > issue, starting with 3686 (executable flag not correctly set on > merge). This issue was already assigned to someone, so apologies if > it's already being worked on. >
Welcome aboard :-). As a note for next time, though, when an issue is assigned to someone, it would be better to ask them (or dev@) whether they're working on it before starting to work on it yourself. I'm CCing Blair now for this reason. > I've attached the patch, and included it below as well. A few questions I > have: > > 1) I couldn't find a precedent for examining the OS's executable flag, > so my approach might be less than ideal. Should I add a test to > prop_tests.py to check that setting svn:executable also sets the > executable bit? No, the test you're just adding already does just that. Just copy the two asserts above the "# commit r2" line to after the comment and you're done :-) > 2) The problem also exists under the '--reintegrate' scenario, even > after a subsequent commit. Would it be better to include that case > here, or move the entire test to the merge_reintegrate.py suite? > I'm not sure we need a separate test for the --reintegrate case; it seems reasonable to assume it does (and will) share the 'set +x permission' logic with normal merges. As to location, if I wrote this I'd probably put it in prop_tests or special_tests along with the other svn:executable tests. (That's somewhat of a bikeshed, though, and I don't feel strongly about this.) > Regards, > Daniel Becroft > > > [[[ > Add regression test for issue #3686. > > This issue involves the executable flag being lost during a merge of a > binary file with the 'svn:executable' property set. > > * subversion/tests/cmdline/merge_tests.py > (merge_change_to_file_with_executable(sbox)) New test case. Drop the signature, and add a colon: (merge_change_to_file_with_executable): New test case. > ]]] (you've attached the patch both inline and as an attachment, I'll review only the latter) > Index: subversion/tests/cmdline/merge_tests.py > =================================================================== > --- subversion/tests/cmdline/merge_tests.py (revision 1059656) > +++ subversion/tests/cmdline/merge_tests.py (working copy) > @@ -16316,6 +16316,78 @@ > "Subtree merge under working merge produced the wrong mergeinfo", > '/A/C/nu:9', [], 'pg', SVN_PROP_MERGEINFO, nu_COPY_path) > > + > +#---------------------------------------------------------------------- > +# Test for issue #3686 'executable flag not correctly set on merge' > +# See http://subversion.tigris.org/issues/show_bug.cgi?id=3686 > +def merge_change_to_file_with_executable(sbox): > + "executable flag is maintained during binary merge" > + > + # Scenario: When merging a change to a binary file with the > 'svn:executable' > + # property set, the file is not marked as 'executable'. After commit, the > + # executable bit is set correctly. > + sbox.build() > + wc_dir = sbox.wc_dir > + trunk_url = sbox.repo_url + '/A/B/E' > + > + alpha_path = os.path.join(wc_dir, "A", "B", "E", "alpha") > + beta_path = os.path.join(wc_dir, "A", "B", "E", "beta") > + > + # Force one of the files to be a binary type > + svntest.actions.run_and_verify_svn(None, None, [], > + 'propset', 'svn:mime-type', > 'application/octet-stream', > + alpha_path) > + > + # Set the 'svn:executable' property on both files > + svntest.actions.run_and_verify_svn(None, None, [], > + 'propset', 'svn:executable', 'ON', > + beta_path) > + > + svntest.actions.run_and_verify_svn(None, None, [], > + 'propset', 'svn:executable', 'ON', > + alpha_path) > + > + # Verify the executable bit has been set before committing > + assert os.access(alpha_path, os.X_OK) > + assert os.access(beta_path, os.X_OK) > + No. Please use 'assert' for bugs in the test itself, and something else ('raise svntest.Failure' is the most generic) for bugs in the code being tested. Example: struct test_case { const char *input; int *exit_code; } test_cases[] = { ... }; for (i = 0; i < NUMBER_OF_TESTS; i++) { struct test_case t = test_cases[i]; SVN_ERR_ASSERT(t.exit_code); SVN_TEST_ASSERT(system(t.input) == *t.exit_code); } > + # Commit change (r2) > + sbox.simple_commit() > + > + # Create the branch > + svntest.actions.run_and_verify_svn(None, None, [], 'cp', > + trunk_url, > + sbox.repo_url + '/branch', > + '-m', "Creating the Branch") > + > + # Modify the files + commit (r3) > + svntest.main.file_append(alpha_path, 'appended alpha text') > + svntest.main.file_append(beta_path, 'appended beta text') > + sbox.simple_commit() > + > + svntest.actions.run_and_verify_svn(None, None, [], 'switch', > + sbox.repo_url + '/branch', > + wc_dir) A comment before this line would be useful, in my opinion. > + > + # Recalculate the paths > + alpha_path = os.path.join(wc_dir, "alpha") > + beta_path = os.path.join(wc_dir, "beta") > + > + # Merge the changes across > + svntest.actions.run_and_verify_svn(None, None, [], 'merge', > + trunk_url, wc_dir) > + > + # Verify the executable bit has been set > + assert os.access(alpha_path, os.X_OK) > + assert os.access(beta_path, os.X_OK) > + As expected, the test passes if you remove these two lines. > + # Commit (r4) > + sbox.simple_commit() > + > + # Verify the executable bit has been set > + assert os.access(alpha_path, os.X_OK) > + assert os.access(beta_path, os.X_OK) > + > ######################################################################## > # Run the tests > > @@ -16507,6 +16579,7 @@ > merge_with_os_deleted_subtrees, > no_self_referential_or_nonexistent_inherited_mergeinfo, > XFail(subtree_merges_inherit_invalid_working_mergeinfo), > + XFail(SkipUnless(merge_change_to_file_with_executable, > svntest.main.is_posix_os)), > ] > > if __name__ == '__main__': In short: +1 to commit, assuming you replace the asserts with something else per my earlier comment. (you aren't a committer yet, though, so please re-send the patch)