The svn behavior has changed with Subversion 1.7 (or at least 1.7.5)
concernant the interpretation of paths. If might be seen as a fix to
follow the description of peg revisions, and in particular the notion
of default peg revision, which is "BASE". But this is still poorly
specified.

For instance, how is path/to/file resolved? And path/to/file@rev,
where rev is a numeric value, BASE or HEAD?

The Subversion book just says: "Locate item in the revision identified
by PEG-REV [or OPERATIVE-REV]."

But how is the item identified, e.g. when symlinks are involved? And
what is the BASE revision (when this is the implied reg revision) in
a mixed-revision working copy? The specification should cover every
case of the example given below.

With usual commands, a path is resolved according to the local system
rules (under GNU/Linux, given by the path_resolution(7) man page).
But svn doesn't behave that way, and I think this is bad when a peg
revision isn't provided (i.e. when one just has a standard path).

This could seem a bit particular and complex, but after an upgrade
from 1.6.17 to 1.7.5, there is an annoying practical consequence:
symbolic links (whether they are versioned or not) to directories
in the working copy (except the root) are no longer followed.

Here's an example with various tests:

------------------------------------------------------------
#!/bin/sh

set -x

mkdir my-test-svn || exit
cd my-test-svn

svnadmin create svn
svn co file://`pwd`/svn wc
cd wc

mkdir -p dir1 dir2/dir2b
echo data1 > dir1/file
echo data2 > dir2/dir2b/file
svn add dir1 dir2
svn ci -m 'dir1 and dir2'

svn rm dir2/dir2b
ln -s ../dir1 dir2/dir2b
cat dir1/file
svn cat dir1/file
cat dir2/dir2b/file
svn cat dir2/dir2b/file

rm dir2/dir2b
svn ci dir2 -m 'dir2 update'
ln -s ../dir1 dir2/dir2b
cat dir2/dir2b/file
svn cat dir2/dir2b/file

echo new > dir1/file
svn ci dir1 -m 'new dir1/file'

cat dir1/file
svn cat dir1/file
cat dir2/dir2b/file
svn cat dir2/dir2b/file

for i in . dir1 dir2 dir1/file; do svn ls -v $i; done

ln -s dir1/file foo-rel
cat foo-rel
svn info foo-rel

ln -s `pwd`/dir1/file foo-abs
cat foo-abs
svn info foo-abs

ln -s `pwd` bar
svn info bar
svn cat bar/dir1/file

ls -l
------------------------------------------------------------

I've attached the output.

-- 
Vincent Lefèvre <vinc...@vinc17.net> - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)
+ mkdir my-test-svn
+ cd my-test-svn
+ svnadmin create svn
+ pwd
+ svn co file:///tmp/my-test-svn/svn wc
Checked out revision 0.
+ cd wc
+ mkdir -p dir1 dir2/dir2b
+ echo data1
+ echo data2
+ svn add dir1 dir2
A         dir1
A         dir1/file
A         dir2
A         dir2/dir2b
A         dir2/dir2b/file
+ svn ci -m dir1 and dir2
Adding         dir1
Adding         dir1/file
Adding         dir2
Adding         dir2/dir2b
Adding         dir2/dir2b/file
Transmitting file data ..
Committed revision 1.
+ svn rm dir2/dir2b
D         dir2/dir2b
D         dir2/dir2b/file
+ ln -s ../dir1 dir2/dir2b
+ cat dir1/file
data1
+ svn cat dir1/file
data1
+ cat dir2/dir2b/file
data1
+ svn cat dir2/dir2b/file
data2
+ rm dir2/dir2b
+ svn ci dir2 -m dir2 update
Deleting       dir2/dir2b

Committed revision 2.
+ ln -s ../dir1 dir2/dir2b
+ cat dir2/dir2b/file
data1
+ svn cat dir2/dir2b/file
svn: warning: W200005: '/tmp/my-test-svn/wc/dir2/dir2b/file' is not under 
version control
svn: E200009: Could not cat all targets because some targets are not versioned
svn: E200009: Illegal target for the requested operation
+ echo new
+ svn ci dir1 -m new dir1/file
Sending        dir1/file
Transmitting file data .
Committed revision 3.
+ cat dir1/file
new
+ svn cat dir1/file
new
+ cat dir2/dir2b/file
new
+ svn cat dir2/dir2b/file
svn: warning: W200005: '/tmp/my-test-svn/wc/dir2/dir2b/file' is not under 
version control
svn: E200009: Could not cat all targets because some targets are not versioned
svn: E200009: Illegal target for the requested operation
+ svn ls -v .
      0  ?                    Jun 21 14:04 ./
+ svn ls -v dir1
      1 vlefevre              Jun 21 14:04 ./
      1 vlefevre            6 Jun 21 14:04 file
+ svn ls -v dir2
      1 vlefevre              Jun 21 14:04 ./
      1 vlefevre              Jun 21 14:04 dir2b/
+ svn ls -v dir1/file
      3 vlefevre            4 Jun 21 14:04 file
+ ln -s dir1/file foo-rel
+ cat foo-rel
new
+ svn info foo-rel
svn: warning: W155010: The node '/tmp/my-test-svn/wc/foo-rel' was not found.

svn: E200009: Could not display info for all targets because some targets don't 
exist
+ pwd
+ ln -s /tmp/my-test-svn/wc/dir1/file foo-abs
+ cat foo-abs
new
+ svn info foo-abs
svn: warning: W155010: The node '/tmp/my-test-svn/wc/foo-abs' was not found.

svn: E200009: Could not display info for all targets because some targets don't 
exist
+ pwd
+ ln -s /tmp/my-test-svn/wc bar
+ svn info bar
Path: bar
Working Copy Root Path: /tmp/my-test-svn/wc/bar
URL: file:///tmp/my-test-svn/svn
Repository Root: file:///tmp/my-test-svn/svn
Repository UUID: 6c61d34b-f237-40c9-9099-c2f2377fe1c4
Revision: 0
Node Kind: directory
Schedule: normal
Last Changed Rev: 0
Last Changed Date: 2012-06-21 14:04:16 +0200 (Thu, 21 Jun 2012)

+ svn cat bar/dir1/file
new
+ ls -l
total 8
lrwxrwxrwx 1 vlefevre vlefevre   19 2012-06-21 14:04:20 bar -> 
/tmp/my-test-svn/wc
drwxr-xr-x 2 vlefevre vlefevre 4096 2012-06-21 14:04:17 dir1
drwxr-xr-x 2 vlefevre vlefevre 4096 2012-06-21 14:04:19 dir2
lrwxrwxrwx 1 vlefevre vlefevre   29 2012-06-21 14:04:20 foo-abs -> 
/tmp/my-test-svn/wc/dir1/file
lrwxrwxrwx 1 vlefevre vlefevre    9 2012-06-21 14:04:20 foo-rel -> dir1/file

Reply via email to