8958f725168c28506b34f9dc9de4ade51f882821
[clearscm.git] / CCDB / triggers / Baseline.pl
1 #!/usr/bin/perl
2
3 =pod
4
5 =head1 NAME $RCSfile: Baseline.pl,v $
6
7 This trigger will update CCDB when baselines are completed or removed.
8
9 =head1 VERSION
10
11 =over
12
13 =item Author
14
15 Andrew DeFaria <Andrew@ClearSCM.com>
16
17 =item Revision
18
19 $Revision: 1.6 $
20
21 =item Created:
22
23 Fri Mar 11 17:45:57 PST 2011
24
25 =item Modified:
26
27 $Date: 2011/04/02 00:29:15 $
28
29 =back
30
31 =head1 DESCRIPTION
32
33 This trigger will update the CCDB when UCM baselines are completed or removed.
34 It is implemented as a post operation trigger on the mkbl_complete and rmbl
35 Clearcase operations. It should be attached to all UCM vobs (i.e. pvobs) that
36 you wish CCDB to monitor. If using mktriggers.pl the trigger defintion is:
37  
38  Trigger:        CCDB_BASELINE
39    Description:  Updates CCDB when baselines are completed or removed
40    Type:         -element -all
41    Opkinds:      -postop mkbl_complete,rmbl
42    ScriptEngine: Perl
43    Script:       Baseline.pl
44    Vobs:         ucm
45  EndTrigger
46
47 =cut
48
49 use strict;
50 use warnings;
51
52 use FindBin;
53 use Data::Dumper;
54     
55 $Data::Dumper::Indent = 0;
56
57 use lib $FindBin::Bin, "$FindBin::Bin/../lib", "$FindBin::Bin/../../lib";
58
59 # I would like to use Clearcase but doing so causes a problem when the trigger
60 # is run from Clearcase Explorer - something about my use of open3 :-(
61
62 use TriggerUtils;
63 use CCDBService;
64
65 triglog 'Starting trigger';
66
67 TriggerUtils::dumpenv;
68
69 my $VERSION  = '$Revision: 1.6 $';
70   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
71
72 my $CCDBService = CCDBService->new;
73
74 trigdie 'Unable to connect to CCDBService', 1
75   unless $CCDBService->connectToServer;
76   
77 my ($err, $msg, $request);
78
79 triglog "CLEARCASE_OP_KIND: $ENV{CLEARCASE_OP_KIND}";
80
81 foreach (split / /, $ENV{CLEARCASE_BASELINES}) {
82   my ($name, $pvob) = split /\@/;
83
84   trigdie 'Baseline name not known', 1
85     unless $name;
86
87   trigdie 'Pvob name not known', 1
88     unless $pvob;
89
90   triglog "Processing Baseline: $name\@$pvob";
91   
92   my $pvobName = vobname $pvob;
93
94   if ($ENV{CLEARCASE_OP_KIND} eq 'mkbl_complete') {
95     triglog "Hit mkbl_complete!";
96     
97     TriggerUtils::dumpenv;
98
99     my $cmd = "lsbl -fmt \"%[activities]p\" $name\@$pvob";
100    
101     my @output = `cleartool $cmd`; chomp @output;
102     my $status = $?;
103
104     trigdie "Unable to execute $cmd (Status: $status)\n" 
105           . join ("\n", @output), $status
106       if $status;
107
108     foreach my $activity (split / /, $output[0]) {
109       my $baselineActivityXref = Dumper {
110         baseline => $name,
111         activity => $activity,
112         pvob     => $pvobName,
113       };
114
115       # Squeeze out extra spaces
116       $baselineActivityXref =~ s/ = /=/g;
117       $baselineActivityXref =~ s/ => /=>/g;
118
119       $request = "AddBaselineActivityXref $baselineActivityXref";
120     
121       triglog "Executing the request: $request";
122
123       ($err, $msg) = $CCDBService->execute ($request);
124   
125       trigdie "Baseline: Unable to execute request: $request\n" 
126             . join ("\n", @$msg), $err
127         if $err;
128     } # foreach
129
130     next;
131   } elsif ($ENV{CLEARCASE_OP_KIND} eq 'mkbl') {
132     my $baseline = Dumper {
133       name => $name,
134       pvob => $pvobName,
135     };
136   
137     # Squeeze out extra spaces
138     $baseline =~ s/ = /=/g;
139     $baseline =~ s/ => /=>/g;
140   
141     $request = "AddBaseline $baseline";
142       
143     triglog "Executing request: $request";
144
145     ($err, $msg) = $CCDBService->execute ($request);
146     
147     trigdie "Unable to execute request: $request\n"
148           . join ("\n", @$msg), $err
149       if $err;
150
151     my $cmd = "lsstream -fmt \"%[activities]p\" $ENV{CLEARCASE_STREAM}";
152     
153     my @output = `cleartool $cmd`; chomp @output;
154     my $status = $?;
155     
156     trigdie "Unable to execute $cmd (Status: $status)\n"
157           . join ("\n", @output), $status
158       if $status;
159     
160     foreach (split / /, $output[0]) {
161       my $baselineActivityXref = Dumper {
162         baseline => $name,
163         activity => $_,
164         pvob     => $pvobName,
165       };
166       
167       # Squeeze out extra spaces
168       $baselineActivityXref =~ s/ = /=/g;
169       $baselineActivityXref =~ s/ => /=>/g;
170
171       $request = "AddBaselineActivityXref $baselineActivityXref";
172
173       triglog "Executing request: $request";
174
175       ($err, $msg) = $CCDBService->execute ($request);
176       
177       # Just ignore dups
178       trigdie "Unable to execute request: $request\n"
179             . join ("\n", @$msg), $err
180         unless $err == 0 or $err == 1062;
181     } # foreach
182     
183     next;
184   } elsif ($ENV{CLEARCASE_OP_KIND} eq 'rmbl') {
185     $request = "DeleteBaseline $name $pvobName";
186   } # if
187
188   triglog "Executing request: $request";
189   
190   ($err, $msg) = $CCDBService->execute ($request);
191
192   trigdie "Unable to execute request: $request\n"
193         . join ("\n", @$msg), $err
194     if $err;
195 } # foreach
196   
197 $CCDBService->disconnectFromServer;
198
199 triglog 'Ending trigger';
200
201 exit 0;
202
203 =pod
204
205 =head1 CONFIGURATION AND ENVIRONMENT
206
207 DEBUG: If set then $debug is set to this level.
208
209 VERBOSE: If set then $verbose is set to this level.
210
211 TRACE: If set then $trace is set to this level.
212
213 =head1 DEPENDENCIES
214
215 =head2 Perl Modules
216
217 L<FindBin>
218
219 L<Data::Dumper|Data::Dumper>
220
221 =head2 ClearSCM Perl Modules
222
223 =begin man 
224
225  CCDBSerivce
226  TriggerUtils
227
228 =end man
229
230 =begin html
231
232 <blockquote>
233 <a href="http://clearscm.com/php/cvs_man.php?file=CCDB/lib/CCDBService.pm">CCDBService</a><br>
234 <a href="http://clearscm.com/php/cvs_man.php?file=CCDB/triggers/TriggerUtils.pm">TriggerUtils</a><br>
235 </blockquote>
236
237 =end html
238
239 =head1 BUGS AND LIMITATIONS
240
241 There are no known bugs in this script
242
243 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
244
245 =head1 LICENSE AND COPYRIGHT
246
247 Copyright (c) 2011, ClearSCM, Inc. All rights reserved.
248
249 =cut