Subversion Repositories DevTools

Rev

Rev 5485 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5485 Rev 5486
Line 41... Line 41...
41
 
41
 
42
use JatsError;
42
use JatsError;
43
use JatsEnv;
43
use JatsEnv;
44
use FileUtils;
44
use FileUtils;
45
use JatsSystem;
45
use JatsSystem;
-
 
46
use ArrayHashUtils;
46
 
47
 
47
# define Global variables
48
# define Global variables
48
#
49
#
49
my $VERSION = "1.0.0";
50
my $VERSION = "1.0.0";
50
my $PROGNAME = "create_dpkgFromTar.pl";
51
my $PROGNAME = "create_dpkgFromTar.pl";
Line 57... Line 58...
57
our $USER;
58
our $USER;
58
our $GBE_ABT;
59
our $GBE_ABT;
59
 
60
 
60
# Global variables
61
# Global variables
61
#
62
#
62
my $tmpDir;
63
my $tmpDirInfo;
63
my $workDir;
64
my $workDir;
64
my $startDir;
65
my $startDir;
65
my $maxHostNameLength = 8;
66
my $maxHostNameLength = 8;
-
 
67
my $pkgTargetDir;
-
 
68
my $deleteTargetDir;
66
 
69
 
67
#
70
#
68
#   Option variables
71
#   Option variables
69
#
72
#
70
my $opt_help = 0;
73
my $opt_help = 0;
71
my $opt_manual = 0;
74
my $opt_manual = 0;
72
my $opt_verbose = 0;
75
my $opt_verbose = 0;
73
my $opt_pname;
76
my $opt_pname;
74
my $opt_pversion;
77
my $opt_pversion;
75
my $opt_srcPath;
78
my $opt_srcPath;
76
my $opt_MergeErrors = 1;
79
my $opt_MergeErrors = 0;
77
my $opt_outputPath;
80
my $opt_outputPath;
-
 
81
my $opt_preDelete;
-
 
82
my $opt_tmpDir;
78
 
83
 
79
#-------------------------------------------------------------------------------
84
#-------------------------------------------------------------------------------
80
# Function        : main entry point 
85
# Function        : main entry point 
81
#
86
#
82
# Description     : Main Entry point
87
# Description     : Main Entry point
Line 93... Line 98...
93
                'pname=s'       => \$opt_pname,             # string
98
                'pname=s'       => \$opt_pname,             # string
94
                'pversion=s'    => \$opt_pversion,          # string
99
                'pversion=s'    => \$opt_pversion,          # string
95
                'srcpath=s'     => \$opt_srcPath,           # string
100
                'srcpath=s'     => \$opt_srcPath,           # string
96
                'mergeErrors!'  => \$opt_MergeErrors,       # [no]flag
101
                'mergeErrors!'  => \$opt_MergeErrors,       # [no]flag
97
                'output=s'      => \$opt_outputPath,        # String
102
                'output=s'      => \$opt_outputPath,        # String
-
 
103
                'tmpdir=s'      => \$opt_tmpDir,            # String
-
 
104
                'predelete!'    => \$opt_preDelete,         # [no]flag
98
                );              
105
                );              
99
 
106
 
100
    #
107
    #
101
    #   Process help and manual options
108
    #   Process help and manual options
102
    #
109
    #
Line 123... Line 130...
123
    EnvImport ('GBE_HOSTNAME');
130
    EnvImport ('GBE_HOSTNAME');
124
    EnvImport ('USER' );
131
    EnvImport ('USER' );
125
    EnvImport ('GBE_DPKG' );
132
    EnvImport ('GBE_DPKG' );
126
    EnvImportOptional ('GBE_ABT', '');
133
    EnvImportOptional ('GBE_ABT', '');
127
 
134
 
-
 
135
    # Defaults
-
 
136
    InitFileUtils();
-
 
137
    $startDir = Getcwd;
-
 
138
    $opt_outputPath = $::GBE_DPKG unless defined $opt_outputPath;
-
 
139
    $opt_srcPath = AbsPath($opt_srcPath) if defined $opt_srcPath;
-
 
140
    $opt_tmpDir = AbsPath($opt_tmpDir) if defined $opt_tmpDir;
-
 
141
 
128
    #
142
    #
129
    #   Basic sanity testing
143
    #   Basic sanity testing
130
    #
144
    #
131
    Error ("Path for package fragments not specified") unless defined $opt_srcPath;
145
    Error ("Path for package fragments not specified") unless defined $opt_srcPath;
