source: subversion/applications/utils/packaging/build-cluster.pl @ 29923

Last change on this file since 29923 was 25355, checked in by joerg, 9 years ago

reindent sourcecode

File size: 58.6 KB
Line 
1#!/usr/bin/perl
2
3=pod
4
5=head1 build-cluster
6
7Build_Cluster is a system to build various Debian Based Packages
8we expect a chroot environment to already be setup in order to
9then be able to do the debuild commands inside these.
10
11
12Show a summary of all results. This also looks for cached results.
13
14=cut
15
16package BuildTask;
17
18use strict;
19use warnings;
20
21use Data::Dumper;
22use Date::Format;
23#use Date::Manip;
24use File::Basename;
25use File::Copy;
26use File::Find;
27use File::Path;
28use File::Slurp qw( slurp write_file read_file append_file) ;
29use Getopt::Long;
30use Getopt::Std;
31use IO::Select;
32use IO::File;
33use IPC::Open3;
34use Pod::Usage;
35use Symbol;
36
37my $dir_chroot = "/home/chroot";
38my $dir_log = "/home/chroot/log";
39my $dir_svn = "$dir_chroot/svn";
40my $package_result_dir = "$dir_chroot/results";
41my $package_result_upload_dir = "/home/httpd/gpsdrive.de"; #This is the upload Directory
42my $user = "tweety";
43my $DEBUG   = 0;
44my $VERBOSE = 1;
45my $MANUAL=0;
46my $HELP=0;
47my $FORCE=0;
48
49my $do_svn_up=1;
50my $do_svn_co=1;
51my $do_svn_changelog = 1;
52my $do_svn_cp= 1;
53my $do_show_results=0;
54my $do_write_html_results_only=0;
55my $do_chk_dep=1;
56my $do_debuild=1;
57my $RESULTS={};
58
59my $do_fast= 1; # Skip Stuff like debuild clean, ...
60
61delete $ENV{http_proxy};
62delete $ENV{HTTP_PROXY};
63$ENV{LANG}="C";
64$ENV{DEB_BUILD_OPTIONS}="parallel=4";
65
66
67# define Colors
68my $ESC="\033";
69my %COLOR;
70$COLOR{RED}="${ESC}[91m";
71$COLOR{GREEN}="${ESC}[92m";
72$COLOR{YELLOW}="${ESC}[93m";
73$COLOR{BLUE}="${ESC}[94m";
74$COLOR{MAGENTA}="${ESC}[95m";
75$COLOR{CYAN}="${ESC}[96m";
76$COLOR{WHITE}="${ESC}[97m";
77$COLOR{BG_RED}="${ESC}[41m";
78$COLOR{BG_GREEN}="${ESC}[42m";
79$COLOR{BG_YELLOW}="${ESC}[43m";
80$COLOR{BG_BLUE}="${ESC}[44m";
81$COLOR{BG_MAGENTA}="${ESC}[45m";
82$COLOR{BG_CYAN}="${ESC}[46m";
83$COLOR{BG_WHITE}="${ESC}[47m";
84$COLOR{BRIGHT}="${ESC}[01m";
85$COLOR{UNDERLINE}="${ESC}[04m";
86$COLOR{BLINK}="${ESC}[05m";
87$COLOR{REVERSE}="${ESC}[07m";
88$COLOR{NORMAL}="${ESC}[0m";
89
90
91# Platform is a combination of "Distribution - Revision - 32/64Bit"
92#    debian-etch-32
93#    debian-etch-64
94my @available_platforms= qw(
95    debian-squeeze-64   debian-squeeze-32
96    debian-lenny-64     debian-lenny-32
97    debian-wheezy-64     debian-wheezy-32
98    ubuntu-hardy-64     ubuntu-hardy-32
99    ubuntu-karmic-64    ubuntu-karmic-32
100    ubuntu-lucid-64             ubuntu-lucid-32
101    ubuntu-maverick-64  ubuntu-maverick-32
102    ubuntu-natty-64             ubuntu-natty-32
103);
104
105# Support until taken from http://en.wikipedia.org/wiki/Ubuntu_(operating_system)
106# ubuntu-hardy    until 2011-04
107# ubuntu-karmic   until 2011-04
108# ubuntu-maverick until 2012-04
109# ubuntu-natty    until 2012-10
110# ubuntu-lucid    until 2013-04
111
112# At 2011-02-15:
113# The latest LTS release is Ubuntu 10.04 (Lucid Lynx), released on 29 April 2010
114# The latest normal release is Ubuntu 10.10 (Maverick Meerkat), released on 10 October 2010.
115
116#    ubuntu-intrepid-64  ubuntu-intrepid-32  # End of Live 2010-04-30
117#    ubuntu-gutsy-64    ubuntu-gutsy-32      # End of Live 2009-04-18
118#    ubuntu-dapper-64   ubuntu-dapper-32     # End of Live 2009-07-14
119#    ubuntu-jaunty-64    ubuntu-jaunty-32    # End of Live 2010-10-23
120
121my @default_platforms= qw(
122    debian-squeeze-64
123    debian-squeeze-32
124    ubuntu-maverick64
125);
126@default_platforms= @available_platforms;
127
128my @platforms;
129
130my %proj2path=(
131    'gpsdrive-maemo'    => 'gpsdrive/contrib/maemo',
132    'gpsdrive-data-maps'=> 'gpsdrive/data/maps',
133    'gpsdrive'          => 'gpsdrive',
134    'gpsdrive-2.10pre7' => 'gpsdrive-2.10pre7',
135    'gpsdrive-2.12'     => 'gpsdrive-2.12',
136    'gpsdrive-data-maps-2.12'   => 'gpsdrive-2.12/data/maps',
137    'gpsdrive-data-maps-2.10pre7'=> 'gpsdrive-2.10pre7/data/maps',
138#    'opencarbox'       => 'opencarbox',
139    'mod_tile'          => 'openstreetmap-applications/utils/mod_tile',
140    'osm2pgsql'         => 'openstreetmap-applications/utils/export/osm2pgsql',
141    'merkaartor'        => 'openstreetmap-applications/editors/merkaartor',
142    'merkaartor'        => 'openstreetmap-applications/editors/merkaartor',
143    'josm'              => 'openstreetmap-applications/editors/josm',
144    'osm-utils'         => 'openstreetmap-applications/utils',
145    'osm-mapnik-world-boundaries'       => 'openstreetmap-applications/rendering/mapnik/openstreetmap-mapnik-world-boundaries',
146    'osm-mapnik-data'   => 'openstreetmap-applications/rendering/mapnik/openstreetmap-mapnik-data',
147    'map-icons'         => 'openstreetmap-applications/share/map-icons',
148    'osmosis'           => 'openstreetmap-applications/utils/osmosis/trunk',
149    'gosmore'           => 'openstreetmap-applications/rendering/gosmore',
150
151    'merkaartor-0.12'   => 'openstreetmap-applications/editors/merkaartor-branches/merkaartor-0.12-fixes',
152    'merkaartor-0.11'   => 'openstreetmap-applications/editors/merkaartor-branches/merkaartor-0.11-fixes',
153    'merkaartor-0.13'   => 'openstreetmap-applications/editors/merkaartor-branches/merkaartor-0.13-fixes',
154    'osm-editor'        => 'openstreetmap-applications/editors/osm-editor',
155    'osm-editor-qt3'    => 'openstreetmap-applications/editors/osm-editor/qt3',
156    'osm-editor-qt4'    => 'openstreetmap-applications/editors/osm-editor/qt4',
157    );
158
159my %proj2debname=(
160    'gpsdrive-maemo'    => 'gpsdrive',
161    'gpsdrive-data-maps'=> 'gpsdrive-data-maps',
162    'gpsdrive'          => 'gpsdrive',
163    'gpsdrive-2.10pre5' => 'gpsdrive',
164    'gpsdrive-2.10pre7' => 'gpsdrive',
165    'gpsdrive-2.12' => 'gpsdrive',
166    'gpsdrive-data-maps-2.12'=> 'gpsdrive-data-maps',
167    'gpsdrive-data-maps-2.10pre7'=> 'gpsdrive-data-maps',
168#    'opencarbox'       => 'opencarbox',
169    'osm2pgsql'         => 'osm2pgsql',
170    'mod_tile'          => 'libapache2-mod-tile',
171    'merkaartor'        => 'merkaartor',
172    'josm'              => 'openstreetmap-josm',
173    'osm-utils'         => 'openstreetmap-utils',
174    'osm-mapnik-world-boundaries'       => 'openstreetmap-mapnik-world-boundaries',
175    'osm-mapnik-data'   => 'openstreetmap-mapnik-data',
176    'map-icons'         => 'openstreetmap-map-icons',
177    'osmosis'           => 'osmosis',
178    'gosmore'           => 'openstreetmap-gosmore',
179
180    'merkaartor-0.12'   => 'merkaartor-0.12-fixes',
181    'merkaartor-0.11'   => 'merkaartor-0.11-fixes',
182    'merkaartor-0.13'   => 'merkaartor-0.13-fixes',
183    'osm-editor'        => 'openstreetmap-editor',
184    'osm-editor-qt3'    => 'openstreetmap-editor',
185    'osm-editor-qt4'    => 'openstreetmap-editor',
186    );
187my %package_names=(
188    'gpsdrive'          => [qw(gpsdrive gpsdrive-friendsd gpsdrive-utils)],
189    'gpsdrive-maemo'    => [qw(gpsdrive)],
190    'gpsdrive-data-maps'=> [qw(gpsdrive-data-maps)],
191    'gpsdrive-2.10pre5' => [qw(gpsdrive gpsdrive-friendsd gpsdrive-utils)],
192    'gpsdrive-2.10pre7' => [qw(gpsdrive gpsdrive-friendsd gpsdrive-utils)],
193    'gpsdrive-2.12'     => [qw(gpsdrive gpsdrive-friendsd gpsdrive-utils)],
194    'gpsdrive-data-maps-2.12'=> [qw(gpsdrive-data-maps)],
195    'gpsdrive-data-maps-2.10pre7'=> [qw(gpsdrive-data-maps)],
196#    'opencarbox'       => [qw(opencarbox)],
197    'mod_tile'          => [qw(libapache2-mod-tile renderd)],
198    'osm2pgsql'         => [qw(osm2pgsql)],
199    'merkaartor'        => [qw(merkaartor)],
200    'josm'              => [qw(openstreetmap-josm)],
201    'osm-utils'         => [qw(openstreetmap-utils openstreetmap-utils-export openstreetmap-utils-filter
202                               openstreetmap-utils-import)],
203    'osm-mapnik-world-boundaries'       => [qw(openstreetmap-mapnik-world-boundaries)],
204    'osm-mapnik-data'   => [qw(openstreetmap-mapnik-data)],
205    'map-icons'         => [qw(openstreetmap-map-icons-classic.big openstreetmap-map-icons-classic.small
206                               openstreetmap-map-icons-info openstreetmap-map-icons-japan-png
207                               openstreetmap-map-icons-japan openstreetmap-map-icons-nickw
208                               openstreetmap-map-icons-square.big openstreetmap-map-icons-square.small-minimal
209                               openstreetmap-map-icons-square.small openstreetmap-map-icons-svg-png
210                               openstreetmap-map-icons-svg-twotone-png openstreetmap-map-icons-svg-twotone
211                               openstreetmap-map-icons-svg openstreetmap-map-icons)],
212    'osmosis'           => [qw(openstreetmap-osmosis)],
213    'gosmore'           => [qw(openstreetmap-gosmore)],
214    'merkaartor-0.12'   => [qw(merkaartor)],
215    'merkaartor-0.11'   => [qw(merkaartor)],
216    'merkaartor-0.13'   => [qw(merkaartor)],
217    'osm-editor'        => [qw(osm-editor)],
218    'osm-editor-qt3'    => [qw(osm-editor)],
219    'osm-editor-qt4'    => [qw(osm-editor)],
220    );
221
222my %NO_BUILD=(
223    'mod_tile'          => qw(ubuntu-intrepid|debian-lenny|ubuntu-hardy),
224    );
225my %svn_repository_url=(
226    'openstreetmap-applications' => 'http://svn.openstreetmap.org/applications',
227    'gpsdrive'                   => 'https://gpsdrive.svn.sourceforge.net/svnroot/gpsdrive/trunk',
228#    'opencarbox'                 => 'https://opencarbox.svn.sourceforge.net/svnroot/opencarbox/OpenCarbox/trunk',
229
230    'gpsdrive-2.10pre5'           => 'https://gpsdrive.svn.sourceforge.net/svnroot/gpsdrive/branches/gpsdrive-2.10pre5',
231    'gpsdrive-2.10pre6'           => 'https://gpsdrive.svn.sourceforge.net/svnroot/gpsdrive/branches/gpsdrive-2.10pre6',
232    'gpsdrive-2.10pre7'           => 'https://gpsdrive.svn.sourceforge.net/svnroot/gpsdrive/branches/gpsdrive-2.10pre7',
233    'gpsdrive-data-maps-2.10pre7' => 'https://gpsdrive.svn.sourceforge.net/svnroot/gpsdrive/branches/gpsdrive-2.10pre7',
234    'gpsdrive-2.12'               => 'https://gpsdrive.svn.sourceforge.net/svnroot/gpsdrive/branches/experimental/gpsdrive-2.12',
235    'gpsdrive-data-maps-2.12'     => 'https://gpsdrive.svn.sourceforge.net/svnroot/gpsdrive/branches/experimental/gpsdrive-2.12',
236    );
237
238my %svn_update_done;
239
240my @available_proj=  sort keys %package_names;
241my @all_proj = grep { $_ !~ m/osmosis|gpsdrive-maemo|merkaartor|merkaartor-0...|gpsdrive-2.10pre|gpsdrive-data-maps-2.10pre7|osm-editor|josm|mod_tile|gosmore|osmosis/ } @available_proj;#
242
243my @projs;
244#@projs= keys %proj2path;
245my @default_projs=@all_proj;
246#@default_projs=qw( gpsdrive-data-maps gpsdrive map-icons osm-utils);
247#@default_projs=qw( gpsdrive gpsdrive-data-maps map-icons osm-utils merkaartor opencarbox osm2pgsql   );# josm gosmore osmosis
248
249sub usage($);
250
251
252# --------------------------------------------
253# Get Options
254
255my $getopt_result = GetOptions (
256    "debug+"        => \$DEBUG,
257    "verbose+"      => \$VERBOSE,
258    "d+"            => \$DEBUG,
259    "v+"            => \$VERBOSE,
260    'help!'         => \$HELP,
261    'manual!'       => \$MANUAL,
262    'man!'          => \$MANUAL,
263
264    "fast!"         => \$do_fast,
265    "force!"        => \$FORCE,
266    "color!"        => sub { my ($a,$b)=(@_);
267                                                         if ( ! $b  ) {
268                                                                 for my $k ( keys %COLOR ) {
269                                                                         $COLOR{$k}='';
270                                                                 }
271                                                         }
272    },
273    "svn!"          => sub { my ($a,$b)=(@_);
274                                                         $do_svn_up        = $b;
275                                                         $do_svn_co        = $b;
276                                                         $do_svn_changelog = $b;
277                                                         $do_svn_cp        = $b;
278},
279    "svn-up!"        => \$do_svn_up,
280    "svn-co!"        => \$do_svn_co,
281    "svn-changelog!" => \$do_svn_changelog,
282    "svn-cp!"        => \$do_svn_cp,
283    "dir-chroot=s"   => \$dir_chroot,     
284    "dir-svn"        => \$dir_svn,
285    "dir-package-results" => \$package_result_dir,
286    "user"           => \$user,
287    "check_dependencies!" =>     \$do_chk_dep,
288    "debuild!"        => \$do_debuild,
289
290    "platforms=s"    => sub { my ($a,$b)=(@_);
291                                                          if ( '*' eq $b ) {
292                                                                  @platforms= @available_platforms;
293                                                          } elsif ( $b =~ m/\*/ ) {
294                                                                  $b =~ s,\*,\.\*,g;
295                                                                  @platforms= grep { $_ =~ m{$b} } @available_platforms;
296                                                          } else {
297                                                                  @platforms = split(',',$b);
298                                                          }
299},
300    "projects=s"     => sub { my ($a,$b)=(@_);
301                                                          if ( '*' eq $b ) {
302                                                                  @projs= @all_proj;
303                                                          } elsif ( $b =~ m/\*/ ) {
304                                                                  $b =~ s,\*,\.\*,g;
305                                                                  @projs= grep { $_ =~ m{$b} } @all_proj;
306                                                          } else {
307                                                                  @projs = split(',',$b);
308                                                          }
309},
310    'show-results'      =>  \$do_show_results,
311    'write-html-results-only!' => \$do_write_html_results_only,
312    );
313
314if ( ! $getopt_result ) {
315    die "Unknown Option\n";
316usage(0);
317}
318
319usage( $MANUAL )
320    if $MANUAL
321    || $HELP;
322
323# ------------------------------------------------------------------
324# Create a new BuildTask object
325sub new {
326    my $pkg = shift;
327    my $self;
328    $self= {@_};
329    bless $self, $pkg;
330    $self->{section} = 'all' unless $self->{section};
331#    print Dumper(\$self);
332    return $self;
333}
334
335# ------------------------------------------------------------------
336# Debugging output
337sub debug($$$){
338    my $self = shift;
339    my $level = shift;
340    my $msg = shift;
341
342    my $platform = $self->{platform}||'';
343    my $proj     = $self->{proj}||'';
344
345    return
346                unless $DEBUG >= $level;
347
348    my $msg1= '';
349    if (  $DEBUG > 5 ) {
350                $msg1 = "($platform:$proj)";
351    }
352    my ( @msg) = split(/\n/,$msg);
353
354    for my $m ( @msg ) {
355                print STDERR "DEBUG$msg1: $m\n";
356    }
357}
358
359# ------------------------------------------------------------------
360# Set/Get Section for Logging
361sub section($;$){
362    my $self = shift;
363    my $new_section= shift;
364
365    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
366
367    if ( defined ($new_section) ) {
368                $self->{section} = $new_section;
369    }
370    my $section  = $self->{section}||'all';
371    return $section;
372}
373
374# ------------------------------------------------------------------
375# Clear/Remove stored Log msgs
376sub Clear_Log($$$){
377    my $self = shift;
378
379    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
380
381    my $platform = $self->platform();
382    my $proj     = $self->proj();
383    my $section  = $self->section();
384
385    if ( ! -d $dir_log ) {
386                die "Cannot Log, Directory '$dir_log' does not exist\n";
387    }
388    my $dst_dir="$dir_log/$proj/$platform";
389    for my $file ( glob("$dst_dir/*.log*" ) ) {
390                unlink $file;
391    }
392                  }
393
394# ------------------------------------------------------------------
395# Log a msg
396sub Log($$$){
397    my $self = shift;
398    my $level    = shift;
399    my $msg      = shift;
400
401    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
402
403    my $platform = $self->{'platform'};
404    my $proj     = $self->proj();
405    my $section  = $self->section();
406
407    if ( ! -d $dir_log ) {
408                die "Cannot Log, Directory '$dir_log' does not exist\n";
409    }
410    my $dst_dir="$dir_log/$proj/$platform";
411    if ( ! -d $dst_dir ) {
412                mkpath($dst_dir)
413                        or warn "WARNING: Konnte Pfad $dst_dir nicht erzeugen: $!\n";
414    }
415
416    # Normal Log Output
417    my $log_file ="$dst_dir/$section.log"; 
418    append_file(  $log_file, "$msg\n" );
419
420    # Html Log
421    $log_file ="$dst_dir/$section.log.shtml"; 
422    if ( ! -$log_file ) {
423                append_file(  $log_file, "<html>\n<pre>\n" );
424    }
425    my $html_msg=$msg;
426    $html_msg =~ s/\</&lt;/g;
427    $html_msg =~ s/\>/&gt;/g;
428    $html_msg =~ s/^(.*(error|warn|No rule to make target|cannot read directory).*)$/<font color="RED">$1<\/font>/gmi;
429    $html_msg =~ s/^(.*(No package|was not found|No such file or directory|missing ).*)$/<font color="RED">$1<\/font>/gmi;
430    $html_msg =~ s{\033\[0m}{<\/font>}g;
431    $html_msg =~ s{\033\[91m}{<font color="RED">}g;
432    $html_msg =~ s{\033\[92m}{<font color="GREEN">}g;
433    $html_msg =~ s{\033\[94m}{<font color="BLUE">}g;
434    append_file(  $log_file, "$html_msg\n" );
435}
436
437# ------------------------------------------------------------------
438# return the filename for the last_result log File
439sub last_result_file($){
440    my $self       = shift;
441
442    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
443
444    my $platform = $self->platform();
445    my $proj     = $self->proj();
446
447    if ( ! -d $dir_log ) {
448                die "Cannot write Result, Directory '$dir_log' does not exist\n";
449    }
450    my $dst_dir="$dir_log/../last_result";
451    if ( ! -d $dst_dir ) {
452                mkpath($dst_dir)
453                        or warn "WARNING: Cannot create Path '$dst_dir': $!\n";
454    }
455
456    my $last_log="$dst_dir/result-$platform-$proj.log";
457    return $last_log;
458                                 }
459
460# ------------------------------------------------------------------
461# write or read the last result of a package
462# add caching of last result. This enables not building (successfull) two times the same package.
463sub last_result($;$){
464    my $self       = shift;
465    my $new_result = shift; # success|fail|dependencies
466
467    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
468
469    my $last_log=$self->last_result_file();
470
471    if ( defined($new_result) ) {
472                my $svn_revision = $self->svn_revision_platform();
473                my $now=time();
474                append_file( $last_log , "$new_result: $svn_revision $now\n" );
475                $self->{last_result}=$new_result;
476    } else {
477                my $last_result;
478                if ( -r "$last_log" ) {
479                        my @lines = read_file( $last_log ) ;
480                        $last_result = pop(@lines);
481                        chomp $last_result;
482                } else {
483                        $last_result='';
484                }
485                $self->{last_result}=$last_result;
486                return $last_result;
487    } 
488                        }
489
490
491# ------------------------------------------------------------------
492# read the last good result of a package
493sub last_good_result($){
494    my $self       = shift;
495
496    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
497
498    my $platform = $self->platform();
499    my $proj     = $self->proj();
500
501    my $last_log=$self->last_result_file();
502
503    my $last_result;
504    if ( -r "$last_log" ) {
505                my @lines = grep { $_ =~ m/success:/ } read_file( $last_log ) ;
506                $last_result = pop(@lines) ||'';
507                chomp $last_result;
508    } else {
509                $last_result='';
510    }
511    $last_result =~ s/.*\:\s*//g;
512    $last_result =~ s/ .*//g;
513    $self->{last_good_result}=$last_result;
514    return $last_result;
515                                 };
516
517
518# ------------------------------------------------------------------
519# check if errors already occured
520sub errors($$){
521    my $self = shift;
522    my $msg = shift;
523
524    die "Wrong Reference".ref($self)  unless ref($self) eq "BuildTask";
525
526    return $self->{errors};
527}
528
529
530# ------------------------------------------------------------------
531# Error output
532sub error($$){
533    my $self = shift;
534    my $msg = shift;
535
536    die "Wrong Reference".ref($self)  unless ref($self) eq "BuildTask";
537
538    my $platform = $self->{platform};
539    my $proj     = $self->{proj};
540
541    $self->{errors} .= "\n" if $self->{errors};
542    $self->{errors} .= $msg;
543
544    $self->Log(1,"ERROR: $msg");
545
546    my $msg1 = "($platform:$proj)";
547    my ( @msg ) = split(/\n/,$msg);
548
549    for my $m ( @msg ) {
550                print STDERR "$COLOR{RED}!!!!! ERROR$msg1: $m$COLOR{NORMAL}\n";
551    }
552}
553
554
555# ------------------------------------------------------------------
556# Warning output
557sub warning($$){
558    my $self = shift;
559    my $msg = shift;
560
561    die "Wrong Reference".ref($self)  unless ref($self) eq "BuildTask";
562
563    my $platform = $self->{platform};
564    my $proj     = $self->{proj};
565
566    $self->{warnings}.= $msg;
567    $self->Log(1,"WARNING: $msg");
568
569    my $msg1 = "($platform:$proj)";
570    my ( @msg ) = split(/\n/,$msg);
571
572    for my $m ( @msg ) {
573                print STDERR "$COLOR{RED}!!!!! WARNING:$msg1: $m$COLOR{NORMAL}\n";
574    }
575}
576
577
578# ------------------------------------------------------------------
579# split a single platform sting into seperate variables
580sub split_platform($){
581    my $platform = shift; #     ubuntu-intrepid-64
582    my ($distri,$version,$bits) = split('-',$platform);
583    return($distri,$version,$bits);
584               };
585
586# ------------------------------------------------------------------
587# return platform
588sub platform($){
589    my $self = shift;
590    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
591
592    my $platform = $self->{platform};
593    $platform || die "NO Platform specified";
594    if ( grep { $_ eq $platform } @available_platforms ){
595                return $platform;
596    } elsif ( "independent" eq $platform ) {
597                return $platform;
598    } else {
599                $self->error("Unknown Platform '$self->{platform}' used");
600    }
601}
602
603# ------------------------------------------------------------------
604# return project
605sub proj($){
606    my $self = shift;
607    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
608
609    return $self->{proj} || die "Unknown Proj";
610}
611
612# ------------------------------------------------------------------
613# subpath of the project directory
614# Example: openstreetmap-applications/utils/osmosis
615sub proj_sub_dir($) {
616    my $self = shift;
617    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
618       
619    my $platform = $self->platform();
620    my $proj     = $self->proj();
621       
622    my $proj_sub_dir=$proj2path{$proj};
623    if ( ! $proj_sub_dir ) {
624                die "Unknown Directory for Project '$proj'; Please define inside build_cluster.pl"
625    };
626    return  $proj_sub_dir;
627                         }
628
629# ------------------------------------------------------------------
630# return the base directory for a specific build
631# Example: /home/chroot/debian-squeeze-64/home/tweety/openstreetmap-applications/utils/osmosis
632sub build_dir($){
633    my $self = shift;
634    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
635
636    my $platform = $self->platform();
637    my $proj_sub_dir = $self->proj_sub_dir();
638   
639    my $build_dir = "$dir_chroot/$platform/home/$user/$proj_sub_dir/";
640    return $build_dir;
641                  }
642
643
644# ------------------------------------------------------------------
645# Directory where the svn Sourcetree is located for the project
646# Example: /home/chroot/svn/openstreetmap-applications/utils/osmosis
647sub svn_dir_full($){
648    my $self = shift;
649    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
650
651    my $proj_sub_dir = $self->proj_sub_dir();
652    return ("$dir_svn/$proj_sub_dir");
653                         }
654
655# ------------------------------------------------------------------
656# convert Project name to a svn base Directory
657sub svn_dir_base($){
658    my $self = shift;
659    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
660
661    my $proj     = $self->proj();
662    my $proj_sub_dir = $self->proj_sub_dir();
663
664    my $repository_dir=$proj_sub_dir;
665    $repository_dir=~ s,/.*,,; # First Directory-part only
666    $self->debug(7,"svn_dir_base() --> Repository: $repository_dir");
667    return $repository_dir;
668                         }
669
670# ------------------------------------------------------------------
671# Execute a command with dchroot in a chroot environment
672sub dchroot($$$){
673    my $self = shift;
674    my $dir       = shift; # Directory inside chroot
675    my $command   = shift; # command to execute
676    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
677
678    my $platform = $self->platform();
679    my $proj     = $self->proj();
680
681    # ERR: I: [debian-squeeze-64 chroot] Running command: "debuild clean"
682
683    return $self->command("dchroot --chroot $platform --directory '/home/$user/$dir' '$command'");
684};
685
686
687# ------------------------------------------------------------------
688# Execute a command
689sub command($$){
690    my $self = shift;
691    my $cmd  = shift;
692    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
693
694    my ($data,$data_out,$data_err)=('','','');
695
696    $self->debug(5, "Command: $cmd");
697
698    my ($infh,$outfh,$errfh);
699    $errfh = gensym();
700    my $pid;
701    eval {
702                $pid = open3($infh, $outfh, $errfh, $cmd);
703    };
704    if ( $@ ) {
705                $self->error("Error running Command $cmd: $@");
706                return;
707    }
708
709    my $sel = new IO::Select;
710    $sel->add($outfh,$errfh);
711
712    while(my @ready = $sel->can_read(1000)) {
713                foreach my $fh (@ready) {
714                        my $line;
715                        my $len = sysread $fh, $line, 4096;
716                        my $len1=length($line);
717                        my $chomp_line=$line;
718                        chomp($chomp_line);
719                        if(not defined $len){
720                                $self->error("Error from child: $!");
721                                return;
722                        } elsif ($len == 0){
723                                $sel->remove($fh);
724                                next;
725                        } else { # we read data alright
726                                $self->debug(7,"command: $chomp_line");
727                                if ($fh == $outfh ) {
728                                        $data_out .= $line;
729                                        $data .= $line;
730                                } elsif ( $fh == $errfh ) {
731                                        $data_err .= $line;
732                                        $data .= $line;
733                                } else {
734                                        die "Shouldn't be here\n";
735                                }
736                                }
737            }
738    }
739
740    waitpid( $pid, 0);
741    my $rc = $? >> 8;
742    $self->debug(7,"Command: ");
743    $self->debug(7,"Command: $cmd");
744    $self->debug(7,"Command: rc:$rc");
745    $self->debug(7,"Command: ^^^^^^^^^^^^^^^^");
746
747    $self->Log(5,"Command: =====================");
748    $self->Log(5,"Command: $cmd");
749    $self->Log(7,"Command: $data");
750    $self->Log(4,"Command: rc:$rc");
751    $self->Log(7,"Command: ^^^^^^^^^^^^^^^^");
752
753#    $self->debug(7,"Data: $data");
754#    $self->debug(7,"Data_out: $data_out");
755#    $self->debug(7,"Data_err: $data_err");
756
757    return $rc,$data_out,$data_err,$data;
758}
759
760# ------------------------------------------------------------------
761# Get svn revision number and write to svnrevision File
762sub write_svn_revision($){
763    my $self = shift;
764    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
765    $self->section("write_svn_revision");
766
767    my $proj     = $self->proj();
768   
769    $self->debug(5,"write_svn_revision: Proj: $proj");
770       
771    my $repository_dir=$self->svn_dir_full($proj);
772   
773    if ( ! -d "$repository_dir/debian" ) {
774                $self->error("No Debian directory found at '$repository_dir/debian'\n");
775                return -1;
776    }
777    my $svn_revision=`cd $repository_dir; svn info . | grep "Last Changed Rev" | sed 's/Last Changed Rev: //'`;
778    chomp $svn_revision;
779    $self->debug(4,"write_svn_revision: SVN Revision($proj): '$svn_revision'");
780    write_file( "$repository_dir/debian/svnrevision", $svn_revision );
781
782
783    # For josm and all it's plugins write a REVISION File
784    if ( $proj =~ /josm/ ) {
785                for my $dir ( glob( "$repository_dir/*/build.xml"), glob("$repository_dir/*/*/build.xml" ) ) {
786                        $dir = dirname($dir);
787                        my $build_xml = slurp( "$dir/build.xml" );
788                        if ( $build_xml =~ m/exec .*output="REVISION".*executable="svn"/ ) {
789                                $self->debug(5,"svn REVISION at $dir");
790                                my $svn_revision=`cd $dir; export LANG=C; svn info --xml >REVISION`;
791                        } else {
792                                $self->debug(5,"no svn REVISION at $dir requested");
793                        }               
794                }
795    }
796                                   };
797
798# ------------------------------------------------------------------
799# Get the svn-revision from the local stored svnrevision File
800# This reflects the revision checked out for ALL others
801sub svn_revision($) {
802    my $self = shift;
803    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
804       
805    my $proj_sub_dir = $self->proj_sub_dir();
806    return '' unless -r "$dir_svn/$proj_sub_dir/debian/svnrevision";
807    my $svn_revision = slurp( "$dir_svn/$proj_sub_dir/debian/svnrevision" );
808    chomp $svn_revision;
809
810    return $svn_revision;
811                         };
812
813# ------------------------------------------------------------------
814# Get the svn-revision from the local stored svnrevision File
815# in the specified platform directory
816sub svn_revision_platform($) {
817    my $self = shift;
818    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
819
820    my $proj       = $self->proj();
821    my $platform   = $self->platform();
822    my $build_dir  = $self->build_dir();
823    my $rev_file="$build_dir/debian/svnrevision";
824    if ( ! -$rev_file ) {
825                warn "Cannot read Revision File for '$platform' '$proj': '$rev_file'\n";
826                return '';
827    }
828
829    my $svn_revision = slurp( $rev_file );
830    $svn_revision =~ s/\s\n//g;
831
832    $self->debug(8,"Revision for '$platform' '$proj': is at '$svn_revision' ");
833   
834    return $svn_revision;
835                                          };
836
837
838# ------------------------------------------------------------------
839# Update the svn source tree
840sub svn_update($){
841    my $self = shift;
842    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
843    return -1 if $self->errors();
844
845    $self->section("svn_update");
846
847    my $proj     = $self->proj();
848
849    $self->debug(4,"");
850    $self->debug(4,"-----------");
851    $self->debug(3,"svn Update: Proj: $proj");
852
853    my $proj_sub_dir=$self->svn_dir_base($proj);
854
855    if ( $svn_update_done{$proj_sub_dir} ) {
856                $self->debug(4,"Repository $proj_sub_dir for $proj already updated");
857                return;
858    };
859
860    if ( ! -d "$dir_svn/$proj_sub_dir" ) {
861                $self->debug(3,"Repository $proj_sub_dir for $proj not existing");
862                return 0;
863    }
864
865    $self->debug(3,"svn up $dir_svn/$proj_sub_dir");
866        $ENV{LC_CTYPE}="en_US.UTF-8";
867    my ($rc,$out,$err,$out_all) = $self->command("svn up --accept theirs-full $dir_svn/$proj_sub_dir");
868    if ( $rc ) {
869                $self->warning("Error '$rc' in 'svn up $dir_svn/$proj_sub_dir'");
870                $self->warning("Error '$err'");
871    }
872
873    my @out = 
874                grep { $_ !~ m/^(\s*$|Fetching external|External at revision|At revision|Checked out external at revision)/ } split(/\n/,$out);
875    $self->debug(4,"OUT-U: ".join("\n",@out));
876    $self->debug(3,"Counting ".scalar(@out)." Changes while doing svn up");
877    if ( $err =~ m/run 'svn cleanup' to remove locks/ ) {
878                $self->debug(3,"We need a svn cleanup");
879                my ($rc,$out,$err,$out_all) = $self->command("svn cleanup $dir_svn/$proj_sub_dir");
880                if ( $rc) {
881                        $self->warning("Error '$rc' in 'svn cleanup $dir_svn/$proj_sub_dir'");
882                        $self->warning("Error '$err'");
883                }
884    } 
885#     elsif ( $out !~ m/At revision/ ) {
886#       $self->error("No final Revision in Output Found\n");
887#       return 0;
888#    } 
889
890    if ( $err ) {
891                my $err_out=$err;
892                $self->error("ERR: $err_out\n");
893                return 0;
894    }
895    $svn_update_done{$proj_sub_dir}++;
896                   };
897
898# ------------------------------------------------------------------
899# Checkout the svn source tree
900sub svn_checkout($){
901    my $self = shift;
902    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
903    return -1 if $self->errors();
904
905    $self->section("svn_checkout");
906
907    my $proj     = $self->proj();
908
909    $self->debug(4,"");
910    $self->debug(4,"------------");
911    $self->debug(3,"svn Checkout: Proj: $proj");
912
913    my $proj_sub_dir=$self->svn_dir_base($proj);
914
915    if ( $svn_update_done{$proj_sub_dir} ) {
916                $self->debug(4,"Repository $proj_sub_dir for $proj already updated");
917                return;
918    };
919
920    my $url=$svn_repository_url{$proj_sub_dir};
921
922        $ENV{LC_CTYPE}="en_US.UTF-8";
923    $self->debug(3,"svn co $url $dir_svn/$proj_sub_dir");
924    my ($rc,$out,$err,$out_all) = $self->command("svn co $url $dir_svn/$proj_sub_dir");
925    my @out = 
926                grep { $_ !~ m/^(\s*$|Fetching external|External at revision|At revision|Checked out external at revision)/ } split(/\n/,$out);
927    $self->debug(4,"OUT-U: ".join("\n",@out));
928    if ( $err ) {
929                $self->warning("WARNING: $err");
930    }
931    $svn_update_done{$proj_sub_dir}++;
932                         };
933
934# ------------------------------------------------------------------
935# Update the svn source tree
936sub svn_changelog($){
937    my $self = shift;
938    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
939    return -1 if $self->errors();
940
941    $self->section("svn_changelog");
942
943    my $proj     = $self->proj();
944
945    if ( $DEBUG>1 ) {
946                print STDERR "\n";
947                print STDERR "------------\n";
948                print STDERR "svn Changelog update:\n";
949                print STDERR "Proj: $proj\n";
950    }
951    my $proj_sub_dir = $self->proj_sub_dir();
952    my $debname = $proj2debname{$proj};
953
954    my $command="$dir_svn/openstreetmap-applications/utils/packaging/svn_log2debian_changelog.pl";
955    $command .= " --project_name='$debname' ";
956   
957    if ( $proj =~ m/gpsdrive.*(2.12)/ ) {
958                # No changelog Adaption
959                return;
960                # $command .= " --prefix=2.12 --release=''";
961    } elsif ( $proj =~ m/gpsdrive-[^\.\d]*([\.\d]+pre\d+)(-)?/ ) {
962                $command .= " --prefix=2.10svn --release=$1";
963    } elsif ( $proj =~ m/gpsdrive[^.\d]*(2.[\d+])/ ) {
964                $command .= " --prefix=$1svn ";
965    };
966    if ( $DEBUG ) {
967                $command .= " --debug ";
968    };
969   
970    my ($rc,$out,$err,$out_all) = $self->command("cd $dir_svn/$proj_sub_dir; $command");
971    if ( $rc) {
972                $self->warning("Error '$rc' in '$command'");
973                $self->warning("Error '$err'");
974    }
975                          };
976
977
978# ------------------------------------------------------------------
979# Update a single chroot the svn source tree
980sub svn_copy($$){
981    my $self = shift;
982    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
983    return -1 if $self->errors();
984
985    $self->section("svn_copy");
986
987    my $platform = $self->platform();
988    my $proj     = $self->proj();
989
990    $self->debug( 4, "" );
991    $self->debug( 4, "------------" );
992    $self->debug( 3, "svn Copy($platform,$proj)" );
993    my $proj_sub_dir = $self->proj_sub_dir();
994
995    if ( $do_fast ) {
996                if ( $self->svn_revision() eq $self->svn_revision_platform() ){
997                        $self->debug(7,"svn copy already done");   
998#           return 0;
999                }
1000    }
1001
1002    $self->debug(4, "Proj sub dir: '$proj_sub_dir'");
1003
1004    my $proj_svn_dir = "$dir_svn/$proj_sub_dir/";
1005    my $build_dir    = $self->build_dir();
1006
1007    if ( ! -d "$proj_svn_dir" ) {
1008                $self->error("SVN Copy Direcoty $proj_svn_dir not found");
1009    }
1010
1011    find(
1012                sub{
1013                        return if $File::Find::name =~ m,\.svn,;
1014                        return if $File::Find::name =~ m,\/.#,; # Backup Files from Emacs
1015                        return if -d $File::Find::name;
1016                        my $src=$File::Find::name;
1017                        my $dst=$File::Find::name;
1018                        $dst=~ s{^$proj_svn_dir}{$build_dir};
1019                        $self->debug(7,"--------------- missing $dst");
1020                        $self->debug(7,"SRC: $src");
1021                        $self->debug(7,"DST: $dst");
1022                        my $dst_dir=dirname($dst);
1023                        unless ( -d $dst_dir ) {
1024                                mkpath($dst_dir) 
1025                                        || $self->error("Cannot create '$dst_dir': $!");
1026                        };
1027                        copy($src,$dst)
1028                                || $self->error("!!!!!!!!!! ERROR: Cannot Copy $src->$dst: $!");
1029                        #print "File::Find::dir       $File::Find::dir\n";
1030                        #print "File                  $_              \n";
1031#           print "File::Find::name      $File::Find::name \n";
1032    },  $proj_svn_dir);
1033
1034    # ###############
1035    # XXXXXXXXXX TODO
1036    # Remove obsolete Files in the dst_dir
1037    # ###############
1038};
1039
1040
1041
1042# ------------------------------------------------------------------
1043# Update a single chroot with svn source tree and apply the patch for this platform
1044sub apply_patch($){
1045    my $self = shift;
1046    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
1047    return -1 if $self->errors();
1048
1049    $self->section("apply_patch");
1050
1051    my $platform  = $self->platform();
1052    my $proj      = $self->proj();
1053    my $build_dir = $self->build_dir();
1054    my $proj_sub_dir = $self->proj_sub_dir();
1055
1056    my $patch_file="$dir_svn/$proj_sub_dir/debian/$platform.patch";
1057    if ( -$patch_file) {
1058                # copy files from SVN-DIR
1059                for my $file ( glob("$dir_svn/$proj_sub_dir/debian/*") ){
1060                        next if -d $file;
1061                        copy($file,"$build_dir/debian/")
1062                                || $self->error("Cannot copy $file ---> $build_dir/debian/: $!");
1063                }
1064
1065                # apply patch
1066                $self->debug(5,"apply_patch($patch_file)");
1067                my ($rc,$out,$err,$out_all) = $self->command("cd $build_dir/debian/; patch <$patch_file");
1068                if ( $out_all =~ /Hunk .* FAILED at / ) {
1069                        $self->error("Error in 'patch <$patch_file'\n".
1070                                                 "Error '$out_all'");
1071                        my (@files) = ($out_all =~ m/saving rejects to file (.+\.rej)/g );
1072                        for my $file ( @files ){
1073                                my $txt = slurp("$build_dir/debian/$file");
1074                                $self->error("\n-------------------------------------------------------------------------\n".
1075                                                         "Patch Error: '$file'\n".
1076                                                         "-------------------------------------------------------------------------\n".
1077                                                         $txt);
1078                    }
1079                       
1080                        return -1;
1081                }
1082                if ( $rc ) {
1083                        $self->error("Error '$rc' in 'patch <$patch_file'");
1084                        $self->error("Error '$out_all'");
1085                        return -1;
1086                };
1087    }
1088
1089                        };
1090
1091
1092# ------------------------------------------------------------------
1093# Update the svn source tree to be able to work without a svn-binary
1094sub apply_pre_patch($){
1095    my $self = shift;
1096    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
1097    return -1 if $self->errors();
1098
1099    $self->section("apply_pre_patch");
1100
1101    my $platform = $self->platform();
1102    my $proj     = $self->proj();
1103    my $svn_dir_full = $self->svn_dir_full();
1104
1105    # For josm and all it's plugins replace the svn-REVISION-Command with true-Command File
1106    if ( $proj =~ /josm/ ) {
1107                for my $dir ( glob( "$svn_dir_full/*/build.xml"), glob("$svn_dir_full/*/*/build.xml" ) ) {
1108                        $dir = dirname($dir);
1109                        my $build_xml = slurp( "$dir/build.xml" );
1110                        if ( $build_xml =~ m/exec .*output="REVISION".*executable="svn"/ ) {
1111                                $self->debug(4,"replace svn command wit TRUE at $dir");
1112                        } else {
1113                                $self->debug(4,"no svn REVISION at $dir requested");
1114                        }               
1115                        $build_xml =~ s/output="REVISION"/output="REVISION.null"/g;
1116                        $build_xml =~ s/executable="svn"/executable="true"/g;           
1117                        $build_xml =~ s,<delete file="REVISION"/>,,g;
1118                        write_file("$dir/build.xml",$build_xml);
1119                }
1120    }
1121   
1122    # <exec append="false" output="REVISION" executable="svn" failifexecutionfails="false">
1123
1124                                };
1125
1126
1127# ------------------------------------------------------------------
1128# Do one build for platform and Project
1129sub dpkg_checkbuilddeps($) {
1130    my $self = shift;
1131    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
1132    if ( $self->errors() ) {
1133                $self->last_result("fail");
1134                return -1
1135    }
1136
1137    $self->section("debuild");
1138
1139    my $platform = $self->platform();
1140    my $proj     = $self->proj();
1141
1142    $self->debug(4,"");
1143    $self->debug(4,"------------");
1144    $self->debug(3,"dpkg-checkbuilddeps($platform,$proj)");
1145    $self->debug(4,"Platform: $platform");
1146    $self->debug(4,"Proj: $proj");
1147    my $proj_sub_dir = $self->proj_sub_dir();
1148
1149    my ($rc,$out,$err,$out_all) = $self->dchroot($proj_sub_dir ,"dpkg-checkbuilddeps");
1150    if ( $err ) {
1151                print "ERR: $err\n";
1152    }
1153    if ( $err =~ m/error: / ) {
1154                $self->error("Error in debuild Output:\n".$err);
1155    }
1156
1157
1158    # --- Check on missing Build dependencies
1159    my @dependencies= grep { $_ =~ m/^dpkg-checkbuilddeps:/ } split(/\n/,$err);
1160    @dependencies = grep { s/.*Unmet build dependencies: //g; }  @dependencies;
1161    @dependencies = map { s/\s*\|\s*/\|/g; s/\|[^\s]+//g;$_ }  @dependencies; # remove alternatives in dependencies " | xy"
1162    @dependencies = grep { s/\([\>\= \.\d\-]+\)//g;$_ }  @dependencies; # remove  "(>> 0.5.0-1)"
1163#    print "\t -2-- ".join("\n\t --- ", @dependencies)."\n";
1164#    exit;
1165    my $dep_file="$dir_chroot/$platform/home/$user/install-debian-dependencies-$proj.sh";
1166    if (  @dependencies ) {
1167                write_file($dep_file,
1168                                   "chroot $dir_chroot/$platform apt-get update\n".
1169                                   "chroot $dir_chroot/$platform dpkg --configure -a\n".
1170                                   "chroot $dir_chroot/$platform aptitude --assume-yes install ".
1171                                   join("\n", @dependencies)."\n");
1172                $self->error("!!!!!!!!!!!!!!!!!!!!!! Cannot Build Debian Package because of Missing Dependencies: \n".
1173                                         "\t".join("\n\t", @dependencies)."\n".
1174                                         "Written install suggestion to : '$dep_file'\n"       
1175                        );
1176                $self->last_result("fail-dependency");
1177                return -1;
1178    } else {
1179                unlink($dep_file);
1180    }
1181    if ( $rc) {
1182                $self->error("Error '$rc' in 'debuild binary'");
1183                $self->warning("Error '$out_all'");
1184    }
1185
1186
1187                                        }
1188
1189
1190# ------------------------------------------------------------------
1191# Do one build for platform and Project
1192sub debuild($) {
1193    my $self = shift;
1194    die "Wrong Reference '".ref($self)."'"  unless ref($self) eq "BuildTask";
1195    if ( $self->errors() ) {
1196                $self->last_result("fail");
1197                return -1
1198    }
1199
1200    $self->section("debuild");
1201
1202    my $platform = $self->platform();
1203    my $proj     = $self->proj();
1204
1205    $self->debug(4,"");
1206    $self->debug(4,"------------");
1207    $self->debug(3,"Debuild($platform,$proj)");
1208    $self->debug(4,"Platform: $platform");
1209    $self->debug(4,"Proj: $proj");
1210    my $proj_sub_dir = $self->proj_sub_dir();
1211
1212    if ( ! $do_fast ) {
1213                my ($rc,$out,$err,$out_all) = $self->dchroot($proj_sub_dir ,"debuild clean");
1214                if ( $err ) {
1215                        print "ERR: $err\n";
1216                }
1217    }
1218
1219    my ($rc,$out,$err,$out_all) = $self->dchroot($proj_sub_dir ,"debuild binary");
1220    if ( $err ) {
1221                print "ERR: $err\n";
1222    }
1223    if ( $err =~ m/error: / ) {
1224                $self->error("Error in debuild Output:\n".$err);
1225    }
1226
1227    if ( $rc) {
1228                $self->error("Error '$rc' in 'debuild binary'");
1229                $self->warning("Error '$out_all'");
1230    }
1231
1232    # ------ Collect Resulting *.deb names
1233    my $result_dir=dirname("$dir_chroot/$platform/home/$user/$proj_sub_dir/");
1234    my $svn_revision = $self->svn_revision_platform();
1235    my $revision_string= $svn_revision;
1236    if ( $proj =~ m/gpsdrive-[^\.\d]*([\.\d]+)$/ ) {
1237                $revision_string= "$1";
1238    } elsif ( $proj =~ m/gpsdrive-[^\.\d]*([\.\d]+pre\d+)(-)?/ ) {
1239                $revision_string= "$1";
1240    }
1241    my @results= grep { $_ =~ m/\.deb$/ } glob("$result_dir/*$revision_string*.deb");
1242    if ( $proj =~ m/gpsdrive-(.*pre.*)/ ) {
1243    } else {
1244                @results= grep { $_ !~ m/2.10pre/ } @results;
1245    }
1246
1247    my $result_count=scalar(@results);
1248    $self->{'results'}->{'deb-count'}=$result_count;
1249    $self->{'results'}->{'packages'}= \@results;
1250    my $result_expected = scalar(@{$package_names{$proj}});
1251    if ( ! $result_count ) {
1252                my $all_deb_in_results = join("\n\t",glob("$result_dir/*.deb"));
1253                $self->error( "!!!!!!!! WARN: NO resulting Packages for Proj '$proj' on Platform $platform.\n".
1254                                          "Expecting $result_expected packages for (svn-)revision '$revision_string'\n".
1255                                          "see results in '$result_dir'\n".
1256                                          "Other Debian Files:  \n\t$all_deb_in_results\n");
1257                $self->last_result("fail");
1258    } elsif ( $result_expected !=  $result_count ) {
1259                $self->error( "!!!!!!!! WARN: Number of resulting Packages for Proj '$proj' on Platform $platform is Wrong.\n".
1260                                          "Expecting $result_expected packages for svn-revision $revision_string, got: $result_count Packages\n".
1261                                          "see results in '$result_dir'");
1262                $self->last_result("fail");
1263    } else {
1264                # Check for missing result-packages
1265                my @names=@{$package_names{$proj}};
1266                my $missing=0;
1267                for my $name ( @{$package_names{$proj}} ) {
1268                        my $check_name="${name}_(|2\.10svn)${revision_string}_(i386|amd64|all)\.deb";
1269                        if ( ! grep { $_ =~ m/$check_name$/ } @results ) {
1270                                $self->error( "!!!!!!!! ERROR: Missing Result Package $name\n");
1271                                $missing++;
1272                        };
1273                }
1274               
1275                my $wrong_name=0;
1276                for my $name ( @results ) {
1277                        my $short_name=basename($name);
1278                        if ( ! grep { $short_name =~ m/${_}_(|2\.10svn)${revision_string}_(i386|amd64|all)\.deb$/ }  @{$package_names{$proj}} ) {
1279                                $self->error( "!!!!!!!! ERROR: Unknown Result Package '$name'\n");
1280                                $wrong_name++;
1281                        };
1282                }
1283                if ( $missing ) {
1284                        $self->last_result("missing");
1285                } elsif ( $wrong_name ) {
1286                        $self->last_result("wrong_name");
1287                } else {
1288                        $self->last_result("success");
1289                } 
1290    }
1291    $self->debug(3,"Resulting Packages($result_count):");
1292    $self->debug(4,"\n\t".join("\n\t",@results));
1293
1294
1295
1296
1297    # Move Result to one Result Place
1298    my ($distri,$version,$bits)=split_platform($platform);
1299    my $dst_dir="$package_result_dir/$distri/pool/$version";
1300    if ( ! -d $dst_dir ) {
1301                mkpath($dst_dir)
1302                        or $self->error( "!!!!!!!! WARNING: Konnte Pfad $dst_dir nicht erzeugen: $!");
1303    }
1304    for my $result ( @results ) {
1305                my $fn=basename($result);
1306                rename($result,"$dst_dir/$fn")
1307                        || $self->error( "!!!!!!!! WARNING Cannot move result '$result' to '$dst_dir/$fn': $!");
1308    }
1309
1310    my @results1= grep { $_ =~ m/\.dsc$/ } glob("$result_dir/*.dsc");
1311    for my $result ( @results1 ) {
1312                my $fn=basename($result);
1313                rename($result,"$dst_dir/$fn")
1314                        || $self->error( "!!!!!!!! WARNING Cannot move result '$result' to '$dst_dir/$fn': $!");
1315    }
1316
1317    @results1= grep { $_ =~ m/\.changes$/ } glob("$result_dir/*.changes");
1318    for my $result ( @results1 ) {
1319                my $fn=basename($result);
1320                rename($result,"$dst_dir/$fn")
1321                        || $self->error( "!!!!!!!! WARNING Cannot move result '$result' to '$dst_dir/$fn': $!");
1322    }
1323
1324}
1325
1326
1327# ------------------------------------------------------------------
1328sub show_results(){
1329    printf "%-15s %6s ","Project","svn";
1330    for my $platform ( @platforms ) {
1331                my $print_platform=$platform;
1332                $print_platform=~ s/(debian|ubuntu)-//;
1333                $print_platform=~ s/-.*//g;
1334                printf "%-7s ",$print_platform ;
1335    }
1336    print  "\n";
1337    printf "%-15s %6s ","","";
1338    for my $platform ( @platforms ) {
1339                my $print_platform=$platform;
1340                $print_platform=~ s/(debian|ubuntu)-//;
1341                $print_platform=~ s/.*-//g;
1342                printf "%-7s ",$print_platform ;
1343    }
1344    print  "\n";
1345
1346    for my $proj ( @projs ) {
1347                my $proj_rev=svn_revision( bless({proj=>$proj,platform=>'independent'},'BuildTask') );
1348                my $p_proj=$proj;
1349                $p_proj=~ s/osm-mapnik-world-boundaries/osm-world-bound/;
1350                $p_proj=~ s/gpsdrive-data-maps/gpsdrive-maps/;
1351                printf "%-15s %6d ",$p_proj,$proj_rev;
1352                for my $platform ( @platforms ) {
1353#           print "$platform ";
1354                        my $task = $RESULTS->{$platform}->{$proj};
1355                        if ( ! defined ( $task ) )  {
1356                                $task = BuildTask->new( proj => $proj, platform => $platform );
1357                        };
1358                        my $svn_revision_platform = $task->svn_revision_platform()||'';
1359                        my $svn_revision = $task->svn_revision()||'';
1360                        my $last_result=$task->last_result();
1361                       
1362                        $task->{svn_base_revision}= $svn_revision;
1363                        if ( $svn_revision eq $svn_revision_platform) {
1364                                $task->{svn_up_to_date}=1;
1365                                $task->{color_rev}=$COLOR{GREEN};
1366                        } else {
1367                                $task->{svn_up_to_date}=0;
1368                                $task->{color_rev}=$COLOR{BLUE};
1369                        }   
1370                        if ( ! $svn_revision_platform ) {
1371                                $task->{color_res}="+$COLOR{GREEN}";
1372                        } elsif ( $last_result =~ m/^success: $svn_revision_platform\s/ ) {
1373                                $task->{color_res}="+$COLOR{GREEN}";
1374                        } else {
1375                                $task->{color_res}="-$COLOR{RED}";
1376                                $task->{color_rev}=$COLOR{RED};
1377                        };
1378
1379                        my $color_rev = $task->{color_rev};
1380                        my $color_res = $task->{color_res};
1381                        my ( $res,$rev,$date)  = split(/:\s*|\s+/,$task->last_result());
1382                        $rev ||='';
1383                        my $rev_last_good  = $task->last_good_result();
1384                        my $print_platform=$platform;
1385                        $print_platform=~ s/(debian-|ubuntu-)//;
1386
1387                        if ( $NO_BUILD{$proj} && ($platform =~ m{$NO_BUILD{$proj}} )) {
1388                                print "Do not build $proj on $platform\n";
1389                                $rev= "no-build";
1390                                $color_res="blue";
1391                        }
1392
1393                        print "$color_res"; #. $print_platform."$COLOR{NORMAL} " ;
1394                        printf "$color_rev%-6s$COLOR{NORMAL} ", $rev;
1395                        if (  $rev_last_good && $rev ne $rev_last_good ) {
1396                                print "$COLOR{GREEN}($rev_last_good)$COLOR{NORMAL}";
1397                        }
1398                }
1399                print "\n";
1400    }
1401}
1402# ------------------------------------------------------------------
1403sub write_html_results(){
1404    my $html_report="$dir_log/results.shtml";
1405    my $fh = IO::File->new(">$html_report");
1406#    print $fh "<html>\n";
1407    print $fh "<!--#include virtual=\"/header.shtml\" -->\n";
1408    print $fh "<div id=\"content\">\n";
1409    print $fh "<div>\n";
1410    print $fh "<H1>Results from the Build-Cluster</H1>\n";
1411    print $fh localtime(time())."\n";
1412    print $fh "<br/>\n";
1413    print $fh "<br/>\n";
1414    print $fh "<table border=1>\n";
1415   
1416        # Header with Platform names
1417    print  $fh "<tr><th>Project</th><th>svn</th>";
1418    for my $platform ( @platforms ) {
1419                my $print_platform=$platform;
1420                $print_platform=~ s/(debian|ubuntu)-/$1\<br\/\>/;
1421                $print_platform=~ s/-/ /g;
1422               
1423                print $fh "<th><font size=\"-3\">$print_platform </font></th>" ;
1424               
1425    }
1426    print  $fh "</tr>\n";
1427       
1428    my $count_green=0;
1429    my $count_blue=0;
1430    my $count_red=0;
1431
1432        # Each Project get it's own line in the Overview
1433    for my $proj ( @projs ) {
1434                print  $fh "<tr>\n";
1435                my $rel_proj_log_dir="$proj";
1436                printf $fh "    <td><font size=\"-3\"><a href=\"$rel_proj_log_dir\">%s</a></font></td>\n",$proj;
1437               
1438                my $proj_rev=svn_revision( bless({proj=>$proj,platform=>'independent'},'BuildTask') );
1439                print $fh "     <td><font size=\"-3\">$proj_rev</font></td>\n";
1440               
1441                for my $platform ( @platforms ) {
1442                        my $task = $RESULTS->{$platform}->{$proj};
1443                        my $rel_log_dir="$proj/$platform";
1444                        if ( ! defined ( $task ) )  {
1445                                $task = BuildTask->new( proj => $proj, platform => $platform );
1446                        };
1447                        my $svn_revision_platform = $task->svn_revision_platform()||'';
1448                        my $svn_revision = $task->svn_revision()||'';
1449                        my $last_result=$task->last_result();
1450                        my $color_rev;
1451                        my $color_res;
1452                        if ( $svn_revision eq $svn_revision_platform) {
1453                                $color_rev="GREEN";
1454                        } else {
1455                                $color_rev="BLUE";
1456                                $count_blue++;
1457                        }   
1458                        my ( $res,$rev,$date)  = split(/:\s*|\s+/,$task->last_result());
1459                        $rev ||='';
1460                        if ( $NO_BUILD{$proj} && ($platform =~ m{$NO_BUILD{$proj}} )) {
1461                                $rev= "no-build";
1462                                $color_rev="black";
1463                        } elsif ( ! $svn_revision_platform ) {
1464                                $color_res="GREEN";
1465                        } elsif ( "$last_result " =~ m/^success: $svn_revision_platform / ) {
1466                                $color_res="GREEN";
1467                                $count_green++;
1468                        } else {
1469                                $color_res="RED";
1470                                $color_rev="RED";
1471                                $count_red++;
1472                        };
1473                       
1474                        my $rev_last_good  = $task->last_good_result();
1475                        my $print_platform=$platform;
1476                        $print_platform=~ s/(debian-|ubuntu-)//;
1477                       
1478                       
1479                        print $fh  "    <td valign=top>";
1480                        print $fh  "<A href=\"$rel_log_dir\">";
1481                        printf $fh "<font size=\"-2\" color=\"$color_rev\">%-6s</font>\t" , $rev;
1482                        $date && print $fh "<br/><FONT size=\"-4\"  color=\"$color_rev\">".
1483                                time2str("%e.%m<br/> %H:%M\n", $date)."</FONT>";
1484                        #time2str("%y/%m/%e %H:%M\n", $date)."</FONT>";
1485                        if (  $rev_last_good
1486                                  && ( $rev ne $rev_last_good ) 
1487                                ) {
1488                                print $fh "\n<br/>              <FONT size=\"-2\" color=\"GREEN\">($rev_last_good)</font>\n";
1489                        }
1490                        print $fh " </a> </td>\n\n";
1491                }
1492                print $fh "\n";
1493                print  $fh "</tr>\n";
1494    }
1495
1496    print $fh "</table>\n";
1497    print $fh "<br/>\n";
1498    print $fh "Colors:\n";
1499    print $fh "<ul>\n";
1500
1501    print $fh "<li><FONT color=\"green\">green</font>: $count_green Build successfull</li>\n";
1502    print $fh "<li><FONT color=\"blue\">blue</font>: $count_blue Build is old but successfull</li>\n";
1503    print $fh "<li><FONT color=\"red\">red</font>: $count_red Build failed</li>\n";
1504    print $fh "</ul>\n";
1505
1506        print $fh "<br/><a href=history.shtml>History</a>";
1507
1508    print $fh "</html>\n";
1509    $fh->close();
1510
1511       
1512    print  "$dir_log/history.txt", "\n" ;
1513    append_file(  "$dir_log/history.txt", "\n" . 
1514                                  "<tr><td>".localtime(time())."</td>" .
1515                                  "<td>$count_green</td>".
1516                                  "<td>$count_blue</td>".
1517                                  "<td>$count_red</td>".
1518                                  "<td>".scalar( @platforms )."</td>".
1519                                  "<td>".scalar(@projs )."</td>".
1520
1521                                  "</tr>\n"
1522                );
1523       
1524
1525    # Create Index for each proj/platform
1526    for my $proj ( @projs ) {
1527                for my $platform ( @platforms ) {
1528                        my $html_index_dir="$dir_log/$proj/$platform";
1529                        if ( ! -d $html_index_dir ) {
1530                                mkpath($html_index_dir)
1531                                        or warn "WARNING: Konnte Pfad $html_index_dir nicht erzeugen: $!\n";
1532                        }
1533                        my $html_index="$html_index_dir/index.shtml";
1534                        my $fh = IO::File->new(">$html_index");
1535                        print $fh "<!--#include virtual=\"/header.shtml\" -->\n";
1536                        print $fh "<div>\n";
1537                        print $fh "<H1><a href=\"../../results.shtml\">Results from the Build-Cluster</a></H1>\n";
1538                        print $fh "<H2>Project: $proj</H2>\n";
1539                        print $fh "<H2>Platform: $platform</H2>\n";
1540
1541                        print $fh "<table><tr>\n";
1542                        print $fh "<td valign=\"top\">\n";
1543                       
1544                        print $fh "Log Files:";
1545                        print $fh "<ul>";
1546                        debug({proj=>$proj,platform=>$platform},5,"Files:");
1547                        for my $file ( glob("$html_index_dir/*.shtml") ) {
1548                                my $file_name = basename($file);
1549                                debug({proj=>$proj,platform=>$platform},5,"              $file");
1550                                next if $file_name eq "index.shtml";
1551                               
1552                                my @lines = read_file( $file ) ;
1553                                my $count_warn=(grep {$_ =~ m/warn/i } @lines);
1554                                my $count_error=(grep {$_ =~ m/error/i } @lines);
1555                                my ( $disp_name ) = ( $file_name =~ m/(.*)\.shtml/ );
1556                                print $fh "<li><A href=\"$file_name\">$disp_name</a>";
1557                                print $fh "<br/>&nbsp;&nbsp;error: $count_error" if $count_error;
1558                                print $fh "<br/>&nbsp;&nbsp;warn: $count_warn" if $count_warn;
1559                                print $fh "</li>\n";
1560                        }
1561                        print $fh "</ul>";
1562                        print $fh "</td>\n";
1563                       
1564                       
1565                        # -----------------------------------------------------------------------
1566                        # list of Debian Packages
1567                        my $task=BuildTask->new( proj     => $proj ,
1568                                                                         platform => $platform );   
1569                        my $rev_last_good  = $task->last_good_result();
1570                        my $res_last  = $task->last_result();
1571                        #print "rev_last_good($proj ,$platform) '$rev_last_good'\n";
1572                       
1573                        print $fh "<td valign=\"top\">\n";
1574                        print $fh "Status:<br/><br/>\n";
1575                        print $fh "Last Good Revision:<br/>&nbsp;&nbsp; $rev_last_good<br/><br/>\n";
1576                        print $fh "Last Result:<br/>&nbsp;&nbsp; $res_last<br/>\n";
1577                        print $fh "</td>\n";
1578                       
1579                       
1580                        #$package_result_dir
1581                        my ($distri,$version,$bits)=split_platform($platform);
1582                       
1583                        my $platform_glob='{i386,amd64,all}';
1584                        $platform_glob='{i386,all}' if $bits eq "32";
1585                        $platform_glob='{amd64,all}' if $bits eq "64";
1586                       
1587                        print $fh "<td valign=\"top\">\n";
1588                        print $fh "<A href=\"/$distri/pool/$version/\">Packages ($distri $version)</a>:\n";
1589                        if ( ${rev_last_good} ) {
1590                               
1591                                print $fh "\t<ul>\n";
1592                                for my $name ( @{$package_names{$proj}} ) {
1593                                        print $fh "\t<li>$name:\n";     
1594
1595                                        $task->debug(7,"glob($package_result_upload_dir/$distri/pool/$version/${name}_${rev_last_good}_${platform_glob}.deb");
1596                                        my @files = glob("$package_result_upload_dir/$distri/pool/$version/${name}_*${rev_last_good}_${platform_glob}.deb");
1597                                        @files = grep { -s $_ } @files;
1598                                        if ( @files ) {
1599                                                print $fh "\t<ul>\n";
1600                                                for my $file ( @files ) {
1601                                                        my $file_name = basename($file);
1602                                                        my $link = $file;
1603                                                        $link =~ s/^$package_result_upload_dir//;
1604                                                        #print "\t$link\n";     
1605                                                        print $fh "\t<li><A href=\"$link\"> $file_name</a></li>\n";     
1606                                                }
1607                                                print $fh "\t</ul>\n";
1608                                        } else {
1609                                                print $fh "<FONT color=\"RED\">No Files found</font>\n";
1610                                        }
1611                                        print $fh "</li>\n";
1612                                }
1613                                print $fh "\t<ul>\n";
1614                        }
1615                        print $fh "</td>\n";
1616                        print $fh "</tr></table>\n";
1617
1618                        print $fh localtime(time())."\n";
1619
1620                        print $fh "<br/><br/><a href=\"../../results.shtml\">Back to Overview</a>\n";
1621                        print $fh "</div>\n";
1622
1623                        for my $file ( glob("$html_index_dir/*.shtml") ) {
1624                                my $file_name = basename($file);
1625                                next if $file_name eq "index.shtml";
1626                                next if $file_name eq "summary.log.shtml";
1627                                my ( $disp_name ) = ( $file_name =~ m/(.*)\.shtml/ );
1628                                print $fh "<h3><A href=\"$file_name\">$disp_name</a></h3>";
1629                                my @lines = read_file( $file ) ;
1630                                #print $fh join("<br/>\n",(grep {$_ =~ m/^(.*(warn|error).*)$/i } @lines));
1631                                print $fh join("<br/>\n",(grep {$_ =~ m/^(.*(failed|error).*)$/i } @lines));
1632                                print $fh "<br/>\n";
1633                        }
1634                        print $fh "<!--#include virtual=\"/footer.shtml\" -->\n";
1635                        $fh->close();
1636                }
1637    }
1638}
1639
1640# ------------------------------------------------------------------
1641sub usage($){
1642    my $opt_manual = shift;
1643
1644    print STDERR <<EOUSAGE;
1645usage: $0 [Options]
1646
1647build_cluster is a tool to compile and build packages for some software-projects.
1648
1649Available Projects:
1650    @available_proj
1651
1652        These Projects will be compiled for a set of
1653
1654Available Platforms:
1655    @available_platforms
1656
1657        The build-cluster-tool expects a set of chroot environments to work in the
1658        directory
1659        $dir_chroot
1660
1661Logfiles are written to:
1662        $dir_log
1663
1664        The svn Checkout is done to:
1665        $dir_svn
1666
1667        Results are collected in the Directory
1668        $package_result_dir
1669
1670EOUSAGE
1671
1672        pod2usage(1) if $HELP;
1673        pod2usage(-verbose=>2) if $opt_manual;
1674
1675
1676
1677        die "\n";
1678
1679}
1680
1681# ------------------------------------------------------------------
1682# Main
1683# ------------------------------------------------------------------
1684@platforms= @default_platforms
1685    unless @platforms;
1686
1687@projs= @default_projs 
1688    unless @projs;
1689
1690
1691if ( $do_write_html_results_only ) {
1692    write_html_results();
1693    exit 0;
1694}
1695
1696if ( $DEBUG >= 1 ) {
1697    print "----------------------------------------\n";
1698    print "Platforms: " . join(" ",@platforms)."\n";
1699    print "Projects:  " . join(" ",@projs)."\n";
1700    print "\t--".($do_svn_up    ?'':'no-')."svn-up\n";
1701    print "\t--".($do_svn_co    ?'':'no-')."svn-co\n";
1702    print "\t--".($do_svn_changelog?'':'no-')."svn-changelog\n";
1703    print "\t--".($do_svn_cp    ?'':'no-')."svn-cp\n";
1704    print "\t--".($do_chk_dep   ?'':'no-')."check_dependencies\n";
1705    print "\t--".($do_debuild   ?'':'no-')."debuild\n";
1706    print "\t--".($do_fast      ?'':'no-')."fast\n";
1707    print "\t--".($FORCE        ?'':'no-')."force\n";
1708    print "\t--".($DEBUG        ?'':'no-')."debug = $DEBUG\n";
1709    print "----------------------------------------\n";
1710}
1711
1712show_results() 
1713    if ( $DEBUG > 1 || $VERBOSE > 1 ) && $do_show_results;
1714
1715# svn Update
1716for my $proj ( @projs ) {
1717    my $task=BuildTask->new( proj     => $proj ,
1718                                                         platform => 'independent' );
1719
1720    $task->svn_update( )        if $do_svn_up;
1721    $task->svn_checkout(  )     if $do_svn_co;
1722    $task->write_svn_revision() if $do_svn_up || $do_svn_co;
1723    $task->apply_pre_patch()    if $do_svn_up || $do_svn_co || $do_svn_cp;;
1724
1725    # Update Changelogs
1726    $task->svn_changelog()      if $do_svn_changelog;
1727}
1728
1729
1730if ( $DEBUG >= 3 ) {
1731    print "----------------------------------------\n";
1732    print "Platforms: " . join(" ",@platforms)."\n";
1733    print "Projects:  " . join(" ",@projs)."\n";
1734    print "----------------------------------------\n";
1735}
1736
1737for my $platform ( @platforms ) {
1738    #print STDERR "\n";
1739    print STDERR "$COLOR{BLUE}------------------------------------------------------------ Platform: $platform$COLOR{NORMAL}\n"
1740                if $DEBUG > 3;
1741
1742    for my $proj ( @projs ) {
1743
1744                if ( $NO_BUILD{$proj} && $platform =~ m {$NO_BUILD{$proj}} ) {
1745                        print "Do not build $proj on $platform\n";
1746                        next;
1747                }
1748
1749                my $task = BuildTask->new( 
1750                        proj     => $proj, 
1751                        platform => $platform ,
1752                        );
1753                if ( $DEBUG>2 || $VERBOSE>2 ) {
1754                        print STDERR "$COLOR{MAGENTA}------------------------------------------------  Platform: $platform$COLOR{NORMAL}        Project: $proj$COLOR{NORMAL}\n";
1755                }
1756
1757                $task->Clear_Log();
1758
1759                if ( $do_fast ) {
1760                        my $svn_revision = $task->svn_revision();
1761                        my $last_result=$task->last_result();
1762                        if ( $svn_revision && ( $last_result =~ m/^success: $svn_revision /) ) {
1763                                if ( $VERBOSE >1 || $DEBUG >2 ) {
1764                                        print STDERR "$COLOR{GREEN}---- Project: $proj ($platform) '$last_result' up-to-date --> skipping$COLOR{NORMAL}\n";
1765                                }
1766                                next;
1767                        } else {
1768                                $task->debug(3, "$COLOR{BLUE}------ Project: $proj build not up to date: '$last_result'$COLOR{NORMAL}");
1769                        };
1770                }
1771
1772                $task->svn_copy()       if $do_svn_cp;
1773                $task->apply_patch();
1774                $task->dpkg_checkbuilddeps()    if $do_chk_dep;
1775                $task->debuild()        if $do_debuild;
1776                $RESULTS->{$platform}->{$proj}=$task;
1777                $task->section("summary");
1778                $task->Log( 1,"\n\nRESULTS:\n".
1779                                        Dumper(\$task) );
1780
1781                my $last_result=$task->last_result();
1782                if ( $VERBOSE || $DEBUG ) {
1783                        print STDERR    "$COLOR{MAGENTA}---  Platform: $platform$COLOR{NORMAL}  Project: $proj  $last_result $COLOR{NORMAL}\n";
1784                }
1785               
1786    }
1787};
1788
1789if ( $DEBUG >= 3) {
1790    print "RESULTS:\n";
1791    print Dumper(\$RESULTS);
1792}
1793
1794show_results() 
1795    if $do_show_results;
1796
1797write_html_results()
1798    if $do_show_results;
1799
1800
1801__END__
1802
1803=pod
1804
1805=head1 Options
1806
1807=over
1808
1809=item --debug
1810
1811Add some Debugging Output
1812
1813=item --verbose
1814
1815Be more verbose
1816
1817=item --fast
1818
1819Skip some not really needed tasks. (debuild clean, ...)
1820And check for already successfully build packages.
1821
1822=item --no-color
1823
1824switch of coloring output. This is needed for example if run in a cronjob.
1825
1826=item --svn-up / --no-svn-up
1827
1828Switch on/off doing subversion update to the projects.
1829
1830=item --svn / --no-svn
1831
1832Switch on/off doing all subversion actions.
1833
1834=item --svn-co / --no-svn-co
1835
1836Switch on/off doing subversion co on the projects.
1837
1838=item --svn-changelog / --no-svn-changelog
1839
1840Switch on/off the creation of an automated changelog from subversion.
1841
1842=item --svn-cp / --no-svn-cp
1843
1844Switch on/off doing copying from the subversion folder to the chroot subdirectories.
1845
1846=item --dir-chroot
1847
1848Specify the directory where all chroots are located.
1849
1850=item --dir-svn
1851
1852Specify the directory where the svn checkou copy is located.
1853
1854=item --dir-package-results
1855
1856Specify the directory where the resulting packages are located.
1857
1858=item --user
1859
1860Specify the username to use for the package build directories.
1861
1862=item --check_dependencies
1863
1864Check dependencies
1865
1866=item --debuild
1867
1868do the debuild
1869
1870=item --platforms=
1871
1872Specify the platforms to build for. a * can be used to specify multiple
1873platforms with a wildcard.
1874
1875=item --projects=
1876
1877Specify the projects to build for. a * can be used to specify multiple
1878projects with a wildcard.
1879
1880=item --show-results
1881
1882Show a summary of all results. This also looks for cached results.
1883
1884=item --write-html-results-only
1885
1886Write Html Pages for the Results and exit.
1887
1888=item --help
1889
1890Help Page
1891
1892=item --man
1893
1894A little bit more detailed Man page
1895
1896=back
1897
1898
1899
1900
1901=head1 TODO:
1902
1903  - Check for another build-cluster.pl already running
1904
1905  - Add timeout to command execution. This might prevent hanging
1906    javacompiler from blocking the rest of the build-cluster.pl
1907
1908  - writing Logfiles
1909
1910  - Help/manpage
1911
1912  - Error Code checking
1913
1914  - while doing "svn up" "svn co": Check if another
1915    svn command is running on the same directory
1916
Note: See TracBrowser for help on using the repository browser.