Subversion Repositories DevTools

Rev

Rev 3890 | 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/ );
2048 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
#
2048 dpurdie 110
# Inputs          :
369 dpurdie 111
#
2048 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
 
1348 dpurdie 208
    Message ("Tag is  : " . $uref->RmRef() );
209
    Message ("Vcs Tag : " . $uref->SvnTag  );
2048 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
    {
2424 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
#
2048 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 });
2048 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
#
2048 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
#
2048 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,
1347 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);
2048 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
 
1347 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
    #
1356 dpurdie 497
#    Message ("Repository Ref: " . $uref->RmPath);
498
#    Message ("Vcs Tag       : " . $uref->SvnTag);
1270 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
#
2048 dpurdie 517
# Inputs          :
311 dpurdie 518
#
2048 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;
1348 dpurdie 540
    my $opt_printfiles;
2424 dpurdie 541
    my $opt_commit = 1;
2652 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
 
2616 dpurdie 550
    my $filesBase = 0;                  # Files in Base workspace
551
    my $filesDeleted = 0;               # Files Deleted
552
    my $filesAdded = 0;                 # Files Added
2652 dpurdie 553
    my $filesTransferred = 0;           # Files Copied
2616 dpurdie 554
    my $dirsDeleted = 0;                # Directories Deleted
555
    my $dirsAdded = 0;                  # Directories Added
2652 dpurdie 556
    my $dirsTransferred = 0;            # Directories Copied
2616 dpurdie 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,
1348 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,
2424 dpurdie 579
                    'commit!'       => \$opt_commit,
2652 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 );
2048 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 );
2424 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';
1356 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
    }
2048 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
 
1270 dpurdie 695
    #
696
    #   Scan for a source file
697
    #   Trying to detect empty views
698
    #   Look for file, not directory
2616 dpurdie 699
    #       Keep a count for reporting
1270 dpurdie 700
    #
701
    {
2616 dpurdie 702
        foreach ( @ws )
703
        {
704
            $filesBase++ unless ( m~/$~ );
705
        }
706
 
1270 dpurdie 707
        my $fileFound = 0;
708
        foreach ( @dir )
709
        {
710
            next if ( m~/$~ );
2616 dpurdie 711
            $fileFound = 1;
1270 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);
1270 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
 
2652 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
 
2652 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
    #
2616 dpurdie 768
 
379 dpurdie 769
    my @rm_files = reverse sort keys %ws;
770
    if ( @rm_files )
771
    {
2652 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
 
2616 dpurdie 785
        my @processedFiles;
379 dpurdie 786
        foreach my $file ( @rm_files  )
787
        {
2616 dpurdie 788
            #
789
            #   Detect items that are to be retained
2652 dpurdie 790
            #   Do not delete items that are a part of a top level path that
3263 dpurdie 791
            #   are not present in the New Import
2616 dpurdie 792
            #
2652 dpurdie 793
            if ( $opt_mergePaths )
2616 dpurdie 794
            {
795
                my $keep = 0;
2652 dpurdie 796
                foreach ( @newTldPaths )
2616 dpurdie 797
                {
2652 dpurdie 798
                    if ( $file =~ m~^$_/~ )
2616 dpurdie 799
                    {
3890 dpurdie 800
                        Verbose0("Merge Retain: $file");
2616 dpurdie 801
                        $keep = 1;
802
                        last;
803
                    }
804
                }
3263 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
                        {
3890 dpurdie 817
                            Verbose0("Merge Retain: $file");
3263 dpurdie 818
                            $keep = 1;
819
                            last;
820
                        }
821
                    }
822
                }
823
 
2616 dpurdie 824
                next if ($keep);
825
            }
826
 
3890 dpurdie 827
            Verbose0 ("Removing $file");
2616 dpurdie 828
            $filesDeleted++ unless ( $file =~ m~/$~ );
829
            $dirsDeleted++ if ( $file =~ m~/$~ );
379 dpurdie 830
            unlink "$opt_workdir/$file";
2616 dpurdie 831
            push @processedFiles, $file;
379 dpurdie 832
        }
2616 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;
2616 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' } );
2048 dpurdie 849
 
379 dpurdie 850
            $base = $end + 1;
851
        }
852
    }
2048 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
    {
2652 dpurdie 864
        my @processedFiles;
311 dpurdie 865
        foreach my $file ( @added  )
866
        {
2652 dpurdie 867
            #
868
            #   Detect items that are to be merged
869
            #   Only specified top level paths are to be imported
3263 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
2652 dpurdie 875
            #
876
            if ( $opt_mergePaths )
877
            {
878
                my $discard = 1;
879
                foreach ( split(',', $opt_mergePaths) )
880
                {
3263 dpurdie 881
                    next if ( m ~\*\*$~ );
882
                    if ( $_ eq '++' )
2652 dpurdie 883
                    {
3263 dpurdie 884
                        $discard = 0;
885
                        last;
886
                    }
887
                    elsif ( $_ eq '+' )
888
                    {
2757 dpurdie 889
                        if ( ($file =~ tr~/~/~) eq 0 )
890
                        {
891
                            $discard = 0;
892
                            last;
893
                        }
894
                    }
895
                    elsif ( $file =~ m~^$_/~ )
896
                    {
2652 dpurdie 897
                        $discard = 0;
898
                        last;
899
                    }
900
                }
2757 dpurdie 901
                Verbose0("Not Importing: $file") if ( $discard ) ;
2652 dpurdie 902
                next if ( $discard );
903
            }
904
 
311 dpurdie 905
            my $src = "$opt_dir/$file";
906
            my $target = "$opt_workdir/$file";
2616 dpurdie 907
            $filesAdded++ unless ( $file =~ m~/$~ );
908
            $dirsAdded++ if ( $file =~ m~/$~ );
2652 dpurdie 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
        }
2652 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;
2616 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
 
2652 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
    }
2652 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
    #
2424 dpurdie 988
    if ( $opt_commit )
