| 53 |
REV: while ($ent->{s} =~ m!<hr size=1 noshade>!gc) { |
REV: while ($ent->{s} =~ m!<hr size=1 noshade>!gc) { |
| 54 |
my $rev = ''; |
my $rev = ''; |
| 55 |
if ($ent->{s} =~ m!Revision!gc and |
if ($ent->{s} =~ m!Revision!gc and |
| 56 |
$ent->{s} =~ m!<a href="([^"]+)"\s*><b>([0-9.]+)</b></a>!gc) { |
$ent->{s} =~ m!<a href="([^"]+)"[^<>]*><b>([0-9.]+)</b></a>!gc) { |
| 57 |
my $uri = $dom->create_uri_reference ($1) |
my $uri = $dom->create_uri_reference ($1) |
| 58 |
->get_absolute_reference ($log_uri)->uri_reference; |
->get_absolute_reference ($log_uri)->uri_reference; |
| 59 |
$rev = $2; |
$rev = $2; |
| 63 |
$text->{$rev} = $revent->{s}; |
$text->{$rev} = $revent->{s}; |
| 64 |
} |
} |
| 65 |
|
|
| 66 |
unless (defined $rcs->{admin}->{head}) { |
$rcs->{admin}->{head} ||= $rev; |
|
$rcs->{admin}->{head} = $rev; |
|
|
$rcs->{deltatext}->{$rev}->{text} = $text->{$rev}; |
|
|
} |
|
| 67 |
} |
} |
| 68 |
|
|
| 69 |
if ($ent->{s} =~ m!<i>\w+ (\w+)\s*(\d+)\s*(\d+):(\d+):(\d+) (\d+) UTC</i> \([^()]+\) by <i>([^<>]+)</i>!gc) { |
if ($ent->{s} =~ m!<i>\w+ (\w+)\s*(\d+)\s*(\d+):(\d+):(\d+) (\d+) UTC</i> \([^()]+\) by <i>([^<>]+)</i>!gc) { |
| 81 |
if ($ent->{s} =~ m[\G<br>Branch:((?>(?!<(?>[bh]r|pre)).)+)]gcs) { |
if ($ent->{s} =~ m[\G<br>Branch:((?>(?!<(?>[bh]r|pre)).)+)]gcs) { |
| 82 |
my $b = $1; |
my $b = $1; |
| 83 |
while ($b =~ m!><b>([^<>]+)</b></a>!gc) { |
while ($b =~ m!><b>([^<>]+)</b></a>!gc) { |
| 84 |
push @{$rcs->{delta}->{$rev}->{branches} ||= []}, $1 |
my $branch = $1; |
| 85 |
unless $1 eq 'MAIN'; |
if ($branch ne 'MAIN') { |
| 86 |
|
my $rev = $rev; |
| 87 |
|
$rev =~ s/\.(\d+)\.\d+\z//; |
| 88 |
|
push @{$rcs->{admin}->{symbols} ||= []}, [$branch => "$rev.0.$1"]; |
| 89 |
|
} |
| 90 |
} |
} |
| 91 |
$ent->{s} =~ m[(?=<(?>br|pre)>)]gc; |
$ent->{s} =~ m[(?=<(?>br|pre)>)]gc; |
| 92 |
} |
} |
| 93 |
|
|
| 94 |
|
if ($ent->{s} =~ m[\G<br>Branch point]gcs) { |
| 95 |
|
$ent->{s} =~ m[(?=<(?>br|pre)>)]gc; |
| 96 |
|
} |
| 97 |
|
|
| 98 |
if ($ent->{s} =~ m[\G<br>CVS Tags:((?>(?!<(?>[bh]r|pre)).)+)]gcs) { |
if ($ent->{s} =~ m[\G<br>CVS Tags:((?>(?!<(?>[bh]r|pre)).)+)]gcs) { |
| 99 |
my $b = $1; |
my $b = $1; |
| 100 |
while ($b =~ m!><b>([^<>]+)</b></a>!gc) { |
while ($b =~ m!><b>([^<>]+)</b></a>!gc) { |
| 101 |
my $rev = $branches->{$1} ? "$rev.0.".((++$branch_rev->{$rev})*2) : $rev; |
my $rev = $branches->{$1} ? "$rev.0.".((++$branch_rev->{$rev})*2) : $rev; |
| 102 |
push @{$rcs->{admin}->{symbols} ||= []}, [$1 => $rev] |
if ($1 eq 'HEAD') { |
| 103 |
unless $1 eq 'HEAD'; ## TODO |
$rcs->{admin}->{head} = $rev; |
| 104 |
|
$rcs->{deltatext}->{$rev}->{text} = $text->{$rev}; |
| 105 |
|
} else { |
| 106 |
|
push @{$rcs->{admin}->{symbols} ||= []}, [$1 => $rev]; |
| 107 |
|
} |
| 108 |
} |
} |
| 109 |
$ent->{s} =~ m[(?=<(?>br|pre)>)]gc; |
$ent->{s} =~ m[(?=<(?>br|pre)>)]gc; |
| 110 |
} |
} |
| 111 |
|
|
| 112 |
|
if ($ent->{s} =~ m[\G<br>Branch point]gcs) { |
| 113 |
|
$ent->{s} =~ m[(?=<(?>br|pre)>)]gc; |
| 114 |
|
} |
| 115 |
|
|
| 116 |
if ($ent->{s} =~ m!\G<br>Changes since <b>([0-9.]+):!gc) { |
if ($ent->{s} =~ m!\G<br>Changes since <b>([0-9.]+):!gc) { |
| 117 |
$rcs->{delta}->{$rev}->{next} = $1; |
my $from_rev = $1; |
| 118 |
$text_from->{$1} = $rev; |
if ($rev =~ /\A[0-9]+\.[0-9]+\z/) { |
| 119 |
|
$rcs->{delta}->{$rev}->{next} = $from_rev; |
| 120 |
|
$text_from->{$from_rev} = $rev; |
| 121 |
|
} elsif ($from_rev =~ /\A[0-9]+\.[0-9]+\z/) { |
| 122 |
|
push @{$rcs->{delta}->{$from_rev}->{branches} ||= []}, $rev; |
| 123 |
|
$text_from->{$rev} = $from_rev; |
| 124 |
|
} else { |
| 125 |
|
$rcs->{delta}->{$from_rev}->{next} = $rev; |
| 126 |
|
$text_from->{$rev} = $from_rev; |
| 127 |
|
} |
| 128 |
} |
} |
| 129 |
|
|
| 130 |
if ($ent->{s} =~ m!<pre>(.*?)</pre>!gcs) { |
if ($ent->{s} =~ m!<pre>(.*?)</pre>!gcs) { |
| 134 |
$rcs->{delta}->{$rev}->{state} = 'Exp'; |
$rcs->{delta}->{$rev}->{state} = 'Exp'; |
| 135 |
} # REV |
} # REV |
| 136 |
|
|
| 137 |
|
delete $text_from->{$rcs->{admin}->{head}}; |
| 138 |
|
|
| 139 |
|
my %symbol; |
| 140 |
|
for (@{$rcs->{admin}->{symbols} || []}) { |
| 141 |
|
$symbol{$_->[0]} = $_->[1]; |
| 142 |
|
} |
| 143 |
|
$rcs->{admin}->{symbols} = [map {[$_ => $symbol{$_}]} keys %symbol]; |
| 144 |
|
|
| 145 |
|
|
| 146 |
require File::Temp; |
require File::Temp; |
| 147 |
require IPC::Open2; |
require IPC::Open2; |
| 148 |
while (keys %$text_from) { |
while (keys %$text_from) { |
| 149 |
my $rev = each %$text_from; |
my $rev = each %$text_from; |
| 150 |
|
my $any; |
| 151 |
if (defined $text->{$text_from->{$rev}}) { |
if (defined $text->{$text_from->{$rev}}) { |
| 152 |
|
$any = 1; |
| 153 |
my $from_file = new File::Temp; |
my $from_file = new File::Temp; |
| 154 |
binmode $from_file; |
binmode $from_file; |
| 155 |
$from_file->print ($text->{$text_from->{$rev}}); |
$from_file->print ($text->{$text_from->{$rev}}); |
| 167 |
$rcs->{deltatext}->{$rev}->{text} = <$diffin>; |
$rcs->{deltatext}->{$rev}->{text} = <$diffin>; |
| 168 |
delete $text_from->{$rev}; |
delete $text_from->{$rev}; |
| 169 |
} |
} |
| 170 |
|
last unless $any; |
| 171 |
} |
} |
| 172 |
|
|
| 173 |
print $rcs->stringify; |
print $rcs->stringify; |