/[scripts]/trunk/svndump-move.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/svndump-move.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 52 - (hide annotations)
Wed Aug 22 21:40:56 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 3636 byte(s)
skip files which have empty line in to list (doesn't really work for all cases...)

1 dpavlin 47 #!/usr/bin/perl
2     use strict;
3     use warnings;
4     use SVN::Dump;
5 dpavlin 48 use Shell qw/svnadmin cp find svn rm/;
6 dpavlin 47 use Cwd qw/abs_path/;
7 dpavlin 50 use Data::Dump qw/dump/;
8 dpavlin 47
9     my $base = shift @ARGV;
10     $base ||= 'svn/';
11    
12 dpavlin 50 my $checkout = "$base/checkout";
13    
14     my $to_dump = 0;
15    
16 dpavlin 47 die "usage: $0 temp-base-directory (default: $base)\n" unless ( -e $base );
17    
18     my $mode = 'move';
19 dpavlin 50 my ( $from, $to ) = ( "$base/from", "$base/to/" );
20     my ( $from_list, $to_list ) = ( "$base/from.lst", "$base/to.lst" );
21 dpavlin 47
22 dpavlin 50 sub rep_url {
23     return 'file:///' . abs_path(shift);
24     }
25    
26 dpavlin 47 sub create_list {
27     my ( $dir, $path ) = @_;
28 dpavlin 50 my $list = svn('ls', '-R', rep_url($from));
29 dpavlin 47 open(my $fh, '>', $path) || die "can't create $path: $!";
30     print $fh $list;
31     close($fh);
32     if ( ! -s $path ) {
33     unlink($path);
34     die "ABORT: created zero size $path\n";
35     }
36     warn "created: $path ", -s $path, "bytes\n";
37     }
38    
39     die "please copy repository on which to perfrom operation to $from\n" if ( ! -e $from );
40    
41 dpavlin 50 warn "##> collect all paths from repository $from\n";
42     create_list( $from, $from_list );
43 dpavlin 47
44 dpavlin 50 if ( ! -e $to_list ) {
45     cp( $from_list, $to_list );
46     die "created $to_list\nplease edit it to reflect new layout\n";
47 dpavlin 48 }
48    
49 dpavlin 49 my $map;
50 dpavlin 50 my $mkdir;
51 dpavlin 49
52 dpavlin 50 open(my $fh_from, '<', $from_list ) || die "can't open $from_list: $!";
53     open(my $fh_to, '<', $to_list ) || die "can't open $to_list: $!";
54     while( my $path_from = <$fh_from> ) {
55     chomp($path_from);
56     my $path_to = <$fh_to> || die "list shorter, probably corrupt: $to_list\n";
57     chomp($path_to);
58     $map->{$path_from} = $path_to;
59     if ( $path_to =~ m{^(.+)/\Q$path_from\E$}) {
60     if ( ! $mkdir->{$1} ) {
61     $mkdir->{$1}++;
62     warn "##> will create $1 in new layout\n";
63     }
64     }
65 dpavlin 49 }
66    
67 dpavlin 50 sub remap {
68     my ($path,$kind) = @_;
69     $path =~ s|/*$|/| if $kind && $kind eq 'dir';
70     if (defined( $map->{$path} )) {
71     my $to = $map->{$path};
72     warn "##> $path -> $to\n";
73     return $to;
74     } else {
75     warn "??> '$path'\n" if $path;
76     return $path;
77     }
78     }
79    
80     warn "map = ",dump( $map ),$/;
81     warn "mkdir = ", dump( $mkdir ),$/;
82    
83 dpavlin 48 if ( -e $to ) {
84     #die "$to allready exists! remove it to re-create repository\n";
85     rm('-Rf',$to);
86     }
87 dpavlin 47
88 dpavlin 48 svnadmin('create', $to);
89     open(my $fh_in, '-|', "svnadmin dump $from") || die "can't dump $from: $!";
90     open(my $fh_out, '|-', "svnadmin load $to") || die "can't load $to: $!";
91 dpavlin 50 open($fh_out, '>', "$base/to.dump") || die "can't dump to $base/to.dump: $!" if $to_dump;
92 dpavlin 47
93 dpavlin 48 my $dump = SVN::Dump->new( { fh => $fh_in } );
94 dpavlin 47
95 dpavlin 50 warn "## converting subversion repository $from -> $to\n";
96 dpavlin 47
97 dpavlin 48 while ( my $rec = $dump->next_record() ) {
98 dpavlin 50
99     if ( $rec->type() eq 'revision' && $rec->get_header( 'Revision-number' ) == 1 && $mkdir ) {
100     # copy revision record
101     print $fh_out $rec->as_string();
102     # fetch dirs sorted by length
103     foreach my $dir ( sort { length($a) <=> length($b) } keys %$mkdir ) {
104     print $fh_out <<"__NODE_ADD_DIR__";
105    
106     Node-path: $dir
107     Node-kind: dir
108     Node-action: add
109     Prop-content-length: 10
110     Content-length: 10
111    
112     PROPS-END
113    
114    
115     __NODE_ADD_DIR__
116     warn "##> inserted mkdir $dir\n";
117     }
118     next;
119 dpavlin 47 }
120 dpavlin 48
121     my $path = $rec->get_header('Node-path');
122 dpavlin 50 my $kind = $rec->get_header('Node-kind');
123     if ( $path ) {
124 dpavlin 52 my $new_path = remap($path,$kind);
125     if ( $new_path eq '' ) {
126     warn "##> skipped $kind $path\n";
127     next;
128     }
129     $rec->set_header('Node-path', $new_path );
130 dpavlin 50 if ( $path = $rec->get_header('Node-copyfrom-path') ) {
131     $rec->set_header('Node-copyfrom-path', remap($path,$kind) );
132     }
133 dpavlin 49 }
134 dpavlin 48
135     print $fh_out $rec->as_string();
136 dpavlin 47 }
137 dpavlin 50
138     if ($@) {
139     warn "ERROR: $@\n";
140     warn "##> content imported into $to\n";
141     svn('ls','-R', rep_url($to));
142     }
143    
144     close($fh_in);
145     close($fh_out);
146    
147     if ( $to_dump ) {
148     svnadmin('verify',$to);
149     } else {
150     rm('-Rf', $checkout) if -e $checkout;
151     svn('co', rep_url($to), $checkout);
152     }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26