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