Subversion Repositories DevTools

Rev

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

Rev 7322 Rev 7323
Line 20... Line 20...
20
use warnings;
20
use warnings;
21
use JatsError;
21
use JatsError;
22
use JatsSvn qw(:All);
22
use JatsSvn qw(:All);
23
use JatsLocateFiles;
23
use JatsLocateFiles;
24
use JatsProperties;
24
use JatsProperties;
-
 
25
use FileUtils;
25
use Pod::Usage;                                 # required for help support
26
use Pod::Usage;                                 # required for help support
26
use Getopt::Long qw(:config require_order);     # Stop on non-option
27
use Getopt::Long qw(:config require_order);     # Stop on non-option
27
use Cwd;
28
use Cwd;
28
use File::Path;
29
use File::Path;
29
use File::Copy;
30
use File::Copy;
Line 79... Line 80...
79
 
80
 
80
#
81
#
81
#   Reconfigure the options parser to allow subcommands to parse options
82
#   Reconfigure the options parser to allow subcommands to parse options
82
#
83
#
83
Getopt::Long::Configure('permute');
84
Getopt::Long::Configure('permute');
-
 
85
InitFileUtils();
84
 
86
 
85
#
87
#
86
#   Process command
88
#   Process command
87
#   First command line argument is a subversion command
89
#   First command line argument is a subversion command
88
#
90
#
Line 96... Line 98...
96
SvnRepoCmd($cmd, @ARGV)                if ( $cmd eq 'ls' );
98
SvnRepoCmd($cmd, @ARGV)                if ( $cmd eq 'ls' );
97
TestSvn()                              if ($cmd eq 'test');
99
TestSvn()                              if ($cmd eq 'test');
98
ShowPaths()                            if ( $cmd =~ m/^path/ );
100
ShowPaths()                            if ( $cmd =~ m/^path/ );
99
ShowTag()                              if ( $cmd =~ m/^tag/ );
101
ShowTag()                              if ( $cmd =~ m/^tag/ );
100
ShowUrl()                              if ( $cmd =~ m/^url/ );
102
ShowUrl()                              if ( $cmd =~ m/^url/ );
-
 
103
SvnMerge()                             if ( $cmd =~ m/^merge/ );
-
 
104
SvnReintegrate()                       if ( $cmd =~ m/^reintegrate/ );
101
 
105
 
102
pod2usage(-verbose => 0, -message => "No valid operations specified") unless ( $opr_done );
106
pod2usage(-verbose => 0, -message => "No valid operations specified") unless ( $opr_done );
103
exit 0;
107
exit 0;
104
 
108
 
105
#-------------------------------------------------------------------------------
109
#-------------------------------------------------------------------------------
Line 1362... Line 1366...
1362
    $uref->SvnSwitch ($branch_tag, $opt_path, '--Print', '--KeepWs' );
1366
    $uref->SvnSwitch ($branch_tag, $opt_path, '--Print', '--KeepWs' );
1363
    $opr_done = 1;
1367
    $opr_done = 1;
1364
}
1368
}
1365
 
1369
 
1366
#-------------------------------------------------------------------------------
1370
#-------------------------------------------------------------------------------
-
 
1371
# Function        : SvnMerge 
-
 
1372
#
-
 
1373
# Description     : Perform an svn merge 
-
 
1374
#                       - with sanity checking
-
 
1375
#                       - auto deterine the correct 'head' to merge from
-
 
1376
#                  
-
 
1377
#
-
 
1378
# Inputs          : None
-
 
1379
#
-
 
1380
# Returns         : 
-
 
1381
#
-
 
1382
sub SvnMerge
-
 
