You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Neels Hofmeyr <ne...@elego.de> on 2008/09/01 23:34:28 UTC

Re: tree-conflicts: please review to determine desired behaviour in detail

Hi folks,

I am delighted to read these great reviews!

Let me give a few comments:



Julian Foad wrote:
> On Mon, 2008-09-01 at 17:36 +0200, Stephen Butler wrote:
>>>> Following notes/tree-conflicts/detection.txt, we want 'svn update' to skip
>>>> any directory scheduled for deletion, and to instead record the tree
>>>> conflict in the parent directory.
>>> Also, similarly, I claim we want 'svn update' to skip any FILE scheduled
>>> for deletion, and to instead record the tree conflict in the parent
>>> directory. Yes?

Yes, exactly, as you have agreed upon. Same for the other similar cases.


>> In the meantime, I've been working through more tests in Neels' list.
>> Skipping updates of tree-conflicted files makes all of the update tests
>> simpler: the expected output is the same for all.
> 
> That's good.

Very much so.

> Is the attached patch for "update_tests.py" what you expect? (This patch
> doesn't make the change to expect the victim to be reported, but just
> the other changes we talked about in this thread so far.)

Yes, that looks very good, except that you need to copy() a tree before
tweaking it. Otherwise, the global is tweaked, leaving a smudge behind in
subsequent use. I've attached another diff.


Great, this also gives me a directive to follow for the other cases. I'll
give a shot at updating them myself...

~Neels

-- 
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696  mobile: +49 177 2345869  fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194

Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Neels Hofmeyr <ne...@elego.de>.

Julian Foad wrote:
> Maybe we could rename "deep_trees_after_leaf_edit" to
> "deep_trees_disk_after_leaf_edit" and introduce also
> "deep_trees_status_after_leaf_edit"?

I like that.
+1

~Neels

-- 
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696  mobile: +49 177 2345869  fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194


Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Julian Foad <ju...@btopenworld.com>.
On Thu, 2008-09-04 at 03:19 +0200, Neels Hofmeyr wrote:
> Hi,
> 
> I think there's still a problem with the new expected results of
> tree-conflicts-on-update tests, in 2_1 and 2_2, where there are local changes.
> 
> 
> 2_1)
> (tree_conflicts_on_update_2_1)
>   Local leaf edit, incoming tree delete.
> 
>   expected_output = wc.State('', {
>     'F'                 : Item(status='C '),
>     'D'                 : Item(status='C '),
>     'DF'                : Item(status='C '),
>     'DD'                : Item(status='C '),
>     'DDF'               : Item(status='C '),
>     'DDD'               : Item(status='C '),
>     })
> 
>   expected_disk = state_after_leaf_edit
> 
>   expected_status = state_after_leaf_edit.copy()
>   expected_status.add({ '' : Item(status='  ') }) # also set root's attributes
>   expected_status.tweak(wc_rev=3)
>   expected_status.tweak('F', 'D', 'DF', 'DD', 'DDF', 'DDD', status='C ')
> 
> 
> The output is fine, so is the disk.
> 
> But the status should also reflect the local changes, right?

Yes, indeed.

  state_after_leaf_edit = svntest.actions.deep_trees_after_leaf_edit

I naively thought the "state_after_leaf_edit.copy()" would provide a
result suitable for use both as a disk state and as an "svn status"
state after local changes. I see now that it only provides the disk
state.

Although your patch doesn't make the tests much longer, it would be nice
to retrieve the expected status from the test suite core (like
"deep_trees_after_leaf_edit" does for the disk state) so that it is only
written in one place.

Maybe we could rename "deep_trees_after_leaf_edit" to
"deep_trees_disk_after_leaf_edit" and introduce also
"deep_trees_status_after_leaf_edit"?

Anyway, your patch is enough for now.

> [[[
> Further fix two tree-conflicts tests.
> 
> * subversion/tests/cmdline/update_tests.py (tree_conflicts_on_update_2_1,
>    tree_conflicts_on_update_2_2): Adjust expected status to reflect the
>     local changes.
> ]]]

Thanks. Committed in r32909.

- Julian



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Neels Hofmeyr <ne...@elego.de>.
Hi,

I think there's still a problem with the new expected results of
tree-conflicts-on-update tests, in 2_1 and 2_2, where there are local changes.