132
    Error ("Package fragment path not found", $opt_srcPath) unless -d $opt_srcPath;
146
    Error ("Package fragment path not found", $opt_srcPath) unless -d $opt_srcPath;
133
    Error ("DPKG_ARCHIVE not found", $GBE_DPKG) unless -d $GBE_DPKG;
147
    Error ("DPKG_ARCHIVE not found", $GBE_DPKG) unless -d $GBE_DPKG;
134
    Error ("Package name not specified") unless defined $opt_pname;
148
    Error ("Package name not specified") unless defined $opt_pname;
135
    Error ("Package version not specified") unless defined $opt_pversion;
149
    Error ("Package version not specified") unless defined $opt_pversion;
-
 
150
    Error ("Output path not specified" ) unless defined $opt_outputPath;
136
    Error ("Output path does not exist", $opt_outputPath) if (defined $opt_outputPath && ! -d $opt_outputPath);
151
    Error ("Output path does not exist", $opt_outputPath) unless -d $opt_outputPath;
-
 
152
    Error ("TmpDir does not exist:", $opt_tmpDir) if (defined($opt_tmpDir) && ! -d ($opt_tmpDir));
137
 
153
 
138
    #
154
    #
139
    #   Create a temp work directory for this
155
    #   Create a temp work directory for this
140
    #       This will be removed on program exit 
156
    #       This will be removed on program exit 
141
    #       Not by File:Temp as it doesn't handle the case where we have chdir'd to the temp area
157
    #       Not by File:Temp as it doesn't handle the case where we have chdir'd to the temp area
142
    #
158
    #
143
    InitFileUtils();
159
    if ($opt_tmpDir)
-
 
160
    {
144
    $startDir = Getcwd;
161
        $workDir = $opt_tmpDir;
-
 
162
    }
-
 
163
    else
-
 
164
    {
145
    $tmpDir = File::Temp->newdir( 'dpkgFromTar_XXXX', CLEANUP => 0, DIR => '/tmp' );
165
        $tmpDirInfo = File::Temp->newdir( 'dpkgFromTar_XXXX', CLEANUP => 0, DIR => '/tmp' );
146
    $workDir = $tmpDir->dirname;
166
        $workDir = $tmpDirInfo->dirname;
-
 
167
    }
147
    Verbose("WorkDir", $workDir);
168
    Verbose("WorkDir", $workDir);
148
    chdir($workDir)|| Error ("Cannot chdir to working directory: $workDir");
169
    chdir($workDir)|| Error ("Cannot chdir to working directory: $workDir");
149
 
170
 
150
    #
171
    #
151
    #   Locate all package fragements
172
    #   Locate all package fragements
Line 157... Line 178...
157
    $basename .= '_*.tar.gz';
178
    $basename .= '_*.tar.gz';
158
    my @packageFragments = glob (catfile($opt_srcPath, $basename ));
179
    my @packageFragments = glob (catfile($opt_srcPath, $basename ));
159
    Error ("No package fragments found.", "Path: $opt_srcPath", "Glob: $basename" ) unless @packageFragments;
180
    Error ("No package fragments found.", "Path: $opt_srcPath", "Glob: $basename" ) unless @packageFragments;
160
    Message("Package Fragmnets found:", @packageFragments);
181
    Message("Package Fragmnets found:", @packageFragments);
161
 
182
 
162
#   my %data;
-
 
163
#   my $dataref;
-
 
164
#   my $ee;
-
 
165
#   $data{bbbb}{count}++;
-
 
166
#   $dataref = $data{bbbb};
-
 
167
#
-
 
168
#   DebugDumpData("dataref:" . ref($dataref), $dataref);
-
 
169
#   $dataref->{aaaa} = 'AAAA';
-
 
170
#
-
 
171
#   DebugDumpData("dataRef", $dataref);
-
 
172
#   DebugDumpData("data", \%data);
-
 
173
#   Error("Just Testing");
-
 
174
 
-
 
175
    #
183
    #
176
    #   Extract the built.files.<hostname>.xml and descpkg from each of package fragments
184
    #   Extract the built.files.<hostname>.xml and descpkg from each of package fragments
-
 
185
    #   Note: Use of -m flag to tar is to overcome issues with the bsdtar used under windows
-
 
186
    #         to create the tar.gz files. It appears to insert localtime and not GMT into 
-
 
187
    #         the file.
177
    #
188
    #
178
    my %pkgData;   
189
    my %pkgData;   
179
    foreach my $srcfile ( @packageFragments)
