Subversion Repositories DevTools

Rev

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

Rev Author Line No. Line
267 dpurdie 1
########################################################################
2
# Copyright ( C ) 2008 ERG Limited, All rights reserved
3
#
4
# Module name   : jats_svnasave_build.pl
5
# Module type   : JATS Utility
6
# Compiler(s)   : Perl
7
# Environment(s): jats
8
#
9
# Description   : Build Daemon Support Utility
10
#                 This utility will:
341 dpurdie 11
#                   +   Assume the CWD is where the build file is located
12
#                   +   Within a version controlled view
267 dpurdie 13
#                   +   Determine a suitable label for the package
14
#                   +   Save the build file in the view
15
#                   +   Label the resultant view
16
#
17
# Usage:        : See POD at end of this file
18
#
19
#               jats etool  jats_svnasave_build
20
#                   -infile     auto.xml/auto.pl
21
#                   -outfile    xxxdepends.xml/build.pl
22
#                   -pname      package_name
23
#                   -pversion   package_version
24
#                   -infofile   path_to_info_file
353 dpurdie 25
#                   -wiplabel   Existing WIP label (deprecate)
341 dpurdie 26
#                   -baselabel  View label
353 dpurdie 27
#                   -isawip     Is A WIP (optional)
267 dpurdie 28
#
29
#......................................................................#
30
 
31
use strict;
32
use warnings;
33
use JatsError;
34
use JatsBuildFiles;
35
use JatsSystem;
36
use JatsProperties;
37
use Getopt::Long;
38
use Pod::Usage;                             # required for help support
39
use File::Copy;
40
use JatsSvn;
41
use Cwd;
42
 
43
################################################################################
44
#   Option variables
45
#
46
 
47
my $VERSION = "2.0.0";                      # Update this
48
my $opt_debug   = $ENV{'GBE_DEBUG'};        # Allow global debug
49
my $opt_verbose = $ENV{'GBE_VERBOSE'};      # Allow global verbose
50
my $opt_infile  = "auto.pl";
51
my $opt_ofile = "build.pl";
52
my $opt_help = 0;
53
my $opt_infofile;
54
my $opt_pname;
55
my $opt_pversion;
56
my $opt_wiplabel;
341 dpurdie 57
my $opt_baselabel;
353 dpurdie 58
my $opt_isa_wip;
267 dpurdie 59
 
60
#
61
#   Globals
62
#
63
my $root_dir;
64
my $tag_label;
65
 
66
my $ws_root;
67
my $pkg_root;
68
 
69
#
70
#   Configuration options
71
#
72
my $result = GetOptions (
73
                "help:+"        => \$opt_help,              # flag, multiple use allowed
74
                "manual:3"      => \$opt_help,              # flag
75
                "verbose:+"     => \$opt_verbose,           # flag
76
 
77
                "outfile=s"     => \$opt_ofile,             # string
78
                "infile=s"      => \$opt_infile,            # string
79
 
80
                "infofile=s"    => \$opt_infofile,          # string
81
                "pname=s"       => \$opt_pname,             # string
82
                "pversion=s"    => \$opt_pversion,          # string
83
                "wiplabel=s"    => \$opt_wiplabel,          # string
341 dpurdie 84
                "baselabel=s"   => \$opt_baselabel,         # string
353 dpurdie 85
                "isawip:+"      => \$opt_isa_wip,           # Flag
267 dpurdie 86
 
87
                #
88
                #   Update documentation at the end of the file
89
                #
90
                );
91
 
92
#
93
#   Process help and manual options
94
#
95
pod2usage(-verbose => 0, -message => "Version: $VERSION")  if ($opt_help == 1  || ! $result);
96
pod2usage(-verbose => 1)  if ( $opt_help == 2 );
97
pod2usage(-verbose => 2)  if ( $opt_help > 2 );
98
 