1383
{
-
 
1384
    my $opt_path = '.';
-
 
1385
    my $opt_info;
-
 
1386
    my @mergeOpts;
-
 
1387
    my $opt_dryRun;
-
 
1388
 
-
 
1389
    #
-
 
1390
    #   Parse more options
-
 
1391
    #
-
 
1392
    Getopt::Long::Configure('pass_through');
-
 
1393
    GetOptions (
-
 
1394
                "help:+"        => \$opt_help,
-
 
1395
                "manual:3"      => \$opt_help,
-
 
1396
                "path:s"        => \$opt_path,
-
 
1397
                'info'          => \$opt_info,
-
 
1398
                'dry-run'       => \$opt_dryRun,
-
 
1399
                ) || Error ("Invalid command line" );
-
 
1400
 
-
 
1401
    #
-
 
1402
    #   Subcommand specific help
-
 
1403
    #
-
 
1404
    SubCommandHelp( $opt_help, "Sync Merge") if ($opt_help);
-
 
1405
 
-
 
1406
    #
-
 
1407
    #   Save merge options
-
 
1408
    #   Error if a non-option is present
-
 
1409
    #
-
 
1410
    foreach (@ARGV) {
-
 
1411
        if (m~^-~) {
-
 
1412
            push @mergeOpts, $_;
-
 
1413
        } else {
-
 
1414
            Error ("Only options must be passed to Merge: $_");
-
 
1415
        }
-
 
1416
    }
-
 
1417
 
-
 
1418
    #
-
 
1419
    #   We intercepted the dry-run option
-
 
1420
    #   Put the option back into the stream.
-
 
1421
    if ($opt_dryRun) {
-
 
1422
        push @mergeOpts, '--dry-run';
-
 
1423
    }
-
 
1424
 
-
 
1425
    #   Check we are in a workspace
-
 
1426
    #   Create an SVN session
-
 
1427
    #   
-
 
1428
    my $uref = NewSessionByWS($opt_path, 0, 1);
-
 
1429
#    DebugDumpData("uref", $uref);
-
 
1430
 
-
 
1431
    #
-
 
1432
    #   Warn user if the command is being executed from within a subdirectory of the workspace
-
 
1433
    #   It might work, but if the directory is deleted it will go badly
-
 
1434
    #
-
 
1435
    my $ws_root = mustBeWsRoot($uref);
-
 
1436
 
-
 
1437
    #
-
 
1438
    #   Determine the source of the merge
-
 
1439
    #   Get some more workspace information
-
 
1440
    # 
-
 
1441
    $uref->getWsExtraInfo();
-
 
1442
    my $logInfo = $uref->{InfoWsExtra};
-
 
1443
#DebugDumpData("getWsExtraInfo", $logInfo);
-
 
1444
 
-
 
1445
    # A bit of sanity testing
-
 
1446
    Error("Workspace does not appear to be a branch") unless (exists $logInfo->{'copyfrom-path'}); 
-
 
1447
    Error("Workspace does not appear to be a branch") unless (exists $logInfo->{'target'}); 
-
 
1448
    Error("Workspace is a trunk") if ($logInfo->{'target'} =~ m~/trunk$~);
-
 
1449
    Error("Workspace is a raw branch") if ($logInfo->{'target'} =~ m~/branches$~);
-
 
1450
    Error("Workspace is a raw tag") if ($logInfo->{'target'} =~ m~/tags$~);
-
 
1451
    Error("Workspace is a within a tag") if ($logInfo->{'target'} =~ m~/tags/~);
-
 
1452
 
-
 
1453
    #   Ensure the source is a branch and not a trunk
-
 
1454
    #   Ensure this workspace is not on the same bit (trunk or branch) 
-
 
1455
    #   
-
 
1456
    Message ("Merge Info - No merge performed") if $opt_info;
-
 
1457
    Message ("RepoRoot: " . $uref->{InfoWs}{'Repository Root'});
-
 
1458
    Message ("Parent: " . $logInfo->{'copyfrom-path'});
-
 
1459
    Message ("Workspace: " . $logInfo->{'target'});
-
 
1460
 
-
 
1461
    unless ($opt_info) {
-
 
1462
        #
-
 
1463
        #   $logInfo->{'copyfrom-path'} is the parent of the branch in the workspace
-
 
1464
        #   use merge ^/<copyfrom-path> to merge the data into this workspace
-
 
1465
        #
-
 
1466
        #   Perform an interactive command so that the user can accept conflicts - if they want
-
 
1467
        my $rv = SvnUserCmd( 'merge',
-
 
1468
                @mergeOpts,
-
 
1469
                '^' . $logInfo->{'copyfrom-path'},
-
 
1470
                $opt_path,
-
 
1471
                { 'credentials' => 1 });
-
 
1472
 
-
 
1473
        exit $rv;
-
 
1474
    }
-
 
1475
    $opr_done = 1;
-
 
1476
}
-
 
