Subversion Repositories DevTools

Rev

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