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 <[email protected]> - 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