[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: [test fail] Re: svn commit: r39093 - in trunk/subversion: libsvn_wc tests/cmdline

From: Stephen Butler <sbutler_at_elego.de>
Date: Thu, 03 Sep 2009 12:49:57 +0200

Quoting Stephen Butler <sbutler_at_elego.de>:

> Quoting Neels Janosch Hofmeyr <neels_at_elego.de>:
>
>> Stephen Butler wrote:
>>> Author: sbutler
>>> Date: Wed Sep 2 16:35:11 2009
>>> New Revision: 39093
>>>
>>> Log:
>>> Fix WC-NG handling of "orphaned" items in a replaced dir.
>>>
>>> "Orphans" are items deleted by a merge that are within a replaced
>>> tree, but aren't themselve replaced by the incoming copy operation.
>>> They should remain deleted, but were being corrupted.
>>>
>>> This fix also eliminates the nonsensical "deleted with history" status
>>> that used to be displayed for orphaned items.
>>>
>>> * subversion/libsvn_wc/entries.c
>>> (write_entry): Fix the logic for translating schedule-delete entries
>>> to wc_db rows.
>>>
>>> * subversion/libsvn_wc/adm_ops.c
>>> (mark_tree): Don't set the "copied" flag for orphans.
>>> (process_committed_leaf): Relax an assertion that assumes the copied
>>> flag is set for orphans.
>>>
>>> * subversion/tests/cmdline/copy_tests.py
>>> (wc_to_wc_copy_deleted):
>>> * subversion/tests/cmdline/revert_tests.py
>>> (status_of_missing_dir_after_revert_replaced_with_history_dir):
>>> Tweak status expectations for orphaned items: show the wc-rev,
>>> don't show the '+' ("with history").
>>>
>>> * subversion/tests/cmdline/merge_tests.py
>>> (copy_then_replace_via_merge): Tweak status expectations. Add
>>> update and commit to check for WC corruption.
>>> (test_list): Remove XFail() from copy_then_replace_via_merge().
>>
>> Hi Steve,
>>
>> hm, this test fails on my side!
>> I did a clean checkout & build and got this:
>>
>> [[[
>> $ ./merge_tests.py 134
>> subversion/svn/commit-cmd.c:142: (apr_err=160020)
>> subversion/libsvn_client/commit.c:853: (apr_err=160020)
>> svn: Commit failed (details follow):
>> subversion/libsvn_client/commit_util.c:1673: (apr_err=160020)
>> subversion/libsvn_delta/path_driver.c:251: (apr_err=160020)
>> subversion/libsvn_client/commit_util.c:1469: (apr_err=160020)
>> subversion/libsvn_repos/commit.c:364: (apr_err=160020)
>> subversion/libsvn_fs_fs/tree.c:1871: (apr_err=160020)
>> svn: File already exists: filesystem
>> '/home/neels/svn/patch/subversion/tests/cmdline/svn-test-work/repositories/merge_tests-134/db',
>> transaction '6-6', path '/branch/J/M'
>> Traceback (most recent call last):
>> File "/home/neels/svn/patch/subversion/tests/cmdline/svntest/main.py",
>> line 1166, in run
>> rc = self.pred.run(sandbox)
>> File "/home/neels/svn/patch/subversion/tests/cmdline/svntest/testcase.py",
>> line 129, in run
>> return self.func(sandbox)
>> File "./merge_tests.py", line 16220, in copy_then_replace_via_merge
>> None, branch_J)
>> File "/home/neels/svn/patch/subversion/tests/cmdline/svntest/actions.py",
>> line 1205, in run_and_verify_commit
>> *args)
>> File "/home/neels/svn/patch/subversion/tests/cmdline/svntest/main.py",
>> line 598, in run_svn
>> *(_with_auth(_with_config_dir(varargs))))
>> File "/home/neels/svn/patch/subversion/tests/cmdline/svntest/main.py",
>> line 366, in run_command
>> None, *varargs)
>> File "/home/neels/svn/patch/subversion/tests/cmdline/svntest/main.py",
>> line 531, in run_command_stdin
>> raise Failure
>> Failure
>> FAIL: merge_tests.py 134: copy then replace via merge
>> ]]]
>>
>> And I don't know what to make of it, really. Hopefully you know?
>
> Strange. I don't know how that passed 'make check'. But a
> distclean and make cause the error to appear for me too. I just
> committed r39098 which XFails this test (for now).
>
> What's really weird, is that if I eliminate the 'svn up' between
> the merge and the commit, the test passes!