99
#
100
#   Configure the error reporting process now that we have the user options
101
#
102
ErrorConfig( 'name'    =>'SVNABTSAVE',
103
             'verbose' => $opt_verbose,
104
           );
105
 
106
Error ("Input and output file are the same: $opt_infile" )
107
    if ( $opt_infile eq $opt_ofile );
108
 
341 dpurdie 109
Error ("Base Label not provided")
110
    unless ( $opt_baselabel );
111
 
267 dpurdie 112
Error ("Package Name not provided")
113
    unless ( $opt_pname );
114
 
115
Error ("Package Version not provided")
116
    unless ( $opt_pversion );
117
 
118
Warning("Path to info file not provided")
119
    unless ( $opt_infofile );
120
 
121
unlink ($opt_infofile) if $opt_infofile;
122
 
123
#
341 dpurdie 124
#   User must have changed to the directory with build files
267 dpurdie 125
#   Continue with user argument sanity check
126
#
127
Error ("Input file not found: $opt_infile" )
128
    unless ( -f $opt_infile );
129
 
130
Error ("Output file not found: $opt_ofile" )
131
    unless ( -f $opt_ofile );
132
 
133
 
134
#
135
#   Create a SubVersion Session using the current workspace
136
#   as a basis. Error if not a workspace
137
#
138
my $session = NewSessionByWS( '.' );
139
 
140
Verbose ("Determine the current workspace root" );
141
$ws_root = $session->SvnLocateWsRoot(1) || '';
142
$pkg_root = $session->Full;
143
 
144
Verbose ("Workspace root: $ws_root");
145
Verbose ("Package root  : $pkg_root");
146
 
147
#
148
#   Determine the desired label for the package
149
#   May need to pick an unassigned label
150
#
151
determine_package_label();
152
 
153
#
154
#   Update the build file
155
#   Under subversion this is a simple 'copy'
156
#
157
Verbose ("Update build files");
158
unlink $opt_ofile;
159
unless ( File::Copy::copy($opt_infile, $opt_ofile) )
160
{
161
    Error("Failed to copy file [$opt_infile] to [$opt_ofile]: $!");
162
    Error ("Updating build files","Reason: $!");
163
}
164
 
165
#
166
#   Change back to original directory
167
#
168
if ( $root_dir )
169
{
170
    chdir $root_dir || Error ("Cannot change directory: $root_dir");
171
}
172
 
173
#
174
#   Label the view
175
#
176
label_build_view();
177
 
178
exit 0;
179
 
180
#-------------------------------------------------------------------------------
181
# Function        : determine_package_label
182
#
183
# Description     : Determine the label that is to be applied to the package
184
#                   There are several cases to consider
185
#                       1) Compatability mode: User provides label
186
#                       2) WIP Mode. Determine name of label to use in rename
187
#                       3) Create a new label
188
#
189
# Inputs          : Globals
190
#
191
# Returns         : Globals
353 dpurdie 192
#                       $tag_label
267 dpurdie 193
#
194
sub determine_package_label
195
{
196
 
197
    #
198
    #   Determine the desired label for the package
199
    #   This is a function of the package name and the package version
200
    #   The two are joined with a '.'
201
    #
202
    $tag_label = $opt_pname . '_' . $opt_pversion;
203
 
204
    #
205
    #   Ensure that desired label is "free", if not then hunt for a new one
206
    #   Determine the name of a 'new' label
207
    #
208
    my $base_label = $tag_label;
209
    my $index = 0;
210
 
211
    while ( ++$index )
212
    {
213
        if ( $index > 20 )
214
        {
215
            Error ("Cannot determine new label. Retry limit exceeded");
216
        }
217
        Verbose2 ("Trying $tag_label");
218
 
219
        if ( $session->SvnValidateTarget (
220
                    'target' => $session->BranchName($tag_label, 'tags' ),
221
                    'test' => 1,
222
                    ))
223
        {
224
            #
225
            #   Label found - so try another
226
            #
227
            Verbose2("Label found. Try another");
228
            $tag_label = $base_label . '.' . $index;
229
            next;
230
        }
231
 
232
        #
233
        #   Warn about non standard label
234
        #
235
        Verbose ("Package will be labeled: $tag_label");
236
        Warning ("Labeling with a non-standard label: $tag_label" )
237
            if ( $index > 1 );
238
        last;
239
    }
240
 
241
    #
242
    #   Free label has been found
243
    #
244
}
245
 
