You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2011/05/26 22:18:43 UTC
svn commit: r1128062 - /subversion/trunk/subversion/libsvn_wc/props.c
Author: pburba
Date: Thu May 26 20:18:42 2011
New Revision: 1128062
URL: http://svn.apache.org/viewvc?rev=1128062&view=rev
Log:
A partial fix for issue #3896 'mergeinfo syntax errors should be treated
gracefully': Teach the WC to tolerate bogus mergeinfo when merging
svn:mergeinfo properties.
* subversion/libsvn_wc/props.c
(apply_single_prop_add,
apply_single_prop_change): We can't merge syntactically invalid mergeinfo,
so if we encounter any just treat it like any other generic property,
rather than coming to a screeching halt.
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=1128062&r1=1128061&r2=1128062&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/props.c (original)
+++ subversion/trunk/subversion/libsvn_wc/props.c Thu May 26 20:18:42 2011
@@ -990,20 +990,39 @@ apply_single_prop_add(svn_wc_notify_stat
else
{
+ svn_boolean_t merged_prop = FALSE;
+
/* The WC difference doesn't match the new value.
We only merge mergeinfo; other props conflict */
if (strcmp(propname, SVN_PROP_MERGEINFO) == 0)
{
const svn_string_t *merged_val;
+ svn_error_t *err = combine_mergeinfo_props(&merged_val,
+ working_val,
+ new_val,
+ result_pool,
+ scratch_pool);
- SVN_ERR(combine_mergeinfo_props(&merged_val, working_val,
- new_val, result_pool,
- scratch_pool));
- apr_hash_set(working_props, propname,
- APR_HASH_KEY_STRING, merged_val);
- set_prop_merge_state(state, svn_wc_notify_state_merged);
+ /* Issue #3896 'mergeinfo syntax errors should be treated
+ gracefully': If bogus mergeinfo is present we can't
+ merge intelligently, so raise a conflict instead. */
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+ svn_error_clear(err);
+ else
+ return svn_error_return(err);
+ }
+ else
+ {
+ merged_prop = TRUE;
+ apr_hash_set(working_props, propname,
+ APR_HASH_KEY_STRING, merged_val);
+ set_prop_merge_state(state, svn_wc_notify_state_merged);
+ }
}
- else
+
+ if (!merged_prop)
{
SVN_ERR(maybe_generate_propconflict(conflict_remains,
db, local_abspath,
@@ -1343,6 +1362,8 @@ apply_single_prop_change(svn_wc_notify_s
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ svn_boolean_t merged_prop = FALSE;
+
*conflict_remains = FALSE;
/* Note: The purpose is to apply the change (old_val -> new_val) onto
@@ -1354,20 +1375,42 @@ apply_single_prop_change(svn_wc_notify_s
the property. */
if (strcmp(propname, SVN_PROP_MERGEINFO) == 0)
{
- /* We know how to merge any mergeinfo property change. */
+ /* We know how to merge any mergeinfo property change...
- SVN_ERR(apply_single_mergeinfo_prop_change(state, conflict_remains,
- db, local_abspath,
- left_version, right_version,
- is_dir,
- working_props,
- propname, base_val, old_val,
- new_val,
- conflict_func, conflict_baton,
- dry_run,
- result_pool, scratch_pool));
+ ...But Issue #3896 'mergeinfo syntax errors should be treated
+ gracefully' might thwart us. If bogus mergeinfo is present we
+ can't merge intelligently, so let the standard method deal with
+ it instead. */
+ svn_error_t *err = apply_single_mergeinfo_prop_change(state,
+ conflict_remains,
+ db, local_abspath,
+ left_version,
+ right_version,
+ is_dir,
+ working_props,
+ propname,
+ base_val,
+ old_val,
+ new_val,
+ conflict_func,
+ conflict_baton,
+ dry_run,
+ result_pool,
+ scratch_pool);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+ svn_error_clear(err);
+ else
+ return svn_error_return(err);
+ }
+ else
+ {
+ merged_prop = TRUE;
+ }
}
- else
+
+ if (!merged_prop)
{
/* The standard method: perform a simple update automatically, but
pass any other kind of merge to maybe_generate_propconflict(). */