Could we just print a hex dump of the value?
s...@apache.org wrote on Tue, Jun 14, 2011 at 15:10:50 -0000: > Author: stsp > Date: Tue Jun 14 15:10:50 2011 > New Revision: 1135635 > > URL: http://svn.apache.org/viewvc?rev=1135635&view=rev > Log: > * subversion/libsvn_wc/props.c > (prop_conflict_from_skel): If any property value involved in the conflict > is binary data do not generate a conflict diff. Also refrain from writing > binary data to the reject file, and print a readable placeholder instead. > > Modified: > subversion/trunk/subversion/libsvn_wc/props.c > > Modified: subversion/trunk/subversion/libsvn_wc/props.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/props.c?rev=1135635&r1=1135634&r2=1135635&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/props.c (original) > +++ subversion/trunk/subversion/libsvn_wc/props.c Tue Jun 14 15:10:50 2011 > @@ -569,6 +569,9 @@ prop_conflict_from_skel(const svn_string > svn_diff_t *diff; > svn_diff_file_options_t *diff_opts; > svn_stringbuf_t *buf; > + svn_boolean_t original_is_binary; > + svn_boolean_t mine_is_binary; > + svn_boolean_t incoming_is_binary; > > /* Navigate to the property name. */ > skel = skel->children->next; > @@ -602,47 +605,64 @@ prop_conflict_from_skel(const svn_string > else if (incoming_base && svn_string_compare(original, mine)) > original = incoming_base; > > - /* ### TODO Do not attempt to generate diffs of binary data. */ > - diff_opts = svn_diff_file_options_create(scratch_pool); > - diff_opts->ignore_space = FALSE; > - diff_opts->ignore_eol_style = FALSE; > - diff_opts->show_c_function = FALSE; > - SVN_ERR(svn_diff_mem_string_diff3(&diff, original, mine, incoming, > - diff_opts, scratch_pool)); > - if (svn_diff_contains_conflicts(diff)) > - { > - svn_stream_t *stream; > - svn_diff_conflict_display_style_t style; > - const char *mine_marker = _("<<<<<<< (local property value)"); > - const char *incoming_marker = _(">>>>>>> (incoming property value)"); > - const char *separator = "======="; > - > - style = svn_diff_conflict_display_modified_latest; > - stream = svn_stream_from_stringbuf(buf, scratch_pool); > - SVN_ERR(svn_stream_skip(stream, buf->len)); > - SVN_ERR(svn_diff_mem_string_output_merge2(stream, diff, > - original, mine, incoming, > - NULL, mine_marker, > - incoming_marker, separator, > - style, scratch_pool)); > - SVN_ERR(svn_stream_close(stream)); > + /* If any of the property values involved in the diff is binary data, > + * do not generate a diff. */ > + original_is_binary = svn_io_is_binary_data(original->data, original->len); > + mine_is_binary = svn_io_is_binary_data(mine->data, mine->len); > + incoming_is_binary = svn_io_is_binary_data(incoming->data, incoming->len); > + > + if (!(original_is_binary || mine_is_binary || incoming_is_binary)) > + { > + diff_opts = svn_diff_file_options_create(scratch_pool); > + diff_opts->ignore_space = FALSE; > + diff_opts->ignore_eol_style = FALSE; > + diff_opts->show_c_function = FALSE; > + SVN_ERR(svn_diff_mem_string_diff3(&diff, original, mine, incoming, > + diff_opts, scratch_pool)); > + if (svn_diff_contains_conflicts(diff)) > + { > + svn_stream_t *stream; > + svn_diff_conflict_display_style_t style; > + const char *mine_marker = _("<<<<<<< (local property value)"); > + const char *incoming_marker = _(">>>>>>> (incoming property > value)"); > + const char *separator = "======="; > + > + style = svn_diff_conflict_display_modified_latest; > + stream = svn_stream_from_stringbuf(buf, scratch_pool); > + SVN_ERR(svn_stream_skip(stream, buf->len)); > + SVN_ERR(svn_diff_mem_string_output_merge2(stream, diff, > + original, mine, incoming, > + NULL, mine_marker, > + incoming_marker, > separator, > + style, scratch_pool)); > + SVN_ERR(svn_stream_close(stream)); > + > + *conflict_desc = svn_string_create_from_buf(buf, result_pool); > + return SVN_NO_ERROR; > + } > } > - else > + > + /* If we could not print a conflict diff just print full values . */ > + if (mine->len > 0) > { > - /* If we cannot print a conflict diff just print full values . */ > - if (mine->len > 0) > - { > - svn_stringbuf_appendcstr(buf, _("Local property value:\n")); > - svn_stringbuf_appendbytes(buf, mine->data, mine->len); > - svn_stringbuf_appendcstr(buf, "\n"); > - } > + svn_stringbuf_appendcstr(buf, _("Local property value:\n")); > + if (mine_is_binary) > + svn_stringbuf_appendcstr(buf, _("Cannot display: property value is " > + "binary data\n")); > + else > + svn_stringbuf_appendbytes(buf, mine->data, mine->len); > + svn_stringbuf_appendcstr(buf, "\n"); > + } > > - if (incoming->len > 0) > - { > - svn_stringbuf_appendcstr(buf, _("Incoming property value:\n")); > - svn_stringbuf_appendbytes(buf, incoming->data, incoming->len); > - svn_stringbuf_appendcstr(buf, "\n"); > - } > + if (incoming->len > 0) > + { > + svn_stringbuf_appendcstr(buf, _("Incoming property value:\n")); > + if (incoming_is_binary) > + svn_stringbuf_appendcstr(buf, _("Cannot display: property value is " > + "binary data\n")); > + else > + svn_stringbuf_appendbytes(buf, incoming->data, incoming->len); > + svn_stringbuf_appendcstr(buf, "\n"); > } > > *conflict_desc = svn_string_create_from_buf(buf, result_pool); > >