#!/usr/bin/env perl

use File::Temp qw/ tempfile tempdir /;

sub usage() {
    print STDERR "cws-extract [-m] [-d cvs_root] [-w|--mws mws] cws_name [ouput_filename]
Create a patch from an up-stream CWS suitable for ooo-build.

  -d cvs_root   Specify the CVS root.
  -m|--modules  One file per module.
  -s            Don't ignore changes in whitespace.
  -w|--mws mws  Specify the Master Workspace name (defaults to SRC680)\n";
    exit 1;
}

# parameters
my $cws = shift @ARGV;
my $cvsroot = "";
my $onepermodule = "false";
my $mws = "DEV300";
my $whitespace = "-b -w";
if (!defined $cws || $cws eq "-h" || $cws eq "--help") {
    usage();
}
while ($cws =~ /^-/) {
    if ($cws eq "-m" || $cws eq "--modules") {
        $onepermodule = "true";
    }
    elsif ($cws eq "-d") {
        $cvsroot = shift @ARGV || usage();
    }
    elsif ($cws eq "-w" || $cws eq "--mws") {
        $mws = shift @ARGV || usage();
    }
    elsif ($cws eq "-s") {
        $whitespace = "";
    }
    else {
        usage();
    }
    $cws = shift @ARGV || usage();
}
if (!defined $cws || !defined $mws || !defined $cvsroot) {
    usage();
}

my $outfile = shift @ARGV;

$ENV{SRC_ROOT} || die "Havn't sourced the environment";

if ( $cvsroot eq "" ) {
    -f "solenv/CVS/Root" || die "Doesn't look like a live OO.o cvs checkout to me";

    $cvsroot = `cat solenv/CVS/Root`;
    $cvsroot =~ s/\n/ /g;
    $cvsroot =~ s/\s*$//;
}

my $ucmws = uc( $mws );
my $modules = `CWS_WORK_STAMP=$cws cwsquery modules -m $ucmws`;
$modules =~ s/\r\n//g;
$modules =~ s/\n/ /g;
$modules =~ s/  / /g;

my @mod_list = split (/ /, $modules);
print STDERR "Modules: '" . join (",", @mod_list) . "'\n";

my $tag = "cws_" . lc($mws) . "_$cws";
my $anchor = uc ("$tag" . "_ANCHOR");

print STDERR "Detecting cws tag:";
if( @mod_list != 0 )
{
	my ($line, $found_orig_mws) = $mws;
	my $i = 0;
	do {
	    open TAGS, "cvs -d '$cvsroot' log '$mod_list[$i]' 2>/dev/null |";
	    $i++;
	} while ( eof ( TAGS ) && $i < scalar (@mod_list) );
	while (<TAGS>)
	{
		if( ($found_orig_mws) = m/cws_(.*)_$cws/ )
		{
			if( $found_orig_mws ne $mws )
			{
				# mws and tag differ - update
				$tag = "cws_" . lc($found_orig_mws) . "_$cws";
				$anchor = uc ("$tag" . "_ANCHOR");
			}
			last;
		}
	}
	close(TAGS);
}
print STDERR " $tag\n";

for my $module (@mod_list) {
    my $tmp = tempdir ("$tag.XXXXXX", CLEANUP => 1);
    print STDERR "Using temp directory: $tmp\n";

    print STDERR "cvs -d '$cvsroot' checkout -r$tag $module\n";
    system ("cd $tmp && cvs -d '$cvsroot' checkout -r$tag $module\n");
    
    my $finaloutfile;
    if (!defined $outfile) {
       if ($onepermodule eq "true" ) {
           $finaloutfile = "cws-$cws-$module.diff";
       }
       else {
           $finaloutfile = "cws-$cws.diff";
       }
    }
    else {
       if ($onepermodule eq "true" ) {
           $finaloutfile = "$module-$outfile";
       }
       else {
           $finaloutfile = "$outfile";
       }
    }
       
    print STDERR "cvs -d '$cvsroot' diff -kk -upN $whitespace -B -r$anchor -r$tag $module >> $finaloutfile 2>&1\n";
    system ("( cd $tmp && cvs -d '$cvsroot' diff -kk -upN $whitespace -B -r$anchor -r$tag $module ) >> $finaloutfile 2>&1");
}
