16 use SVK::Editor::Diff;
23 # TODO use confess from 'use Carp'
29 my ($this, $repo_path, $authors_file) = @_;
33 $self->{repos} = SVN::Repos::open($repo_path);
34 $self->{authors_file} = $authors_file;
35 $self->{authors} = undef;
37 if (defined($self->{authors_file})) {
38 my $f = util::FileLoad($self->{authors_file});
39 my @lines = split("\n", $f);
41 foreach my $l (@lines) {
42 if ($l =~ /^([\w\-]+) = (.*)$/) {
43 $self->{authors}->{$1} = $2;
47 confess "line: $l: invalid";
55 sub get_last_svn_rev($$)
57 my ($self, $branch) = @_;
59 return $self->{repos}->fs->youngest_rev();
62 sub get_missing_svn_revs($$$)
64 my ($self, $branch, $start_rev) = @_;
65 my $last_rev = $self->get_last_svn_rev($branch);
68 my $nroot = $self->{repos}->fs->revision_root($last_rev);
69 my $hist = $nroot->node_history($branch);
71 while ($hist = $hist->prev(0)) {
72 my $crev = $hist->location();
73 last unless defined($crev);
74 last unless $crev > 0;
75 last unless $crev > $start_rev;
83 sub svn2git_author($$)
87 my $out = $self->{authors}->{$in};
89 confess "author: $in:not found" unless defined($out);
102 if ($tmp =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\./) {
112 my $time = timegm($sec, $min, $hour, $day, $month, $year);
113 $out = gmctime($time);
116 confess "time: $in: invalid" unless defined($out);
123 my ($self, $in) = @_;
130 sub get_git_patch($$$)
132 my ($self, $branch, $rev) = @_;
135 my $oroot = $self->{repos}->fs->revision_root($orev);
136 my $nroot = $self->{repos}->fs->revision_root($nrev);
140 $p->{svn_author} = $self->{repos}->fs->revision_prop($nrev, "svn:author");
141 $p->{svn_date} = $self->{repos}->fs->revision_prop($nrev, "svn:date");
142 $p->{svn_log} = $self->{repos}->fs->revision_prop($nrev, "svn:log");
143 $p->{svn_rev} = $rev;
146 my $editor = SVN2GitEditor->new(
147 cb_basecontent => sub {
148 my ($path, $pool) = @_;
149 my $base = $oroot->file_contents("$branch/$path", $pool);
153 my ($path, $pname, $pool) = @_;
154 my $prop = $oroot->node_prop("$branch/$path", $pname, $pool);
157 oldrepos => $self->{repos},
162 llabel => "revision $orev",
163 rlabel => "revision $nrev",
165 output => \$p->{git_diff});
167 SVN::Repos::dir_delta($oroot,
174 $p->{git_author} = $self->svn2git_author($p->{svn_author});
175 $p->{git_date} = $self->svn2git_date($p->{svn_date});
176 $p->{git_log} = $self->svn2git_log($p->{svn_log});
178 my @log = split("\n", $p->{git_log});
179 $p->{git_log_subject} = shift @log;
180 $p->{git_log_body} = join("\n", @log);
182 if ($p->{git_diff} eq "") {
183 $p->{git_patch} = undef;
187 $p->{git_patch} = "";
188 $p->{git_patch} .= "From 123456789abcdef\n";
189 $p->{git_patch} .= "From: $p->{git_author}\n";
190 $p->{git_patch} .= "Date: $p->{git_date}\n";
191 $p->{git_patch} .= "Subject: [PATCH] r$p->{svn_rev}: $p->{git_log_subject}\n";
192 $p->{git_patch} .= "$p->{git_log_body}\n";
193 $p->{git_patch} .= "\n";
194 $p->{git_patch} .= $p->{git_diff};
195 $p->{git_patch} .= "\n---\nsvn-sync script\n\n";