Subversion Repositories DevTools

Rev

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