The update sets the copyfrom info (of working nodes) as described
in notes/api-errata/wc003.txt. Copyfrom info is inherited from the
parent by default. The child (e.g., /branch/J/M above) should have
its own copyfrom info only if it was copied from some other URL
or revision.

Unfortunately, the merge code violates this rule. It writes the
copyfrom info all over a copied-here tree.

Update triggered the error because it translates the whole wc_db to
entries and back again, according to the inheritance rule.

I hope we can fix the merge code to follow the same rule. It gets
a bit hairy, rewriting data of nodes in the tree, where the meaning
of the data depends on data in the parents, which we're rewriting
via the same callbacks. :-\ Calling svn_wc__db_scan_addition()
doesn't work, because the data is incomplete.

Steve

>
>>> ==============================================================================
>>> --- trunk/subversion/tests/cmdline/merge_tests.py Wed Sep 2
>>> 16:02:04 2009 (r39092)
>>> +++ trunk/subversion/tests/cmdline/merge_tests.py Wed Sep 2
>>> 16:35:11 2009 (r39093)
>>> @@ -16211,14 +16211,14 @@ def copy_then_replace_via_merge(sbox):
>>> main.run_svn(None, 'merge', url_A, branch)
>>>
>>> # Check status:
>>> - # sigma and K from r4 were deleted
>>> - # theta and L from r4 were replaced by r6
>>> - # omega and M were added (from r6)
>>> + # sigma and K are deleted (not copied!)
>>> + # theta and L are replaced (deleted then copied-here)
>>> + # omega and M are copied-here
>>> expected_status = wc.State(branch_J, {
>>> '' : Item(status='R ', copied='+', wc_rev='-'),
>>> - 'sigma' : Item(status='D ', copied='+', wc_rev='-'),
>>> - 'K' : Item(status='D ', copied='+', wc_rev='-'),
>>> - 'K/zeta' : Item(status='D ', copied='+', wc_rev='-'),
>>> + 'sigma' : Item(status='D ', wc_rev=6),
>>> + 'K' : Item(status='D ', wc_rev=6),
>>> + 'K/zeta' : Item(status='D ', wc_rev=6),
>>> 'theta' : Item(status=' ', copied='+', wc_rev='-'),
>>> 'L' : Item(status=' ', copied='+', wc_rev='-'),
>>> 'L/zeta' : Item(status=' ', copied='+', wc_rev='-'),
>>> @@ -16228,6 +16228,25 @@ def copy_then_replace_via_merge(sbox):
>>> })
>>> actions.run_and_verify_status(branch_J, expected_status)
>>>
>>> + # Update and commit, just to make sure the WC isn't busted.
>>> + main.run_svn(None, 'up', branch_J)
>>> + expected_output = wc.State(branch_J, {
>>> + '' : Item(verb='Replacing'),
>>> + })
>>> + expected_status = wc.State(branch_J, {
>>> + '' : Item(status=' ', wc_rev=7),
>>> + 'theta' : Item(status=' ', wc_rev=7),
>>> + 'L' : Item(status=' ', wc_rev=7),
>>> + 'L/zeta' : Item(status=' ', wc_rev=7),
>>> + 'omega' : Item(status=' ', wc_rev=7),
>>> + 'M' : Item(status=' ', wc_rev=7),
>>> + 'M/zeta' : Item(status=' ', wc_rev=7),
>>> + })
>>> + actions.run_and_verify_commit(branch_J,
>>> + expected_output,
>>> + expected_status,
>>> + None, branch_J)
>>> +
>>> #----------------------------------------------------------------------
>>>
>>> def merge_replace_causes_tree_conflict2(sbox):
>
>
>
>
> --
> Stephen Butler | Software Developer
> elego Software Solutions GmbH
> Gustav-Meyer-Allee 25 | 13355 Berlin | Germany
> fon: +49 30 2345 8696 | mobile: +49 163 25 45 015
> fax: +49 30 2345 8695 | http://www.elegosoft.com
> Geschäftsführer: Olaf Wagner | Sitz der Gesellschaft: Berlin
> Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194
>
> ------------------------------------------------------
> http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2390567
>

-- 
Stephen Butler | Software Developer
elego Software Solutions GmbH
Gustav-Meyer-Allee 25 | 13355 Berlin | Germany
fon: +49 30 2345 8696 | mobile: +49 163 25 45 015
fax: +49 30 2345 8695 | http://www.elegosoft.com
Geschäftsführer: Olaf Wagner | Sitz der Gesellschaft: Berlin
Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194
------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2390596
Received on 2009-09-03 14:12:35 CEST

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.