989
    {
990
        $svn = NewSessionByWS( $opt_workdir );
991
        my $pkgPath = $svn->Path();
387 dpurdie 992
 
2424 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
 
2424 dpurdie 999
        $svn->SvnCi ('comment' => $ciComment, 'allowSame' => 1 );
1000
        Message ("Repository Ref: " . $svn->RmRef) unless( $opt_label );
379 dpurdie 1001
        $svn->setRepoProperty('svn:author', $opt_author) if (defined ($opt_author));
1002
        $svn->setRepoProperty('svn:date', $opt_date) if (defined ($opt_date));
2424 dpurdie 1003
 
1004
        #
1005
        #   Label the result
1006
        #   The workspace will have been updated, so we can use it as the base for
1007
        #   the labeling process
1008
        #
1009
        if ( $opt_label )
1010
        {
1011
            $svn->SvnCopyWs (
1012
                           target => $url_label,
1013
                           'noswitch' => 1,
1014
                           'replace' => $opt_replace,
1015
                           'comment' => "$pkgPath: Tagged by Jats Svn Import",
1016
                           );
1017
            Message ("Repository Ref: " . $svn->RmRef);
1018
            Message ("Vcs Tag       : " . $svn->SvnTag);
1019
            $svn->setRepoProperty('svn:author', $opt_author) if (defined ($opt_author));
1020
            $svn->setRepoProperty('svn:date', $opt_date) if (defined ($opt_date));
1021
        }
311 dpurdie 1022
    }
2424 dpurdie 1023
    else
1024
    {
1025
        Message ("Workspace not commited","Workspace: $opt_workdir");
1026
    }
311 dpurdie 1027
 
1028
    #
1029
    #   Clean up
1030
    #
2424 dpurdie 1031
    if ( $opt_delete && ! $opt_reuse  && $opt_commit )
311 dpurdie 1032
    {
1033
        Message ("Delete Workspace");
1034
        rmtree( $opt_workdir );
1035
    }
379 dpurdie 1036
 
1037
    #
1038
    #   Automation data transfer
1039
    #
1040
    if ( defined $opt_datafile )
1041
    {
1042
        my $data = JatsProperties::New();
1043
 
1044
        $data->setProperty('Command'        , 'ImportPackage');
1045
        $data->setProperty('Label'          , $opt_label);
1347 dpurdie 1046
        $data->setProperty('subversion.url' , $svn->RmRef);
1047
        $data->setProperty('subversion.tag' , $svn->SvnTag);
379 dpurdie 1048
 
2616 dpurdie 1049
        $data->setProperty('files.base'     , $filesBase);
1050
        $data->setProperty('files.removed'  , $filesDeleted);
1051
        $data->setProperty('files.added'    , $filesAdded);
1052
 
379 dpurdie 1053
        $data->Dump('InfoFile') if ($opt_verbose);
1054
        $data->store( $opt_datafile );
1055
    }
1056
 
311 dpurdie 1057
    $opr_done = 1;
1058
}
1059
 
1060
#-------------------------------------------------------------------------------
385 dpurdie 1061
# Function        : DeleteBranch
1062
#
1063
# Description     : Delete the branch that a workspace is based upon
1064
#
2048 dpurdie 1065
# Inputs          :
385 dpurdie 1066
#
2048 dpurdie 1067
# Returns         :
385 dpurdie 1068
#
1069
sub DeleteBranch
1070
{
1071
    my $opt_path;
1072
    my $opt_error = 0;
1073
    #
1074
    #   Parse more options
1075
    #
1076
    GetOptions (
1077
                "help:+"        => \$opt_help,
1078
                "manual:3"      => \$opt_help,
1079
                "path:s"        => \$opt_path,
1080
                ) || Error ("Invalid command line" );
1081
 
1082
    #
1083
    #   Subcommand specific help
1084
    #
1085
    SubCommandHelp( $opt_help, "Delete Branch") if ($opt_help);
1086
 
1087
    #
1088
    #   Sanity Tests
1089
    #
2071 dpurdie 1090
    Message ("Delete Workspace Branchs" );
385 dpurdie 1091
 
1092
    #
1093
    #   Do all the hard work
1094
    #
1095
    $opt_path = '.' unless ( defined $opt_path );
1096
    my $uref = NewSessionByWS($opt_path, 0, 1);
1097
    my $ws_root = $uref->SvnLocateWsRoot(1);
1098
    my $ws_url = $uref->FullWs();
1099
 
1100
    #
2882 dpurdie 1101
    #   What we do depends what arguments the user provided
385 dpurdie 1102
    #
2071 dpurdie 1103
    unless ( @ARGV )
1104
    {
1105
        #
1106
        #   If no branch was specified - then display the workspace branch
1107
        #
1108
        Error ('The workspace is not based on a branch')
1109
            unless ( $ws_url =~ m ~/branches/(.*)~ );
1110
        Message('The workspace is based on the branch: '. $1);
1111
    }
1112
    else
1113
    {
1114
        #
1115
        #   Delete all specified branches
1116
        #
1117
        foreach my $branch ( @ARGV )
1118
        {
1119
            Message ("Deleting: " . $branch );
1120
            my $target = join( '/', $uref->FullPath(), 'branches', $branch);
1121
            if ( $uref->SvnDelete (
1122
                              'target'    => $target,
1123
                              'comment'   => [$uref->Path().": Delete Branch",'Deleted by user command: jats svn delete-branch'],
1124
                              'noerror'   => 1,
1125
                              )
1126
               )
1127
            {
1128
                Warning ("Branch deletion failed: $branch");
1129
            }
1130
        }
1131
    }
385 dpurdie 1132
    $opr_done = 1;
1133
}
1134
 