190
    foreach my $srcfile ( @packageFragments)
180
    {
191
    {
181
        Message ("Extacting metadata from $srcfile");
192
        Message ("Extracting metadata from " . StripDir($srcfile));
182
        my $basename = $srcfile;
193
        my $basename = $srcfile;
183
        $basename =~ s~^.*/~~;
194
        $basename =~ s~^.*/~~;
184
        $basename =~ s~\.gz$~~;
195
        $basename =~ s~\.gz$~~;
185
        $basename =~ s~\.tar$~~;
196
        $basename =~ s~\.tar$~~;
186
        $basename = substr($basename, $basenameLen);
197
        $basename = substr($basename, $basenameLen);
187
        $pkgData{$srcfile}{basename} = $basename;
198
        $pkgData{$srcfile}{basename} = $basename;
188
        mkpath ($basename);
199
        mkpath ($basename);
189
        Error ("Temp subdir $basename not created: $!") unless -d $basename;
200
        Error ("Temp subdir $basename not created: $!") unless -d $basename;
190
        my $rv = System ('tar', '-xzf', $srcfile, 
201
        my $rv = System ('tar', '-xzmf', $srcfile, 
191
                            IsVerbose(1) ? '-v' : undef, 
202
                            IsVerbose(1) ? '-v' : undef, 
192
                            '-C', $basename, 
203
                            '-C', $basename, 
193
                            '--wildcards', './built.files.*.xml', './descpkg' );
204
                            '--wildcards', './built.files.*.xml' );
194
        Error("Tar extraction error: $srcfile") if ($rv);
205
        Error("Tar extraction error: $srcfile") if ($rv);
195
    }
206
    }
196
 
207
 
197
    #
208
    #
198
    #   Read in the XML from each of the files
209
    #   Read in the XML from each of the files
199
    #
210
    #
200
    my %fileData;
211
    my %fileData;
201
    foreach my $srcfile ( keys %pkgData )
212
    foreach my $srcfile ( keys %pkgData )
202
    {
213
    {
203
        my @extracted = glob(catfile($pkgData{$srcfile}{basename}, 'built.files.*.xml'));
214
        my @extracted = glob(catfile($pkgData{$srcfile}{basename}, 'built.files.*.xml'));
204
        foreach my $srcfile (@extracted)
215
        foreach my $srcfile ( @extracted)
205
        {
216
        {
206
            my $ref = XML::Simple::XMLin($srcfile);
217
            my $ref = XML::Simple::XMLin($srcfile, ForceArray => 1, KeyAttr => []);
207
#           DebugDumpData("REF", $ref);
218
            #DebugDumpData("REF - $srcfile, " .ref($ref), $ref);
-
 
219
 
208
            foreach my $entry (@{$ref->{file}})
220
            foreach my $entry (@{$ref->{file}})
209
            {
221
            {
-
 
222
                #   directory - no processing required
210
                next if $entry->{type} eq 'dir';
223
                next if $entry->{type} eq 'dir';
-
 
224
 
-
 
225
                #   link - no processing reqiuired
-
 
226
                next if $entry->{type} eq 'link';
-
 
227
 
-
 
228
                #   file - ensure there is no clash
211
                if ($entry->{type} eq 'file')
229
                if ($entry->{type} eq 'file')
212
                {
230
                {
213
                    # Calc max host name length for pretty printing
231
                    # Calc max host name length for pretty printing
214
                    my $hostnameLen = length $entry->{host};
232
                    my $hostnameLen = length $entry->{host};
215
                    $maxHostNameLength = $hostnameLen if ($hostnameLen > $maxHostNameLength);
233
                    $maxHostNameLength = $hostnameLen if ($hostnameLen > $maxHostNameLength);
Line 231... Line 249...
231
                        # Create new entry
249
                        # Create new entry
232
                        $store->{md5sum} = $entry->{md5sum};
250
                        $store->{md5sum} = $entry->{md5sum};
233
                    }
251
                    }
234
                next;
252
                next;
235
                }
253
                }
-
 
254
                #   Unknown - just a warning for now
236
Warning( "Unknown type:" . $entry->{fullname} . ':' . $entry->{type} );
255
                Warning( "Unknown type:" . $entry->{fullname} . ':' . $entry->{type} );
237
            }
256
            }
238
        }
257
        }
239
    }
258
    }
240
 
259
 
241
    #
260
    #
Line 249... Line 268...
249
        #   Some entries are allowed to differ
268
        #   Some entries are allowed to differ