246
#-------------------------------------------------------------------------------
247
# Function        : label_build_view
248
#
249
# Description     : Label the view
250
#
251
#                   Either:
252
#                       Rename the WIP label to required name
253
#                       Label all files in the view
254
#                   
255
#                   Use JATS to do the hard work
256
#
257
#
258
# Inputs          : Globals
259
#
260
# Returns         : 
261
#
262
sub label_build_view
263
{
264
    #
265
    #   Save the current workspace - with its modified build file
266
    #
267
    Verbose ("Apply new label to package: $tag_label");
268
    $session->SvnCopyWs (
269
               'target'   => $session->BranchName($tag_label, 'tags' ),
270
               'modified' => $opt_ofile,
271
               'noswitch' => 1,
272
               'replace'  => 0,
273
               'comment'  => 'Created by Jats SaveBuild',
274
               );
275
    Message ("Repository Ref: " . $session->RmRef);
276
 
353 dpurdie 277
    if ( $opt_isa_wip || $opt_wiplabel )
267 dpurdie 278
    {
279
        #
280
        #   If the build is based on a WIP, then we can delete the
281
        #   WIP if its based on a branch
282
        #
283
        if ( $session->WsType eq 'branches' )
284
        {
285
            $session->SvnDelete(
286
                    'target'  => $session->FullWs,
287
                    'comment' => ["Deleted by Jats SaveBuild","Replaced by: $tag_label"],
288
                    'noerror' => 1,
289
                     );
290
        }
291
        else
292
        {
293
            Message ("WIP not deleted.","Will not delete WIPS based on a :" . $session->WsType );
294
        }
295
    }
296
 
297
    #
298
    #   Write the label out to the specified file so that the user
299
    #   can do something with it
300
    #
301
    if ( $opt_infofile )
302
    {
303
 
304
        my $data = JatsProperties::New();
305
 
306
        $data->setProperty('Label', $tag_label);
353 dpurdie 307
        $data->setProperty('WipLabel', $opt_wiplabel ) if $opt_baselabel;
267 dpurdie 308
        $data->setProperty('PackageName', $opt_pname);
309
        $data->setProperty('PackageVersion', $opt_pversion);
310
        $data->setProperty('subversion.tag', $session->RmRef);
341 dpurdie 311
        $data->setProperty('VCS.tag', 'SVN::' . $session->RmRef);
267 dpurdie 312
 
313
        $data->Dump('InfoFile') if ($opt_verbose);
314
        $data->store( $opt_infofile );
315
    }
316
}
317
 
318
#-------------------------------------------------------------------------------
319
#   Documentation
320
#
321
 
322
=pod
323
 
324
=head1 NAME
325
 
326
jats_svnsave_build - Save a build view to version control system
327
 
328
=head1 SYNOPSIS
329
 
330
  jats etool jats_save_build [options]
331
 
332
 Options:
333
    -help[=n]           - brief help message
334
    -help -help         - Detailed help message
335
    -man[=n]            - Full documentation
336
    -verbose[=n]        - Verbose operation
337
    -infile=xxx         - Input file (auto.pl)
338
    -outfile=xxx        - Output file (build.pl)
339
    -infofile=path      - Save label information in 'path'
340
    -pname=name         - Name of the package
341
    -pversion=text      - Package version
342
    -wiplabel=text      - Current package WIP label
341 dpurdie 343
    -baselabel=text     - Base label for sandbox
353 dpurdie 344
    -isawip             - Current package is a WIP
