Author: danielsh Date: Sun Oct 17 20:13:44 2010 New Revision: 1023571 URL: http://svn.apache.org/viewvc?rev=1023571&view=rev Log: Make sure a locally-copied svn:needs-lock file isn't marked read-only.
Found by: Paul Maier <[email protected]> Review by: stsp * subversion/tests/cmdline/lock_tests.py (check_writability): New helper. (is_readonly, is_writable): New assertion helpers. (cp_isnt_ro): New test. (test_list): Run new test, passing. * subversion/libsvn_wc/copy.c (copy_versioned_file): Remove read-only permissions from the staged destination file. Modified: subversion/trunk/subversion/libsvn_wc/copy.c subversion/trunk/subversion/tests/cmdline/lock_tests.py Modified: subversion/trunk/subversion/libsvn_wc/copy.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/copy.c?rev=1023571&r1=1023570&r2=1023571&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/copy.c (original) +++ subversion/trunk/subversion/libsvn_wc/copy.c Sun Oct 17 20:13:44 2010 @@ -238,10 +238,22 @@ copy_versioned_file(svn_wc__db_t *db, tmpdir_abspath, TRUE, /* recursive */ cancel_func, cancel_baton, scratch_pool)); + if (tmp_dst_abspath) { svn_skel_t *work_item; + /* Remove 'read-only' from the destination file; it's a local add. */ + { + const svn_string_t *needs_lock; + SVN_ERR(svn_wc__internal_propget(&needs_lock, db, src_abspath, + SVN_PROP_NEEDS_LOCK, + scratch_pool, scratch_pool)); + if (needs_lock) + SVN_ERR(svn_io_set_file_read_write(tmp_dst_abspath, + FALSE, scratch_pool)); + } + SVN_ERR(svn_wc__wq_build_file_move(&work_item, db, tmp_dst_abspath, dst_abspath, scratch_pool, scratch_pool)); Modified: subversion/trunk/subversion/tests/cmdline/lock_tests.py URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/lock_tests.py?rev=1023571&r1=1023570&r2=1023571&view=diff ============================================================================== --- subversion/trunk/subversion/tests/cmdline/lock_tests.py (original) +++ subversion/trunk/subversion/tests/cmdline/lock_tests.py Sun Oct 17 20:13:44 2010 @@ -37,6 +37,24 @@ XFail = svntest.testcase.XFail Item = svntest.wc.StateItem ###################################################################### +# Helpers + +def check_writability(path, writable) + bits = stat.S_IWGRP | stat.S_IWOTH | stat.S_IWRITE + mode = os.stat(path)[0] + if bool(mode & bits) != writable: + raise svntest.Failure("path '%s' is unexpectedly %s (mode %o)" + % (path, ["writable", "read-only"][writable], mode)) + +def is_writable(path): + "Raise if PATH is not writable." + check_writability(path, True) + +def is_readonly(path): + "Raise if PATH is not readonly." + check_writability(path, False) + +###################################################################### # Tests #---------------------------------------------------------------------- @@ -1573,6 +1591,39 @@ def replace_and_propset_locked_path(sbox 'commit', '-m', '', G_path) +#---------------------------------------------------------------------- +def cp_isnt_ro(sbox): + "uncommitted svn:needs-lock add/cp not read-only" + + sbox.build() + wc_dir = sbox.wc_dir + + mu_path = os.path.join(wc_dir, 'A', 'mu') + mu2_path = os.path.join(wc_dir, 'A', 'mu2') + kappa_path = os.path.join(wc_dir, 'kappa') + open(kappa_path, 'w').write("This is the file 'kappa'.\n") + + # added file + sbox.simple_add(kappa_path) + svntest.actions.set_prop('svn:needs-lock', 'yes', kappa_path) + is_writable(kappa_path) + sbox.simple_commit(kappa_path) + is_readonly(kappa_path) + + # versioned file + svntest.actions.set_prop('svn:needs-lock', 'yes', mu_path) + is_writable(mu_path) + sbox.simple_commit(mu_path) + is_readonly(mu_path) + + # added-with-history file (aka uncommitted copied file) + svntest.actions.set_prop('svn:needs-lock', 'yes', mu_path) + svntest.main.run_svn(None, 'copy', mu_path, mu2_path) + is_writable(mu2_path) + sbox.simple_commit(mu2_path) + is_readonly(mu2_path) + + ######################################################################## # Run the tests @@ -1619,6 +1670,7 @@ test_list = [ None, verify_path_escaping, XFail(replace_and_propset_locked_path, svntest.main.is_ra_type_dav), + cp_isnt_ro, ] if __name__ == '__main__':
