On 18.07.2012 12:25, Bert Huijben wrote:
>
>> -----Original Message-----
>> From: Branko Čibej [mailto:br...@wandisco.com]
>> Sent: woensdag 18 juli 2012 11:50
>> To: dev@subversion.apache.org
>> Subject: Re: svn commit: r1362739 -
>> /subversion/trunk/subversion/tests/cmdline/basic_tests.py
>>
>> On 18.07.2012 10:51, Philip Martin wrote:
>>> "Bert Huijben" <b...@qqmail.nl> writes:
>>>
>>>> In 1.6 all these cases worked because we found a .svn directory with
>>>> metadata in the immediate parent (=the symlinked directory).
>>>>
>>>> I'm not sure if we really want to support all these corner cases
>>>> (including those where this symlink is versioned itself). We never
>>>> intentionally broke this feature.
>>> The 1.6 behaviour could be considered a bug.
>> That's a bit too strong, IMO. The fact is that, up to 1.6, every
>> directory in the working copy was effectively a working copy root, and
>> we even had code that specifically made it possible to acces a WC root
>> through a symbolic link (the main use case was wc-root-on-subst-drive on
>> Windows). So it's reasonable to interpret this as supported behaviour,
>> even if we never intended it.
>>
>>>   Following unversioned
>>> symlinks to the root of a working copy is probably simple enough, but
>>> following unversioned symlinks inside a working copy looks far harder.
>>>
>>> svnadmin create repo
>>> svn import -mm repo/format file://`pwd`/repo/A/f
>>> svn co file://`pwd`/repo wc
>>> ln -s f wc/A/g1
>>> ln -s A wc/B1
>>> svn add wc/A/g1 wc/B1
>>> svn ci -mm wc
>>> ln -s f wc/A/g2
>>> ln -s A wc/B2
>>>
>>> wc/A/f is a versioned file; the content can be accessed through a
>>> variety of paths containing symlinks: wc/A/g1, wc/A/g2, wc/B1/f,
>>> wc/B2/f, wc/B1/g1, wc/B1/g2, wc/B2/g1 and wc/B2/g2.  Some of the
>>> symlinks are versioned and some are unversioned.
>>>
>>> Now consider:
>>>
>>> echo new-f > wc/A/f
>>> svn st wc/A/g1
>>> svn ci -mm wc/A/g1
>>>
>>> wc/A/g1 is versioned so status shows the status of wc/A/g1 not wc/A/f
>>> and commit does nothing unless wc/A/g1 is changed.  That behaviour looks
>>> correct to me.
>> Yes. This is the tricky part. IMO the only rational thing to do is to
>> never try to resolve symlinks if the original target resolves to a known
>> node. So in the commit case the user might be surprised by the different
>> behaviour if the symlink is versioned or not, but at least the
>> difference can be explained.
>>
>>> What about the unversioned wc/A/g2?  The new 4193 tests seem to
>> assume
>>> that Subversion operations should follow this symlink through to wc/A/f.
>>> Is it sensible for operations on an unversioned symlink to affect the
>>> target while the same operations on a versioned symlink affect the
>>> source?  That strikes me as very confusing.
>>>
>>> How should wc/B2/g1 behave?  wc/B2 is unversioned but wc/B2/g1 points
>> to
>>> wc/A/g1 which is versioned.  Do operations on wc/B2/g1 affect wc/A/f?
>> I think the only thing we could do is to resolve symlinks in explicit
>> targets iff the original path does not resolve to a known versioned
>> node. That would isolate the extra work in the error case and would not
>> change the behaviour of cases that currently work, nor would it change
>> the way recursive operations work.
>>
>> I also wouldn't worry about the paths in notification callbacks but
>> would just use the resolved paths everywhere; e.g., if "svn ci x/f" gets
>> translated to "svn ci a/f", I wouldn't try to show x/f in the commit
>> notification.
> That is nice behavior in theory, but doesn't really work in many use cases. 
> Scripted users of the client library (or 'svn') expect to see the paths they 
> passed in the results they get. E.g. If you perform a query and expect the 
> result in a hashtable, you don't want the key you need to fetch the item to 
> change.
>
> Another problem is that you can have one path in several formats in the 
> target list of an operation, while we only filter duplicates (like in commit)
>
> libsvn_wc assumes that all paths are unique in their canonical absolute 
> format. Converting from one absolute path to another in the lowest layer 
> breaks all assumptions the higher layers make about the library behavior. 
> Storing multiple wcroots (after resolving symlinks) doesn't break things, but 
> when we have the (wcroot, local_relpath) pair things will break.

Good point, I hadn't considered that. So this is looking more and more
like a "wontfix".

> The other solution, trying to resolve when parsing the arguments in 'svn' 
> won't work because we at that point don't know what the arguments are used 
> for yet.

Yes, that's clear; we'd have to at least look at what the arguments
resolve to, and that would entail extra up-front work that I wouldn't
want to see in the code.

-- 
Certified & Supported Apache Subversion Downloads:
http://www.wandisco.com/subversion/download

Reply via email to