1477
 
-
 
1478
#-------------------------------------------------------------------------------
-
 
1479
# Function        : SvnReintegrate
-
 
1480
#
-
 
1481
# Description     : Simulate an svn merge --reintegrate (which is now deprecated)
-
 
1482
#                       - Assume the user has the 'trunk' in a workspace
-
 
1483
#                       - Ensure there are no uncommitted files
-
 
1484
#                       - Ensure it is upto date with thr REpo server
-
 
1485
#                       - with much sanity checking
-
 
1486
#                       - verify the named branch
-
 
1487
#                       - Ensure the named branch is derived from the workspace
-
 
1488
#                       - perform a simple merge
-
 
1489
#
-
 
1490
# Inputs          : None
-
 
1491
#
-
 
1492
# Returns         : 
-
 
1493
#
-
 
1494
sub SvnReintegrate
-
 
1495
{
-
 
1496
    my $opt_path = '.';
-
 
1497
    my $opt_info;
-
 
1498
    my @mergeOpts;
-
 
1499
    my $opt_reintegrate;
-
 
1500
    my $opt_dryRun;
-
 
1501
    my $opt_branch;
-
 
1502
 
-
 
1503
    #
-
 
1504
    #   Parse more options
-
 
1505
    #
-
 
1506
    Getopt::Long::Configure('pass_through');
-
 
1507
    GetOptions (
-
 
1508
                "help:+"        => \$opt_help,
-
 
1509
                "manual:3"      => \$opt_help,
-
 
1510
                "path:s"        => \$opt_path,
-
 
1511
                'info'          => \$opt_info,
-
 
1512
                'reintegrate!'  => \$opt_reintegrate,
-
 
1513
                'dry-run'       => \$opt_dryRun,
-
 
1514
                'branch:s'      => \$opt_branch,
-
 
1515
                ) || Error ("Invalid command line" );
-
 
1516
 
-
 
1517
    #
-
 
1518
    #   Subcommand specific help
-
 
1519
    #
-
 
1520
    SubCommandHelp( $opt_help, "Reintegrate Merge") if ($opt_help);
-
 
1521
 
-
 
1522
    #
-
 
1523
    #   Save merge options
-
 
1524
    #   Extract the named branch ( if not provided via the -branch ) option
-
 
1525
    #
-
 
1526
    foreach (@ARGV) {
-
 
1527
        if (m~^-~) {
-
 
1528
            push @mergeOpts, $_;
-
 
1529
        } else {
-
 
1530
            Error ("Source branh for the merge must only be specified once") if (defined($opt_branch));
-
 
1531
            $opt_branch = $_;
-
 
1532
        }
-
 
1533
    }
-
 
1534
 
-
 
1535
    Error("No branch specified") unless defined $opt_branch;
-
 
1536
    Error("Branch name looks bad") unless ($opt_branch =~ m~[-/a-zA-Z0-9]~i);
-
 
1537
 
-
 
1538
    #
-
 
1539
    #   We intercepted the dry-run option,
-
 
1540
    #   Put the option back into the stream.
-
 
1541
    if ($opt_dryRun) {
-
 
1542
        push @mergeOpts, '--dry-run';
-
 
1543
    }
-
 
1544
 
-
 
1545
    #
-
 
1546
    #   Calculate the target name
-
 
1547
    #       trunk is special
-
 
1548
    #       tags/... is special
-
 
1549
    if ( $opt_branch eq 'trunk' ) {
-
 
1550
    } elsif ( $opt_branch =~ m~tags/.+~ ) {
-
 
1551
    } else {
-
 
1552
        $opt_branch = join ('/', 'branches', $opt_branch);
-
 
1553
    }
-
 
1554
 
-
 
1555
    #
-
 
1556
    #   Check we are in a workspace
-
 
1557
    #   Create an SVN session
-
 
1558
    #
-
 
1559
    my $uref = NewSessionByWS($opt_path, 0, 1);
-
 
1560
    $uref->{WSURL} =~ m~[^/](/.*)~;
-
 
1561
    $uref->{target} = $1;
-
 
1562
 
-
 
1563
    #
-
 
1564
    #   Warn user if the command is being executed from within a subdirectory of the workspace
-
 
1565
    #   It might work, but if the directory is deleted it will go badly
-
 
1566
    #
-
 
1567
    my $ws_root = mustBeWsRoot($uref);
-
 
1568
#DebugDumpData("uref", $uref);
-
 
1569
 
-
 
1570
    #
-
 
1571
    #   Validate the branch the user has specified - it must exist
-
 
1572
    #
-
 
1573
    my $ws_url = $uref->Full();
-
 
1574
    my $branch_tag = join ('/', $ws_url, $opt_branch);
-
 
1575
    $uref->SvnValidateTarget (
-
 
1576
                        'cmd'    => 'svn reintegrate',
-
 
1577
                        'target' => $branch_tag,
-
 
1578
                        'require' => 1,
-
 
1579
                        );
-
 
1580
 
-
 
1581
    #
-
 
1582
    #   Verify the source of the merge
-
 
1583
    #   Need to get data about the branch, not the current workspace
-
 
1584
    #
-
 
1585
    my $branchRef = NewSessionByUrl($branch_tag);
-
 
1586
    $branchRef->getWsExtraInfo();
-
 
1587
    my $branchLogInfo = $branchRef->{InfoWsExtra};
-
 
1588
#DebugDumpData("getWsExtraInfo", $branchLogInfo);
-
 
1589
 
-
 
1590
    # A bit of sanity testing
-
 
1591
    Error("Branch does not appear to be a branch") unless (exists $branchLogInfo->{'copyfrom-path'}); 
-
 
1592
    Error("Branch does not appear to be a branch") unless (exists $branchLogInfo->{'target'}); 
-
 
1593
    Warning("Branch is a trunk") if ($branchLogInfo->{'target'} =~ m~/trunk$~);
-
 
1594
    Error("Branch is a raw branch") if ($branchLogInfo->{'target'} =~ m~/branches$~);
-
 
1595
    Error("Branch is a raw tag") if ($branchLogInfo->{'target'} =~ m~/tags$~);
-
 
1596
    Warning("Branch is a within a tag") if ($branchLogInfo->{'target'} =~ m~/tags/~);
-
 
1597
    Error ("Merging to myself") if ($uref->{target} eq $branchLogInfo->{'target'});
-
 
1598
    Error ("Branch not taken from this trunk", "Workspace: $uref->{'target'}","Branch: $branchLogInfo->{'copyfrom-path'}") unless ($uref->{'target'} eq $branchLogInfo->{'copyfrom-path'});
-
 
1599
 
-
 
1600
    Message ("Reintegrate Info - No merge performed") if ($opt_info );
-
 
1601
    Message ("RepoRoot: " . $uref->{InfoWs}{'Repository Root'});
-
 
1602
    Message ("Source Branch: " . $branchLogInfo->{'target'});
-
 
1603
    Message ("Workspace Branch: " . $uref->{'target'} );
-
 
1604
    Message ("Reintegrate from $branchLogInfo->{'target'} to $uref->{'target'}");
-
 
1605
 
-
 
1606
    #
-
 
1607
    #   Examine the workspace and ensure that there are no modified
-
 
1608
    #   files - unless they are expected
-
 
1609
    #   
-
 
1610
    #   Prevent the user from merging into a WS that has not been committed
-
 
1611
    #
-
 
1612
    $uref->SvnWsModified ( 'cmd' => 'Reintegrate' );
-
 
1613
 
-
 
1614
    unless ($opt_info) {
-
 
1615
 
-
 
1616
        #
-
 
1617
        #   $branchLogInfo->{'target'} is the branch of the specified branch
-
 
1618
        #   $uref->{target} - should be the same
-
 
1619
        #   
-
 
1620
        #   use merge ^/<target> to merge the data into this workspace
-
 
1621
        #
-
 
1622
        #   Perform an interactive command so that the user can accept conflicts - if they want
-
 
1623
        #
-
 
1624
        my $rv = SvnUserCmd( 'merge', '--reintegrate',
-
 
1625
                @mergeOpts,
-
 
1626
                '^' . $branchLogInfo->{'target'},
-
 
1627
                '.',
-
 
1628
                { 'credentials' => 1 });
-
 
1629
 
-
 
1630
    }
-
 
1631
    $opr_done = 1;
-
 
1632
}
-
 
