Subversion Repositories DevTools

Rev

Rev 3423 | Rev 4127 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3423 dpurdie 1
########################################################################
2
# Copyright (C) 1998-2012 Vix Technology, All rights reserved
3
#
4
# Module name   : ReleasedPackageReport.pl
5
# Module type   : Makefile system
6
# Compiler(s)   : Perl
7
# Environment(s): jats
8
#
9
# Description   : Script to create a daily report to track new packages
10
#                 released into dpkg_archive
11
#
12
#                 Script should be run once a day
13
#
14
# Usage:
15
#
16
# Version   Who      Date        Description
17
#
18
#......................................................................#
19
 
20
require 5.008_002;
21
use strict;
22
use warnings;
23
 
24
use Pod::Usage;
25
use Getopt::Long;
26
use File::Temp qw/ tempfile tempdir /;
27
 
28
use JatsError;
29
use JatsRmApi;
30
use JatsSystem;
31
 
32
#
33
#   Global data
34
#
4011 dpurdie 35
my $logbase = '/home/releasem/logs/';
3423 dpurdie 36
my @logData;
37
my %RevData;
38
my $RM_DB;
39
my $logfile;
40
my $datafile;
41
my $dataname;
42
my @mailList = (qw (
43
    David.Purdie@vixtechnology.com
44
    ));
45
my @alsoMail = (qw(John.Rowling@vixtechnology.com));
46
 
47
#-------------------------------------------------------------------------------
48
# Function        : Main
49
#
50
# Description     : Main entry point
51
#
52
# Inputs          : 
53
#
54
# Returns         : 
55
#
56
 
57
#
58
#   Program may run under cron
59
#   Extend the path
60
#
61
my $PATH = $ENV{PATH};
62
my $HOME = $ENV{HOME};
63
if ( $HOME )
64
{
65
    $PATH = "$HOME/bin:$HOME/cron:$PATH";
66
    $ENV{PATH} = $PATH;
67
}
68
 
69
#
70
#   Program will call itself to do hard work
71
#   If the 1st arg is INVOKE, then generate report and exit
72
#       This will create
73
#
74
#
75
if ( $ARGV[0] && $ARGV[0] eq 'INVOKE' )
76
{
77
    generateReport($ARGV[1], $ARGV[2]);
78
    exit 0
79
}
80
 
81
#
82
#   Determine report details
83
#   Determine yesterdays report
84
#
85
my $logname;
86
if ( $ARGV[0] )
87
{
88
    $logname = $ARGV[0];
89
}
90
else
91
{
92
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 24*60*60);
93
    $logname = sprintf("release.%4.4d.%2.2d.%2.2d.log", $year+1900, $mon +1, $mday);
94
}
95
Error ("Bad format for argument" ) unless( $logname =~ m~\.log$~ );
96
$dataname = $logname;
97
$dataname =~ s~\.log$~.csv~;
98
 
99
#
100
#   Create a temp file to capture the output of the report generation
101
#   This will include all errors
102
#
103
(undef,$logfile) = tempfile();
104
$datafile = '/tmp/' . $dataname;
105
 
106
#print "Temp file: $logfile\n";
107
#print "logname  : $logname\n";
108
#print "Data file: $datafile\n";
109
 
110
open STDOUT, '>', $logfile  or die "Can't redirect STDOUT: $!";
111
open STDERR, ">&STDOUT"         or die "Can't dup STDOUT: $!";
112
 
113
#
114
#   Invoke myself again to create the body of the report
115
#
116
my $rv = JatsCmd ('eprog', __FILE__, 'INVOKE', $logname, $datafile );
117
#print ("Rv: $rv\n");
118
#
119
#   Mail the report
120
#
121
my @mailAttachments;
122
push (@mailAttachments, '-a', $datafile ) if ( -f $datafile );
123
 
124
System ('sendEmail.pl'
125
            , '-f', 'buildadm@vixtechnology.com'
126
            , '-t',  join(',', @mailList)
127
            , '-u', 'Release Package Report: ' . $logname
128
            , '-o', "message-file=$logfile"
129
            , '-o', 'message-content-type=html'
130
 
131
            , '-q'
132
            , @mailAttachments
133
            );
134
 
135
unlink $logfile;
136
unlink $datafile;
137
print "All Done\n";
138
exit $rv;
139
 
