GCC's r120621 seems to have triggered a bug in svn_repos_replay.
repos_replay has the feature of letting you replay a revision which
includes copies from places that you can't read. This can occur
because the RA session is rooted at, say, /trunk, and the copy comes
from outside of /trunk, or because authz rules prevent you from
reading the place where it is copied from. It makes it look like the
file or directory structure was freshly added by using a series of
add_directory/add_file calls without copy_froms. This is implemented
in the add_subdir function in libsvn_repos/replay.c.
add_subdir is originally called from path_driver_cb_func, which is
called by svn_delta_path_driver, which makes sure that we don't break
delta editor ordering rules. Except... if add_subdir decides to make
a bunch of extra calls, we can end up breaking the rules!
In the following reproduction recipe, we create at r1 this repo:
there/A/B
here/
At r2 we copy there/A into here/, and also modify a property on the
new here/A/B.
The reproduction script triggers the bug via the perl bindings to RA
replay, by replaying r2 against here/ only. It shouldn't be hard to
write a little C program that does the same thing. Alternatively,
after creating the repo, make an authz that prevents there/ from being
read, run svnserve, and run svnsync against the svnserved repo.
(svnsync doesn't support syncing from anywhere but the root of a
repository, so the "syncing too low" case can't be tested with
svnsync.)
This is the output that I get from foo.pl:
SVK::Editor=HASH(0x18f476c) set_target_revision 2 at
/opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level/SVN/Ra.pm line 85
SVK::Editor=HASH(0x18f476c) open_root
-1,_p_apr_pool_t=SCALAR(0x18f4b2c) at
/opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level/SVN/Ra.pm line 85
SVK::Editor=HASH(0x18f476c) open_directory
here,,-1,_p_apr_pool_t=SCALAR(0x18f4c1c) at
/opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level/SVN/Ra.pm line 85
SVK::Editor=HASH(0x18f476c) add_directory
here/A,,,-1,_p_apr_pool_t=SCALAR(0x18f4c1c) at
/opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level/SVN/Ra.pm line 85
SVK::Editor=HASH(0x18f476c) add_directory
here/A/B,,,-1,_p_apr_pool_t=SCALAR(0x18f4c1c) at
/opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level/SVN/Ra.pm line 85
SVK::Editor=HASH(0x18f476c) close_directory
,_p_apr_pool_t=SCALAR(0x18f4a30) at
/opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level/SVN/Ra.pm line 85
SVK::Editor=HASH(0x18f476c) open_directory
here/A/B,,-1,_p_apr_pool_t=SCALAR(0x18f4b2c) at
/opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level/SVN/Ra.pm line 85
Filesystem has no item: File not found: revision 1, path '/here/A/B'
at foo.pl line 3
ie, it calls close_directory on A/B and then tries to open it again,
which is not good. Or at least I think that's the problem.
I'm not sure that I'll have much more time to track this one down...
--dave
#!/bin/bash
S=svn
SA=svnadmin
rm -rf r w foo.pl
$SA create r
U=file://`pwd`/r
$S co $U w
cd w
$S mkdir here there
$S mkdir there/A
$S mkdir there/A/B
$S ci -m "original structure"
$S cp there/A here/
$S ps foo bar here/A/B
$S ci -m "copy with mod from there to here"
cd ..
echo 'use SVN::Core; use SVN::Ra; use SVK::Editor;' >foo.pl
echo 'my $ra = SVN::Ra->new("file://'`pwd`'/r/here");' >>foo.pl
echo '$ra->replay(2, 0, 1, SVK::Editor->new({_debug=>1}));' >>foo.pl
perl foo.pl
--
David Glasser | glasser_at_mit.edu | http://www.davidglasser.net/
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Thu Jan 11 20:42:08 2007