1633
 
-
 
1634
#-------------------------------------------------------------------------------
-
 
1635
# Function        : mustBeWsRoot 
-
 
1636
#
-
 
1637
# Description     : Ensure that the user is not in a subdirectory of a workspace 
-
 
1638
#
-
 
1639
# Inputs          : $uref   - A Svn session handle
-
 
1640
#
-
 
1641
# Returns         : Will not return on error
-
 
1642
#                   Return the workspace root as provided by SvnLocateWsRoot
-
 
1643
#
-
 
1644
sub mustBeWsRoot
-
 
1645
{
-
 
1646
    my ($uref) = @_;
-
 
1647
 
-
 
1648
    my $ws_root = $uref->SvnLocateWsRoot(0);
-
 
1649
    my $pathToRoot = RelPath($ws_root);
-
 
1650
    if ( $pathToRoot =~ m~^..~) {
-
 
1651
        Error("This command cannot be executed within a subdirectory of the workspace",
-
 
1652
                "It can be executed in the root of the workspace: $pathToRoot",
-
 
1653
                "It can be executed externally with the -path option");
-
 
1654
    }
-
 
1655
 
-
 
1656
    return $ws_root;
-
 
1657
}
-
 
1658
 
-
 
1659
#-------------------------------------------------------------------------------
1367
# Function        : ShowBranches
1660
# Function        : ShowBranches
1368
#
1661
#
1369
# Description     : Show branches in current workspace
1662
# Description     : Show branches in current workspace
1370
#                   Internal use only
1663
#                   Internal use only
1371
#
1664
#
Line 1472... Line 1765...
1472
    delete-package URL     - Delete Package Subtree