140
#-------------------------------------------------------------------------------
141
# Function        : generateReport
142
#
143
# Description     : 
144
#
145
# Inputs          : $logname                    - Logfile name
146
#
147
# Returns         : 
148
#
149
sub generateReport
150
{
151
    my ($logname, $datafile) = @_;
152
#    $logname = "release.2012.03.28.log";
153
    Message ("logname: $logname");
154
 
155
    #
156
    #   Read and parse the log file
157
    #
158
    my $logfile = $logbase . $logname;
159
    my $fileError;
160
    open (my $log, '<', $logfile ) || ($fileError = 1);
161
 
162
    if ( $fileError )
163
    {
164
        Error "Cannot open log file: $logfile\n";
165
        exit 1;
166
    }
167
 
168
 
169
    while ( <$log> )
170
    {
171
        s~\s+$~~;
172
        next unless ( m~ make_release_changed ~ );
173
#print "$_\n";
174
 
175
        my %data;
176
        while ( m~(\w+)=("(.*?)"|(\d+))~ )
177
        {
178
            my $mb = $-[0];                     # Match begin offset
179
            my $me = $+[0];                     # Match end
180
            $data{$1} = $3 || $4;
181
    #print "$1 ---- $data{$1}\n";
182
 
183
            substr( $_, $mb, $me - $mb, '');
184
        }
185
        push @logData, \%data;
186
    }
187
 
188
    #
189
    #   Query the release manager database for info
190
    #
191
    foreach my $entry ( @logData )
192
    {
193
        getPkgDetailsByPVID ( $entry->{pv_id}, $entry );
194
    }
195
    #DebugDumpData("RevData", \%RevData );
196
 
197
    #
198
    #   Generate some nice data
199
    #   Sort by name
200
    #
201
    my %summary;
202
    open ( DATA, '>', $datafile ) || Error ("Cannot open $datafile");
203
 
204
    {
205
        my @data;
206
        push @data,'CodeReview','CodeStriker','AutoTest','ManualTest','OtherTest','PackageName','PackageVersion';
207
        print DATA join(',', @data), "\n";
208
    }
209
 
210
    print "<h1>Released Package Report</h1>\n";
211
    print "<pre style=\"font-size: medium\">\n";
212
    foreach my $entry ( sort {lc($a->{pkg_name}) cmp lc($b->{pkg_name}) } @logData )
213
    {
214
        my $pvid = $entry->{pv_id};
215
        $summary{PackagesReleased}++;
216
 
217
        my $crm = exists $RevData{$pvid}{CodeReview} ? 'M' : '-';
218
        my $crs = exists $RevData{$pvid}{CodeStriker} ? 'S' : '-';
219
 
220
        $summary{CodeReview}++ if exists $RevData{$pvid}{CodeReview};
221
        $summary{CodeStriker}++ if exists $RevData{$pvid}{CodeStriker};
222
 
223
 
224
        my $utestauto = '.';
225
        my $utestmanual = '.';
226
        my $testOther = '.';
227
 
228
        my $utest= $RevData{$pvid}{UnitTest};
229
        if ( defined $utest )
230
        {
231
            if ( $utest == 7  ) {
232
                $utestauto='A';
233
                $summary{AutoTest}++;
234
            } elsif ( $utest == 6  ) {
235
                $utestmanual = 'I';
236
                $summary{ManualTest}++;
237
            } else {
238
                $testOther = 'O';
239
                $summary{OtherTest}++;
240
            }
241
        }
242
 
243
        print "$crm$crs $utestauto$utestmanual$testOther $entry->{pkg_name}, $entry->{pkg_version}";
244
        print "\n";
245
 
246
        #
247
        #   Generate Data file too
248
        #
249
        my @data;
250
        push @data,$crm,$crs,$utestauto,$utestmanual,$testOther,$entry->{pkg_name},$entry->{pkg_version};
251
        print DATA join(',', @data), "\n";
252
 
253
    }
254
    close DATA;
255
 
256
    print "\n<hr>";
257
    print "<h2>Ledgend</h2>";
258
    print "Column-1: M: Package has a manual code review entry\n";
259
    print "Column-2: S: Package has a code striker review entry\n";
260
    print "\n";
261
    print "Column-4: A: Automated unit test performed with build\n";
262
    print "Column-5: I: Package marked as having an interactive test (often misused)\n";
263
    print "Column-6: O: Package marked as having some other form of test\n";
264
 
265
 
266
    print "<h2>Summary</h2>";
267
    print "Generated at            : ",scalar localtime() ,"\n";
268
    print "Logfile                 : $logname\n";
269
    print "Total Packages Released : ", $summary{PackagesReleased} || 0,"\n";
270
    print "With Code Review        : ", $summary{CodeReview}       || 0 ,"\n";
271
    print "With CodeStriker Entry  : ", $summary{CodeStriker}      || 0 ,"\n";
272
    print "With build test         : ", $summary{AutoTest}         || 0 ,"\n";
273
    print "Marked with Manual Test : ", $summary{ManualTest}       || 0 ,"\n";
274
    print "Marked with other Test  : ", $summary{OtherTest}        || 0 ,"\n";
275
    print "</pre>\n";
276
}
277
 