2_1)
(tree_conflicts_on_update_2_1)
  Local leaf edit, incoming tree delete.

  expected_output = wc.State('', {
    'F'                 : Item(status='C '),
    'D'                 : Item(status='C '),
    'DF'                : Item(status='C '),
    'DD'                : Item(status='C '),
    'DDF'               : Item(status='C '),
    'DDD'               : Item(status='C '),
    })

  expected_disk = state_after_leaf_edit

  expected_status = state_after_leaf_edit.copy()
  expected_status.add({ '' : Item(status='  ') }) # also set root's attributes
  expected_status.tweak(wc_rev=3)
  expected_status.tweak('F', 'D', 'DF', 'DD', 'DDF', 'DDD', status='C ')


The output is fine, so is the disk.

But the status should also reflect the local changes, right?
The status after a leaf edit without conflicts is:

  ''                  : Item(status='  ', wc_rev='2'),
  'F'                 : Item(status='  ', wc_rev='2'),
  'F/alpha'           : Item(status='M ', wc_rev='2'),
  'DD'                : Item(status='  ', wc_rev='2'),
  'DD/D1'             : Item(status='  ', wc_rev='2'),
  'DD/D1/D2'          : Item(status='  ', wc_rev='2'),
  'DD/D1/D2/epsilon'  : Item(status='A ', wc_rev='0'),
  'DF'                : Item(status='  ', wc_rev='2'),
  'DF/D1'             : Item(status='  ', wc_rev='2'),
  'DF/D1/beta'        : Item(status='M ', wc_rev='2'),
  'DDD'               : Item(status='  ', wc_rev='2'),
  'DDD/D1'            : Item(status='  ', wc_rev='2'),
  'DDD/D1/D2'         : Item(status='  ', wc_rev='2'),
  'DDD/D1/D2/D3'      : Item(status='  ', wc_rev='2'),
  'DDD/D1/D2/D3/zeta' : Item(status='A ', wc_rev='0'),
  'DDF'               : Item(status='  ', wc_rev='2'),
  'DDF/D1'            : Item(status='  ', wc_rev='2'),
  'DDF/D1/D2'         : Item(status='  ', wc_rev='2'),
  'DDF/D1/D2/gamma'   : Item(status='M ', wc_rev='2'),
  'D'                 : Item(status='  ', wc_rev='2'),
  'D/D1'              : Item(status='  ', wc_rev='2'),
  'D/D1/delta'        : Item(status='A ', wc_rev='0'),


2_2)
(tree_conflicts_on_update_2_2)
Local leaf delete, incoming tree delete.

Same as above, and the status tree after a leaf delete without conflicts is:

  ''                  : Item(status='  ', wc_rev='2'),
  'F'                 : Item(status='  ', wc_rev='2'),
  'F/alpha'           : Item(status='D ', wc_rev='2'),
  'DD'                : Item(status='  ', wc_rev='2'),
  'DD/D1'             : Item(status='  ', wc_rev='2'),
  'DD/D1/D2'          : Item(status='D ', wc_rev='2'),
  'DF'                : Item(status='  ', wc_rev='2'),
  'DF/D1'             : Item(status='  ', wc_rev='2'),
  'DF/D1/beta'        : Item(status='D ', wc_rev='2'),
  'DDD'               : Item(status='  ', wc_rev='2'),
  'DDD/D1'            : Item(status='  ', wc_rev='2'),
  'DDD/D1/D2'         : Item(status='  ', wc_rev='2'),
  'DDD/D1/D2/D3'      : Item(status='D ', wc_rev='2'),
  'DDF'               : Item(status='  ', wc_rev='2'),
  'DDF/D1'            : Item(status='  ', wc_rev='2'),
  'DDF/D1/D2'         : Item(status='  ', wc_rev='2'),
  'DDF/D1/D2/gamma'   : Item(status='D ', wc_rev='2'),
  'D'                 : Item(status='  ', wc_rev='2'),
  'D/D1'              : Item(status='D ', wc_rev='2'),


Thus, I come up with this patch:

[[[
Further fix two tree-conflicts tests.

* subversion/tests/cmdline/update_tests.py (tree_conflicts_on_update_2_1,
   tree_conflicts_on_update_2_2): Adjust expected status to reflect the
    local changes.
]]]


~Neels


-- 
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696  mobile: +49 177 2345869  fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194


Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Neels Hofmeyr <ne...@elego.de>.
...and here the missing attachment.