1765
    delete-package URL     - Delete Package Subtree
1473
    branch BRANCH          - Create a Development Branch
1766
    branch BRANCH          - Create a Development Branch
1474
    switch [BRANCH]        - Switch to a Development Branch
1767
    switch [BRANCH]        - Switch to a Development Branch
1475
    delete-branch          - Delete a Development Branch
1768
    delete-branch          - Delete a Development Branch
1476
    import URL             - Import files to package at URL
1769
    import URL             - Import files to package at URL
-
 
1770
    merge                  - Merge head into a feature branch
-
 
1771
    reintegrate            - Integrate a feature branch to its head
-
 
1772
 
1477
 
1773
 
1478
 Use the command
1774
 Use the command
1479
    jats svn command -h
1775
    jats svn command -h
1480
 for command specific help
1776
 for command specific help
1481
 
1777
 
Line 2229... Line 2525...
2229
 
2525
 
2230
Label the new version
2526
Label the new version
2231
 
2527
 
2232
=back
2528
=back
2233
 
2529
 
-
 
2530
=head1 Sync Merge
-
 
2531
 
-
 
2532
=head2 NAME
-
 
2533
 
-
 
2534
Perform a Feature Branch Sync Merge
-
 
2535
 
-
 
2536
=head2 SYNOPSIS
-
 
