Subversion Repositories DevTools

Rev

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

Rev Author Line No. Line
311 dpurdie 1
########################################################################
2
# Copyright (C) 1998-2008 ERG Limited, All rights reserved
3
#
4
# Module name   : jats_svn.pl
5
# Module type   : Jats Utility
6
# Compiler(s)   : Perl
7
# Environment(s): Jats
8
#
9
# Description   : A script to perform a number of SVN utility functions
10
#                 The script will:
11
#                   Delete a package
12
#                   Create a package
13
#                   Import source to a package
14
#
15
#
16
#......................................................................#
17
 
18
require 5.006_001;
19
use strict;
20
use warnings;
21
use JatsError;
22
use JatsSvn qw(:All);
23
use JatsLocateFiles;
379 dpurdie 24
use JatsProperties;
311 dpurdie 25
use Pod::Usage;                                 # required for help support
26
use Getopt::Long qw(:config require_order);     # Stop on non-option
27
use Cwd;
28
use File::Path;
29
use File::Copy;
30
use File::Basename;
31
use File::Compare;
387 dpurdie 32
use Encode;
311 dpurdie 33
 
34
my $VERSION = "1.0.0";                          # Update this
35
 
36
#
37
#   Options
38
#
39
my $opt_debug   = $ENV{'GBE_DEBUG'};            # Allow global debug
40
my $opt_verbose = $ENV{'GBE_VERBOSE'};          # Allow global verbose
41
my $opt_help = 0;
42
 
43
#
44
#   Globals
45
#
46
my $opr_done;                                   # User has done something
47
 
48
#-------------------------------------------------------------------------------
49
# Function        : Mainline Entry Point
50
#
51
# Description     :
52
#
53
# Inputs          :
54
#
55
my $result = GetOptions (
56
                "help:+"        => \$opt_help,              # flag, multiple use allowed
57
                "manual:3"      => \$opt_help,              # flag
58
                "verbose:+"     => \$opt_verbose,           # flag, multiple use allowed
59
 
60
                );
61
 
62
                #
63
                #   UPDATE THE DOCUMENTATION AT THE END OF THIS FILE !!!
64
                #
65
 
66
#
67
#   Process help and manual options
68
#
69
pod2usage(-verbose => 0, -message => "Version: $VERSION") if ($opt_help == 1 || ! $result);
70
pod2usage(-verbose => 1) if ($opt_help == 2 );
71
pod2usage(-verbose => 2) if ($opt_help > 2);
72
 
73
#
74
#   Configure the error reporting process now that we have the user options
75
#
76
ErrorConfig( 'name'    =>'SVN',
77
             'verbose' => $opt_verbose,
78
            );
79
 
80
#
369 dpurdie 81
#   Reconfigure the options parser to allow subcommands to parse options
311 dpurdie 82
#
83
Getopt::Long::Configure('permute');
84
 
85
#
86
#   Process command
87
#   First command line argument is a subversion command
88
#
89
my $cmd = shift @ARGV || "help";
90
CreatePackage()                        if ( $cmd =~ m/^create/ );
2049 dpurdie 91
CreateBranch()                         if ( $cmd =~ m/^branch/ );
92
SwitchBranch()                         if ( $cmd =~ m/^switch/ );
385 dpurdie 93
DeleteBranch()                         if ( $cmd =~ m/^delete-branch/ );
311 dpurdie 94
DeletePackage()                        if ( $cmd =~ m/^delete-package/ );
95
ImportPackage()                        if ( $cmd =~ m/^import/ );
96
SvnRepoCmd($cmd, @ARGV)                if ( $cmd eq 'ls' );
363 dpurdie 97
TestSvn()                              if ($cmd eq 'test');
369 dpurdie 98
ShowPaths()                            if ( $cmd =~ m/^path/ );
99
ShowTag()                              if ( $cmd =~ m/^tag/ );
100
ShowUrl()                              if ( $cmd =~ m/^url/ );
311 dpurdie 101
 
102
pod2usage(-verbose => 0, -message => "No valid operations specified") unless ( $opr_done );
103
exit 0;
104
 