267 dpurdie 345
 
346
=head1 OPTIONS
347
 
348
=over 8
349
 
350
=item B<-help[=n]>
351
 
352
Print a brief help message and exits.
353
 
354
The verbosity of the help text can be controlled by setting the help level to a
355
number in the range of 1 to 3, or by invoking the option multiple times.
356
 
357
=item B<-man[=n]>
358
 
359
Without a numeric argument this is the same as -help=3. Full help will be
360
displayed.
361
 
362
With a numeric argument, this option is the same as -help=n.
363
 
364
=item B<-verbose[=n]>
365
 
366
This option will increase the level of verbosity of the utility.
367
 
368
If an argument is provided, then it will be used to set the level, otherwise the
369
existing level will be incremented. This option may be specified multiple times.
370
 
371
=item B<-infile=xxxx>
372
 
373
This option specifies the name of the generated build configuration file that
374
will be used as a data-source for the check-in build file.
375
 
376
The default file name is 'auto.pl'.
377
 
378
=item B<-outfile=xxxx>
379
 
380
This option specifies the name of the target build configuration file that
381
will be checked in to version-control. Data from from file specifies with '-
382
infile' will be used to update the file.
383
 
384
The default file name is 'build.pl'.
385
 
386
=item B<-infofile=path>
387
 
388
This option specifies a file that this utility will use to communicate with a
389
user script. It will write the new label text into the file.
390
 
391
The file path is relative to the current working directory.
392
 
393
The file will be deleted, and only created if the utility is successful.
394
 
395
=item B<-pname=name>
396
 
397
This option specifies the package name. It will be used to construct a new
398
label for the package.
399
 
400
=item B<-pversion=xxx>
401
 
402
This option specifies the package version. It will be used to construct a new
403
label for the package.
404
 
405
=item B<-wiplabel=text>
406
 
353 dpurdie 407
Deprecated option. Do not use. Use -isawip instead.
408
 
409
=item B<-baselabel=text>
410
 
411
This option specifies the Version Control Label that the current workspace
412
is based on. This may be used to determine the new label for the package.
413
 
414
This parameter is mandatory.
415
 
416
=item B<-isawip>
417
 
267 dpurdie 418
This option controls the manner in which this utility will label the build view.
419
 
420
If present, the label specifies a 'Work In Progress' label. The label will be
421
renamed. At the end of the process the wip label will be deleted from the
422
the repository.
423
 
424
If not present, then the view will be labeled with a new label.
425
 
426
=back
427
 
428
=head1 DESCRIPTION
429
 
430
This utility is used by the automated build system to place build view under
431
version control. The utility will:
432
 
433
=over 8
434
 
435
=item * Determine a suitable label for the package
436
 
437
The label is constructed from the package name and the package version. The
438
utility will ensure that the label does not already exist. If it does it will
439
use an alternate form of the label.
440
 
441
=item * Locate the build files within the package
442
 
443
JATS build files do not need to be at the root of the package. The utility
444
will locate the JATS build files.
445
 
446
=item * Update the build files and save them into the version control system
447
 
448
The build file will be updated with new version information as provided by a
449
secondary configuration file.
450
 
451
The updated file will be checked into version control.
452
 
453
=item * Ensure that the package is labeled
454
 
455
The build view will be labeled (tagged).
456
 
457
If a WIP label is provided then the WIP label will be removed if it is a branch.
458
 
459
=item * Return the label to the user
460
 
461
The label used to label the package will be returned to the user in an 'info'
462
file. This is a 'properties' file. The following properties are defined:
463
 
464
=over 8
465
 
466
=item   1) Label - The label used to tag the file
467
 
468
=item   3) WipLabel - The WIP label provided (optional)
469
 
470
=item   4) PackageName - The package name
471
 
472
=item   5) PackageVersion - The package version
473
 
474
=back
475
 
476
=back
477
 
478
=cut
479