2537
 
-
 
2538
jats svn merge [options]
-
 
2539
 
-
 
2540
 Options:
-
 
2541
    -help[=n]              - Help message, [n=1,2,3]
-
 
2542
    -man                   - Full documentation [-help=3]
-
 
2543
    -verbose[=n]           - Verbose command operation
-
 
2544
    -info                  - Displays merge info only
-
 
2545
    -dry-run               - Perform a dry run of the merge
-
 
2546
    -path=path             - Target workspace
-
 
2547
    ...                    - Other options are passed to the merge
-
 
2548
 
-
 
2549
=head2 ARGUMENTS
-
 
2550
 
-
 
2551
The command takes no arguments, just options.
-
 
2552
 
-
 
2553
=head2 OPTIONS
-
 
2554
 
-
 
2555
=over
-
 
2556
 
-
 
2557
=item B<-path=path>
-
 
2558
 
-
 
2559
This options specifies the path of the target workspace. If not provided the
-
 
2560
command will use the current directory.
-
 
2561
 
-
 
2562
=item B<-info>
-
 
2563
 
-
 
2564
This option will display information about the proposed merge, but it will not do the merge.
-
 
2565
This is not the same as a '-dry-run' as it shows information that the command has recovered from
-
 
2566
the workspace.
-
 
2567
 
-
 
2568
=item B<-dry-run>
-
 
2569
 
-
 
2570
This option will perform a dry run of the actual merge. It will not modify the workspace.
-
 
2571
 
-
 
2572
=item B<...>
-
 
2573
 
-
 
2574
Options that are not processed by this command will be passed through to the underlying
-
 
2575
'svn merge' command. Available options include:
-
 
2576
 
-
 
2577
=over 8
-
 
2578
 
-
 
2579
=item * --accept=mf (mine-full)
-
 
2580
 
-
 
2581
=item * --accept=mc (mine-conflict)
-
 
2582
 
-
 
2583
=back
-
 
2584
 
-
 
2585
=back
-
 
2586
 
-
 
2587
=head2 DESCRIPTION
-
 
2588
 
-
 
2589
This command implements the common operation of merging the release branch 
-
 
2590
head (normally trunk) onto a private development branch in the current working copy. 
-
 
2591
 
-
 
2592
The main goal of this command is to avoid situations where developers accidentally merge 
-
 
2593
from the wrong branch, or end up with (to them) inexplicable merge failures and thus 
-
 
2594
lose confidence in Subversion. 
-
 
2595
 
-
 
2596
It will fail if the current working copy is actually on the trunk, and not a branch.
-
 
2597
 
-
 
2598
=head1 Reintegrate Merge
-
 
2599
 
-
 
2600
=head2 NAME
-
 
2601
 
-
 
2602
Reintegrate a Feature Branch
-
 
2603
 
-
 
2604
=head2 SYNOPSIS
-
 
2605
 
-
 
2606
jats svn reintegrate [options] [branch name]
-
 
2607
 
-
 
2608
 Options:
-
 
2609
    -help[=n]              - Help message, [n=1,2,3]
-
 
2610
    -man                   - Full documentation [-help=3]
-
 
2611
    -verbose[=n]           - Verbose command operation
-
 
2612
    -path=path             - Target workspace
-
 
2613
    -info                  - Displays merge info only
-
 
2614
    -dry-run               - Perform a dry run of the merge
-
 
2615
    -branch=name           - The branch to be used as the merge source
