Wed, 01 Feb 2006
Recovering SVN bdb Repositories
I looked at a few of my older SVK repositories and found that debian had upgraded bdb under me and so the repositories couldn't be read. The error message was something like:
Berkeley DB error: Berkeley DB error for filesystem /home/pjcj/g/svk/testr/db while opening environment: DB_VERSION_MISMATCH: Database environment version mismatch: bdb: Program version 4.3 doesn't match environment version
The solution was to find a copy of svnadmin which was statically linked to the older library and use that to help upgrade the repository. While I was there, I moved the remainder of my repositories to fsfs.
I found such an svnadmin binary at uncc.org after which the sequence of commands is:
$ /path/to/static/svnadmin recover repository $ /path/to/static/svnadmin dump repository > repository.dmp
At this point you could upgrade your bdb repository if you wanted to. I just blew it away and created a new fsfs repository. (Well, I was a little more careful.)
$ mv repository repository.bdb $ svnadmin create repository $ svnadmin load repository < repository.dmp
And then everything worked again.
[/revision_control] permanent link
Here's how I set up my base utilities on a new machine. It's not optimal by a long shot, but it's pretty easy.
% aptitude install svk $ cd ~ $ svk depot --init $ svk cp http://svk.server/svn/base $ rm -r base $ cd g $ svk co //base/trunk base $ cd .. $ ln -s g/base/* g/base/.* .
[/revision_control] permanent link
It's really about time I made my SVK repositories public, and as a first step towards that I decided to install SVN::Web. I'm running debian, and since the Perl SVN bindings are such a pain to install I am using the system perl to run SVK. This means that I also need to use the system perl to run SVN::Web.
The first thing I did was to install debian's mod_perl. That wasn't too hard:
# aptitude install libapache2-mod-perl2
and everything still seemed to work. Now the problem is that SVN::Web isn't packaged for debian, so the installation is going to need to be an unholy mix of debian packages and CPAN modules. I decided to try to install as many of the debian packages as I could and install the remainder from CPAN. So, the debian packages I installed were:
# aptitude install libtemplate-perl libpod-coverage-perl \ libtest-differences-perl libmodule-build-perl libtext-diff-perl \ libxml-rss-perl libexception-class-perl libtemplate-perl-doc \ libapache2-request-perl libnumber-format-perl \ libtemplate-plugin-clickable-perl libemail-find-perl
They might not all be strictly necessary.
Then I needed to install some modules from CPAN:
# perl -MCPAN -e shell cpan> install SVN::Web ... cpan> install Exception::Class ... cpan> install Devel::StackTrace ... cpan> install Template::Plugin::Number::Format ... cpan> install Text::Diff::HTML ... cpan> install Template::Plugin::Clickable::Email ...
I had to install Exception::Class from CPAN since the debian version was too old. Without Text::Diff::HTML the process would just sit there eating all the CPU when you asked for HTML diffs. Without Template::Plugin::Clickable::Email the error log filled up saying it wasn't there.
Then I added to /etc/apache2/sites-available/default :
<Directory /var/www/svnweb> AllowOverride None Options None SetHandler perl-script PerlHandler SVN::Web </Directory> <Directory /var/www/svnweb/css> SetHandler default-handler </Directory>
Then I had to hack on SVN::Web.pm itself to make it work with Apache2. The diff below seems to work for me, though it might well be either overkill or underkill.
--- /usr/local/share/perl/5.8.7/SVN/Web.pm.org 2006-01-30 20:37:46.000000000 +0100 +++ /usr/local/share/perl/5.8.7/SVN/Web.pm 2006-01-30 22:50:42.000000000 +0100 @@ -861,15 +861,17 @@ sub handler { eval " - use Apache::RequestRec (); - use Apache::RequestUtil (); - use Apache::RequestIO (); - use Apache::Response (); - use Apache::Const; - use Apache::Constants; - use Apache::Request; + use Apache2::RequestRec (); + use Apache2::RequestUtil (); + use Apache2::RequestIO (); + use Apache2::Response (); + use Apache2::Const; + use Apache2::Const; + use Apache2::Request; "; + die $@ if $@; + my $r = shift; eval "$r = Apache::Request->new($r)"; my $base = $r->location; @@ -921,7 +923,7 @@ } mod_perl_output($cfg, $html); - return &Apache::OK; + return &Apache2::Const::OK; } =head1 SEE ALSO
So I battled SVN::Web and debian and I prevailed! You can see the results at svnweb.