105
#-------------------------------------------------------------------------------
369 dpurdie 106
# Function        : ShowPaths
107
#
108
# Description     : Show PATHS
109
#
2049 dpurdie 110
# Inputs          :
369 dpurdie 111
#
2049 dpurdie 112
# Returns         :
369 dpurdie 113
#
114
sub ShowPaths
115
{
116
    #
117
    #   Parse more options
118
    #
119
    GetOptions (
120
                "help:+"        => \$opt_help,
121
                "manual:3"      => \$opt_help,
122
                ) || Error ("Invalid command line" );
123
 
124
    #
125
    #   Subcommand specific help
126
    #
127
    SubCommandHelp( $opt_help, "Subversion Paths") if ($opt_help || $#ARGV >= 0);
128
 
129
    #
130
    #   Display known PATHS
131
    #
132
    my ( $pSVN_URLS, $pSVN_URLS_LIST) = SvnPaths();
133
    print ("Configured SubVersion Repository Paths\n");
134
    print sprintf("    %-20s %s\n", 'Tag', 'URL Prefix');
135
 
136
    foreach my $key ( @{$pSVN_URLS_LIST} )
137
    {
138
        print sprintf("    %-20s %s\n", $key || 'Default', $pSVN_URLS->{$key} );
139
    }
140
 
141
    $opr_done = 1;
142
}
143
 
144
#-------------------------------------------------------------------------------
145
# Function        : ShowTag
146
#
147
# Description     : Convert a URL into a TAG
148
#                   Convert the current workspace info into a TAG
149
#
150
# Inputs          : url                     - Url to convert (optional)
151
#                   Options
152
#                       -help[=n]           - Show help
153
#                       -man                - Show manual
154
#                       -url=url            - Convert URL
155
#                       -path=path          - Convert Workspace
156
#
157
# Returns         : Nothing
158
#
159
sub ShowTag
160
{
161
    my $opt_path;
162
    my $opt_url;
163
 
164
    #
165
    #   Parse more options
166
    #
167
    GetOptions (
168
                "help:+"        => \$opt_help,
169
                "manual:3"      => \$opt_help,
170
                "path:s"        => \$opt_path,
171
                "url:s"         => \$opt_url,
172
                ) || Error ("Invalid command line" );
173
 
174
    #
175
    #   Subcommand specific help
176
    #
177
    SubCommandHelp( $opt_help, "Url to Tag") if ($opt_help);
178
 
179
    #
180
    #   Bare argument is a URL
181
    #   If no arguments provided assume a path of the current directory
182
    #
183
    $opt_url = shift (@ARGV) if ( $#ARGV == 0 );
184
    $opt_path = '.' unless ( defined $opt_path || defined $opt_url );
185
 
186
    #
187
    #   Sanity Tests
188
    #
189
    Error ("Cannot specify both a URL and a PATH")
190
            if ( defined $opt_url && defined $opt_path );
191
    Warning ("Too many arguments") if ( $#ARGV >= 0 );
192
 
193
    #   Do all the hard work
194
    #
195
    my $uref;
196
    if ( $opt_url )
197
    {
198
        $uref = NewSessionByUrl ( $opt_url );
199
        $uref->CalcRmReference($uref->Full());
200
    }
201
    else
202
    {
203
        $uref = NewSessionByWS($opt_path, 0, 1);
204
        my $ws_root = $uref->SvnLocateWsRoot(1);
205
        $uref->CalcRmReference($uref->FullWs());
206
    }
207
 
1403 dpurdie 208
    Message ("Tag is  : " . $uref->RmRef() );
209
    Message ("Vcs Tag : " . $uref->SvnTag  );
2049 dpurdie 210
 
369 dpurdie 211
    $opr_done = 1;
212
}
213
#-------------------------------------------------------------------------------
214
# Function        : ShowUrl
215
#
216
# Description     : Convert a TAG into a URL
217
#                   Show the current workspace URL
218
#
219
# Inputs          : tag                     - Tag to convert (optional)
220
#                   Options
221
#                       -help[=n]           - Show help
222
#                       -man                - Show manual
223
#                       -tag=tag            - Convert TAG
224
#                       -path=path          - Convert Workspace
225
#
226
# Returns         : Nothing
227
#
228
sub ShowUrl
229
{
230
    my $opt_path;
231
    my $opt_tag;
232
 
233
    #
234
    #   Parse more options
235
    #
236
    GetOptions (
237
                "help:+"        => \$opt_help,
238
                "manual:3"      => \$opt_help,
239
                "path:s"        => \$opt_path,
240
                "tag:s"         => \$opt_tag,
241
                ) || Error ("Invalid command line" );
242
 
243
    #
244
    #   Subcommand specific help
245
    #
246
    SubCommandHelp( $opt_help, "Tag to Url") if ($opt_help);
247
 
248
    #
249
    #   Bare argument is a TAG
250
    #   If no arguments provided assume a path of the current directory
251
    #
252
    $opt_tag = shift (@ARGV) if ( $#ARGV == 0 );
253
    $opt_path = '.' unless ( defined $opt_path || defined $opt_tag );
254
 
255
    #
256
    #   Sanity Tests
257
    #
258
    Error ("Cannot specify both a TAG and a PATH")
259
            if ( defined $opt_tag && defined $opt_path );
260
    Warning ("Too many arguments") if ( $#ARGV >= 0 );
261
 
262
    #   Do all the hard work
263
    #
264
    my $uref;
265
    my $url;
266
    if ( $opt_tag )
267
    {
2429 dpurdie 268
        my $path = $opt_tag;
269
        my $label;
270
 
271
        $path =~ s~^SVN::~~;
272
        if ( $path =~ m~(.+)::(.+)~ )
273
        {
274
            $path = $1;
275
            $label = $2;
276
        }
277
        $url = SvnPath2Url($path);
278
        if ( $label && $label =~ m~^\d+$~ )
279
        {
280
            $url .= '@' . $label;
281
        }
282
        elsif ( $label )
283
        {
284
            $url =~ m~(.+)(/(tags|branches|trunk)(/|$|@))~;
285
            $url = $1 . '/tags/'. $label;
286
        }
369 dpurdie 287
    }
288
    else
289
    {
290
        $uref = NewSessionByWS($opt_path, 0, 1);
291
        my $ws_root = $uref->SvnLocateWsRoot(1);
292
        $url = $uref->FullWsRev();
293
    }
294
 
295
    Message ("Url: $url");
296
    $opr_done = 1;
297
}
298
 
299
#-------------------------------------------------------------------------------
363 dpurdie 300
# Function        : TestSvn
301
#
302
# Description     : Test access to subversion
303
#
304
# Inputs          : None
305
#
306
# Returns         :
307
#
308
sub TestSvn
309
{
310
    #
311
    #   Parse more options
312
    #
313
    GetOptions (
314
                "help:+"        => \$opt_help,
315
                "manual:3"      => \$opt_help,
316
                ) || Error ("Invalid command line" );
317
 
318
    #
319
    #   Subcommand specific help
320
    #
321
    SubCommandHelp( $opt_help, "Test Subversion") if ($opt_help || $#ARGV >= 0);
322
 
323
    SvnUserCmd( '--version');
324
    $opr_done = 1;
325
}
326
#-------------------------------------------------------------------------------
311 dpurdie 327
# Function        : SvnRepoCmd
328
#
329
# Description     : Execute a SVN command, where the first argument
330
#                   is a repository specifier
331
#
332
# Inputs          : $cmd
333
#                   $repo_url
334
#                   @opts
335
#
2049 dpurdie 336
# Returns         :
311 dpurdie 337
#
338
sub SvnRepoCmd
339
{
340
    my ( $cmd, $repo_url, @opts ) = @_;
341
    my $uref = NewSessionByUrl ( $repo_url );
342
 
343
    SvnUserCmd( $cmd,
344
            $uref->Full,
345
            @opts,
346
            { 'credentials' => 1 });
2049 dpurdie 347
 
311 dpurdie 348
    $opr_done = 1;
349
}
350
 
351
#-------------------------------------------------------------------------------
352
# Function        : DeletePackage
353
#
354
# Description     : Delete a Package structure within a Repository
355
#                   Intended for test usage
356
#
357
# Inputs          : URL                 - Url to Repo + Package Base
358
#
2049 dpurdie 359
# Returns         :
311 dpurdie 360
#
361
sub DeletePackage
362
{
379 dpurdie 363
    my $opt_error = 0;
311 dpurdie 364
    #
365
    #   Parse more options
366
    #
367
    GetOptions (
368
                "help:+"        => \$opt_help,
369
                "manual:3"      => \$opt_help,
379 dpurdie 370
                "error!"       => \$opt_error,
311 dpurdie 371
                ) || Error ("Invalid command line" );
372
 
373
    #
374
    #   Subcommand specific help
375
    #
376
    SubCommandHelp( $opt_help, "Delete a Package") if ($opt_help || $#ARGV < 0);
377
 
378
    #
379
    #   Sanity Tests
380
    #
381
    Message ("Delete Entire Package Tree" );
382
    Warning ("Too many arguments: @ARGV") if ( $#ARGV >= 1 );
383
 
384
    #
385
    #   Do all the hard work
386
    #       Create
387
    #       Import
388
    #       Label
389
    #
390
    my $uref = NewSessionByUrl ( $ARGV[0] );
379 dpurdie 391
    $uref->SvnValidatePackageRoot(!$opt_error);
311 dpurdie 392
    $uref->SvnDelete (
393
                      'target'      => $uref->Full,
385 dpurdie 394
                      'comment'   => [$uref->Path().": Delete Package",'Deleted by user command: jats svn delete-package'],
379 dpurdie 395
                      'noerror'   => !$opt_error,
311 dpurdie 396
                      );
397
    $opr_done = 1;
398
}
399
 
400
#-------------------------------------------------------------------------------
401
# Function        : CreatePackage
402
#
403
# Description     : Create a Package structure within a Repository
404
#                   Optionally Import Data
405
#                   Optionally Tag the import
406
#                   Optionally Tag the import on a branch
407
#
408
# Inputs          : URL                 - Url to Repo + Package Base
409
#                   Options             - Command modifiers
410
#                       -import=path    - Import named directory
411
#                       -label=name     - Label the result
412
#                       -tag=name       - Import to Tag Only
413
#                       -branch=name    - Import to Branch only
414
#                       -new            - Must be new package
415
#                       -replace        - Replace existing
416
#
2049 dpurdie 417
# Returns         :
311 dpurdie 418
#
419
sub CreatePackage
420
{
421
    my $opt_import;
422
    my $opt_tag;
423
    my $opt_branch;
424
    my $opt_trunk;
425
    my $opt_new;
426
    my $opt_label;
427
    my $opt_replace;
428
    my $pname;
429
    my $type;
385 dpurdie 430
    my $opt_author;
431
    my $opt_date;
311 dpurdie 432
    Message ("Create New Package Version" );
433
 
434
    #
435
    #   Parse more options
436
    #
437
    GetOptions (
438
                "help:+"        => \$opt_help,
439
                "manual:3"      => \$opt_help,
440
                "verbose:+"     => \$opt_verbose,
441
                "import=s"      => \$opt_import,
442
                "new"           => \$opt_new,
443
                "branch=s"      => \$opt_branch,
444
                "trunk"         => \$opt_trunk,
1403 dpurdie 445
                "tags=s"        => \$opt_tag,
311 dpurdie 446
                "label=s"       => \$opt_label,
447
                "replace"       => \$opt_replace,
385 dpurdie 448
                'author=s'      => \$opt_author,
449
                'date=s'        => \$opt_date,
311 dpurdie 450
 
451
                ) || Error ("Invalid command line" );
452
 
453
    #
454
    #   Subcommand specific help
455
    #
456
    SubCommandHelp( $opt_help, "Create a Package Version") if ($opt_help || $#ARGV < 0);
2049 dpurdie 457
 
311 dpurdie 458
    #
369 dpurdie 459
    #   Alter the error reporting parameters
311 dpurdie 460
    #
461
    ErrorConfig( 'verbose' => $opt_verbose );
462
 
463
    #
464
    #   Sanity Tests
465
    #
466
    my $count = 0;
467
    $count++ if ( $opt_trunk );
468
    $count++ if ( $opt_branch );
469
    $count++ if ( $opt_tag );
470
    Error ("Conflicting options: -trunk, -tag, -branch") if ( $count > 1 );
471
    Error ("Nothing imported to be labeled") if ( $count && !$opt_import );
472
    Error ("Import path does not exist: $opt_import") if ( $opt_import && ! -d $opt_import );
473
    Error ("Conflicting options: new and replace") if ( $opt_new && $opt_replace );
385 dpurdie 474
    Error ("Too many command line arguments") if ( exists $ARGV[1] );
311 dpurdie 475
 
1403 dpurdie 476
    $type = 'tags/' . $opt_tag          if ( $opt_tag);
477
    $type = 'branches/' . $opt_branch   if ( $opt_branch );
478
    $type = 'trunk'                     if ( $opt_trunk);
311 dpurdie 479
 
480
    #
481
    #   Do all the hard work
482
    #       Create
483
    #       Import
484
    #       Label
485
    #
486
    my $uref = NewSessionByUrl ( $ARGV[0] );
487
    $uref->SvnCreatePackage (
488
                      'import'  => $opt_import,
489
                      'label'   => $opt_label,
490
                      'type'    => $type,
491
                      'new'     => $opt_new,
492
                      'replace' => $opt_replace,
493
                      );
385 dpurdie 494
    #
495
    # Report RmPath as using a pegged version of a new package is a bit silly
496
    #
1403 dpurdie 497
#    Message ("Repository Ref: " . $uref->RmPath);
498
#    Message ("Vcs Tag       : " . $uref->SvnTag);
1329 dpurdie 499
    if ( $uref->{REVNO} )
500
    {
501
        $uref->setRepoProperty('svn:author', $opt_author) if (defined ($opt_author));
502
        $uref->setRepoProperty('svn:date', $opt_date) if (defined ($opt_date));
503
    }
311 dpurdie 504
    $opr_done = 1;
505
}
506
 
507
#-------------------------------------------------------------------------------
508
# Function        : ImportPackage
509
#
510
# Description     : Import a new version of a package
511
#                   Take great care to reuse file-versions that are already in
512
#                   the  package
513
#
369 dpurdie 514
#                   Intended to allow the importation of multiple
311 dpurdie 515
#                   versions of a package
516
#
2049 dpurdie 517
# Inputs          :
311 dpurdie 518
#
2049 dpurdie 519
# Returns         :
311 dpurdie 520
#
521
sub ImportPackage
522
{
523
    Message ("Import Package Version" );
524
 
525
    #
526
    #   Options
527
    #
528
    my $opt_package;
529
    my $opt_dir;
530
    my $opt_label;
531
    my $opt_replace = 0;
532
    my $opt_reuse;
533
    my $opt_workdir = "SvnImportDir";
534
    my $opt_delete = 1;
379 dpurdie 535
    my $opt_author;
536
    my $opt_date;
537
    my $opt_log = '';
538
    my $opt_branch;
539
    my $opt_datafile;
1403 dpurdie 540
    my $opt_printfiles;
2429 dpurdie 541
    my $opt_commit = 1;
2764 dpurdie 542
    my $opt_mergePaths;
311 dpurdie 543
 
544
    #
545
    #   Other globals
546
    #
547
    my $url_label;
379 dpurdie 548
    my $url_branch;
311 dpurdie 549
 
2764 dpurdie 550
    my $filesBase = 0;                  # Files in Base workspace
551
    my $filesDeleted = 0;               # Files Deleted
552
    my $filesAdded = 0;                 # Files Added
553
    my $filesTransferred = 0;           # Files Copied
554
    my $dirsDeleted = 0;                # Directories Deleted
555
    my $dirsAdded = 0;                  # Directories Added
556
    my $dirsTransferred = 0;            # Directories Copied
557
 
558
 
311 dpurdie 559
    #
560
    #   Configuration options
561
    #
562
    my $result = GetOptions (
379 dpurdie 563
                    'help:+'        => \$opt_help,
564
                    'manual:3'      => \$opt_help,
565
                    'verbose:+'     => \$opt_verbose,
566
                    'package=s'     => \$opt_package,
567
                    'dir=s'         => \$opt_dir,
568
                    'label=s'       => \$opt_label,
569
                    'branch=s'      => \$opt_branch,
570
                    'replace'       => \$opt_replace,
571
                    'reuse'         => \$opt_reuse,
572
                    'workspace=s'   => \$opt_workdir,
573
                    'delete!'       => \$opt_delete,
1403 dpurdie 574
                    'printfiles=i'  => \$opt_printfiles,
379 dpurdie 575
                    'author=s'      => \$opt_author,
576
                    'date=s'        => \$opt_date,
577
                    'log=s'         => \$opt_log,
578
                    'datafile=s'    => \$opt_datafile,
2429 dpurdie 579
                    'commit!'       => \$opt_commit,
2764 dpurdie 580
                    'mergePaths=s'  => \$opt_mergePaths,
311 dpurdie 581
 
582
                    #
583
                    #   Update documentation at the end of the file
584
                    #
585
                    ) || Error ("Invalid command line" );
586
 
587
    #
588
    #   Insert defaults
341 dpurdie 589
    #   User can specify base package via -package or a non-options argument
311 dpurdie 590
    #
591
    $opt_package = $ARGV[0] unless ( $opt_package );
379 dpurdie 592
    unlink $opt_datafile if ( defined $opt_datafile );
2049 dpurdie 593
 
311 dpurdie 594
    #
595
    #   Subcommand specific help
596
    #
597
    SubCommandHelp( $opt_help, "Import directory to a Package")
598
        if ($opt_help || ! $opt_package );
599
 
600
    #
369 dpurdie 601
    #   Alter the error reporting parameters
311 dpurdie 602
    #
603
    ErrorConfig( 'verbose' => $opt_verbose );
604
 
605
    #
606
    #   Configure the error reporting process now that we have the user options
607
    #
608
    Error ("No package URL specified") unless ( $opt_package );
609
    Error ("No base directory specified") unless ( $opt_dir );
610
    Error ("Invalid base directory: $opt_dir") unless ( -d $opt_dir );
2429 dpurdie 611
    Error ("Cannot label if not committing") if ( $opt_label && ! $opt_commit );
311 dpurdie 612
 
613
    #
614
    #   Create an SVN session
615
    #
616
    my $svn = NewSessionByUrl ( $opt_package );
617
 
618
    #
619
    #   Ensure that the required label is available
620
    #
621
    if ( $opt_label )
622
    {
623
        $opt_label = SvnIsaSimpleLabel ($opt_label);
624
        $url_label = $svn->BranchName( $opt_label, 'tags' );
625
        $svn->SvnValidateTarget (
626
                        'target' => $url_label,
627
                        'available' => 1,
628
                        ) unless ( $opt_replace );
629
    }
630
 
631
    #
379 dpurdie 632
    #   Validate the required branch
633
    #   It will be created if it doesn't exist
634
    #
635
    if ( $opt_branch )
636
    {
637
        $opt_branch = SvnIsaSimpleLabel($opt_branch);
638
        $url_branch = $svn->BranchName( $opt_branch, 'branches' );
385 dpurdie 639
        my $rv = $svn->SvnValidateTarget (
640
                        'cmd'    => 'SvnImporter. Create branch',
379 dpurdie 641
                        'target' => $url_branch,
642
                        'create' => 1,
643
                        );
385 dpurdie 644
        if ( $rv == 2 )
645
        {
646
            $svn->setRepoProperty('svn:author', $opt_author) if (defined ($opt_author));
647
            $svn->setRepoProperty('svn:date', $opt_date) if (defined ($opt_date));
648
        }
379 dpurdie 649
    }
650
 
651
    #
311 dpurdie 652
    #   Create a workspace based on the users package
653
    #   Allow the workspace to be reused to speed up multiple
654
    #   operations
655
    #
656
    unless ( $opt_reuse && -d $opt_workdir )
657
    {
658
        Message ("Creating Workspace");
659
        rmtree( $opt_workdir );
660
 
661
        $svn->SvnValidatePackageRoot ();
662
        #DebugDumpData( 'Svn', $svn );
663
        $svn->SvnValidateTarget (
664
                            'cmd'    => 'SvnImporter',
665
                            'target' => $svn->Full,
666
                            'require' => 1,
667
                            );
668
 
379 dpurdie 669
        my $url_co = $opt_branch ? $url_branch : $svn->Full . '/trunk';
1403 dpurdie 670
        $svn->SvnCo ( $url_co, $opt_workdir, 'print' => $opt_printfiles );
311 dpurdie 671
        Error ("Cannot locate the created Workspace")
672
            unless ( -d $opt_workdir );
673
    }
674
    else
675
    {
676
        Message ("Reusing Workspace");
677
    }
2049 dpurdie 678
 
311 dpurdie 679
    #
680
    #   Determine differences between the two folders
681
    #       Create structures for each directory
682
    #
683
    Message ("Determine Files in packages");
684
 
685
    my $search = JatsLocateFiles->new("--Recurse=1",
686
                                       "--DirsToo",
687
                                       "--FilterOutRe=/\.svn/",
688
                                       "--FilterOutRe=/\.svn\$",
689
                                       "--FilterOutRe=^/${opt_workdir}\$",
690
                                       "--FilterOutRe=^/${opt_workdir}/",
691
                                       );
692
    my @ws = $search->search($opt_workdir);
693
    my @dir = $search->search($opt_dir);
694
 
1329 dpurdie 695
    #
696
    #   Scan for a source file
697
    #   Trying to detect empty views
698
    #   Look for file, not directory
2764 dpurdie 699
    #       Keep a count for reporting
1329 dpurdie 700
    #
701
    {
2764 dpurdie 702
        foreach ( @ws )
703
        {
704
            $filesBase++ unless ( m~/$~ );
705
        }
706
 
1329 dpurdie 707
        my $fileFound = 0;
708
        foreach ( @dir )
709
        {
710
            next if ( m~/$~ );
2764 dpurdie 711
            $fileFound = 1;
1329 dpurdie 712
            last;
713
        }
714
 
715
        unless ( $fileFound )
716
        {
717
            Warning ("No source files found in source view");
718
            $opr_done = 1;
719
            return;
720
        }
721
    }
722
 
311 dpurdie 723
    #Information ("WS Results", @ws);
724
    #Information ("DIR Results", @dir);
1329 dpurdie 725
    #Information ("WS Results: ", scalar @ws);
726
    #Information ("DIR Results:", scalar @dir);
311 dpurdie 727
 
728
    #
729
    #   Create a hash the Workspace and the User dir
730
    #   The key will be file names
731
    #
732
    my %ws;  map ( $ws{$_} = 1 , @ws );
733
    my %dir; map ( $dir{$_} = 1 , @dir );
734
 
735
    #
736
    #   Create a hash of common elements
737
    #   Removing then from the other two
738
    #
739
    my %common;
740
    foreach ( keys %ws )
741
    {
742
        next unless ( exists $dir{$_} );
743
        $common{$_} = 1;
744
        delete $ws{$_};
745
        delete $dir{$_};
746
    }
747
 
2764 dpurdie 748
    #
749
    #   Now have:
750
    #       %ws     - Hash of paths that are only in the Workspace
751
    #       %dir    - Hash of paths that are only in New Import
752
    #       %common - Hash of paths that are common to both
753
    #
311 dpurdie 754
    #DebugDumpData( 'WS', \%ws );
755
    #DebugDumpData( 'DIR', \%dir );
756
    #DebugDumpData( 'COMMON', \%common );
757
 
2764 dpurdie 758
 
311 dpurdie 759
    #
379 dpurdie 760
    #   Need to consider the case where a file has been replaced with a directory
761
    #   and visa-versa. Delete files and directories first.
762
    #
763
    #
764
    #   Remove files
765
    #   Sort in reverse. This will ensure that we process directory
766
    #   contents before directories
767
    #
2764 dpurdie 768
 
379 dpurdie 769
    my @rm_files = reverse sort keys %ws;
770
    if ( @rm_files )
771
    {
2764 dpurdie 772
        #
773
        #   Calculate new top level paths
774
        #   These are of the form xxxxx/
775
        #
776
        my @newTldPaths;
777
        if ( $opt_mergePaths )
778
        {
779
            foreach  ( @rm_files)
780
            {
781
                push (@newTldPaths, $1 ) if ( m~^([^/]+)/$~ );
782
            }
783
        }
784
 
785
        my @processedFiles;
379 dpurdie 786
        foreach my $file ( @rm_files  )
787
        {
2764 dpurdie 788
            #
789
            #   Detect items that are to be retained
790
            #   Do not delete items that are a part of a top level path that
3347 dpurdie 791
            #   are not present in the New Import
2764 dpurdie 792
            #
793
            if ( $opt_mergePaths )
794
            {
795
                my $keep = 0;
796
                foreach ( @newTldPaths )
797
                {
798
                    if ( $file =~ m~^$_/~ )
799
                    {
4030 dpurdie 800
                        Verbose("Merge Retain: $file");
2764 dpurdie 801
                        $keep = 1;
802
                        last;
803
                    }
804
                }
3347 dpurdie 805
 
806
                #
807
                #   Examine $opt_mergPaths and process entries that look like
808
                #       build/**  -> keep the directory and every think under it
809
                #
810
                foreach ( split(',', $opt_mergePaths) )
811
                {
812
                    if ( m~(.+/)\*\*$~ )
813
                    {
814
                        my $base = $1;
815
                        if ( $file =~ m~^$base~ )
816
                        {
4030 dpurdie 817
                            Verbose("Merge Retain: $file");
3347 dpurdie 818
                            $keep = 1;
819
                            last;
820
                        }
821
                    }
822
                }
823
 
2764 dpurdie 824
                next if ($keep);
825
            }
826
 
4030 dpurdie 827
            Verbose ("Removing $file");
2764 dpurdie 828
            $filesDeleted++ unless ( $file =~ m~/$~ );
829
            $dirsDeleted++ if ( $file =~ m~/$~ );
379 dpurdie 830
            unlink "$opt_workdir/$file";
2764 dpurdie 831
            push @processedFiles, $file;
379 dpurdie 832
        }
2764 dpurdie 833
        @rm_files = @processedFiles;
379 dpurdie 834
 
835
        #
836
        #   Inform Subversion about the removed files
837
        #
838
        my $base = 0;
839
        my $num = $#rm_files;
2764 dpurdie 840
        Message ("Update the workspace: Removed $filesDeleted Files, $dirsDeleted directories");
379 dpurdie 841
 
842
        while ( $base <= $num )
843
        {
844
            my $end = $base + 200;
845
            $end = $num if ( $end > $num );
846
 
847
            $svn->SvnCmd ( 'delete', map ("$opt_workdir/$_@", @rm_files[$base .. $end] ),
848
                            { 'error' => 'Deleting files from workspace' } );
2049 dpurdie 849
 
379 dpurdie 850
            $base = $end + 1;
851
        }
852
    }
2049 dpurdie 853
 
379 dpurdie 854
    #
311 dpurdie 855
    #   Add New Files
856
    #   Won't add empty directories at this point
857
    #
858
    #   Process by sorted list
859
    #   This will ensure we process parent directories first
860
    #
861
    my @added = sort keys %dir;
862
    if ( @added )
863
    {
2764 dpurdie 864
        my @processedFiles;
311 dpurdie 865
        foreach my $file ( @added  )
866
        {
2764 dpurdie 867
            #
868
            #   Detect items that are to be merged
869
            #   Only specified top level paths are to be imported
3347 dpurdie 870
            #   Special mergePath names
871
            #       ++              - All files and directories
872
            #       +               - All files in the root
873
            #       path/**         - Keep all items under path
874
            #       Otherwise       - name of a directory
2764 dpurdie 875
            #
876
            if ( $opt_mergePaths )
877
            {
878
                my $discard = 1;
879
                foreach ( split(',', $opt_mergePaths) )
880
                {
3347 dpurdie 881
                    next if ( m ~\*\*$~ );
882
                    if ( $_ eq '++' )
2764 dpurdie 883
                    {
3347 dpurdie 884
                        $discard = 0;
885
                        last;
886
                    }
887
                    elsif ( $_ eq '+' )
888
                    {
2764 dpurdie 889
                        if ( ($file =~ tr~/~/~) eq 0 )
890
                        {
891
                            $discard = 0;
892
                            last;
893
                        }
894
                    }
895
                    elsif ( $file =~ m~^$_/~ )
896
                    {
897
                        $discard = 0;
898
                        last;
899
                    }
900
                }
4030 dpurdie 901
                Verbose("Not Importing: $file") if ( $discard ) ;
2764 dpurdie 902
                next if ( $discard );
903
            }
904
 
311 dpurdie 905
            my $src = "$opt_dir/$file";
906
            my $target = "$opt_workdir/$file";
2764 dpurdie 907
            $filesAdded++ unless ( $file =~ m~/$~ );
908
            $dirsAdded++ if ( $file =~ m~/$~ );
909
            push @processedFiles, $file;
311 dpurdie 910
 
911
            if ( -d $src )
912
            {
379 dpurdie 913
                Verbose ("Adding directory: $file");
311 dpurdie 914
                mkdir ( $target ) unless (-d $target);
915
            }
916
            else
917
            {
918
 
919
                my $path = dirname ( $target);
920
                mkdir ( $path ) unless (-d $path);
921
 
922
                Verbose ("Adding $file");
923
                unless (File::Copy::copy( $src, $target ))
924
                {
925
                    Error("Failed to transfer file [$file]: $!");
926
                }
927
            }
928
        }
2764 dpurdie 929
        @added = @processedFiles;
930
 
311 dpurdie 931
        #
932
        #   Inform Subversion about the added files
933
        #   The command line does have a finite length, so add them 200 at a
934
        #   time.
935
        #
936
 
937
        my $base = 0;
938
        my $num = $#added;
2764 dpurdie 939
        Message ("Update the workspace: Added $filesAdded Files, $dirsAdded directories");
311 dpurdie 940
 
941
        while ( $base <= $num )
942
        {
943
            my $end = $base + 200;
944
            $end = $num if ( $end > $num );
945
 
946
            $svn->SvnCmd ( 'add'
947
                            , '--depth=empty'
948
                            , '--parents'
379 dpurdie 949
                            , map ("$opt_workdir/$_@", @added[$base .. $end] ),
311 dpurdie 950
                            { 'error' => 'Adding files to workspace' } );
951
 
952
            $base = $end + 1;
953
        }
954
    }
955
 
956
    #
957
    #   The common files may have changed
958
    #   Simply copy them all in and let subversion figure it out
959
    #
960
    foreach my $file ( sort keys %common  )
961
    {
962
        my $src = "$opt_dir/$file";
963
        my $target = "$opt_workdir/$file";
964
 
2764 dpurdie 965
        $filesTransferred++ unless ( $file =~ m~/$~ );
966
        $dirsTransferred++ if ( $file =~ m~/$~ );
967
 
311 dpurdie 968
        next if ( -d $src );
969
        if ( File::Compare::compare ($src, $target) )
970
        {
971
            Verbose ("Transfer $file");
972
            unlink $target;
973
            unless (File::Copy::copy( $src, $target ))
974
            {
975
                Error("Failed to transfer file [$file]: $!",
976
                      "Src: $src",
977
                      "Tgt: $target");
978
            }
979
        }
980
    }
2764 dpurdie 981
    Message ("Update the workspace: Transferred $filesTransferred Files, $dirsTransferred directories")
982
        if ($filesTransferred);
311 dpurdie 983
 
984
    #
985
    #   Commit the workspace
986
    #   This will go back onto the trunk
987
    #
2429 dpurdie 988
    if ( $opt_commit )
989
    {
990
        $svn = NewSessionByWS( $opt_workdir );
991
        my $pkgPath = $svn->Path();
387 dpurdie 992
 
2429 dpurdie 993
        my $ciComment = "$pkgPath: Checkin by Svn Import";
994
        $ciComment .= "\n" . $opt_log if ( $opt_log );
995
        $ciComment =~ s~\r\n~\n~g;
996
        $ciComment =~ s~\r~\n~g;
997
        $ciComment = encode('UTF-8', $ciComment, Encode::FB_DEFAULT);
387 dpurdie 998
 
2429 dpurdie 999
        $svn->SvnCi ('comment' => $ciComment, 'allowSame' => 1 );
1000
        Message ("Repository Ref: " . $svn->RmRef) unless( $opt_label );
4076 dpurdie 1001
        unless ($svn->{NoRepoChanges}) {
1002
            $svn->setRepoProperty('svn:author', $opt_author) if (defined ($opt_author));
1003
            $svn->setRepoProperty('svn:date', $opt_date) if (defined ($opt_date));
1004
        }
2429 dpurdie 1005
 
1006
        #
1007
        #   Label the result
1008
        #   The workspace will have been updated, so we can use it as the base for
1009
        #   the labeling process
1010
        #
1011
        if ( $opt_label )
1012
        {
4076 dpurdie 1013
            my $tagComment = "$pkgPath: Tagged by Jats Svn Import";
1014
            if ($svn->{NoRepoChanges} && $opt_log )
1015
            {
1016
                $tagComment .= "\nNo Repository changes on last commit. Comment was:";
1017
                $tagComment .= "\n" . $opt_log;
1018
                $tagComment =~ s~\r\n~\n~g;
1019
                $tagComment =~ s~\r~\n~g;
1020
                $tagComment = encode('UTF-8', $tagComment, Encode::FB_DEFAULT);
1021
            }
2429 dpurdie 1022
            $svn->SvnCopyWs (
1023
                           target => $url_label,
1024
                           'noswitch' => 1,
1025
                           'replace' => $opt_replace,
4076 dpurdie 1026
                           'comment' => $tagComment,
2429 dpurdie 1027
                           );
1028
            Message ("Repository Ref: " . $svn->RmRef);
1029
            Message ("Vcs Tag       : " . $svn->SvnTag);
1030
            $svn->setRepoProperty('svn:author', $opt_author) if (defined ($opt_author));
1031
            $svn->setRepoProperty('svn:date', $opt_date) if (defined ($opt_date));
1032
        }
311 dpurdie 1033
    }
2429 dpurdie 1034
    else
1035
    {
1036
        Message ("Workspace not commited","Workspace: $opt_workdir");
1037
    }
311 dpurdie 1038
 
1039
    #
1040
    #   Clean up
1041
    #
2429 dpurdie 1042
    if ( $opt_delete && ! $opt_reuse  && $opt_commit )
311 dpurdie 1043
    {
1044
        Message ("Delete Workspace");
1045
        rmtree( $opt_workdir );
1046
    }
379 dpurdie 1047
 
1048
    #
1049
    #   Automation data transfer
1050
    #
1051
    if ( defined $opt_datafile )
1052
    {
1053
        my $data = JatsProperties::New();
1054
 
1055
        $data->setProperty('Command'        , 'ImportPackage');
1056
        $data->setProperty('Label'          , $opt_label);
1403 dpurdie 1057
        $data->setProperty('subversion.url' , $svn->RmRef);
1058
        $data->setProperty('subversion.tag' , $svn->SvnTag);
379 dpurdie 1059
 
2764 dpurdie 1060
        $data->setProperty('files.base'     , $filesBase);
1061
        $data->setProperty('files.removed'  , $filesDeleted);
1062
        $data->setProperty('files.added'    , $filesAdded);
1063
 
379 dpurdie 1064
        $data->Dump('InfoFile') if ($opt_verbose);
1065
        $data->store( $opt_datafile );
1066
    }
1067
 
311 dpurdie 1068
    $opr_done = 1;
1069
}
1070
 
1071
#-------------------------------------------------------------------------------
385 dpurdie 1072
# Function        : DeleteBranch
1073
#
1074
# Description     : Delete the branch that a workspace is based upon
1075
#
2049 dpurdie 1076
# Inputs          :
385 dpurdie 1077
#
2049 dpurdie 1078
# Returns         :
385 dpurdie 1079
#
1080
sub DeleteBranch
1081
{
1082
    my $opt_path;
1083
    my $opt_error = 0;
1084
    #
1085
    #   Parse more options
1086
    #
1087
    GetOptions (
1088
                "help:+"        => \$opt_help,
1089
                "manual:3"      => \$opt_help,
1090
                "path:s"        => \$opt_path,
1091
                ) || Error ("Invalid command line" );
1092
 
1093
    #
1094
    #   Subcommand specific help
1095
    #
1096
    SubCommandHelp( $opt_help, "Delete Branch") if ($opt_help);
1097
 
1098
    #
1099
    #   Sanity Tests
1100
    #
2429 dpurdie 1101
    Message ("Delete Workspace Branchs" );
385 dpurdie 1102
 
1103
    #
1104
    #   Do all the hard work
1105
    #
1106
    $opt_path = '.' unless ( defined $opt_path );
1107
    my $uref = NewSessionByWS($opt_path, 0, 1);
1108
    my $ws_root = $uref->SvnLocateWsRoot(1);
1109
    my $ws_url = $uref->FullWs();
1110
 
1111
    #
2931 dpurdie 1112
    #   What we do depends what arguments the user provided
385 dpurdie 1113
    #
2429 dpurdie 1114
    unless ( @ARGV )
1115
    {
1116
        #
1117
        #   If no branch was specified - then display the workspace branch
1118
        #
1119
        Error ('The workspace is not based on a branch')
1120
            unless ( $ws_url =~ m ~/branches/(.*)~ );
1121
        Message('The workspace is based on the branch: '. $1);
1122
    }
1123
    else
1124
    {
1125
        #
1126
        #   Delete all specified branches
1127
        #
1128
        foreach my $branch ( @ARGV )
1129
        {
1130
            Message ("Deleting: " . $branch );
1131
            my $target = join( '/', $uref->FullPath(), 'branches', $branch);
1132
            if ( $uref->SvnDelete (
1133
                              'target'    => $target,
1134
                              'comment'   => [$uref->Path().": Delete Branch",'Deleted by user command: jats svn delete-branch'],
1135
                              'noerror'   => 1,
1136
                              )
1137
               )
1138
            {
1139
                Warning ("Branch deletion failed: $branch");
1140
            }
1141
        }
1142
    }
385 dpurdie 1143
    $opr_done = 1;
1144
}
1145
 
2049 dpurdie 1146
#-------------------------------------------------------------------------------
1147
# Function        : CreateBranch
1148
#
1149
# Description     : Branch a workspace and then switch to the new branch
1150
#
1151
# Inputs          :
1152
#
1153
# Returns         :
1154
#
1155
sub CreateBranch
1156
{
1157
    my $opt_path;
1158
    my $opt_comment;
1159
    my $opt_switch = 1;
1160
    my $opt_branch;
385 dpurdie 1161
 
2049 dpurdie 1162
    #
1163
    #   Parse more options
1164
    #
1165
    GetOptions (
1166
                "help:+"        => \$opt_help,
1167
                "manual:3"      => \$opt_help,
1168
                "path:s"        => \$opt_path,
1169
                "switch!"       => \$opt_switch,
1170
                "comment:s"     => \$opt_comment,
1171
                ) || Error ("Invalid command line" );
1172
 
1173
    #
1174
    #   Subcommand specific help
1175
    #
1176
    SubCommandHelp( $opt_help, "Create Branch") if ($opt_help);
1177
 
1178
    #
1179
    #   Sanity Tests
1180
    #
1181
    Message ("Create Workspace Branch" );
1182
    Error ("Too many arguments: @ARGV") if ( $#ARGV > 0 );
1183
    Error ("Not enough arguments. No branch name specified") if ( $#ARGV < 0 );
1184
 
1185
    #
1186
    #   Sanity test the label
1187
    #
1188
    $opt_branch = SvnIsaSimpleLabel ($ARGV[0] );
1189
 
1190
    #
1191
    #   Do all the hard work
1192
    #
1193
    $opt_path = '.' unless ( defined $opt_path );
1194
    my $uref = NewSessionByWS($opt_path, 0, 1);
1195
    my $ws_root = $uref->SvnLocateWsRoot(1);
1196
    my $ws_url = $uref->Full();
1197
 
1198
    #
2931 dpurdie 1199
    #   Use the version of the branch that has been committed as the base of the
1200
    #   copy. If the user has modified files, then they won't be committed
2049 dpurdie 1201
    #
1202
    #   This operation will be server-side only
1203
    #
1204
    Message ("Creating branch: $opt_branch");
1205
    my $repoLink = $uref->{InfoWs}{URL} . '@' . $uref->{InfoWs}{Revision};
1206
    $uref->{DEVBRANCH} =  join ('/', 'branches', $opt_branch);
1207
    my $branch_tag = $uref->SvnCopy (
1208
                'old' => $repoLink,
1209
                'new' => join ('/', $ws_url, $uref->{DEVBRANCH} ),
1210
                'comment' => $opt_comment ? $opt_comment : 'Created by Jats svn branch',
1211
                'replace' => 0,
1212
                );
1213
 
2054 dpurdie 1214
 
2049 dpurdie 1215
    if ( $opt_switch )
1216
    {
1217
        Verbose ("Switching to new branch: $opt_branch");
1218
        $branch_tag = SvnPath2Url($branch_tag);
2054 dpurdie 1219
        chdir ($ws_root) || Error ("Cannot cd to: " .$ws_root);
1220
        $uref->SvnSwitch ($branch_tag, $opt_path, '--Print', '--KeepWs' );
2049 dpurdie 1221
    }
1222
    else
1223
    {
1224
        Warning ("Using existing workspace, not the created branch");
1225
    }
1226
    Message ("Repository Ref: " . $uref->RmRef);
1227
    Message ("Vcs Tag       : " . $uref->SvnTag);
1228
 
1229
#    #
1230
#    #   The copy operation *should* be a server side operation only
2931 dpurdie 1231
#    #   If the user has committed changes, but not yet updated the local
2049 dpurdie 1232
#    #   workspace, then subversion will do a client side copy
1233
#    #   This is not good.
1234
#    #
1235
#    $uref->SvnCopyWs (
1236
#                   target => join ('/', $ws_url, 'branches', $opt_branch),
1237
#                   'allowLocalMods' => 1,
1238
#                   'noupdatecheck' => 1,
1239
#                   'noswitch' => ! $opt_switch,
1240
#                   'replace' => 0,
1241
#                   'comment' => $opt_comment ? $opt_comment : 'Created by Jats svn branch',
1242
#                   );
1243
#
1244
#    Message ("Repository Ref: " . $uref->RmRef);
1245
#    Message ("Vcs Tag       : " . $uref->SvnTag);
1246
 
1247
    $opr_done = 1;
1248
}
1249
 
385 dpurdie 1250
#-------------------------------------------------------------------------------
2049 dpurdie 1251
# Function        : SwitchBranch
1252
#
1253
# Description     : Switch to a specified branch
1254
#
1255
# Inputs          :
1256
#
1257
# Returns         :
1258
#
1259
sub SwitchBranch
1260
{
1261
    my $opt_path = '.';
1262
    my $opt_branch;
1263
 
1264
    #
1265
    #   Parse more options
1266
    #
1267
    GetOptions (
1268
                "help:+"        => \$opt_help,
1269
                "manual:3"      => \$opt_help,
1270
                "path:s"        => \$opt_path,
1271
                ) || Error ("Invalid command line" );
1272
 
1273
    #
1274
    #   Subcommand specific help
1275
    #
1276
    SubCommandHelp( $opt_help, "Switch Branch") if ($opt_help);
1277
    return ShowBranches($opt_path) if ( $#ARGV < 0 );
1278
 
1279
    #
1280
    #   Sanity Tests
1281
    #
1282
    Error ("Too many arguments: @ARGV") if ( $#ARGV > 0 );
1283
 
1284
    #
1285
    #   Calculate the target name
1286
    #       trunk is special
1287
    #       tags/... is special
1288
    $opt_branch = $ARGV[0];
1289
    if ( $opt_branch eq 'trunk' ) {
1290
    } elsif ( $opt_branch =~ m~tags/.+~ ) {
1291
    } else {
1292
        $opt_branch = join ('/', 'branches', $opt_branch);
1293
    }
1294
    Message ("Switching to new branch: $opt_branch");
1295
 
1296
    #
1297
    #   Do all the hard work
1298
    #
1299
    my $uref = NewSessionByWS($opt_path, 0, 1);
2054 dpurdie 1300
    my $ws_root = $uref->SvnLocateWsRoot(1);
2049 dpurdie 1301
    my $ws_url = $uref->Full();
1302
    my $branch_tag = join ('/', $ws_url, $opt_branch);
1303
 
1304
    #
1305
    #   Validate the branch
1306
    #
1307
    $uref->SvnValidateTarget (
1308
                        'cmd'    => 'svn switch',
1309
                        'target' => $branch_tag,
1310
                        'require' => 1,
1311
                        );
1312
 
2054 dpurdie 1313
    #
1314
    #   Must Change directory before we switch
2931 dpurdie 1315
    #   Otherwise we will import changes into the wrong place
2054 dpurdie 1316
    #
1317
    chdir ($ws_root) || Error ("Cannot cd to: " . $ws_root);
1318
    $uref->SvnSwitch ($branch_tag, $opt_path, '--Print', '--KeepWs' );
2049 dpurdie 1319
    $opr_done = 1;
1320
}
1321
 
1322
#-------------------------------------------------------------------------------
1323
# Function        : ShowBranches
1324
#
1325
# Description     : Show branches in current workspace
1326
#                   Internal use only
1327
#
1328
# Inputs          : $opt_path           - Optional path
1329
#
1330
# Returns         :
1331
#
1332
sub ShowBranches
1333
{
1334
    my ($opt_path) = @_;
1335
 
1336
    my $uref = NewSessionByWS($opt_path, 0, 1);
1337
    my $ws_url = $uref->Full();
1338
 
1339
    #
2931 dpurdie 1340
    #   Display the packages full URL - allow the user to manually look at more
1341
    #   List the branches
2049 dpurdie 1342
    #
1343
    Message ("Url: $ws_url", 'Available Branches');
1344
    SvnUserCmd( 'ls', join ('/', $ws_url, 'branches'), { 'credentials' => 1 });
1345
    $opr_done = 1;
1346
}
1347
#-------------------------------------------------------------------------------
311 dpurdie 1348
# Function        : SubCommandHelp
1349
#
1350
# Description     : Provide help on a subcommand
1351
#
1352
# Inputs          : $help_level             - Help Level 1,2,3
1353
#                   $topic                  - Topic Name
1354
#
1355
# Returns         : This function does not return
1356
#
1357
sub SubCommandHelp
1358
{
1359
    my ($help_level, $topic) = @_;
1360
    my @sections;
1361
    #
1362
    #   Spell out the section we want to display
1363
    #
1364
    #   Note:
1365
    #   Due to bug in pod2usage can't use 'head1' by itself
1366
    #   Each one needs a subsection.
1367
    #
1368
    push @sections, qw( NAME SYNOPSIS ) ;
1369
    push @sections, qw( ARGUMENTS OPTIONS ) if ( $help_level > 1 );
1370
    push @sections, qw( DESCRIPTION )       if ( $help_level > 2 );
1371
 
1372
    #
1373
    #   Extract section from the POD
1374
    #
1375
    pod2usage({-verbose => 99,
1376
               -noperldoc => 1,
1377
               -sections => $topic . '/' . join('|', @sections) } );
1378
}
1379
 
1380
#-------------------------------------------------------------------------------
1381
#   Documentation
1382
#   NOTE
1383
#
1384
#   Each subcommand MUST have
1385
#   head1 section as used by the subcommand
1386
#       This should be empty, as the contents will NOT be displayed
1387
#   head2 sections called
1388
#       NAME SYNOPSIS ARGUMENTS OPTIONS DESCRIPTION
1389
#
1390
#=head1 xxxxxx
1391
#=head2 NAME
1392
#=head2 SYNOPSIS
1393
#=head2 ARGUMENTS
1394
#=head2 OPTIONS
1395
#=head2 DESCRIPTION
1396
#
1397
 
1398
=pod
1399
 
361 dpurdie 1400
=for htmltoc    GENERAL::Subversion::
1401
 
311 dpurdie 1402
=head1 NAME
1403
 
1404
jats svn - Miscellaneous SubVersion Operations
1405
 
1406
=head1 SYNOPSIS
1407
 
1408
jats svn [options] command [command options]
1409
 
1410
 Options:
1411
    -help[=n]              - Help message, [n=1,2,3]
1412
    -man                   - Full documentation [-help=3]
1413
    -verbose[=n]           - Verbose command operation
1414
 
1415
 Common Command Options:
1416
    All command support suboptions to provide command specific help
1417
 
1418
    -help[=n]              - Help message, [n=1,2,3]
1419
    -man                   - Full documentation [-help=3]
1420
 
1421
 Commands are:
363 dpurdie 1422
    test                   - Test access to subversion
369 dpurdie 1423
    paths                  - Display Subversion tag to URL conversions
311 dpurdie 1424
    ls URL                 - List Repo contents for URL
369 dpurdie 1425
    tag [URL]              - Convert URL or Path to a Release Manager Tag
1426
    url [TAG]              - Convert TAG or Path to a Subversion URL
2049 dpurdie 1427
    create-package URL     - Create a new package at URL
311 dpurdie 1428
    delete-package URL     - Delete Package Subtree
2049 dpurdie 1429
    branch BRANCH          - Create a Development Branch
1430
    switch [BRANCH]        - Switch to a Development Branch
385 dpurdie 1431
    delete-branch          - Delete a Development Branch
311 dpurdie 1432
    import URL             - Import files to package at URL
1433
 
1434
 Use the command
1435
    jats svn command -h
1436
 for command specific help
1437
 
1438
=head1 OPTIONS
1439
 
1440
=over
1441
 
1442
=item B<-help[=n]>
1443
 
1444
Print a help message and exit. The level of help may be either 1, 2 or
1445
3 for a full manual.
1446
 
1447
This option may be specified multiple times to increment the help level, or
1448
the help level may be directly specified as a number.
1449
 
1450
=item B<-man>
1451
 
1452
This is the same as '-help=3'.
1453
The complete help is produced in a man page format.
1454
 
2429 dpurdie 1455
=item B<-verbose[=n]>
311 dpurdie 1456
 
1457
This option will increase the level of verbosity of the commands.
1458
 
1459
If an argument is provided, then it will be used to set the level, otherwise the
1460
existing level will be incremented. This option may be specified multiple times.
1461
 
1462
=back
1463
 
1464
=head1 DESCRIPTION
1465
 
1466
This program provides a number of useful Subversion based operations.
1467
 
363 dpurdie 1468
=head1 Test Subversion
1469
 
1470
=head2 NAME
1471
 
1472
Test Subversion
1473
 
1474
=head2 SYNOPSIS
1475
 
1476
    jats svn test
1477
 
1478
=head2 DESCRIPTION
1479
 
1480
This command will ensure that the subversion command line utility can be
1481
located. The command will report the version of the svn client found.
1482
 
369 dpurdie 1483
=head1 Subversion Paths
1484
 
1485
=head2 NAME
1486
 
1487
Subversion Paths
1488
 
1489
=head2 SYNOPSIS
1490
 
1491
    jats svn paths
1492
 
1493
=head2 DESCRIPTION
1494
 
1495
This command will display the base Tags and associated URLs that are used by
1496
JATS to convert a 'Subversion Tag' into a full URLs that will be used to access
1497
a physical repository.
1498
 
1499
The 'Tags' configuration is site-specific.
1500
 
311 dpurdie 1501
=head1 List Repository
1502
 
363 dpurdie 1503
=head2 NAME
1504
 
1505
List Repository
1506
 
1507
=head2 SYNOPSIS
1508
 
1509
    jats svn ls <URL>
1510
 
1511
=head2 DESCRIPTION
1512
 
311 dpurdie 1513
This command will take a URL and perform a 'svn' list operation. The URL will
1514
be expanded to include the site specific repository.
1515
 
369 dpurdie 1516
=head1 Url to Tag
1517
 
1518
=head2 NAME
1519
 
1520
Url to Tag
1521
 
1522
=head2 SYNOPSIS
1523
 
1524
    jats svn tag [Option] [tag]
1525
 
1526
 Options:
1527
    -help[=n]              - Help message, [n=1,2,3]
1528
    -man                   - Full documentation [-help=3]
1529
    -path=path             - Convert specified path
1530
    -url=url               - Convert specified URL
1531
 
1532
=head2 DESCRIPTION
1533
 
1534
This command will convert a URL or a PATH to a Subversion Tag that can
1535
be used within the remainder of the build system. If no PATH or URL is provided,
1536
then the command uses a path of the current directory.
1537
 
1538
The command will convert either a PATH or a URL. It will not do both.
1539
 
1540
The command will use the configured Subversion URL prefixes to create the Tag.
1541
 
1542
If a PATH is to be converted, then the PATH must address a Subversion workspace.
1543
The conversion will return a Tag to the root of the Workspace and Peg it to
1544
the last committed version. The command will not determine if the workspace
1545
contains modified files.
1546
 
1547
If a URL is to be converted, then the resultant value should be used with
1548
caution. The result is only as good as the provided URL and may not address
1549
the root of a package.
1550
 
1551
=head1 Tag to Url
1552
 
1553
=head2 NAME
1554
 
1555
Tag to Url
1556
 
1557
=head2 SYNOPSIS
1558
 
1559
    jats svn url [Option] [url]
1560
 
1561
 Options:
1562
    -help[=n]              - Help message, [n=1,2,3]
1563
    -man                   - Full documentation [-help=3]
1564
    -path=path             - Convert specified path
1565
    -url=url               - Convert specified URL
1566
 
1567
=head2 DESCRIPTION
1568
 
1569
This command will convert a TAG or a PATH to a full URL that can be used
1570
directly by Subversion. If no PATH or TAG is provided, then the command uses a
1571
path of the current directory.
1572
 
2429 dpurdie 1573
The command will convert either a TAG or a PATH. It will not do both.
369 dpurdie 1574
 
1575
The command will use the configured Subversion URL prefixes to expand the TAG.
1576
 
1577
If a PATH is to be converted, then the PATH must address a Subversion workspace.
1578
The conversion will return a URL to the root of the Workspace and Peg it to
1579
the last committed version. The command will not determine if the workspace
1580
contains modified files.
1581
 
1582
If a TAG is to be converted, then the resultant value should be used with
1583
caution. The result is only as good as the provided URL and may not address
1584
the root of a package.
1585
 
2429 dpurdie 1586
=head3 Examples
1587
 
1588
To display the URL of the current workspace
1589
 
1590
    jats svn url
1591
 
1592
To display the URL of a known workspace
1593
 
1594
    jats svn url -path=myWorkSpace
1595
 
1596
To convert a TAG from Release Manager or other JATS commands
1597
 
1598
    jats svn url AUPERASVN01/COTS
1599
    jats svn url SVN::AUPERASVN01/COTS/bouncycastle/trunk::bouncycastle_1.3.1.cots@502
1600
 
2049 dpurdie 1601
=head1 Create a Package Version
1602
 
1603
=head2 NAME
1604
 
1605
Create a Package Version
1606
 
1607
=head2 SYNOPSIS
1608
 
1609
jats svn [options] create-package URL [command options]
1610
 
1611
 Options:
1612
    -help[=n]               - Help message, [n=1,2,3]
1613
    -man                    - Full documentation [-help=3]
1614
    -verbose[=n]            - Verbose command operation
1615
 
1616
 Command Options
1617
    -help[=n]               - Provide command specific help
1618
    -new                    - Package must not exist
1619
    -replace                - Replace any existing versions
2429 dpurdie 1620
    -import=path            - Import directory tree
2049 dpurdie 1621
    -label=nnn              - Label imported package
1622
    -trunk                  - Import to trunk (default)
1623
    -tags=nnn               - Import to tags
1624
    -branch=nnn             - Import to branches
1625
 
1626
=head2 ARGUMENTS
1627
 
1628
The command takes one argument: The URL of the desired package.
1629
This may be be:
1630
 
1631
=over
1632
 
1633
=item * A full URL
1634
 
1635
Complete with protocol and path information.
1636
 
1637
=item * A simple URL
1638
 
1639
JATS will prepend the site-specific repository location to the user provided URL
1640
 
1641
=back
1642
 
1643
=head2 OPTIONS
1644
 
1645
=over
1646
 
1647
=item -help[=n]
1648
 
1649
Print a help message and exit. The level of help may be either 1, 2 or 3.
1650
 
1651
This option may be specified multiple times to increment the help level, or
1652
the help level may be directly specified as a number.
1653
 
1654
=item -new
1655
 
1656
This option specifies that the named package MUST not exist at all.
1657
 
1658
=item -replace
1659
 
1660
This option allows the program to replace any existing versions of the
1661
imported source. It will allow the deletion of any existing trunk, tags or
1662
branches.
1663
 
2429 dpurdie 1664
=item -import=path
2049 dpurdie 1665
 
1666
This option specifies the path of a subdirectory tree to import into the newly
1667
created package. In not provided, then only a package skeleton will be created.
1668
 
2429 dpurdie 1669
All files and directories below, but not including, the named path will be
1670
imported into the package.
1671
 
2049 dpurdie 1672
=item -label=nnn
1673
 
1674
This option specifies a label to place the imported source.
1675
 
1676
=item -trunk
1677
 
1678
This option specifies that imported source will be placed on the trunk of the
1679
package. This is the default mode of import.
1680
 
1681
The options -trunk, -tags and -branch are mutually exclusive.
1682
 
1683
=item -tags=nnn
1684
 
1685
This option specifies that imported source will be placed directly on the
1686
named tag of the package.
1687
 
1688
The options -trunk, -tags and -branch are mutually exclusive.
1689
 
1690
=item -branch=nnn
1691
 
1692
This option specifies that imported source will be placed directly on the
1693
named branch of the package.
1694
 
1695
The options -trunk, -tags and -branch are mutually exclusive.
1696
 
1697
=back
1698
 
1699
=head2 DESCRIPTION
1700
 
1701
This command will create a new package within a repository. It will ensure
1702
that the package contains the three required subdirectories: trunk, tags and
1703
branches.
1704
 
1705
The command will also ensure that packages are not placed at inappropriate
1706
locations within the repository. It is not correct to place a package within
1707
another package.
1708
 
1709
The command will, optionally, import a directory tree into the repository and,
1710
optionally, label the package.
1711
 
1712
The package body may be imported to the 'trunk' or to a branch or a tag.
1713
By default the data will be imported to the trunk and may be labeled (tagged).
1714
 
1715
Options allow the targets to be deleted if they exist or to ensure that they
1716
are not present.
1717
 
1718
The command does not attempt to merge file versions within the repository. It
1719
may result in multiple instances of a file within the repository. Use only for
1720
simple imports. Use the 'import' command for more sophisticated import requirements.
1721
 
2429 dpurdie 1722
=head3 Examples
1723
 
1724
To create a package skeleton in the Perth MREF_Package repository for a package
1725
called 'VIXmyPackage':
1726
 
1727
    jats svn create-package AUPERASVN01/MREF_Package/VIXmyPackage
1728
 
1729
To create a package skeleton in the Perth MREF_Package repository, import code
1730
into the trunk of the package and label (tag) it:
1731
 
1732
    jats svn create-package \
1733
           AUPERASVN01/MREF_Package/VIXmyPackage \
1734
           -import=VIXmyNewPackage \
1735
           -label=VIXmyPackage.WIP
1736
 
311 dpurdie 1737
=head1 Delete a Package
1738
 
1739
=head2 NAME
1740
 
1741
Delete a Package
1742
 
1743
=head2 SYNOPSIS
1744
 
1745
jats svn delete-package URL [options]
1746
 
1747
 Options:
1748
    -help[=n]              - Help message, [n=1,2,3]
1749
    -man                   - Full documentation [-help=3]
1750
    -verbose[=n]           - Verbose command operation
1751
 
1752
=head2 ARGUMENTS
1753
 
1754
The command takes one argument: The URL of the desired package.
1755
This may be be:
1756
 
1757
=over
1758
 
1759
=item * A full URL
1760
 
1761
Complete with protocol and path information.
1762
 
1763
=item * A simple URL
1764
 
1765
JATS will prepend the site-specific repository location to the user provided URL
1766
 
1767
=back
1768
 
1769
=head2 OPTIONS
1770
 
1771
This command has no significant options, other than the general help options.
1772
 
1773
=head2 DESCRIPTION
1774
 
1775
This command will delete a package from the repository. It will ensure
1776
that the package is a valid package, before it is deleted.
1777
 
1778
The command is intended to be used by test scripts, rather than users.
1779
 
2049 dpurdie 1780
=head1 Create Branch
385 dpurdie 1781
 
1782
=head2 NAME
1783
 
2049 dpurdie 1784
Create a Workspace Branch
385 dpurdie 1785
 
1786
=head2 SYNOPSIS
1787
 
2049 dpurdie 1788
jats svn branch branch-name [options]
385 dpurdie 1789
 
1790
 Options:
1791
    -help[=n]              - Help message, [n=1,2,3]
1792
    -man                   - Full documentation [-help=3]
1793
    -verbose[=n]           - Verbose command operation
1794
    -path=path             - Target workspace
2049 dpurdie 1795
    -[no]switch            - Switch to new branch(default)
1796
    -comment=text          - Comment to apply to the new branch
385 dpurdie 1797
 
1798
=head2 ARGUMENTS
1799
 
2049 dpurdie 1800
The command takes one argument. The name of the branch to be created.
385 dpurdie 1801
 
1802
=head2 OPTIONS
1803
 
1804
=over
1805
 
1806
=item B<-path=path>
1807
 
1808
This options specifies the path of the target workspace. If not provided the
1809
command will use the current directory.
1810
 
2049 dpurdie 1811
=item B<-[no]switch>
1812
 
1813
If enabled (the default) the workspace will be switched to the new branch at
1814
the end of the process.
1815
 
1816
=item B<-comment=text>
1817
 
1818
If present, the specified text will be used as a Subversion comment when the
1819
branch is created.
1820
 
1821
If not provided, then JATS will provide a basic comment.
1822
 
385 dpurdie 1823
=back
1824
 
1825
=head2 DESCRIPTION
1826
 
2049 dpurdie 1827
This command will create a named branch associated with the workspace in the
1828
specified path. It is intended to simplify the creation of Private or
385 dpurdie 1829
Development branches.
1830
 
2049 dpurdie 1831
If the named branch already exists, then the command will fail.
385 dpurdie 1832
 
2049 dpurdie 1833
The command performs a server-side copy. It will not commit any locally
1834
modified files. Nor will it inform you if there are any.
311 dpurdie 1835
 
2049 dpurdie 1836
By default, the user is 'switched' to the newly created branch.
1837
 
1838
=head1 Switch Branch
1839
 
311 dpurdie 1840
=head2 NAME
1841
 
2049 dpurdie 1842
Switch a Workspace Branch
311 dpurdie 1843
 
1844
=head2 SYNOPSIS
1845
 
2049 dpurdie 1846
jats svn switch [branch-name] [options]
311 dpurdie 1847
 
1848
 Options:
2049 dpurdie 1849
    -help[=n]              - Help message, [n=1,2,3]
1850
    -man                   - Full documentation [-help=3]
1851
    -verbose[=n]           - Verbose command operation
1852
    -path=path             - Target workspace
311 dpurdie 1853
 
1854
=head2 ARGUMENTS
1855
 
2049 dpurdie 1856
The command takes one optional argument. The name of the target branch.
311 dpurdie 1857
 
2049 dpurdie 1858
=head2 OPTIONS
1859
 
311 dpurdie 1860
=over
1861
 
2049 dpurdie 1862
=item B<-path=path>
311 dpurdie 1863
 
2049 dpurdie 1864
This options specifies the path of the target workspace. If not provided the
1865
command will use the current directory.
311 dpurdie 1866
 
2049 dpurdie 1867
=back
311 dpurdie 1868
 
2049 dpurdie 1869
=head2 DESCRIPTION
311 dpurdie 1870
 
2049 dpurdie 1871
This command will switch the users workspace to the named branch. This is
1872
identical to the Subversion switch command, except it is easier to user and
1873
has several validity checks and other enhancements.
311 dpurdie 1874
 
2049 dpurdie 1875
The command has two modes of operation:
311 dpurdie 1876
 
2049 dpurdie 1877
=over 4
311 dpurdie 1878
 
2049 dpurdie 1879
=item   1. Display a list of branched in the current package.
311 dpurdie 1880
 
2049 dpurdie 1881
If no branch is specified, then the utility will display a list of branches in
1882
the packages 'branches' directory.
311 dpurdie 1883
 
2049 dpurdie 1884
=item   2. Switch to the named branch.
311 dpurdie 1885
 
2049 dpurdie 1886
The named branch must exists otherwise the command will fail.
311 dpurdie 1887
 
2429 dpurdie 1888
There are two special variants of the branch name:
311 dpurdie 1889
 
2049 dpurdie 1890
=over 4
311 dpurdie 1891
 
2049 dpurdie 1892
=item trunk
311 dpurdie 1893
 
2049 dpurdie 1894
If the branch is named 'trunk' then it will refer to the packages truck
1403 dpurdie 1895
 
2049 dpurdie 1896
=item tags
1403 dpurdie 1897
 
2049 dpurdie 1898
If the branch name starts with 'tags/', then the command will refer to
1899
a tag within the package and not a branch.
1403 dpurdie 1900
 
2049 dpurdie 1901
=back
1403 dpurdie 1902
 
2049 dpurdie 1903
The command will add and remove unmodified files from the workspace during this
1904
operation.
311 dpurdie 1905
 
2049 dpurdie 1906
=back
311 dpurdie 1907
 
2049 dpurdie 1908
=head3 Examples
311 dpurdie 1909
 
2049 dpurdie 1910
To switch to the packages trunk
311 dpurdie 1911
 
2049 dpurdie 1912
    jats svn switch trunk
311 dpurdie 1913
 
2049 dpurdie 1914
To switch to the a branch called MyBranch
311 dpurdie 1915
 
2049 dpurdie 1916
    jats svn switch MyBranch
311 dpurdie 1917
 
2049 dpurdie 1918
To switch to a tagged version of the package
311 dpurdie 1919
 
2049 dpurdie 1920
    jats svn switch tags/MyPackage_1.0.0000.cr
311 dpurdie 1921
 
2049 dpurdie 1922
To display a list of available branches (not tags)
311 dpurdie 1923
 
2049 dpurdie 1924
    jats svn switch
311 dpurdie 1925
 
2049 dpurdie 1926
=head1 Delete Branch
311 dpurdie 1927
 
2049 dpurdie 1928
=head2 NAME
311 dpurdie 1929
 
2049 dpurdie 1930
Delete the Workspace Branch
311 dpurdie 1931
 
2049 dpurdie 1932
=head2 SYNOPSIS
311 dpurdie 1933
 
2429 dpurdie 1934
jats svn delete-branch [options] [branch-list]
311 dpurdie 1935
 
2049 dpurdie 1936
 Options:
1937
    -help[=n]              - Help message, [n=1,2,3]
1938
    -man                   - Full documentation [-help=3]
1939
    -verbose[=n]           - Verbose command operation
1940
    -path=path             - Target workspace
311 dpurdie 1941
 
2049 dpurdie 1942
=head2 ARGUMENTS
1943
 
2429 dpurdie 1944
The command may take zero or more arguments. If provided the arguments will be
1945
branch names to be deleted.
2049 dpurdie 1946
 
1947
=head2 OPTIONS
1948
 
1949
=over
1950
 
1951
=item B<-path=path>
1952
 
1953
This options specifies the path of the target workspace. If not provided the
1954
command will use the current directory.
1955
 
1956
=back
1957
 
1958
=head2 DESCRIPTION
1959
 
2429 dpurdie 1960
This command can display the branch associated with the workspace or it can
1961
delete one or more branches. It is intended to simplify the deletion of Private
1962
or Development branches.
2049 dpurdie 1963
 
2429 dpurdie 1964
=over 4
1965
 
1966
=item 1 Arguments are provided
1967
 
1968
The command will delete all the named branches. If a named branch does not exist
1969
then the command will issue a warning message.
1970
 
1971
=item 2 No arguments provided
1972
 
1973
The command will display the branch associated with the workspace
1974
 
2049 dpurdie 1975
If the workspace is not linked to a 'branch' then the command will fail.
1976
 
2429 dpurdie 1977
=back
1978
 
311 dpurdie 1979
=head1 Import directory to a Package
1980
 
1981
=head2 NAME
1982
 
1983
Import directory to a Package
1984
 
1985
=head2 SYNOPSIS
1986
 
1987
jats svn [options] import URL [command options]
1988
 
1989
 Options:
1990
    -help[=n]               - Help message, [n=1,2,3]
1991
    -man                    - Full documentation [-help=3]
1992
    -verbose[=n]            - Verbose command operation
1993
 
1994
 Command Options
1995
    -help[=n]               - Command specific help, [n=1,2,3]
1996
    -verbose[=n]            - Verbose operation
1997
    -package=name           - Name of source package
1998
    -dir=path               - Path to new version
379 dpurdie 1999
    -label=label            - Label the result
2000
    -branch=branchName      - Base import on a branch
311 dpurdie 2001
    -replace                - Allow the label to be replaced
2002
    -reuse                  - Reuse the import directory
2003
    -workspace=path         - Path and name of alternate workspace
2004
    -[no]delete             - Deletes workspace after use. Default:yes
379 dpurdie 2005
    -author=name            - Force author of changes
2006
    -date=dateString        - Force date of changes
2007
    -log=text               - Append text to the commit message
2008
    -datafile=path          - Export tag data for automation
2931 dpurdie 2009
    -[no]commit             - Prevent changes being committed. Default:Yes
2429 dpurdie 2010
    -printfiles=n           - Control commit verbosity
2931 dpurdie 2011
    -mergePaths=dirList     - Comma separated list of directories to merge
311 dpurdie 2012
 
2013
=head2 ARGUMENTS
2014
 
2015
The command takes one argument: The URL of the desired package.
2016
This may be be:
2017
 
2018
=over
2019
 
2020
=item * A full URL
2021
 
2022
Complete with protocol and path information.
2023
 
2024
=item * A simple URL
2025
 
2026
JATS will prepend the site-specific repository location to the user provided URL
2027
 
2028
=back
2029
 
2030
=head2 OPTIONS
2031
 
2032
=over
2033
 
2034
=item -help[=n]
2035
 
2036
Print a help message and exit. The level of help may be either 1, 2 or 3.
2037
 
2038
This option may be specified multiple times to increment the help level, or
2039
the help level may be directly specified as a number.
2040
 
2041
=item -verbose[=n]
2042
 
2043
This option will increase the level of verbosity of the utility.
2044
 
2045
If an argument is provided, then it will be used to set the level, otherwise the
2046
existing level will be incremented. This option may be specified multiple times.
2047
 
2048
=item -package=name
2049
 
2050
Either this option or a bare URL on the command line must be provided. It
2051
specifies the repository and package to be used as a basis for the work.
2052
 
2053
=item -dir=path
2054
 
2055
This option is mandatory. It specifies the path to a local directory that
2056
contains a version of the software to be checked in.
2057
 
2058
=item -label=name
2059
 
2060
The resulting software version will be labeled with this tag, if it is provided.
2061
 
383 dpurdie 2062
A label name of TIMESTAMP will be treated in special manner. The name will be
2063
replaced with a unique name based on the users name and the current date time.
2064
 
379 dpurdie 2065
=item -branch=branchName
2066
 
2067
This option will cause the importation to be referenced to the named branch.
2068
If the branch does not exist it will be created. If it does exist then it will
2069
be used.
2070
 
2071
If this option is not specified, then the importation will be based on the 'trunk'.
2072
 
2073
If the Workspace is provided, then it will be used independently of this option.
2074
 
383 dpurdie 2075
A branchName of TIMESTAMP will be treated in special manner. The name will be
2076
replaced with a unique name based on the users name and the current date time.
2077
 
311 dpurdie 2078
=item -replace
2079
 
2080
This option, if provided, allows the label to be replaced.
2081
 
2082
=item -reuse
2083
 
2084
This option can be used to speed the creation of multiple versions in a scripted
2085
environment. The option allows the utility to reuse the workspace if it exists.
2086
 
2087
=item -workspace=path
2088
 
2089
This option specifies an alternate workspace directory to create and use. The
2090
default directory is "SvnImportDir" within the users current directory.
2091
 
2092
=item [no]delete
2093
 
341 dpurdie 2094
This option control the deletion of the workspace directory. By default the
311 dpurdie 2095
directory will be deleted, unless re-use is also used.
2096
 
379 dpurdie 2097
=item -author=name
2098
 
2099
This option will force the author of changes as recorded in the repository.
385 dpurdie 2100
The repository must be configured to allow such changes.
379 dpurdie 2101
 
2102
This option may not work for non-admin users.
2103
 
2104
=item -date=dateString
2105
 
2106
This option will force the date of the changes as recorded in the repository.
385 dpurdie 2107
The repository must be configured to allow such changes.
379 dpurdie 2108
The dateString is in a restricted ISO 8601 format: ie 2009-02-12T00:44:04.921324Z
2109
 
2110
This option may not work for non-admin users.
2111
 
2112
=item -log=text
2113
 
2114
This option will append the specified text to the commit message.
2115
The first line of the commit message is fixed by the import tool.
2116
 
2117
=item -datafile=path
2118
 
2119
This option will cause the utility to create a data file to record the import
2120
tag. It is used for automation of the import process.
2121
 
2429 dpurdie 2122
=item -[no]commit
2123
 
2124
This option will prevent the final workspace from being committed to the
2125
Repository. This allows inspection of the results.
2126
 
2127
The default operation is to commit and label the results of the import.
2128
 
2129
=item -printfiles=n
2130
 
2131
This option controls commit verbosity. The default operation is to display
2132
the files added and removed during the commit.
2133
 
2134
Suitable numbers are: None, 0 (No Display) and 1 (Full Display).
2135
 
2764 dpurdie 2136
=item -mergePaths=dirList
2137
 
2931 dpurdie 2138
This option specifies a Comma separated list of directories to be merged
3967 dpurdie 2139
during the import process. This works via the following mechanism:
2764 dpurdie 2140
 
2141
If the named directory exists in the 'new' image it will replace that in the
2142
'initial' workspace.
2143
 
2144
If the named directory does not exist in the 'new' image, but does exist in the
2145
'initial' image then it will be retained in the 'final' image.
2146
 
2147
Directories other than those named will not be imported.
2148
 
311 dpurdie 2149
=back
2150
 
2151
=head2 DESCRIPTION
2152
 
2153
Import a new version of a package to the trunk of the package. The utility
2154
will only import changed files so that file history is preserved within the
2155
repository.
2156
 
2157
This utility is used import software from another version control system
2158
The utility will:
2159
 
2160
=over
2161
 
361 dpurdie 2162
=item *
311 dpurdie 2163
 
361 dpurdie 2164
Create a Work Space based on the current package version
2165
 
379 dpurdie 2166
The 'trunk' of the named package will be used as the base for the workspace,
2167
unless modified with the -branch option.
311 dpurdie 2168
 
361 dpurdie 2169
=item *
311 dpurdie 2170
 
361 dpurdie 2171
Update files and directories
2172
 
311 dpurdie 2173
Determines the files and directories that have been added and deleted and
2174
update the Workspace to reflect the new structure.
2175
 
361 dpurdie 2176
=item *
311 dpurdie 2177
 
361 dpurdie 2178
Check in the new version
311 dpurdie 2179
 
361 dpurdie 2180
=item *
2181
 
2182
Label the new version
2183
 
311 dpurdie 2184
=back
2185
 
2186
=cut
2187