-
 
2616
    ...                    - Other options are passed to the merge
-
 
2617
 
-
 
2618
=head2 ARGUMENTS
-
 
2619
 
-
 
2620
If an argument is provided then it will be used as the name of the branch to be merged into
-
 
2621
the current workspace. This is the same as using the -branch option.
-
 
2622
 
-
 
2623
=head2 OPTIONS
-
 
2624
 
-
 
2625
=over
-
 
2626
 
-
 
2627
=item B<-path=path>
-
 
2628
 
-
 
2629
This options specifies the path of the target workspace. If not provided the
-
 
2630
command will use the current directory.
-
 
2631
 
-
 
2632
=item B<-info>
-
 
2633
 
-
 
2634
This option will display information about the proposed merge, but it will not do the merge.
-
 
2635
This is not the same as a '--dry-run' as it shows information that the command has recovered from
-
 
2636
the workspace.
-
 
2637
 
-
 
2638
=item B<-dry-run>
-
 
2639
 
-
 
2640
This option will perform a dry run of the actual merge. It will NOT deleted the feature branch. It will
-
 
2641
switch the workspace and after the dry run of the merge it will switch it back.
-
 
2642
 
-
 
2643
This option implies '-reintegrate'.
-
 
2644
 
-
 
2645
=item B<-branch>
-
 
2646
 
-
 
2647
This option provides an alternate method for specifying the source of the merge.
-
 
2648
 
-
 
2649
=item B<...>
-
 
2650
 
-
 
2651
Options that are not processed by this command will be passed through to the underlying
-
 
2652
'svn merge' command. Available options include:
-
 
2653
 
-
 
2654
=over 8
-
 
2655
 
-
 
2656
=item * --accept=mf (mine-full)
-
 
2657
 
-
 
2658
=item * --accept=mc (mine-conflict)
-
 
2659
 
-
 
2660
=back
-
 
2661
 
-
 
2662
=head2 DESCRIPTION
-
 
2663
 
-
 
2664
This command implements the common operation of merging a private branch back into the main
-
 
2665
development branch (normally the trunk).
-
 
2666
 
-
 
2667
The main goal of this command is to avoid situations where developers accidentally merge 
-
 
2668
from the wrong branch, or end up with (to them) inexplicable merge failures and thus 
-
 
2669
lose confidence in Subversion. 
-
 
2670
 
-
 
2671
It will fail if the specified branch was not tacken from the package's trunk.
-
 
2672
 
-
 
2673
The command will do the following operations:
-
 
2674
 
-
 
2675
=over 8
-
 
2676
 
-
 
2677
=item * 
-
 
2678
 
-
 
2679
Ensure that the path address a subversion workspace and that the user is not in a sundirectory
-
 
2680
of the workspace.
-
 
2681
 
-
 
2682
=item * 
-
 
2683
 
-
 
2684
Ensure the specified branch exists within the package.
-
 
2685
 
-
 
2686
=item * 
-
 
2687
 
-
 
2688
Ensure the workspace contains no modified files
-
 
2689
 
-
 
2690
=item * 
-
 
2691
 
-
 
2692
Ensure that the specified branch was taken from the branch (often the trunk) on which the 
-
 
2693
workspace is based. A number of other sanity checks are also performed
-
 
2694
 
-
 
2695
 
-
 
2696
=item * 
-
 
2697
 
-
 
2698
Perform the reintegration merge.
-
 
2699
 
-
 
2700
This is, strictly speaking a 'svn merge --reintegrate' as that operation has been deprecated
-
 
2701
and was problematic. The effect is the same.
-
 
2702
 
-
 
2703
=back
-
 
2704
 
-
 
2705
At the end of the reintegration merge the workspace will conatin modified files. The user should verify 
-
 
2706
that the merge has had the desired result and to commit the changes.
-
 
2707
 
2234
=cut
2708
=cut
2235
 
2709