Neels Hofmeyr wrote:
> 
> Julian Foad wrote:
>> On Tue, 2008-09-02 at 04:24 +0200, Neels Hofmeyr wrote:
>>>  :/
>>>
>>> I found yet another small error in the patch:
>>> It should say status='C ' instead of 'C'. I had fixed one of them, but
>>> overlooked the four others.
>> Thanks, Neels. I have committed this version of your patch in r32846.
>>
>>
>> I didn't apply this bit to the branch:
>>
>>> * subversion/tests/cmdline/svntest/wc.py (tweak): Wrap an error message in
>>>     square brackets so that it is printed as string and not as an array with
>>>     character items.
> 
> thought so :)
> I tried to sneak in a cosmetic change through the back door. ;)
> 
> 
>> because it's unrelated to tree conflicts. I looked at applying it on the
>> trunk, but I couldn't reproduce a problem with it. I see no difference:
> 
> 
> Using the attached testing-patch, I get this output:
> 
> [[[
> $ ./update_tests.py 3
> UNEXPECTED EXCEPTION:
> [...]
> KeyError: ('P', 'a', 't', 'h', ' ', "'", 'A', '/', 'D', '/', 'f', 'o', 'o',
> "'", ' ', 'n', 'o', 't', ' ', 'p', 'r', 'e', 's', 'e', 'n', 't', ' ', 'i',
> 'n', ' ', 'W', 'C', ' ', 's', 't', 'a', 't', 'e', ' ', 'd', 'e', 's', 'c',
> 'r', 'i', 'p', 't', 'o', 'r')
> FAIL:  update_tests.py 3: update should not munge adds or replaces
> ]]]
> 
> Adding the square brackets, this becomes
> 
> [[[
> $ ./update_tests.py 3
> UNEXPECTED EXCEPTION:
> [...]
> KeyError: "Path 'A/D/foo' not present in WC state descriptor"
> FAIL:  update_tests.py 3: update should not munge adds or replaces
> ]]]
> 
> , with quotes around it, as I didn't notice before. I didn't realise it
> might be related to the python version, either.
> 
> $ python -V
> Python 2.5.2
> 
> 
> Thanks for committing the other stuff!
> 
> ~Neels
> 
> 
> 
>>>     e.args = "Path '%s' not present in WC state descriptor" % path
>>> KeyError: Path 'A/mu2' not present in WC state descriptor
>>>     e.args = ["Path '%s' not present in WC state descriptor" % path]
>>> KeyError: Path 'A/mu2' not present in WC state descriptor
>> Maybe it depends on a specific version of Python. My version is Python
>> 2.4.2. What did you see?
>>
>> If interested, see
>> <http://mail.python.org/pipermail/python-dev/2002-September/028547.html>
>> in which Guido van Rossum says args[0] should be the actual key that
>> failed, and <http://bugs.python.org/issue2651> which claims the present
>> behaviour of KeyError is not documented an proposes a change.
>>
>> If this is just about having quotation marks around the string, and
>> behaves differently in different versions of Python, perhaps we can just
>> forget about it :-)
>>
>> - Julian
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
>> For additional commands, e-mail: dev-help@subversion.tigris.org
>>
> 

-- 
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696  mobile: +49 177 2345869  fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194

Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Julian Foad <ju...@btopenworld.com>.
On Thu, 2008-09-04 at 01:57 +0200, Neels Hofmeyr wrote:
> Julian Foad wrote:
> > I didn't apply this bit to the branch:
> > 
> >> * subversion/tests/cmdline/svntest/wc.py (tweak): Wrap an error message in
> >>     square brackets so that it is printed as string and not as an array with
> >>     character items.
> 
> thought so :)
> I tried to sneak in a cosmetic change through the back door. ;)

> > because it's unrelated to tree conflicts. I looked at applying it on the
> > trunk, but I couldn't reproduce a problem with it. I see no difference:

> Using the attached testing-patch, I get this output:
> 
> [[[
> $ ./update_tests.py 3
> UNEXPECTED EXCEPTION:
> [...]
> KeyError: ('P', 'a', 't', 'h', ' ', "'", 'A', '/', 'D', '/', 'f', 'o', 'o',
> "'", ' ', 'n', 'o', 't', ' ', 'p', 'r', 'e', 's', 'e', 'n', 't', ' ', 'i',
> 'n', ' ', 'W', 'C', ' ', 's', 't', 'a', 't', 'e', ' ', 'd', 'e', 's', 'c',
> 'r', 'i', 'p', 't', 'o', 'r')
> FAIL:  update_tests.py 3: update should not munge adds or replaces
> ]]]
> 
> Adding the square brackets, this becomes
> 
> [[[
> $ ./update_tests.py 3
> UNEXPECTED EXCEPTION:
> [...]
> KeyError: "Path 'A/D/foo' not present in WC state descriptor"
> FAIL:  update_tests.py 3: update should not munge adds or replaces
> ]]]
> 
> , with quotes around it, as I didn't notice before. I didn't realise it
> might be related to the python version, either.
> 
> $ python -V
> Python 2.5.2

