1 |
#!/usr/bin/perl |
2 |
|
3 |
# st2couch.pl |
4 |
# |
5 |
# 09/30/08 20:07:10 CEST Dobrica Pavlinusic <dpavlin@rot13.org> |
6 |
|
7 |
use warnings; |
8 |
use strict; |
9 |
|
10 |
my $path = shift @ARGV || '/home/dpavlin/private/svn/couchdb/'; |
11 |
my $repository = $path; |
12 |
$repository =~ s{/+$}{}; |
13 |
$repository =~ s{^.+/([^/]+)}{$1}; |
14 |
my $database = 'subversion'; |
15 |
|
16 |
warn "# $path -> $repository @ $database"; |
17 |
|
18 |
use SVN::Dump; |
19 |
use CouchDB::Client; |
20 |
use Data::Structure::Util qw(unbless); |
21 |
use Data::Dump qw/dump/; |
22 |
|
23 |
open(my $svn_fh, "svnadmin dump $path |") || die "can't open svnadmin dump $path: $!"; |
24 |
my $dump = SVN::Dump->new({ fh => $svn_fh }); |
25 |
|
26 |
my $c = CouchDB::Client->new(uri => 'http://localhost:5984/'); |
27 |
$c->testConnection or die "The server cannot be reached"; |
28 |
print "CouchDB version " . $c->serverInfo->{version} . "\n"; |
29 |
my $db = $c->newDB( $database ); |
30 |
#$db->delete if $c->dbExists( $database ); |
31 |
$db->create unless $c->dbExists( $database ); |
32 |
|
33 |
my $r = 0; |
34 |
|
35 |
while ( my $record = $dump->next_record() ) { |
36 |
warn "## record ",dump( $record ); |
37 |
my $_id = $repository . '-r' . $r++; |
38 |
my $doc = $db->newDoc( $_id ); |
39 |
my $data = { |
40 |
repository => $repository, |
41 |
type => $record->type, |
42 |
text => $record->get_text, |
43 |
}; |
44 |
|
45 |
$data->{$_} = $record->{headers_block}->{$_} |
46 |
foreach ( keys %{ $record->{headers_block} } ); |
47 |
|
48 |
warn "## data ",dump( $data ); |
49 |
$doc->{data} = $data; |
50 |
$doc->create; |
51 |
warn "<< $record\n"; |
52 |
} |