Author: stsp
Date: Tue Mar 17 10:05:53 2015
New Revision: 1667228
URL: http://svn.apache.org/r1667228
Log:
Fix text conflict description for binary files.
The is_binary flag in conflict description was set to zero even
for binary files. As a result, 'svn resolve' offered 'mine-conflict'
and 'theirs-conflict' options which don't make any sense for binaries.
Add a regression test to catch this problem in the future.
* subversion/libsvn_wc/conflicts.c
(read_text_conflict_desc): Drop is_binary paramter. Use the mime type to
detemine whether the conflicted file is binary.
(svn_wc__conflict_invoke_resolver): Stop passing FALSE for is_binary.
Let read_text_conflict_desc figure it out based on the mime type.
(svn_wc__read_conflicts): Read WORKING properties for text-conflicted files
and pass the mime type to read_text_conflict_desc().
* subversion/tests/libsvn_wc/conflict-data-test.c
(test_binary_file_conflict, test_funcs): New test.
Modified:
subversion/trunk/subversion/libsvn_wc/conflicts.c
subversion/trunk/subversion/tests/libsvn_wc/conflict-data-test.c
Modified: subversion/trunk/subversion/libsvn_wc/conflicts.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/conflicts.c?rev=1667228&r1=1667227&r2=1667228&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/conflicts.c (original)
+++ subversion/trunk/subversion/libsvn_wc/conflicts.c Tue Mar 17 10:05:53 2015
@@ -1739,7 +1739,6 @@ read_text_conflict_desc(svn_wc_conflict_
svn_wc__db_t *db,
const char *local_abspath,
const svn_skel_t *conflict_skel,
- svn_boolean_t is_binary,
const char *mime_type,
svn_wc_operation_t operation,
const svn_wc_conflict_version_t *left_version,
@@ -1748,8 +1747,8 @@ read_text_conflict_desc(svn_wc_conflict_
apr_pool_t *scratch_pool)
{
*desc = svn_wc_conflict_description_create_text2(local_abspath, result_pool);
- (*desc)->is_binary = is_binary;
(*desc)->mime_type = mime_type;
+ (*desc)->is_binary = mime_type ? svn_mime_type_is_binary(mime_type) : FALSE;
(*desc)->operation = operation;
(*desc)->src_left_version = left_version;
(*desc)->src_right_version = right_version;
@@ -1960,7 +1959,7 @@ svn_wc__conflict_invoke_resolver(svn_wc_
scratch_pool, scratch_pool));
SVN_ERR(read_text_conflict_desc(&desc,
- db, local_abspath, conflict_skel, FALSE,
+ db, local_abspath, conflict_skel,
svn_prop_get_value(props,
SVN_PROP_MIME_TYPE),
operation, left_version, right_version,
@@ -2270,10 +2269,14 @@ svn_wc__read_conflicts(const apr_array_h
if (text_conflicted)
{
svn_wc_conflict_description2_t *desc;
+ apr_hash_t *props;
+ SVN_ERR(svn_wc__db_read_props(&props, db, local_abspath, scratch_pool,
+ scratch_pool));
SVN_ERR(read_text_conflict_desc(&desc,
db, local_abspath, conflict_skel,
- FALSE /*is_binary*/, NULL /*mime_type*/,
+ svn_prop_get_value(props,
+ SVN_PROP_MIME_TYPE),
operation, left_version, right_version,
result_pool, scratch_pool));
APR_ARRAY_PUSH(cflcts, svn_wc_conflict_description2_t *) = desc;
Modified: subversion/trunk/subversion/tests/libsvn_wc/conflict-data-test.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_wc/conflict-data-test.c?rev=1667228&r1=1667227&r2=1667228&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_wc/conflict-data-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_wc/conflict-data-test.c Tue Mar 17
10:05:53 2015
@@ -910,6 +910,48 @@ test_prop_conflict_resolving(const svn_t
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_binary_file_conflict(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_test__sandbox_t sbox;
+ const apr_array_header_t *conflicts;
+ svn_wc_conflict_description2_t *desc;
+
+ svn_test__enable_sleep_for_timestamps(pool);
+
+ SVN_ERR(svn_test__sandbox_create(&sbox, "test_binary_file_conflict", opts,
pool));
+
+ /* Create and add a binary file. */
+ SVN_ERR(sbox_file_write(&sbox, "binary-file", "\xff\xff\xff\xff\xff\xff"));
+ SVN_ERR(sbox_wc_add(&sbox, "binary-file"));
+ SVN_ERR(sbox_wc_propset(&sbox, SVN_PROP_MIME_TYPE,
+ "application/octet-stream", "binary-file"));
+ SVN_ERR(sbox_wc_commit(&sbox, "binary-file")); /* r1 */
+
+ /* Make a change to the binary file. */
+ SVN_ERR(sbox_file_write(&sbox, "binary-file", "\xfc\xfc\xfc\xfc\xfc\xfc"));
+ SVN_ERR(sbox_wc_commit(&sbox, "binary-file")); /* r2 */
+
+ /* Update back to r1, make a conflicting change to binary file. */
+ SVN_ERR(sbox_wc_update(&sbox, "binary-file", 1));
+ SVN_ERR(sbox_file_write(&sbox, "binary-file", "\xfd\xfd\xfd\xfd\xfd\xfd"));
+
+ /* Update to HEAD and ensure the conflict is marked as binary. */
+ SVN_ERR(sbox_wc_update(&sbox, "binary-file", 2));
+ SVN_ERR(svn_wc__read_conflicts(&conflicts, sbox.wc_ctx->db,
+ sbox_wc_path(&sbox, "binary-file"),
+ FALSE, /* create_tempfiles */
+ pool, pool));
+ SVN_TEST_ASSERT(conflicts->nelts == 1);
+ desc = APR_ARRAY_IDX(conflicts, 0, svn_wc_conflict_description2_t *);
+ SVN_TEST_ASSERT(desc->is_binary);
+
+ svn_test__disable_sleep_for_timestamps(pool);
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
@@ -934,6 +976,8 @@ static struct svn_test_descriptor_t test
"test prop conflicts"),
SVN_TEST_OPTS_PASS(test_prop_conflict_resolving,
"test property conflict resolving"),
+ SVN_TEST_OPTS_PASS(test_binary_file_conflict,
+ "test binary file conflict"),
SVN_TEST_NULL
};