+if (-e STATE_FILE) {
+ my $state = Storable::retrieve(STATE_FILE);
+ if ($state->[0] eq $timestamp) {
+ printf "State retrieved from %s\n", STATE_FILE;
+ @not_on_cpan = @{ $state->[1] };
+ @unfindable = @{ $state->[2] };
+ @missing = @{ $state->[3] };
+ %name_mismatch = %{ $state->[4] };
+ %version = %{ $state->[5] };
+ $already_parsed = 1;
+ } else {
+ printf "Obsolete state file %s, regenerating\n", STATE_FILE;
+ 1 while unlink STATE_FILE;
+ }
+}
+
+unless ($already_parsed) {
+ if (-e DATA_FILE) {
+ my $data = Storable::retrieve(DATA_FILE);
+ if ($data->[0] eq $timestamp) {
+ printf "Data retrieved from %s\n", DATA_FILE;
+ %fetched_uri = %{ $data->[1] };
+ } else {
+ printf "Obsolete data file %s, regenerating\n", DATA_FILE;
+ 1 while unlink DATA_FILE;
+ }
+ }
+
+ parse_portage_tree();
+ print "\n";
+
+ Storable::store([
+ $timestamp,
+ \@not_on_cpan,
+ \@unfindable,
+ \@missing,
+ \%name_mismatch,
+ \%version,
+ ] => STATE_FILE);
+ printf "State stored to %s\n", STATE_FILE;
+}
+
+print "\n";
+p(0, "Summary\n");
+
+p(1, "Not on the CPAN:\n");
+p(2, "$_\n") for @not_on_cpan;
+
+p(1, "Alleged to be on the CPAN, but unfindable:\n");
+p(2, "$_\n") for @unfindable;
+
+p(1, "Only a different version is on the CPAN:\n");
+p(2, "$_\n") for @missing;
+
+p(1, "Name mismatch:\n");
+for my $dist_name (sort keys %name_mismatch) {
+ my $pkg_name = $name_mismatch{$dist_name};
+ my $mapped_name = CPANPLUS::Dist::Gentoo::Maps::name_c2g($dist_name);
+
+ my $fixed = $mapped_name eq $pkg_name;
+ my $eq = $fixed ? '==' : '!=';
+ my $str = colored(
+ "$dist_name => $mapped_name $eq $pkg_name",
+ $fixed ? 'bright_green' : 'bright_red'
+ );
+ p(2, "$str\n");
+}
+
+p(1, "Version mismatch:\n");
+for (sort keys %version) {
+ my ($dist_version, $pkg_version) = @{$version{$_}};
+ my $default_mapped_version = CPANPLUS::Dist::Gentoo::Maps::version_c2g(
+ undef,
+ $dist_version,
+ );
+ my $mapped_version = CPANPLUS::Dist::Gentoo::Maps::version_c2g(
+ $_,
+ $dist_version,
+ );
+ if ($default_mapped_version ne $pkg_version) {
+ my $fixed = $mapped_version eq $pkg_version;
+ my $eq = $fixed ? '==' : '!=';
+ my $str = colored(
+ "$dist_version => $mapped_version $eq $pkg_version",
+ $fixed ? 'bright_green' : 'bright_red'
+ );
+ p(2, "$_: $str\n");
+ }
+}
+
+copy TARGET, BACKUP or die "copy failed: $!";
+
+open my $src, '<', BACKUP;
+open my $dst, '>', TARGET;
+
+my $max = max map length, keys %name_mismatch;
+
+SRC: while (<$src>) {
+ print $dst $_;
+ if (/^__DATA__$/) {
+ printf $dst "%s%s %s\n", $_, (' ' x ($max - length)), $name_mismatch{$_}
+ for sort keys %name_mismatch;
+ last SRC;
+ }
+}