#!/usr/bin/perl -w
# -*- perl -*-

#
# $Id: $
# Author: Slaven Rezic
#
# Copyright (C) 2007 Slaven Rezic. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# Mail: slaven@rezic.de
# WWW:  http://www.rezic.de/eserte/
#

# This needs to be rewritten to be dependent only on a checked out svn
# or svk repository.

use strict;
#use CPAN;
use CPAN::Version;
use ExtUtils::MakeMaker;
use File::Find;
use Digest::MD5 qw();

# REPO BEGIN
# REPO NAME save_pwd /home/e/eserte/work/srezic-repository 
# REPO MD5 0f7791cf8e3b62744d7d5cfbd9ddcb07

=head2 save_pwd(sub { ... })

=for category File

Save the current directory and assure that outside the block the old
directory will still be valid.

=cut

sub save_pwd (&) {
    my $code = shift;
    require Cwd;
    my $pwd = Cwd::cwd();
    eval {
	$code->();
    };
    my $err = $@;
    chdir $pwd or die "Can't chdir back to $pwd: $!";
    die $err if $err;
}
# REPO END

my $oldtkdir = "/usr/local/src/Tk-804.027-XFT/blib/lib/"; # XXX
my $newtkdir = "$ENV{HOME}/work/svk-checkouts/Tk/blib/lib"; # XXX

my %old_modules;
my %new_modules;

# my $tk_mod = CPAN::Shell->expand("Module", "Tk");
# my $tk_dist = $tk_mod->distribution;
# for my $mod_id ($tk_dist->containsmods()) {
#     my $mod = CPAN::Shell->expand("Module", $mod_id);
# #     {
# # 	no warnings 'uninitialized';
# # 	if ($mod->cpan_version != $mod->available_version) {
# # 	    warn "cpan/available version diffs for $mod_id: " . $mod->cpan_version . " != " . $mod->available_version . "\n";
# # 	}
# #     }
#     my $mod_ver = $mod->cpan_version;
#     $old_modules{$mod_id} = $mod_ver;
# }

for my $def ([$oldtkdir, \%old_modules],
	     [$newtkdir, \%new_modules],
	    ) {
    my($dir, $hashref) = @$def;

    save_pwd {
	chdir $dir or die "Can't chdir to $dir: $!";

	find(sub {
		 if (-f && /\.pm$/) {
		     (my $mod_name = $File::Find::name) =~ s{^\./}{};
		     $mod_name =~ s{\.pm$}{};
		     $mod_name =~ s{/}{::}g;
		     my $file = $_;
		     my $ver = MM->parse_version($file);
		     my $md5 = do {
			 my $ctx = Digest::MD5->new;
			 open my $fh, $file or die $!;
			 $ctx->addfile($fh);
			 $ctx->hexdigest;
		     };
		     $hashref->{$mod_name} = { ver => $ver,
					       md5 => $md5,
					     };
		 }
	     }, ".");
    }
}

while(my($k,$v) = each %old_modules) {
    if (!exists $new_modules{$k}) {
	print "Module $k vanished.\n";
    } else {
	my $old = $old_modules{$k};
	my $new = $new_modules{$k};
	if (CPAN::Version->vlt($new->{ver}, $old->{ver})) {
	    print "*** WARNING: version of $k became lower! ($old->{ver} -> $new->{ver})\n";
	}
	if ($old->{ver} ne $new->{ver} &&
	    $old->{md5} eq $new->{md5}) {
	    print "Unnecessary version change in $k ($old->{ver} -> $new->{ver}).\n";
	} elsif ($old->{ver} eq $new->{ver} &&
		 $old->{md5} ne $new->{md5}) {
	    print "*** $k needs version increment.\n";
	}
    }
}
while(my($k,$v) = each %new_modules) {
    if (!exists $old_modules{$k}) {
	print "Module $k newly added.\n";
    }
}

__END__