278
exit 0;
279
 
280
#-------------------------------------------------------------------------------
281
# Function        : getPkgDetailsByPVID
282
#
283
# Description     : Get Package Details
284
#
285
# Inputs          : 
286
#
287
# Returns         : 
288
#
289
 
290
sub getPkgDetailsByPVID
291
{
292
    my ($PVID, $entry) = @_;
293
    my (@row);
294
#print "---processing: $PVID\n";
295
 
296
    return unless ( $PVID );
297
    $RevData{$PVID}{ProcCount}++;
298
    $RevData{$PVID}{Entry} = $entry;
299
 
300
    # if we are not or cannot connect then return 0 as we have not found anything
301
    connectRM(\$RM_DB) unless ( $RM_DB );
302
 
303
    # First get details from pv_id
304
 
305
    my $m_sqlstr = "SELECT crev.PV_ID, crev.DATE_OF_REVIEW" .
306
                   " FROM release_manager.CODE_REVIEWS crev" .
307
                   " WHERE crev.PV_ID = $PVID";
308
 
309
    my $sth = $RM_DB->prepare($m_sqlstr);
310
    if ( defined($sth) )
311
    {
312
        if ( $sth->execute( ) )
313
        {
314
            if ( $sth->rows )
315
            {
316
                while ( @row = $sth->fetchrow_array )
317
                {
318
#                    print "@row\n";
319
                    $RevData{$PVID}{CodeReview} = 1;
320
 
321
                }
322
            }
323
            $sth->finish();
324
        }
325
    }
326
    else
327
    {
328
        Error("Prepare failure" );
329
    }
330
 
331
    ###############################
332
 
333
    $m_sqlstr = "SELECT curl.PV_ID, curl.CR_ID" .
334
                   " FROM release_manager.CODE_REVIEW_URL curl" .
335
                   " WHERE curl.PV_ID = $PVID";
336
    $sth = $RM_DB->prepare($m_sqlstr);
337
    if ( defined($sth) )
338
    {
339
        if ( $sth->execute( ) )
340
        {
341
            if ( $sth->rows )
342
            {
343
                while ( @row = $sth->fetchrow_array )
344
                {
345
#                    print "@row\n";
346
                    $RevData{$PVID}{CodeStriker} = 1;
347
                }
348
            }
349
            $sth->finish();
350
        }
351
    }
352
    else
353
    {
354
        Error("Prepare failure" );
355
    }
356
 
357
    ###############################
358
    # TEST_TYPES_FK values
359
    #
360
    #   1	Not Done
361
    #   2	Coverage
362
    #   3	Performance
363
    #   4	Memory
364
    #   5	Automatic Unit Test
365
    #   6	Interactive Unit Test
366
    #   7	Autobuild UTF
367
    #
368
 
369
    $m_sqlstr = "SELECT utest.PV_ID, utest.TEST_TYPES_FK" .
370
                   " FROM release_manager.UNIT_TESTS utest" .
371
                   " WHERE utest.PV_ID = $PVID and utest.TEST_TYPES_FK  != 1";
372
    $sth = $RM_DB->prepare($m_sqlstr);
373
    if ( defined($sth) )
374
    {
375
        if ( $sth->execute( ) )
376
        {
377
            if ( $sth->rows )
378
            {
379
                while ( @row = $sth->fetchrow_array )
380
                {
381
#                    print "@row\n";
382
                    $RevData{$PVID}{UnitTest} = $row[1];
383
                }
384
            }
385
            $sth->finish();
386
        }
387
    }
388
    else
389
    {
390
        Error("Prepare failure" );
391
    }
392
}
393
 
394