OK, you've convinced me. Committed in r32908.

- Julian



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Neels Hofmeyr <ne...@elego.de>.

Julian Foad wrote:
> On Tue, 2008-09-02 at 04:24 +0200, Neels Hofmeyr wrote:
>>  :/
>>
>> I found yet another small error in the patch:
>> It should say status='C ' instead of 'C'. I had fixed one of them, but
>> overlooked the four others.
> 
> Thanks, Neels. I have committed this version of your patch in r32846.
> 
> 
> I didn't apply this bit to the branch:
> 
>> * subversion/tests/cmdline/svntest/wc.py (tweak): Wrap an error message in
>>     square brackets so that it is printed as string and not as an array with
>>     character items.

thought so :)
I tried to sneak in a cosmetic change through the back door. ;)


> because it's unrelated to tree conflicts. I looked at applying it on the
> trunk, but I couldn't reproduce a problem with it. I see no difference:


Using the attached testing-patch, I get this output:

[[[
$ ./update_tests.py 3
UNEXPECTED EXCEPTION:
[...]
KeyError: ('P', 'a', 't', 'h', ' ', "'", 'A', '/', 'D', '/', 'f', 'o', 'o',
"'", ' ', 'n', 'o', 't', ' ', 'p', 'r', 'e', 's', 'e', 'n', 't', ' ', 'i',
'n', ' ', 'W', 'C', ' ', 's', 't', 'a', 't', 'e', ' ', 'd', 'e', 's', 'c',
'r', 'i', 'p', 't', 'o', 'r')
FAIL:  update_tests.py 3: update should not munge adds or replaces
]]]

Adding the square brackets, this becomes

[[[
$ ./update_tests.py 3
UNEXPECTED EXCEPTION:
[...]
KeyError: "Path 'A/D/foo' not present in WC state descriptor"
FAIL:  update_tests.py 3: update should not munge adds or replaces
]]]

, with quotes around it, as I didn't notice before. I didn't realise it
might be related to the python version, either.

$ python -V
Python 2.5.2


Thanks for committing the other stuff!

~Neels



> 
>>     e.args = "Path '%s' not present in WC state descriptor" % path
> 
>> KeyError: Path 'A/mu2' not present in WC state descriptor
> 
>>     e.args = ["Path '%s' not present in WC state descriptor" % path]
> 
>> KeyError: Path 'A/mu2' not present in WC state descriptor
> 
> Maybe it depends on a specific version of Python. My version is Python
> 2.4.2. What did you see?
> 
> If interested, see
> <http://mail.python.org/pipermail/python-dev/2002-September/028547.html>
> in which Guido van Rossum says args[0] should be the actual key that
> failed, and <http://bugs.python.org/issue2651> which claims the present
> behaviour of KeyError is not documented an proposes a change.
> 
> If this is just about having quotation marks around the string, and
> behaves differently in different versions of Python, perhaps we can just
> forget about it :-)
> 
> - Julian
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
> For additional commands, e-mail: dev-help@subversion.tigris.org
> 

-- 
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696  mobile: +49 177 2345869  fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194


Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Julian Foad <ju...@btopenworld.com>.
On Tue, 2008-09-02 at 04:24 +0200, Neels Hofmeyr wrote:
>  :/
> 
> I found yet another small error in the patch:
> It should say status='C ' instead of 'C'. I had fixed one of them, but
> overlooked the four others.

Thanks, Neels. I have committed this version of your patch in r32846.


I didn't apply this bit to the branch:

> * subversion/tests/cmdline/svntest/wc.py (tweak): Wrap an error message in
>     square brackets so that it is printed as string and not as an array with
>     character items.

because it's unrelated to tree conflicts. I looked at applying it on the
trunk, but I couldn't reproduce a problem with it. I see no difference:

>     e.args = "Path '%s' not present in WC state descriptor" % path

> KeyError: Path 'A/mu2' not present in WC state descriptor