250
        #       descpkg
269
        #       descpkg
251
        #       version_*.h 
270
        #       version_*.h 
252
        #           files as these are generated and may contain different dates and line endings
271
        #           files as these are generated and may contain different dates and line endings
253
        #
272
        #
254
        if ($entry eq 'aadescpkg')
273
        if ($entry eq 'descpkg')
255
        {
274
        {
256
            delete $fileData{$entry};
275
            delete $fileData{$entry};
257
            next;
276
            next;
258
        }
277
        }
259
 
278
 
Line 264... Line 283...
264
            next;
283
            next;
265
        }
284
        }
266
 
285
 
267
        #
286
        #
268
        #   Delete entry if its not marked as bad
287
        #   Delete entry if its not marked as bad
269
        unless (exists $fileData{$entry}{bad} ) {
288
        unless (exists $fileData{$entry}{bad} )
-
 
289
        {
270
            delete $fileData{$entry};
290
            delete $fileData{$entry};
271
            next;
291
            next;
272
        }
292
        }
273
 
293
 
274
        #
294
        #
275
        #   Have a merge error
295
        #   Have a merge error
276
        #   Detail what has happened
296
        #       Detail what has happened
-
 
297
        #       Generate pretty output showning on which machines that are command.
277
        #
298
        #
278
        unless ($headerReported)
299
        unless ($headerReported)
279
        {
300
        {
280
            $headerReported = 1;
301
            $headerReported = 1;
281
            reportMergeError('Package Merge Error. File provided by different builds are not identical');
302
            reportMergeError('Package Merge Error. File provided by different builds are not identical');
282
            reportMergeError('This prevents the build from being reproducible.');
303
            reportMergeError('This prevents the build from being reproducible.');
283
        }
304
        }
284
        reportMergeError('File Name:  ' . $entry);
305
        reportMergeError('File Name:  ' . $entry);
-
 
306
 
-
 
307
#       foreach my $e ( @{$fileData{$entry}{hosts}} )
-
 
308
#       {
-
 
309
#           reportMergeError('    Provided by:  ' . sprintf('%-*s',$maxHostNameLength,$e->{host}) . '  Signature: ' . $e->{md5sum});
-
 
310
#       }
-
 
311
 
-
 
312
        my %md5List;
-
 
313
        foreach my $e ( @{$fileData{$entry}{hosts}} ) {
-
 
314
            UniquePush (\@{$md5List{$e->{md5sum}}}, $e->{host});
-
 
315
        }
-
 
316
 
285
        foreach my $e ( @{$fileData{$entry}{hosts}} )
317
        foreach my $e ( @{$fileData{$entry}{hosts}} )
286
        {
318
        {
-
 
319
            my $hostList;
-
 
320
            my @sameHosts = @{$md5List{$e->{md5sum}}};
-
 
321
            ArrayDelete (\@sameHosts, $e->{host});
-
 
322
            if (@sameHosts) {
-
 
323
                $hostList = ' Same as: ' . join(', ', @sameHosts);
-
 
324
            } else {
-
 
325
                $hostList = ' Unique to: '. $e->{host};
-
 
326
            }
-
 
327
 
287
            reportMergeError('    Provided by:  ' . sprintf('%-*s',$maxHostNameLength,$e->{host}) . '  Signature: ' . $e->{md5sum});
328
            reportMergeError('    Provided by:  ' . sprintf('%-*s',$maxHostNameLength,$e->{host}) . $hostList );
288
        }
329
        }
-
 
330
 
-
 
331
 
289
    }
332
    }
290
    ErrorDoExit();
333
    ErrorDoExit();
291
 
334
 
292
    #
335
    #
-
 
336
    #   Calculate target package location
-
 
337
    #   
-
 
338
    $pkgTargetDir = catdir($opt_outputPath, $opt_pname, $opt_pversion);
-
 
339
    Verbose("Package Target: $pkgTargetDir");
-
 
340
    RmDirTree($pkgTargetDir) if $opt_preDelete;
-
 
341
    Error ("Target package directory exists") if -d $pkgTargetDir;
-
 
342
    mkpath ($pkgTargetDir);
-
 
343
    Error ("Package target not created: $!", $pkgTargetDir) unless -d $pkgTargetDir;
-
 
344
    $deleteTargetDir = 1;
-
 
345
 
-
 
346
    #
293
    #   Extract the archive contents and merge them into one directory
347
    #   Extract the archive contents and merge them into one directory
294
    #       If there are overlaps - don't replace them
