Rework pool_tok_seq and pool_print_seq.
[svn-fe.git] / replay.pl
blob9715619620413a463c2ea572a1e54ab3a8bc43a7
1 #!/usr/bin/perl
3 use SVN::Core;
4 use SVN::Repos;
5 use SVN::Fs;
7 use Date::Parse;
8 use File::Temp;
10 my $mirror = '/path/to/mirror';
12 my $repos = SVN::Repos::open($mirror);
13 my $fs = $repos->fs();
15 my $uuid = $fs->revision_prop(0, 'svn:sync-from-uuid');
16 my $url = $fs->revision_prop(0, 'svn:sync-from-url');
17 my $maxrev = int($fs->revision_prop(0, 'svn:sync-last-merged-rev'));
19 print "# SVN_UUID: $uuid\n";
20 print "# SVN_URL: $url\n";
21 print "# MAX_REV: $maxrev\n";
23 my $commitlog;
24 my $nextmark = 1;
25 my $marks;
27 $repos->get_logs([''], 1, $maxrev, 1, 0, sub {
28 my ($paths, $rev, $author, $date, $log, $pool) = @_;
30 print "# SVN_AUTHOR: $author\n";
31 print "# SVN_DATE: $date\n";
33 my $GIT_COMMITTER_NAME=$author;
34 my $GIT_COMMITTER_EMAIL=$author.'@'.$uuid;
35 my $GIT_COMMITTER_DATE=int(str2time($date)).' +0000';
37 my @commitlogfile = File::Temp->new();
38 $commitlog = $commitlogfile[FH];
40 print $commitlog "commit refs/heads/master\n";
41 print $commitlog "committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n";
42 print $commitlog 'data '.length($log)."\n$log\n";
44 my $root = $fs->revision_root($rev, $pool);
46 for my $file (keys %$paths) {
47 my $node = $paths->{$file};
48 my $action = $node->action;
50 if ($action eq 'D') {
51 print $commitlog "D $file\n";
52 next;
55 if ($root->is_dir($file, $pool) ) {
56 # Recursive modify
57 if (defined $node->copyfrom_rev) {
58 # modifydir($root, $file);
60 } else {
61 modifyfile($root, $file, $pool);
65 seek $commitlog, 0, 0;
66 local $/ = \16384;
67 while (<$commitlog>) {
68 print $_;
70 close $commitlog;
72 print "progress to revision $rev\n"
73 });
75 sub modifyfile {
76 my ($root, $file, $pool) = @_;
78 my $proplist = $root->node_proplist($file, $pool);
79 my $md5 = $root->file_md5_checksum($file, $pool);
80 # Strip the leading slash from the path for git
81 my $path = substr($file, 1);
83 my $mode;
85 if (defined $proplist->{'svn:special'}) {
86 $mode = '120000';
87 $md5 .= 'L';
88 } else {
89 $mode = defined $proplist->{'svn:executable'} ? '100755' : '100644';
92 my $mark = $marks->{$md5};
93 if (!defined $mark) {
94 $mark = $nextmark++;
95 $marks->{$md5} = $mark;
96 my $length = $root->file_length($file, $pool);
97 $length -= 5 if $mode == '120000';
98 my $contents = $root->file_contents($file, $pool);
99 print "# MD5: $md5\n";
100 print "blob\nmark :$mark\n";
101 print "data $length\n";
102 local $/ = \16384;
103 my $linkprefix;
104 read $contents, $linkprefix, 5 if $mode == '120000';
105 while (<$contents>) {
106 print $_;
108 close $contents;
109 print "\n";
111 print $commitlog "M $mode :$mark $path\n";