The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use strict;
use SVK::Test;
plan tests => 26;
our $output;

my ($xd, $svk) = build_test('test');

$svk->mkdir(-m => 'trunk', '/test/trunk');
$svk->mkdir(-m => 'trunk', '/test/branches');
$svk->mkdir(-m => 'trunk', '/test/tags');
my $tree = create_basic_tree($xd, '/test/trunk');

my $depot = $xd->find_depot('test');
my $uri = uri($depot->repospath);

$svk->mirror('//mirror/MyProject', $uri);
$svk->sync('//mirror/MyProject');

my ($copath, $corpath) = get_copath('bm-online-offline');

$svk->checkout('//mirror/MyProject/trunk', $copath);

chdir($copath);

# this should be is_output(_like) instead of just run it
# but I'm not sure what's the correct message yet
$svk->br('--offline','foo');

is_output_like ($svk, 'info', [],
   qr|Depot Path: //local/MyProject/foo|);

is_ancestor($svk, '//local/MyProject/foo', '/mirror/MyProject/trunk', 6);

is_output($svk, 'br', ['-l', '--local', '//mirror/MyProject'],
          ['foo']);
append_file('A/be', "fnordorz\n");
$svk->commit(-m => 'orz');

is_output($svk, 'br', ['--online', '-C'],
    ["We will copy branch //local/MyProject/foo to //mirror/MyProject/branches/foo",
     "Then do a smerge on //mirror/MyProject/branches/foo",
     "Finally delete the src branch //local/MyProject/foo"]);

is_output_like ($svk, 'branch', ['--online'],
    qr|U   A/be|);

is_output_like ($svk, 'info', [],
   qr|Depot Path: //mirror/MyProject/branches/foo|);

# since branch name is not the same, just do move and switch
is_output ($svk, 'info', ['//local/MyProject/foo'],
    ["Path //local/MyProject/foo does not exist."]);

is_ancestor($svk, '//mirror/MyProject/branches/foo', '/mirror/MyProject/trunk', 6);

# let's play with feature/foobar branch now

is_output_like ($svk, 'branch', ['--create', 'feature/foobar'],
    qr'Project branch created: feature/foobar');

$svk->br('--switch', 'feature/foobar');
is_output_like ($svk, 'info', [],
   qr|Depot Path: //mirror/MyProject/branches/feature/foobar|);

is_output ($svk, 'branch', ['--online'],
    ["Current branch already online"]);

# future should be is_output_like
$svk->br('--offline'); # offline the feature/foobar branch

is_output_like ($svk, 'info', [],
   qr|Depot Path: //local/MyProject/feature/foobar|);

append_file ('B/S/Q/qu', "\nappend CBA on local branch feature/foobar\n");
$svk->commit ('-m', 'commit message on local branch','');

# now should do smerge first, then sw to the branch 
is_output_like ($svk, 'branch', ['--online', '-C'],
    qr|U   B/S/Q/qu|);

is_output_like ($svk, 'branch', ['--online'],
    qr|U   B/S/Q/qu|);

is_output_like ($svk, 'log', [],
    qr|commit message on local branch|);

is_output_like ($svk, 'info', [],
   qr|Depot Path: //mirror/MyProject/branches/feature/foobar|);

# since there's the same branch name exists, just do smerge and switch
is_output_like ($svk, 'info', ['//local/MyProject/feature/foobar'],
   qr|Depot Path: //local/MyProject/feature/foobar|);

$svk->delete ("A/Q/qu");
overwrite_file ("A/Q/qz", "orz\n");
$svk->commit (-m => '- changes in remote');

is_output_like ($svk, 'branch', ['--offline'],
    qr|U   A/Q/qz\nD   A/Q/qu|);

is_output_like ($svk, 'log', [],
    qr|- changes in remote|);

# online with a new branch name

$svk->br('--online', 'release/abc'); # online and rename to the release/abc branch

is_output_like ($svk, 'info', [],
   qr|Depot Path: //mirror/MyProject/branches/release/abc|);

is_output_like ($svk, 'br', [],
   qr|Copied From: feature/foobar@\d+|);

$svk->br('--offline'); # offline the feature/foobar branch

chdir ("C");
is_output ($svk, 'br', [],
    ["Project name: MyProject",
     "Branch: release/abc (offline)",
     "Revision: 22",
     "Repository path: //local/MyProject/release/abc/C",
     'Copied From: feature/foobar@12',
     'Merged From: release/abc@18']);

is_output ($svk, 'br', ['--offline'],
    ["Current branch already offline"]);

is_output ($svk, 'br', [],
    ["Project name: MyProject",
     "Branch: release/abc (offline)",
     "Revision: 22",
     "Repository path: //local/MyProject/release/abc/C",
     'Copied From: feature/foobar@12',
     'Merged From: release/abc@18']);

chdir('..');
$svk->br('--switch','trunk');

is_output_like ($svk, 'info', [],
   qr|Depot Path: //mirror/MyProject/trunk|);

$svk->br('--offline'); # offline the trunk

# w/o bname, will use <pname>-trunk as the local(offline) bname
is_output_like ($svk, 'info', [],
   qr|Depot Path: //local/MyProject/MyProject-trunk|);