348
    #       If there are overlaps - don't replace them
295
    #       Work in a temp directory so that partial packages are not seen
-
 
296
    #
349
    #
297
    my $pkgDir = 'pkg';
-
 
298
    mkpath ($pkgDir);
-
 
299
    Error ("Temp subdir $basename not created: $!") unless -d $pkgDir;
-
 
300
    foreach my $srcfile ( keys %pkgData )
350
    foreach my $srcfile ( keys %pkgData )
301
    {
351
    {
302
        Message ("Extacting all files from $srcfile");
352
        Message ("Extracting all files from " . StripDir($srcfile));
303
        my $rv = System ('tar', '-xzf', $srcfile, IsVerbose(1) ? '-v' : undef, '-C', $pkgDir );
353
        my $rv = System ('tar', '-xzmf', $srcfile, IsVerbose(1) ? '-v' : undef, '-C', $pkgTargetDir );
304
        Error("Tar extraction error: $srcfile") if ($rv);
354
        Error("Tar extraction error: $srcfile") if ($rv);
305
    }
355
    }
306
 
356
 
307
    #
357
    #
308
    #   Fix file permissions
358
    #   Fix file permissions
309
    #   We know we are running under unix so we will use a unix command
359
    #   We know we are running under unix so we will use a unix command
310
    #
360
    #
311
    Message('Setting file permissions');
361
    Message('Setting file permissions');
312
    System('chmod', '-R', 'a+rx', $pkgDir);
362
    System('chmod', '-R', 'a+rx', $pkgTargetDir);
313
    
363
    
314
    #
364
    #
315
    #   Fix descpkg file
365
    #   Fix descpkg file
316
    #   Original create_dpkg uses the CopyDescpkg function. This is a bit wonky
366
    #   Original create_dpkg uses the CopyDescpkg function. This is a bit wonky
317
    #   All it appears to do is:
367
    #   All it appears to do is:
318
    #       Force build machine name
368
    #       Force build machine name
319
    #       Force user name
369
    #       Force user name
320
    #       Force build time into the descpkg file
370
    #       Force build time into the descpkg file
321
    #  If a package was built on multiple machines then the build machine names were lost
371
    #  If a package was built on multiple machines then the build machine names were lost
322
    #
372
    #  
-
 
373
    #   This implementation
-
 
374
    #       Use the descpkg file in the first package fragment
-
 
375
    #       There is enough other information in the build system to track where the package
-
 
376
    #       was built. This was not available when CopyDescpkg was implemented
323
    
377
    
324
    #
-
 
325
    #   Move the package to its final resting place within the target archive
-
 
326
    #
-
 
327
    my $pkgTargetDir = catdir($opt_outputPath, 'MergedPackage');
-
 
328
    Message('Move assembled package to:' . $pkgTargetDir);
-
 
329
    Message('Move from:' . $pkgDir);
-
 
330
    mkpath ($pkgTargetDir);
-
 
331
    RmDirTree($pkgTargetDir);
-
 
332
 
-
 
333
    System('mv', $pkgDir, $pkgTargetDir ) && Error('Cannot move assembled package into archive');
-
 
334
    
378
    
335
    #
379
    #
336
    #   All Done
380
    #   All Done
-
 
381
    #       Flag  - don't cleanup generated dierctory
337
    #
382
    #       
-
 
383
    Information("Package Target: $pkgTargetDir");
-
 
384
    $deleteTargetDir = 0;
338
    exit 0;
385
    exit 0;
339
 
386
 
340
#-------------------------------------------------------------------------------
387
#-------------------------------------------------------------------------------
341
# Function        : END 
388
# Function        : END 
342
#
389
#
Line 350... Line 397...
350
{
397
{
351
    #
398
    #
352
    #   Delete everything in the temp directory
399
    #   Delete everything in the temp directory
353
    #   It was a directory created by this instance for the use of this instance
400
    #   It was a directory created by this instance for the use of this instance
354
    #
401
    #
355
    if ($startDir)
402
    if ($tmpDirInfo)
356
    {
403
    {
357
        Message("Cleanup processing");
404
        Message("Cleanup processing");
358
        chdir($startDir);
405
        chdir($startDir);
359
        Warning("TMPDIR exists: $tmpDir") if (-d $tmpDir);
-
 
360
        #RmDirTree($tmpDir);
406
        RmDirTree($workDir);
361
        if (-d $tmpDir)
407
        if (-d $workDir)
362
        {
408
        {
363
            Warning("TMPDIR still exists: $tmpDir");
409
            Warning("TMPDIR still exists: $workDir");
364
        }
410
        }
-
 
411
    } 
-
 
412
    elsif ($workDir)
-
 
413
    {
-
 
414
        Message ("Retaining workdir: $workDir");
-
 
415
    }
-
 
416
 
-
 
417
    #
-
 
418
    #   Delete the package target dir
-
 
419
    #   We must have created it - as we error if it exists.
-
 
420
    #   
-
 
421
    #   Remove the packageName and packageVersion directories fi possible
-
 
422
    #   
-
 
423
    if ($deleteTargetDir)
-
 
424
    {
-
 
425
        Message("Remove partially created package");
-
 
426
        RmDirTree($pkgTargetDir);
-
 
427
 
-
 
428
        my $pkgDir = StripFileExt($pkgTargetDir);
-
 
429
        rmdir($pkgDir) && Message("Remove package dir: $pkgDir");
365
    }
430
    }
366
}
431
}
367
 
