Subversion Repositories DevTools

Rev

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