Subversion Repositories DevTools

Rev

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