432
 
368
#-------------------------------------------------------------------------------
433
#-------------------------------------------------------------------------------
369
# Function        : reportMergeError 
434
# Function        : reportMergeError 
Line 374... Line 439...
374
#
439
#
375
# Returns         : Nothing 
440
# Returns         : Nothing 
376
#
441
#
377
sub reportMergeError
442
sub reportMergeError
378
{
443
{
379
    $opt_MergeErrors ? ReportError(@_) : Warning(@_);
444
    $opt_MergeErrors ? Warning(@_) : ReportError(@_);
380
}
445
}
381
 
446
 
382
#-------------------------------------------------------------------------------
447
#-------------------------------------------------------------------------------
383
#   Documentation
448
#   Documentation
384
#
449
#
Line 402... Line 467...
402
    -verbose           - Display additional progress messages
467
    -verbose           - Display additional progress messages
403
    -pname=name        - Ensure package is named correctly
468
    -pname=name        - Ensure package is named correctly
404
    -pversion=version  - Ensure package version is correct
469
    -pversion=version  - Ensure package version is correct
405
    -srcdir=path       - Location of the package fragments
470
    -srcdir=path       - Location of the package fragments
406
 
471
 
-
 
472
  Debug and Testing:
-
 
473
    -[no]mergeErrors   - Allow merge errors
-
 
474
    -[no]predelete     - Predelete generated package
-
 
475
    -output=path       - Base of test package archive
-
 
476
 
407
=head1 OPTIONS
477
=head1 OPTIONS
408
 
478
 
409
=over 8
479
=over 8
410
 
480
 
411
=item B<-help>
481
=item B<-help>
Line 431... Line 501...
431
 
501
 
432
=item B<-pversion=version>
502
=item B<-pversion=version>
433
 
503
 
434
The version of the target package.
504
The version of the target package.
435
 
505
 
-
 
506
=item B<-[no]mergeErrors>
-
 
507
 
-
 
508
This option allows the merging process to continue if merge errors are located.
-
 
509
The default is -noMergeErrors
-
 
510
 
-
 
511
This option is  intended for testing use only.
-
 
512
 
-
 
513
=item B<-[no]predelete>
-
 
514
 
-
 
515
This option will delete the target package instance before the package is assembled.
-
 
516
The default is -noPreDelete
-
 
517
 
-
 
518
This option is  intended for testing use only.
-
 
519
 
-
 
520
=item B<-output=path>
-
 
521
 
-
 
522
This option allows the user to specify to root of a test package archive.
-
 
523
The dafualt is to use the value provided by GBE_DPKG - the main package archive.
-
 
524
 
-
 
525
This option is  intended for testing use only.
-
 
526
 
436
=back
527
=back
437
 
528
 
438
=head1 DESCRIPTION
529
=head1 DESCRIPTION
439
 
530
 
440
This utility program is used by the build system to merge build artifacts from several
531
This utility program is used by the build system to merge build artifacts from several
Line 519... Line 610...
519
 
610
 
520
=item *
611
=item *
521
 
612
 
522
File permisions will be adjusted. All directories will be made world readable and all files will be made world executable.
613
File permisions will be adjusted. All directories will be made world readable and all files will be made world executable.
523
 
614
 
524
=item *
-
 
525
 
-
 
526
The assembled package is then moved to its final location within the pakage archive. 
-
 
527
This will prevent partial packages being available to users. The creation will be atomic.
-
 
528
 
-
 
529
=back
615
=back
530
 
616
 
531
=cut
617
=cut
532
 
618