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 2012/10/25 01:14:13 UTC
svn commit: r1401915 - in /subversion/trunk/subversion:
libsvn_client/merge.c tests/cmdline/merge_tests.py
Author: pburba
Date: Wed Oct 24 23:14:12 2012
New Revision: 1401915
URL: http://svn.apache.org/viewvc?rev=1401915&view=rev
Log:
Prevent segfault when merge target has file externals with mergeinfo.
See http://svn.haxx.se/dev/archive-2012-10/0364.shtml
* subversion/libsvn_client/merge.c
(get_wc_explicit_mergeinfo_catalog): Prune file externals with explicit
mergeinfo from the catalog.
* subversion/tests/cmdline/merge_tests.py
(merge_with_externals_with_mergeinfo): New regression test.
(test_list): Add merge_with_externals_with_mergeinfo.
Modified:
subversion/trunk/subversion/libsvn_client/merge.c
subversion/trunk/subversion/tests/cmdline/merge_tests.py
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1401915&r1=1401914&r2=1401915&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Wed Oct 24 23:14:12 2012
@@ -5731,12 +5731,17 @@ get_wc_explicit_mergeinfo_catalog(apr_ha
svn_opt_revision_t working_revision = { svn_opt_revision_working, { 0 } };
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_hash_index_t *hi;
+ apr_hash_t *externals;
SVN_ERR(svn_client_propget5(subtrees_with_mergeinfo, NULL,
SVN_PROP_MERGEINFO, target_abspath,
&working_revision, &working_revision, NULL,
depth, NULL, ctx, result_pool, scratch_pool));
+ SVN_ERR(svn_wc__externals_defined_below(&externals, ctx->wc_ctx,
+ target_abspath, scratch_pool,
+ scratch_pool));
+
/* Convert property values to svn_mergeinfo_t. */
for (hi = apr_hash_first(scratch_pool, *subtrees_with_mergeinfo);
hi;
@@ -5747,6 +5752,15 @@ get_wc_explicit_mergeinfo_catalog(apr_ha
svn_mergeinfo_t mergeinfo;
svn_error_t *err;
+ /* svn_client_propget5 picks up file externals with
+ mergeinfo, but we don't want those. */
+ if (apr_hash_get(externals, wc_path, APR_HASH_KEY_STRING))
+ {
+ apr_hash_set(*subtrees_with_mergeinfo, wc_path,
+ APR_HASH_KEY_STRING, NULL);
+ continue;
+ }
+
svn_pool_clear(iterpool);
err = svn_mergeinfo_parse(&mergeinfo, mergeinfo_string->data,
Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=1401915&r1=1401914&r2=1401915&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Wed Oct 24 23:14:12 2012
@@ -17826,6 +17826,60 @@ def merge_with_added_subtrees_with_merge
None, None, None, None,
None, 1, 0)
+#----------------------------------------------------------------------
+@SkipUnless(server_has_mergeinfo)
+def merge_with_externals_with_mergeinfo(sbox):
+ "merge with externals with mergeinfo"
+
+ # Some paths we'll care about.
+ A_path = sbox.ospath('A')
+ A_COPY_path = sbox.ospath('A_COPY')
+ file_external_path = sbox.ospath('A/file-external')
+ mu_COPY_path = sbox.ospath('A_COPY/mu')
+ mu_path = sbox.ospath('A/mu')
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ # Make a branch of ^/A and then make a few edits under A in r3-6:
+ wc_disk, wc_status = set_up_branch(sbox)
+
+ svntest.main.file_write(mu_COPY_path, "branch edit")
+ svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ 'file edit on the branch', wc_dir)
+ svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+
+ # Create a file external under 'A' and set some bogus mergeinfo
+ # on it (the fact that this mergeinfo is bogus has no bearing on
+ # this test).
+ svntest.actions.run_and_verify_svn(None, None, [], 'propset',
+ 'svn:externals',
+ '^/iota file-external', A_path)
+ svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ 'set file external', wc_dir)
+ svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+ svntest.actions.run_and_verify_svn(None, None, [], 'ps', SVN_PROP_MERGEINFO,
+ "/bogus-mergeinfo:5", file_external_path)
+ svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ 'set mergeinfo on file external',
+ file_external_path)
+
+ # Sync merge ^/A to A_COPY and then reintegrate A_COPY back to A.
+ svntest.actions.run_and_verify_svn(None, None, [], 'merge',
+ sbox.repo_url + '/A', A_COPY_path)
+ svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+ 'sync merge', wc_dir)
+ # This was segfaulting, see
+ # http://svn.haxx.se/dev/archive-2012-10/0364.shtml
+ svntest.actions.run_and_verify_svn(
+ None,
+ expected_merge_output(None,
+ ['U ' + mu_path + '\n',
+ ' U ' + A_path + '\n'],
+ two_url=True),
+ [], 'merge', '--reintegrate', sbox.repo_url + '/A_COPY',
+ A_path)
+
########################################################################
# Run the tests
@@ -17961,6 +18015,7 @@ test_list = [ None,
reverse_merge_with_rename,
merge_adds_then_deletes_subtree,
merge_with_added_subtrees_with_mergeinfo,
+ merge_with_externals_with_mergeinfo,
]
if __name__ == '__main__':
RE: svn commit: r1401915 - in /subversion/trunk/subversion: libsvn_client/merge.c tests/cmdline/merge_tests.py
Posted by Bert Huijben <be...@qqmail.nl>.
> -----Original Message-----
> From: pburba@apache.org [mailto:pburba@apache.org]
> Sent: donderdag 25 oktober 2012 01:14
> To: commits@subversion.apache.org
> Subject: svn commit: r1401915 - in /subversion/trunk/subversion:
> libsvn_client/merge.c tests/cmdline/merge_tests.py
>
> Author: pburba
> Date: Wed Oct 24 23:14:12 2012
> New Revision: 1401915
>
> URL: http://svn.apache.org/viewvc?rev=1401915&view=rev
> Log:
> Prevent segfault when merge target has file externals with mergeinfo.
>
> See http://svn.haxx.se/dev/archive-2012-10/0364.shtml
>
> * subversion/libsvn_client/merge.c
>
> (get_wc_explicit_mergeinfo_catalog): Prune file externals with explicit
> mergeinfo from the catalog.
>
> * subversion/tests/cmdline/merge_tests.py
>
> (merge_with_externals_with_mergeinfo): New regression test.
>
> (test_list): Add merge_with_externals_with_mergeinfo.
Shouldn't this fix be applied to every switched paths below a directory instead of just on file externals specifically?
Or is there some other subsystem that denies merges in this situation?
Bert
RE: svn commit: r1401915 - in /subversion/trunk/subversion: libsvn_client/merge.c tests/cmdline/merge_tests.py
Posted by Bert Huijben <be...@qqmail.nl>.
> -----Original Message-----
> From: pburba@apache.org [mailto:pburba@apache.org]
> Sent: donderdag 25 oktober 2012 01:14
> To: commits@subversion.apache.org
> Subject: svn commit: r1401915 - in /subversion/trunk/subversion:
> libsvn_client/merge.c tests/cmdline/merge_tests.py
>
> Author: pburba
> Date: Wed Oct 24 23:14:12 2012
> New Revision: 1401915
>
> URL: http://svn.apache.org/viewvc?rev=1401915&view=rev
> Log:
> Prevent segfault when merge target has file externals with mergeinfo.
>
> See http://svn.haxx.se/dev/archive-2012-10/0364.shtml
>
> * subversion/libsvn_client/merge.c
>
> (get_wc_explicit_mergeinfo_catalog): Prune file externals with explicit
> mergeinfo from the catalog.
>
> * subversion/tests/cmdline/merge_tests.py
>
> (merge_with_externals_with_mergeinfo): New regression test.
>
> (test_list): Add merge_with_externals_with_mergeinfo.
Shouldn't this fix be applied to every switched paths below a directory instead of just on file externals specifically?
Or is there some other subsystem that denies merges in this situation?
Bert