You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2012/09/27 16:06:28 UTC
svn commit: r1391019 - in /subversion/trunk/subversion:
libsvn_wc/conflicts.c tests/cmdline/resolve_tests.py
Author: stsp
Date: Thu Sep 27 14:06:27 2012
New Revision: 1391019
URL: http://svn.apache.org/viewvc?rev=1391019&view=rev
Log:
Fix a bug where the conflict resolver loses the executable bit of a file
with an svn:executable property.
* subversion/libsvn_wc/conflicts.c
(eval_text_conflict_func_result, resolve_conflict_on_node): When installing
a resolved file, also set up a work queue task to sync file flags.
The resolution source might be a temp file with different permission bits.
* subversion/tests/cmdline/resolve_tests.py
(auto_resolve_executable_file): New test, which verifies the above fix
with --accept theirs-full (though other --accept cases were also affected,
testing just one should be sufficient).
(test_list): Add new test.
Modified:
subversion/trunk/subversion/libsvn_wc/conflicts.c
subversion/trunk/subversion/tests/cmdline/resolve_tests.py
Modified: subversion/trunk/subversion/libsvn_wc/conflicts.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/conflicts.c?rev=1391019&r1=1391018&r2=1391019&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/conflicts.c (original)
+++ subversion/trunk/subversion/libsvn_wc/conflicts.c Thu Sep 27 14:06:27 2012
@@ -1600,6 +1600,10 @@ eval_text_conflict_func_result(svn_skel_
FALSE /* record_fileinfo */,
result_pool, scratch_pool));
*work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
+
+ SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item, db, local_abspath,
+ result_pool, scratch_pool));
+ *work_items = svn_wc__wq_merge(*work_items, work_item, result_pool);
if (remove_source)
{
@@ -1679,7 +1683,6 @@ save_merge_result(svn_skel_t **work_item
db, local_abspath,
source, edited_copy_abspath,
result_pool, scratch_pool));
-
return SVN_NO_ERROR;
}
@@ -2341,6 +2344,11 @@ resolve_conflict_on_node(svn_boolean_t *
&work_item, db, local_abspath,
auto_resolve_src, local_abspath, pool, pool));
work_items = svn_wc__wq_merge(work_items, work_item, pool);
+
+ SVN_ERR(svn_wc__wq_build_sync_file_flags(&work_item, db,
+ local_abspath,
+ pool, pool));
+ work_items = svn_wc__wq_merge(work_items, work_item, pool);
}
/* Legacy behavior: Only report text conflicts as resolved when at least
Modified: subversion/trunk/subversion/tests/cmdline/resolve_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/resolve_tests.py?rev=1391019&r1=1391018&r2=1391019&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/resolve_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/resolve_tests.py Thu Sep 27 14:06:27 2012
@@ -25,7 +25,7 @@
######################################################################
# General modules
-import shutil, sys, re, os
+import shutil, sys, re, os, stat
import time
# Our testing module
@@ -243,6 +243,35 @@ def prop_conflict_resolution(sbox):
[], # Prop deleted
['incoming-conflict\n'])
+@SkipUnless(svntest.main.is_posix_os)
+def auto_resolve_executable_file(sbox):
+ "resolve file with executable bit set"
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # Mark iota as executable
+ sbox.simple_propset("svn:executable", '*', 'iota')
+ sbox.simple_commit() # r2
+
+ # Make a change to iota in r3
+ svntest.main.file_write(sbox.ospath('iota'), "boo\n")
+ sbox.simple_commit() # r3
+
+ # Update back to r2, and tweak iota to provoke a text conflict
+ sbox.simple_update(revision=2)
+ svntest.main.file_write(sbox.ospath('iota'), "bzzt\n")
+
+ # Get permission bits of iota
+ mode = os.stat(sbox.ospath('iota'))[stat.ST_MODE]
+
+ # Update back to r3, and auto-resolve the text conflict.
+ svntest.main.run_svn(False, 'update', wc_dir, '--accept', 'theirs-full')
+
+ # permission bits of iota should be unaffected
+ if mode != os.stat(sbox.ospath('iota'))[stat.ST_MODE]:
+ raise svntest.Failure
+
+
########################################################################
# Run the tests
@@ -250,6 +279,7 @@ def prop_conflict_resolution(sbox):
test_list = [ None,
automatic_conflict_resolution,
prop_conflict_resolution,
+ auto_resolve_executable_file,
]
if __name__ == '__main__':