>     e.args = ["Path '%s' not present in WC state descriptor" % path]

> KeyError: Path 'A/mu2' not present in WC state descriptor

Maybe it depends on a specific version of Python. My version is Python
2.4.2. What did you see?

If interested, see
<http://mail.python.org/pipermail/python-dev/2002-September/028547.html>
in which Guido van Rossum says args[0] should be the actual key that
failed, and <http://bugs.python.org/issue2651> which claims the present
behaviour of KeyError is not documented an proposes a change.

If this is just about having quotation marks around the string, and
behaves differently in different versions of Python, perhaps we can just
forget about it :-)

- Julian



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Neels Hofmeyr <ne...@elego.de>.
 :/

I found yet another small error in the patch:
It should say status='C ' instead of 'C'. I had fixed one of them, but
overlooked the four others.


Neels Hofmeyr wrote:
> 
> Neels Hofmeyr wrote:
>>> Is the attached patch for "update_tests.py" what you expect? (This patch
>>> doesn't make the change to expect the victim to be reported, but just
>>> the other changes we talked about in this thread so far.)
>> Yes, that looks very good, except that you need to copy() a tree before
>> tweaking it. Otherwise, the global is tweaked, leaving a smudge behind in
>> subsequent use. I've attached another diff.
> 
> Actually, this newer version of the patch makes it worthwhile -- I have
> tested it and resolved some minor trouble.
> 
> Only for STATUS trees, one also needs to add attributes to the
> (non-existent) root node. This is done by adding an item with a zero length
> path ('').
> 

(same log message)
[[[
Change tree-conflicts tests in update_tests.py so that they pass the
behaviour agreed upon on the dev mailing list, and XFail() them. Also apply
minor fixes.

Patch by: julianfoad
          Neels Hofmeyr <ne...@elego.de>

* subversion/tests/cmdline/update_tests.py (tree_conflicts_on_update_1_1,
   tree_conflicts_on_update_1_2, tree_conflicts_on_update_2_1,
   tree_conflicts_on_update_2_2, tree_conflicts_on_update_3):
    Adjust the expected behaviour for these tests. Change them to XFail in
    the tests list.

* subversion/tests/cmdline/svntest/actions.py (deep_trees_virginal_state,
   deep_trees_after_leaf_edit, deep_trees_after_leaf_del): Expand these
    structures to contain a separate node item for each parent directory,
    because this is needed for tweak() to work.

* subversion/tests/cmdline/svntest/wc.py (tweak): Wrap an error message in
    square brackets so that it is printed as string and not as an array with
    character items.
]]]


-- 
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696  mobile: +49 177 2345869  fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194

Re: tree-conflicts: please review to determine desired behaviour in detail

Posted by Neels Hofmeyr <ne...@elego.de>.

Neels Hofmeyr wrote:
>> Is the attached patch for "update_tests.py" what you expect? (This patch
>> doesn't make the change to expect the victim to be reported, but just
>> the other changes we talked about in this thread so far.)
> 
> Yes, that looks very good, except that you need to copy() a tree before
> tweaking it. Otherwise, the global is tweaked, leaving a smudge behind in
> subsequent use. I've attached another diff.

Actually, this newer version of the patch makes it worthwhile -- I have
tested it and resolved some minor trouble.

Only for STATUS trees, one also needs to add attributes to the
(non-existent) root node. This is done by adding an item with a zero length
path ('').



[[[
Change tree-conflicts tests in update_tests.py so that they pass the
behaviour agreed upon on the dev mailing list, and XFail() them. Also apply
minor fixes.

Patch by: julianfoad
          Neels Hofmeyr <ne...@elego.de>

* subversion/tests/cmdline/update_tests.py (tree_conflicts_on_update_1_1,
   tree_conflicts_on_update_1_2, tree_conflicts_on_update_2_1,
   tree_conflicts_on_update_2_2, tree_conflicts_on_update_3):
    Adjust the expected behaviour for these tests. Change them to XFail in
    the tests list.

* subversion/tests/cmdline/svntest/actions.py (deep_trees_virginal_state,
   deep_trees_after_leaf_edit, deep_trees_after_leaf_del): Expand these
    structures to contain a separate node item for each parent directory,
    because this is needed for tweak() to work.

* subversion/tests/cmdline/svntest/wc.py (tweak): Wrap an error message in
    square brackets so that it is printed as string and not as an array with
    character items.
]]]
-- 
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696  mobile: +49 177 2345869  fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194