2048 dpurdie 1135
#-------------------------------------------------------------------------------
1136
# Function        : CreateBranch
1137
#
1138
# Description     : Branch a workspace and then switch to the new branch
1139
#
1140
# Inputs          :
1141
#
1142
# Returns         :
1143
#
1144
sub CreateBranch
1145
{
1146
    my $opt_path;
1147
    my $opt_comment;
1148
    my $opt_switch = 1;
1149
    my $opt_branch;
385 dpurdie 1150
 
2048 dpurdie 1151
    #
1152
    #   Parse more options
1153
    #
1154
    GetOptions (
1155
                "help:+"        => \$opt_help,
1156
                "manual:3"      => \$opt_help,
1157
                "path:s"        => \$opt_path,
1158
                "switch!"       => \$opt_switch,
1159
                "comment:s"     => \$opt_comment,
1160
                ) || Error ("Invalid command line" );
1161
 
1162
    #
1163
    #   Subcommand specific help
1164
    #
1165
    SubCommandHelp( $opt_help, "Create Branch") if ($opt_help);
1166
 
1167
    #
1168
    #   Sanity Tests
1169
    #
1170
    Message ("Create Workspace Branch" );
1171
    Error ("Too many arguments: @ARGV") if ( $#ARGV > 0 );
1172
    Error ("Not enough arguments. No branch name specified") if ( $#ARGV < 0 );
1173
 
1174
    #
1175
    #   Sanity test the label
1176
    #
1177
    $opt_branch = SvnIsaSimpleLabel ($ARGV[0] );
1178
 
1179
    #
1180
    #   Do all the hard work
1181
    #
1182
    $opt_path = '.' unless ( defined $opt_path );
1183
    my $uref = NewSessionByWS($opt_path, 0, 1);
1184
    my $ws_root = $uref->SvnLocateWsRoot(1);
1185
    my $ws_url = $uref->Full();
1186
 
1187
    #
2882 dpurdie 1188
    #   Use the version of the branch that has been committed as the base of the
1189
    #   copy. If the user has modified files, then they won't be committed
2048 dpurdie 1190
    #
1191
    #   This operation will be server-side only
1192
    #
1193
    Message ("Creating branch: $opt_branch");
1194
    my $repoLink = $uref->{InfoWs}{URL} . '@' . $uref->{InfoWs}{Revision};
1195
    $uref->{DEVBRANCH} =  join ('/', 'branches', $opt_branch);
1196
    my $branch_tag = $uref->SvnCopy (
1197
                'old' => $repoLink,
1198
                'new' => join ('/', $ws_url, $uref->{DEVBRANCH} ),
1199
                'comment' => $opt_comment ? $opt_comment : 'Created by Jats svn branch',
1200
                'replace' => 0,
1201
                );
1202
 
2053 dpurdie 1203
 
2048 dpurdie 1204
    if ( $opt_switch )
1205
    {
1206
        Verbose ("Switching to new branch: $opt_branch");
1207
        $branch_tag = SvnPath2Url($branch_tag);
2053 dpurdie 1208
        chdir ($ws_root) || Error ("Cannot cd to: " .$ws_root);
1209
        $uref->SvnSwitch ($branch_tag, $opt_path, '--Print', '--KeepWs' );
2048 dpurdie 1210
    }
1211
    else
1212
    {
1213
        Warning ("Using existing workspace, not the created branch");
1214
    }
1215
    Message ("Repository Ref: " . $uref->RmRef);
1216
    Message ("Vcs Tag       : " . $uref->SvnTag);
1217
 
1218
#    #
1219
#    #   The copy operation *should* be a server side operation only
2882 dpurdie 1220
#    #   If the user has committed changes, but not yet updated the local
2048 dpurdie 1221
#    #   workspace, then subversion will do a client side copy
1222
#    #   This is not good.
1223
#    #
1224
#    $uref->SvnCopyWs (
1225
#                   target => join ('/', $ws_url, 'branches', $opt_branch),
1226
#                   'allowLocalMods' => 1,
1227
#                   'noupdatecheck' => 1,
1228
#                   'noswitch' => ! $opt_switch,
1229
#                   'replace' => 0,
1230
#                   'comment' => $opt_comment ? $opt_comment : 'Created by Jats svn branch',
1231
#                   );
1232
#
1233
#    Message ("Repository Ref: " . $uref->RmRef);
1234
#    Message ("Vcs Tag       : " . $uref->SvnTag);
1235
 
1236
    $opr_done = 1;
1237
}
1238
 
385 dpurdie 1239
#-------------------------------------------------------------------------------
2048 dpurdie 1240
# Function        : SwitchBranch
1241
#
1242
# Description     : Switch to a specified branch
1243
#
1244
# Inputs          :
1245
#
1246
# Returns         :
1247
#
1248
sub SwitchBranch
1249
{
1250
    my $opt_path = '.';
1251
    my $opt_branch;
1252
 
1253
    #
1254
    #   Parse more options
1255
    #
1256
    GetOptions (
1257
                "help:+"        => \$opt_help,
1258
                "manual:3"      => \$opt_help,
1259
                "path:s"        => \$opt_path,
1260
                ) || Error ("Invalid command line" );
1261
 
1262
    #
1263
    #   Subcommand specific help
1264
    #
1265
    SubCommandHelp( $opt_help, "Switch Branch") if ($opt_help);
1266
    return ShowBranches($opt_path) if ( $#ARGV < 0 );
1267
 
1268
    #
1269
    #   Sanity Tests
1270
    #
1271
    Error ("Too many arguments: @ARGV") if ( $#ARGV > 0 );
1272
 
1273
    #
1274
    #   Calculate the target name
1275
    #       trunk is special
1276
    #       tags/... is special
1277
    $opt_branch = $ARGV[0];
1278
    if ( $opt_branch eq 'trunk' ) {
1279
    } elsif ( $opt_branch =~ m~tags/.+~ ) {
1280
    } else {
1281
        $opt_branch = join ('/', 'branches', $opt_branch);
1282
    }
1283
    Message ("Switching to new branch: $opt_branch");
1284
 
1285
    #
1286
    #   Do all the hard work
1287
    #
1288
    my $uref = NewSessionByWS($opt_path, 0, 1);
2053 dpurdie 1289
    my $ws_root = $uref->SvnLocateWsRoot(1);
2048 dpurdie 1290
    my $ws_url = $uref->Full();
1291
    my $branch_tag = join ('/', $ws_url, $opt_branch);
1292
 
1293
    #
1294
    #   Validate the branch
1295
    #
1296
    $uref->SvnValidateTarget (
1297
                        'cmd'    => 'svn switch',
1298
                        'target' => $branch_tag,
1299
                        'require' => 1,
1300
                        );
1301
 
2053 dpurdie 1302
    #
1303
    #   Must Change directory before we switch
2882 dpurdie 1304
    #   Otherwise we will import changes into the wrong place
2053 dpurdie 1305
    #
1306
    chdir ($ws_root) || Error ("Cannot cd to: " . $ws_root);
1307
    $uref->SvnSwitch ($branch_tag, $opt_path, '--Print', '--KeepWs' );
2048 dpurdie 1308
    $opr_done = 1;
1309
}
1310
 
1311
#-------------------------------------------------------------------------------
1312
# Function        : ShowBranches
1313
#
1314
# Description     : Show branches in current workspace
1315
#                   Internal use only
1316
#
1317
# Inputs          : $opt_path           - Optional path
1318
#
1319
# Returns         :
1320
#
1321
sub ShowBranches
1322
{
1323
    my ($opt_path) = @_;
1324
 
1325
    my $uref = NewSessionByWS($opt_path, 0, 1);
1326
    my $ws_url = $uref->Full();
1327
 
1328
    #
2882 dpurdie 1329
    #   Display the packages full URL - allow the user to manually look at more
1330
    #   List the branches
2048 dpurdie 1331
    #
1332
    Message ("Url: $ws_url", 'Available Branches');
1333
    SvnUserCmd( 'ls', join ('/', $ws_url, 'branches'), { 'credentials' => 1 });
1334
    $opr_done = 1;
1335
}
1336
#-------------------------------------------------------------------------------
311 dpurdie 1337
# Function        : SubCommandHelp
1338
#
1339
# Description     : Provide help on a subcommand
1340
#
1341
# Inputs          : $help_level             - Help Level 1,2,3
1342
#                   $topic                  - Topic Name
1343
#
1344
# Returns         : This function does not return
1345
#
1346
sub SubCommandHelp
1347
{
1348
    my ($help_level, $topic) = @_;
1349
    my @sections;
1350
    #
1351
    #   Spell out the section we want to display
1352
    #
1353
    #   Note:
1354
    #   Due to bug in pod2usage can't use 'head1' by itself
1355
    #   Each one needs a subsection.
1356
    #
1357
    push @sections, qw( NAME SYNOPSIS ) ;
1358
    push @sections, qw( ARGUMENTS OPTIONS ) if ( $help_level > 1 );
1359
    push @sections, qw( DESCRIPTION )       if ( $help_level > 2 );
1360
 
1361
    #
1362
    #   Extract section from the POD
1363
    #
1364
    pod2usage({-verbose => 99,
1365
               -noperldoc => 1,
1366
               -sections => $topic . '/' . join('|', @sections) } );
1367
}
1368
 
1369
#-------------------------------------------------------------------------------
1370
#   Documentation
1371
#   NOTE
1372
#
1373
#   Each subcommand MUST have
1374
#   head1 section as used by the subcommand
1375
#       This should be empty, as the contents will NOT be displayed
1376
#   head2 sections called
1377
#       NAME SYNOPSIS ARGUMENTS OPTIONS DESCRIPTION
1378
#
1379
#=head1 xxxxxx
1380
#=head2 NAME
1381
#=head2 SYNOPSIS
1382
#=head2 ARGUMENTS
1383
#=head2 OPTIONS
1384
#=head2 DESCRIPTION
1385
#
1386
 
1387
=pod
1388
 
361 dpurdie 1389
=for htmltoc    GENERAL::Subversion::
1390
 
311 dpurdie 1391
=head1 NAME
1392
 
1393
jats svn - Miscellaneous SubVersion Operations
1394
 
1395
=head1 SYNOPSIS
1396
 
1397
jats svn [options] command [command options]
1398
 
1399
 Options:
1400
    -help[=n]              - Help message, [n=1,2,3]
1401
    -man                   - Full documentation [-help=3]
1402
    -verbose[=n]           - Verbose command operation
1403
 
1404
 Common Command Options:
1405
    All command support suboptions to provide command specific help
1406
 
1407
    -help[=n]              - Help message, [n=1,2,3]
1408
    -man                   - Full documentation [-help=3]
1409
 
1410
 Commands are:
363 dpurdie 1411
    test                   - Test access to subversion
369 dpurdie 1412
    paths                  - Display Subversion tag to URL conversions
311 dpurdie 1413
    ls URL                 - List Repo contents for URL
369 dpurdie 1414
    tag [URL]              - Convert URL or Path to a Release Manager Tag
1415
    url [TAG]              - Convert TAG or Path to a Subversion URL
2048 dpurdie 1416
    create-package URL     - Create a new package at URL
311 dpurdie 1417
    delete-package URL     - Delete Package Subtree
2048 dpurdie 1418
    branch BRANCH          - Create a Development Branch
1419
    switch [BRANCH]        - Switch to a Development Branch
385 dpurdie 1420
    delete-branch          - Delete a Development Branch
311 dpurdie 1421
    import URL             - Import files to package at URL
1422
 
1423
 Use the command
1424
    jats svn command -h
1425
 for command specific help
1426
 
1427
=head1 OPTIONS
1428
 
1429
=over
1430
 
1431
=item B<-help[=n]>
1432
 
1433
Print a help message and exit. The level of help may be either 1, 2 or
1434
3 for a full manual.
1435
 
1436
This option may be specified multiple times to increment the help level, or
1437
the help level may be directly specified as a number.
1438
 
1439
=item B<-man>
1440
 
1441
This is the same as '-help=3'.
1442
The complete help is produced in a man page format.
1443
 
2071 dpurdie 1444
=item B<-verbose[=n]>
311 dpurdie 1445
 
1446
This option will increase the level of verbosity of the commands.
1447
 
1448
If an argument is provided, then it will be used to set the level, otherwise the
1449
existing level will be incremented. This option may be specified multiple times.
1450
 
1451
=back
1452
 
1453
=head1 DESCRIPTION
1454
 
1455
This program provides a number of useful Subversion based operations.
1456
 
363 dpurdie 1457
=head1 Test Subversion
1458
 
1459
=head2 NAME
1460
 
1461
Test Subversion
1462
 
1463
=head2 SYNOPSIS
1464
 
1465
    jats svn test
1466
 
1467
=head2 DESCRIPTION
1468
 
1469
This command will ensure that the subversion command line utility can be
1470
located. The command will report the version of the svn client found.
1471
 
369 dpurdie 1472
=head1 Subversion Paths
1473
 
1474
=head2 NAME
1475
 
1476
Subversion Paths
1477
 
1478
=head2 SYNOPSIS
1479
 
1480
    jats svn paths
1481
 
1482
=head2 DESCRIPTION
1483
 
1484
This command will display the base Tags and associated URLs that are used by
1485
JATS to convert a 'Subversion Tag' into a full URLs that will be used to access
1486
a physical repository.
1487
 
1488
The 'Tags' configuration is site-specific.
1489
 
311 dpurdie 1490
=head1 List Repository
1491
 
363 dpurdie 1492
=head2 NAME
1493
 
1494
List Repository
1495
 
1496
=head2 SYNOPSIS
1497
 
1498
    jats svn ls <URL>
1499
 
1500
=head2 DESCRIPTION
1501
 
311 dpurdie 1502
This command will take a URL and perform a 'svn' list operation. The URL will
1503
be expanded to include the site specific repository.
1504
 
369 dpurdie 1505
=head1 Url to Tag
1506
 
1507
=head2 NAME
1508
 
1509
Url to Tag
1510
 
1511
=head2 SYNOPSIS
1512
 
1513
    jats svn tag [Option] [tag]
1514
 
1515
 Options:
1516
    -help[=n]              - Help message, [n=1,2,3]
1517
    -man                   - Full documentation [-help=3]
1518
    -path=path             - Convert specified path
1519
    -url=url               - Convert specified URL
1520
 
1521
=head2 DESCRIPTION
1522
 
1523
This command will convert a URL or a PATH to a Subversion Tag that can
1524
be used within the remainder of the build system. If no PATH or URL is provided,
1525
then the command uses a path of the current directory.
1526
 
1527
The command will convert either a PATH or a URL. It will not do both.
1528
 
1529
The command will use the configured Subversion URL prefixes to create the Tag.
1530
 
1531
If a PATH is to be converted, then the PATH must address a Subversion workspace.
1532
The conversion will return a Tag to the root of the Workspace and Peg it to
1533
the last committed version. The command will not determine if the workspace
1534
contains modified files.
1535
 
1536
If a URL is to be converted, then the resultant value should be used with
1537
caution. The result is only as good as the provided URL and may not address
1538
the root of a package.
1539
 
1540
=head1 Tag to Url
1541
 
1542
=head2 NAME
1543
 
1544
Tag to Url
1545
 
1546
=head2 SYNOPSIS
1547
 
1548
    jats svn url [Option] [url]
1549
 
1550
 Options:
1551
    -help[=n]              - Help message, [n=1,2,3]
1552
    -man                   - Full documentation [-help=3]
1553
    -path=path             - Convert specified path
1554
    -url=url               - Convert specified URL
1555
 
1556
=head2 DESCRIPTION
1557
 
1558
This command will convert a TAG or a PATH to a full URL that can be used
1559
directly by Subversion. If no PATH or TAG is provided, then the command uses a
1560
path of the current directory.
1561
 
2424 dpurdie 1562
The command will convert either a TAG or a PATH. It will not do both.
369 dpurdie 1563
 
1564
The command will use the configured Subversion URL prefixes to expand the TAG.
1565
 
1566
If a PATH is to be converted, then the PATH must address a Subversion workspace.
1567
The conversion will return a URL to the root of the Workspace and Peg it to
1568
the last committed version. The command will not determine if the workspace
1569
contains modified files.
1570
 
1571
If a TAG is to be converted, then the resultant value should be used with
1572
caution. The result is only as good as the provided URL and may not address
1573
the root of a package.
1574
 
2424 dpurdie 1575
=head3 Examples
1576
 
1577
To display the URL of the current workspace
1578
 
1579
    jats svn url
1580
 
1581
To display the URL of a known workspace
1582
 
1583
    jats svn url -path=myWorkSpace
1584
 
1585
To convert a TAG from Release Manager or other JATS commands
1586
 
1587
    jats svn url AUPERASVN01/COTS
1588
    jats svn url SVN::AUPERASVN01/COTS/bouncycastle/trunk::bouncycastle_1.3.1.cots@502
1589
 
2048 dpurdie 1590
=head1 Create a Package Version
1591
 
1592
=head2 NAME
1593
 
1594
Create a Package Version
1595
 
1596
=head2 SYNOPSIS
1597
 
1598
jats svn [options] create-package URL [command options]
1599
 
1600
 Options:
1601
    -help[=n]               - Help message, [n=1,2,3]
1602
    -man                    - Full documentation [-help=3]
1603
    -verbose[=n]            - Verbose command operation
1604
 
1605
 Command Options
1606
    -help[=n]               - Provide command specific help
1607
    -new                    - Package must not exist
1608
    -replace                - Replace any existing versions
2354 dpurdie 1609
    -import=path            - Import directory tree
2048 dpurdie 1610
    -label=nnn              - Label imported package
1611
    -trunk                  - Import to trunk (default)
1612
    -tags=nnn               - Import to tags
1613
    -branch=nnn             - Import to branches
1614
 
1615
=head2 ARGUMENTS
1616
 
1617
The command takes one argument: The URL of the desired package.
1618
This may be be:
1619
 
1620
=over
1621
 
1622
=item * A full URL
1623
 
1624
Complete with protocol and path information.
1625
 
1626
=item * A simple URL
1627
 
1628
JATS will prepend the site-specific repository location to the user provided URL
1629
 
1630
=back
1631
 
1632
=head2 OPTIONS
1633
 
1634
=over
1635
 
1636
=item -help[=n]
1637
 
1638
Print a help message and exit. The level of help may be either 1, 2 or 3.
1639
 
1640
This option may be specified multiple times to increment the help level, or
1641
the help level may be directly specified as a number.
1642
 
1643
=item -new
1644
 
1645
This option specifies that the named package MUST not exist at all.
1646
 
1647
=item -replace
1648
 
1649
This option allows the program to replace any existing versions of the
1650
imported source. It will allow the deletion of any existing trunk, tags or
1651
branches.
1652
 
2354 dpurdie 1653
=item -import=path
2048 dpurdie 1654
 
1655
This option specifies the path of a subdirectory tree to import into the newly
1656
created package. In not provided, then only a package skeleton will be created.
1657
 
2354 dpurdie 1658
All files and directories below, but not including, the named path will be
1659
imported into the package.
1660
 
2048 dpurdie 1661
=item -label=nnn
1662
 
1663
This option specifies a label to place the imported source.
1664
 
1665
=item -trunk
1666
 
1667
This option specifies that imported source will be placed on the trunk of the
1668
package. This is the default mode of import.
1669
 
1670
The options -trunk, -tags and -branch are mutually exclusive.
1671
 
1672
=item -tags=nnn
1673
 
1674
This option specifies that imported source will be placed directly on the
1675
named tag of the package.
1676
 
1677
The options -trunk, -tags and -branch are mutually exclusive.
1678
 
1679
=item -branch=nnn
1680
 
1681
This option specifies that imported source will be placed directly on the
1682
named branch of the package.
1683
 
1684
The options -trunk, -tags and -branch are mutually exclusive.
1685
 
1686
=back
1687
 
1688
=head2 DESCRIPTION
1689
 
1690
This command will create a new package within a repository. It will ensure
1691
that the package contains the three required subdirectories: trunk, tags and
1692
branches.
1693
 
1694
The command will also ensure that packages are not placed at inappropriate
1695
locations within the repository. It is not correct to place a package within
1696
another package.
1697
 
1698
The command will, optionally, import a directory tree into the repository and,
1699
optionally, label the package.
1700
 
1701
The package body may be imported to the 'trunk' or to a branch or a tag.
1702
By default the data will be imported to the trunk and may be labeled (tagged).
1703
 
1704
Options allow the targets to be deleted if they exist or to ensure that they
1705
are not present.
1706
 
1707
The command does not attempt to merge file versions within the repository. It
1708
may result in multiple instances of a file within the repository. Use only for
1709
simple imports. Use the 'import' command for more sophisticated import requirements.
1710
 
2354 dpurdie 1711
=head3 Examples
1712
 
1713
To create a package skeleton in the Perth MREF_Package repository for a package
1714
called 'VIXmyPackage':
1715
 
1716
    jats svn create-package AUPERASVN01/MREF_Package/VIXmyPackage
1717
 
1718
To create a package skeleton in the Perth MREF_Package repository, import code
1719
into the trunk of the package and label (tag) it:
1720
 
1721
    jats svn create-package \
1722
           AUPERASVN01/MREF_Package/VIXmyPackage \
1723
           -import=VIXmyNewPackage \
1724
           -label=VIXmyPackage.WIP
1725
 
311 dpurdie 1726
=head1 Delete a Package
1727
 
1728
=head2 NAME
1729
 
1730
Delete a Package
1731
 
1732
=head2 SYNOPSIS
1733
 
1734
jats svn delete-package URL [options]
1735
 
1736
 Options:
1737
    -help[=n]              - Help message, [n=1,2,3]
1738
    -man                   - Full documentation [-help=3]
1739
    -verbose[=n]           - Verbose command operation
1740
 
1741
=head2 ARGUMENTS
1742
 
1743
The command takes one argument: The URL of the desired package.
1744
This may be be:
1745
 
1746
=over
1747
 
1748
=item * A full URL
1749
 
1750
Complete with protocol and path information.
1751
 
1752
=item * A simple URL
1753
 
1754
JATS will prepend the site-specific repository location to the user provided URL
1755
 
1756
=back
1757
 
1758
=head2 OPTIONS
1759
 
1760
This command has no significant options, other than the general help options.
1761
 
1762
=head2 DESCRIPTION
1763
 
1764
This command will delete a package from the repository. It will ensure
1765
that the package is a valid package, before it is deleted.
1766
 
1767
The command is intended to be used by test scripts, rather than users.
1768
 
2048 dpurdie 1769
=head1 Create Branch
385 dpurdie 1770
 
1771
=head2 NAME
1772
 
2048 dpurdie 1773
Create a Workspace Branch
385 dpurdie 1774
 
1775
=head2 SYNOPSIS
1776
 
2048 dpurdie 1777
jats svn branch branch-name [options]
385 dpurdie 1778
 
1779
 Options:
1780
    -help[=n]              - Help message, [n=1,2,3]
1781
    -man                   - Full documentation [-help=3]
1782
    -verbose[=n]           - Verbose command operation
1783
    -path=path             - Target workspace
2048 dpurdie 1784
    -[no]switch            - Switch to new branch(default)
1785
    -comment=text          - Comment to apply to the new branch
385 dpurdie 1786
 
1787
=head2 ARGUMENTS
1788
 
2048 dpurdie 1789
The command takes one argument. The name of the branch to be created.
385 dpurdie 1790
 
1791
=head2 OPTIONS
1792
 
1793
=over
1794
 
1795
=item B<-path=path>
1796
 
1797
This options specifies the path of the target workspace. If not provided the
1798
command will use the current directory.
1799
 
2048 dpurdie 1800
=item B<-[no]switch>
1801
 
1802
If enabled (the default) the workspace will be switched to the new branch at
1803
the end of the process.
1804
 
1805
=item B<-comment=text>
1806
 
1807
If present, the specified text will be used as a Subversion comment when the
1808
branch is created.
1809
 
1810
If not provided, then JATS will provide a basic comment.
1811
 
385 dpurdie 1812
=back
1813
 
1814
=head2 DESCRIPTION
1815
 
2048 dpurdie 1816
This command will create a named branch associated with the workspace in the
1817
specified path. It is intended to simplify the creation of Private or
385 dpurdie 1818
Development branches.
1819
 
2048 dpurdie 1820
If the named branch already exists, then the command will fail.
385 dpurdie 1821
 
2048 dpurdie 1822
The command performs a server-side copy. It will not commit any locally
1823
modified files. Nor will it inform you if there are any.
311 dpurdie 1824
 
2048 dpurdie 1825
By default, the user is 'switched' to the newly created branch.
1826
 
1827
=head1 Switch Branch
1828
 
311 dpurdie 1829
=head2 NAME
1830
 
2048 dpurdie 1831
Switch a Workspace Branch
311 dpurdie 1832
 
1833
=head2 SYNOPSIS
1834
 
2048 dpurdie 1835
jats svn switch [branch-name] [options]
311 dpurdie 1836
 
1837
 Options:
2048 dpurdie 1838
    -help[=n]              - Help message, [n=1,2,3]
1839
    -man                   - Full documentation [-help=3]
1840
    -verbose[=n]           - Verbose command operation
1841
    -path=path             - Target workspace
311 dpurdie 1842
 
1843
=head2 ARGUMENTS
1844
 
2048 dpurdie 1845
The command takes one optional argument. The name of the target branch.
311 dpurdie 1846
 
2048 dpurdie 1847
=head2 OPTIONS
1848
 
311 dpurdie 1849
=over
1850
 
2048 dpurdie 1851
=item B<-path=path>
311 dpurdie 1852
 
2048 dpurdie 1853
This options specifies the path of the target workspace. If not provided the
1854
command will use the current directory.
311 dpurdie 1855
 
2048 dpurdie 1856
=back
311 dpurdie 1857
 
2048 dpurdie 1858
=head2 DESCRIPTION
311 dpurdie 1859
 
2048 dpurdie 1860
This command will switch the users workspace to the named branch. This is
1861
identical to the Subversion switch command, except it is easier to user and
1862
has several validity checks and other enhancements.
311 dpurdie 1863
 
2048 dpurdie 1864
The command has two modes of operation:
311 dpurdie 1865
 
2048 dpurdie 1866
=over 4
311 dpurdie 1867
 
2048 dpurdie 1868
=item   1. Display a list of branched in the current package.
311 dpurdie 1869
 
2048 dpurdie 1870
If no branch is specified, then the utility will display a list of branches in
1871
the packages 'branches' directory.
311 dpurdie 1872
 
2048 dpurdie 1873
=item   2. Switch to the named branch.
311 dpurdie 1874
 
2048 dpurdie 1875
The named branch must exists otherwise the command will fail.
311 dpurdie 1876
 
2354 dpurdie 1877
There are two special variants of the branch name:
311 dpurdie 1878
 
2048 dpurdie 1879
=over 4
311 dpurdie 1880
 
2048 dpurdie 1881
=item trunk
311 dpurdie 1882
 
2048 dpurdie 1883
If the branch is named 'trunk' then it will refer to the packages truck
1356 dpurdie 1884
 
2048 dpurdie 1885
=item tags
1356 dpurdie 1886
 
2048 dpurdie 1887
If the branch name starts with 'tags/', then the command will refer to
1888
a tag within the package and not a branch.
1356 dpurdie 1889
 
2048 dpurdie 1890
=back
1356 dpurdie 1891
 
2048 dpurdie 1892
The command will add and remove unmodified files from the workspace during this
1893
operation.
311 dpurdie 1894
 
2048 dpurdie 1895
=back
311 dpurdie 1896
 
2048 dpurdie 1897
=head3 Examples
311 dpurdie 1898
 
2048 dpurdie 1899
To switch to the packages trunk
311 dpurdie 1900
 
2048 dpurdie 1901
    jats svn switch trunk
311 dpurdie 1902
 
2048 dpurdie 1903
To switch to the a branch called MyBranch
311 dpurdie 1904
 
2048 dpurdie 1905
    jats svn switch MyBranch
311 dpurdie 1906
 
2048 dpurdie 1907
To switch to a tagged version of the package
311 dpurdie 1908
 
2048 dpurdie 1909
    jats svn switch tags/MyPackage_1.0.0000.cr
311 dpurdie 1910
 
2048 dpurdie 1911
To display a list of available branches (not tags)
311 dpurdie 1912
 
2048 dpurdie 1913
    jats svn switch
311 dpurdie 1914
 
2048 dpurdie 1915
=head1 Delete Branch
311 dpurdie 1916
 
2048 dpurdie 1917
=head2 NAME
311 dpurdie 1918
 
2048 dpurdie 1919
Delete the Workspace Branch
311 dpurdie 1920
 
2048 dpurdie 1921
=head2 SYNOPSIS
311 dpurdie 1922
 
2071 dpurdie 1923
jats svn delete-branch [options] [branch-list]
311 dpurdie 1924
 
2048 dpurdie 1925
 Options:
1926
    -help[=n]              - Help message, [n=1,2,3]
1927
    -man                   - Full documentation [-help=3]
1928
    -verbose[=n]           - Verbose command operation
1929
    -path=path             - Target workspace
311 dpurdie 1930
 
2048 dpurdie 1931
=head2 ARGUMENTS
1932
 
2354 dpurdie 1933
The command may take zero or more arguments. If provided the arguments will be
2071 dpurdie 1934
branch names to be deleted.
2048 dpurdie 1935
 
1936
=head2 OPTIONS
1937
 
1938
=over
1939
 
1940
=item B<-path=path>
1941
 
1942
This options specifies the path of the target workspace. If not provided the
1943
command will use the current directory.
1944
 
1945
=back
1946
 
1947
=head2 DESCRIPTION
1948
 
2071 dpurdie 1949
This command can display the branch associated with the workspace or it can
1950
delete one or more branches. It is intended to simplify the deletion of Private
1951
or Development branches.
2048 dpurdie 1952
 
2071 dpurdie 1953
=over 4
1954
 
1955
=item 1 Arguments are provided
1956
 
1957
The command will delete all the named branches. If a named branch does not exist
1958
then the command will issue a warning message.
1959
 
1960
=item 2 No arguments provided
1961
 
1962
The command will display the branch associated with the workspace
1963
 
2048 dpurdie 1964
If the workspace is not linked to a 'branch' then the command will fail.
1965
 
2071 dpurdie 1966
=back
1967
 
311 dpurdie 1968
=head1 Import directory to a Package
1969
 
1970
=head2 NAME
1971
 
1972
Import directory to a Package
1973
 
1974
=head2 SYNOPSIS
1975
 
1976
jats svn [options] import URL [command options]
1977
 
1978
 Options:
1979
    -help[=n]               - Help message, [n=1,2,3]
1980
    -man                    - Full documentation [-help=3]
1981
    -verbose[=n]            - Verbose command operation
1982
 
1983
 Command Options
1984
    -help[=n]               - Command specific help, [n=1,2,3]
1985
    -verbose[=n]            - Verbose operation
1986
    -package=name           - Name of source package
1987
    -dir=path               - Path to new version
379 dpurdie 1988
    -label=label            - Label the result
1989
    -branch=branchName      - Base import on a branch
311 dpurdie 1990
    -replace                - Allow the label to be replaced
1991
    -reuse                  - Reuse the import directory
1992
    -workspace=path         - Path and name of alternate workspace
1993
    -[no]delete             - Deletes workspace after use. Default:yes
379 dpurdie 1994
    -author=name            - Force author of changes
1995
    -date=dateString        - Force date of changes
1996
    -log=text               - Append text to the commit message
1997
    -datafile=path          - Export tag data for automation
2882 dpurdie 1998
    -[no]commit             - Prevent changes being committed. Default:Yes
2424 dpurdie 1999
    -printfiles=n           - Control commit verbosity
2882 dpurdie 2000
    -mergePaths=dirList     - Comma separated list of directories to merge
311 dpurdie 2001
 
2002
=head2 ARGUMENTS
2003
 
2004
The command takes one argument: The URL of the desired package.
2005
This may be be:
2006
 
2007
=over
2008
 
2009
=item * A full URL
2010
 
2011
Complete with protocol and path information.
2012
 
2013
=item * A simple URL
2014
 
2015
JATS will prepend the site-specific repository location to the user provided URL
2016
 
2017
=back
2018
 
2019
=head2 OPTIONS
2020
 
2021
=over
2022
 
2023
=item -help[=n]
2024
 
2025
Print a help message and exit. The level of help may be either 1, 2 or 3.
2026
 
2027
This option may be specified multiple times to increment the help level, or
2028
the help level may be directly specified as a number.
2029
 
2030
=item -verbose[=n]
2031
 
2032
This option will increase the level of verbosity of the utility.
2033
 
2034
If an argument is provided, then it will be used to set the level, otherwise the
2035
existing level will be incremented. This option may be specified multiple times.
2036
 
2037
=item -package=name
2038
 
2039
Either this option or a bare URL on the command line must be provided. It
2040
specifies the repository and package to be used as a basis for the work.
2041
 
2042
=item -dir=path
2043
 
2044
This option is mandatory. It specifies the path to a local directory that
2045
contains a version of the software to be checked in.
2046
 
2047
=item -label=name
2048
 
2049
The resulting software version will be labeled with this tag, if it is provided.
2050
 
383 dpurdie 2051
A label name of TIMESTAMP will be treated in special manner. The name will be
2052
replaced with a unique name based on the users name and the current date time.
2053
 
379 dpurdie 2054
=item -branch=branchName
2055
 
2056
This option will cause the importation to be referenced to the named branch.
2057
If the branch does not exist it will be created. If it does exist then it will
2058
be used.
2059
 
2060
If this option is not specified, then the importation will be based on the 'trunk'.
2061
 
2062
If the Workspace is provided, then it will be used independently of this option.
2063
 
383 dpurdie 2064
A branchName of TIMESTAMP will be treated in special manner. The name will be
2065
replaced with a unique name based on the users name and the current date time.
2066
 
311 dpurdie 2067
=item -replace
2068
 
2069
This option, if provided, allows the label to be replaced.
2070
 
2071
=item -reuse
2072
 
2073
This option can be used to speed the creation of multiple versions in a scripted
2074
environment. The option allows the utility to reuse the workspace if it exists.
2075
 
2076
=item -workspace=path
2077
 
2078
This option specifies an alternate workspace directory to create and use. The
2079
default directory is "SvnImportDir" within the users current directory.
2080
 
2081
=item [no]delete
2082
 
341 dpurdie 2083
This option control the deletion of the workspace directory. By default the
311 dpurdie 2084
directory will be deleted, unless re-use is also used.
2085
 
379 dpurdie 2086
=item -author=name
2087
 
2088
This option will force the author of changes as recorded in the repository.
385 dpurdie 2089
The repository must be configured to allow such changes.
379 dpurdie 2090
 
2091
This option may not work for non-admin users.
2092
 
2093
=item -date=dateString
2094
 
2095
This option will force the date of the changes as recorded in the repository.
385 dpurdie 2096
The repository must be configured to allow such changes.
379 dpurdie 2097
The dateString is in a restricted ISO 8601 format: ie 2009-02-12T00:44:04.921324Z
2098
 
2099
This option may not work for non-admin users.
2100
 
2101
=item -log=text
2102
 
2103
This option will append the specified text to the commit message.
2104
The first line of the commit message is fixed by the import tool.
2105
 
2106
=item -datafile=path
2107
 
2108
This option will cause the utility to create a data file to record the import
2109
tag. It is used for automation of the import process.
2110
 
2424 dpurdie 2111
=item -[no]commit
2112
 
2113
This option will prevent the final workspace from being committed to the
2114
Repository. This allows inspection of the results.
2115
 
2116
The default operation is to commit and label the results of the import.
2117
 
2118
=item -printfiles=n
2119
 
2120
This option controls commit verbosity. The default operation is to display
2121
the files added and removed during the commit.
2122
 
2123
Suitable numbers are: None, 0 (No Display) and 1 (Full Display).
2124
 
2652 dpurdie 2125
=item -mergePaths=dirList
2616 dpurdie 2126
 
2882 dpurdie 2127
This option specifies a Comma separated list of directories to be merged
3965 dpurdie 2128
during the import process. This works via the following mechanism:
2616 dpurdie 2129
 
2130
If the named directory exists in the 'new' image it will replace that in the
2131
'initial' workspace.
2132
 
2133
If the named directory does not exist in the 'new' image, but does exist in the
2134
'initial' image then it will be retained in the 'final' image.
2135
 
2652 dpurdie 2136
Directories other than those named will not be imported.
2137
 
311 dpurdie 2138
=back
2139
 
2140
=head2 DESCRIPTION
2141
 
2142
Import a new version of a package to the trunk of the package. The utility
2143
will only import changed files so that file history is preserved within the
2144
repository.
2145
 
2146
This utility is used import software from another version control system
2147
The utility will:
2148
 
2149
=over
2150
 
361 dpurdie 2151
=item *
311 dpurdie 2152
 
361 dpurdie 2153
Create a Work Space based on the current package version
2154
 
379 dpurdie 2155
The 'trunk' of the named package will be used as the base for the workspace,
2156
unless modified with the -branch option.
311 dpurdie 2157
 
361 dpurdie 2158
=item *
311 dpurdie 2159
 
361 dpurdie 2160
Update files and directories
2161
 
311 dpurdie 2162
Determines the files and directories that have been added and deleted and
2163
update the Workspace to reflect the new structure.
2164
 
361 dpurdie 2165
=item *
311 dpurdie 2166
 
361 dpurdie 2167
Check in the new version
311 dpurdie 2168
 
361 dpurdie 2169
=item *
2170
 
2171
Label the new version
2172
 
311 dpurdie 2173
=back
2174
 
2175
=cut
2176