#!/usr/bin/perl
#package CPAN_Build
use strict;

our $VERSION = 0.001;
use Cwd 'abs_path';

my $console = "$ENV{HOME}/.xsession-errors";
open CONSOLE, ">>$console";

my $count       = 0.001;
my $cpanversion = "CPAN_Version";

build($_) foreach @ARGV;

sub clean {
	my ( $folder, $package ) = @_;

	chdir $folder;
	system "perl Makefile.PL | grep OK";
	system "make clean | grep OK";
	system "rm Makefile.old 2>&1 | grep OK";
	system "rm MANIFEST 2>&1 | grep OK";
	system "rm MANIFEST.bak 2>&1 | grep OK";

	system "rm -r '$package-'[0-9].[0-9][0-9][0-9][0-9] 2>/dev/null";
}

sub dist {
	my ( $folder, $package ) = @_;

	chdir $folder;
	system "mv lib/auto /tmp/$$-auto" if -e "lib/auto";

	system "perl Makefile.PL | grep OK";
	system "make manifest 2>&1 | grep OK";
	system "cat MANIFEST | $cpanversion $package +$count | grep OK";
	system "perl Makefile.PL | grep OK";
	my $test = system "make test 1>>$console 2>>$console | grep OK";
	
	my ( $tmp, @links ) = remove_links($folder);
	return unless $tmp;


	my $dist = system "make dist 1>>$console 2>>$console | grep OK";
	system "cat MANIFEST | $cpanversion $package -$count | grep OK" unless $dist || $test;
	#printf "%d, %d", $dist?1:0 , $test?1:0;

	insert_links( $tmp, $folder, @links );

	system "mkdir -p ../test/";

	#
	my $build_number = 0;
	if (-e ".build") {
		$build_number = `cat .build`;
		chomp $build_number;
	}

	#
	$build_number++;
	system "echo $build_number > .build";


	#
	my $gz = `ls '$package-'[0-9].[0-9]*.gz`;
	chomp $gz;
	$gz =~ s/(\.tar\.gz)$/sprintf "_%03d%s", $build_number, $1/e;
	print $gz;

	#
	system "mv '../$package-'[0-9].[0-9_]*.gz ../test 2>/dev/null | grep OK";
	system "mv '$package-'[0-9].[0-9]*.gz ../$gz 2>/dev/null | grep OK";

	#
	system "mv /tmp/$$-auto lib/auto" if -e "/tmp/$$-auto";
	return 1;
}

sub build {
	my $file = abs_path shift;
	$file = "$file/Makefile.PL" if -d $file;
	return unless -e $file;

	if ( $file =~ m|(.*?/cpan/(.*?))/|o ) {
		my ( $folder, $package ) = ( $1, $2 );
		
		print CONSOLE "#" x 80, "\n";
		print CONSOLE "Building $folder . . .\n";

		return unless dist( $folder, $package );
		clean( $folder, $package );

		print CONSOLE "Done build $file . . .\n";
	}

}

use File::Temp 'mkdtemp';

sub remove_links {
	my ($folder) = @_;
	my $lib = "$folder/lib";
	return unless -e $lib;
	return unless my $tmp = mkdtemp('/tmp/libXXXX');
	#print "\nRemove_links\n";

	#print "$lib\n";
	#print "$tmp\n";

	my @links;

	opendir DIR, $lib;
	foreach ( readdir DIR ) {
		next unless -l "$lib/$_";
		push @links, $_;

		my $cmd = "mv '$lib/$_' '$tmp'";
		system $cmd;

		#print "$cmd\n";
	}
	closedir DIR, $lib;

	#sleep 2;
	return $tmp, @links;
}

sub insert_links {
	my ( $tmp, $folder, @links ) = @_;
	my $lib = "$folder/lib";
	#print "\ninsert_links\n";

	foreach (@links) {
		my $cmd = "mv '$tmp/$_' '$lib'";
		system $cmd;

		#print "$cmd\n";
	}

	system "rmdir '$tmp'";
}

END {
	close CONSOLE;
}

__END__

NEdit -> Preferences -> Default Settings -> Customize Menus -> Shell Menu
Shell Menu:

Menu Entry: 		Perl>Test
Command Input: 	none
Command Output: 	dialog

Save file before executing command: 	true

Shell Command to Execute:
/home/holger/perl/cpan/X3D/nedit/perltest '%'
