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 Test::More;
use SVK::Test;
plan tests => 29;
our ($output, $answer);
# build another tree to be mirrored ourself
my ($xd, $svk) = build_test('test');

my $tree = create_basic_tree ($xd, '/test/');

my ($copath, $corpath) = get_copath ('svm');

my ($srepospath, $spath, $srepos) =$xd->find_repos ('/test/A', 1);
my $suuid = $srepos->fs->get_uuid;

$svk->copy ('-m', 'just make some more revisions', '/test/A', "/test/A-$_") for (1..20);

my $uri = uri($srepospath);
is_output ($svk, 'mirror', ['//m', $uri.($spath eq '/' ? '' : $spath)],
	   ['Mirror initialized.  Run svk sync //m to start mirroring.']);

is_output ($svk, 'mirror', [$uri.($spath eq '/' ? '' : $spath), '//m'],
	   ['/m already exists.']);

is_output_like ($svk, 'mirror', [], qr'SYNOPSIS', 'add - help');

is_output ($svk, 'mirror', ['--upgrade'],
	   ['nothing to upgrade']);
is_output ($svk, 'mirror', ['--upgrade', '//m'],
	   ['nothing to upgrade']);

is_output ($svk, 'sync', ['//'],
	   ['// is not a mirrored path.']);
is_output ($svk, 'sync', ['//what'],
	   ['//what is not a mirrored path.']);

is_output ($svk, 'sync', ['/what/'],
	   ["No such depot: what."]);
$svk->sync (-a => '/what/',
	    ["No such depot: what."]);

$svk->sync ('//m');
$svk->copy ('-m', 'branch', '//m', '//l');
$svk->checkout ('//l', $copath);
ok (-e "$corpath/be");
append_file ("$copath/be", "from local branch of svm'ed directory\n");
mkdir "$copath/T/";
append_file ("$copath/T/xd", "local new file\n");

$svk->add ("$copath/T");
$svk->delete ("$copath/Q/qu");

$svk->commit ('-m', 'local modification from branch', "$copath");
$svk->merge (qw/-C -r 4:5/, '-m', 'merge back to remote', '//l', '//m');
$svk->merge (qw/-r 4:5/, '-m', 'merge back to remote', '//l', '//m');
$svk->sync ('//m');

#$svk->merge (qw/-r 5:6/, '//m', $copath);
$svk->switch ('//m', $copath);
$svk->update ($copath);

append_file ("$copath/T/xd", "back to mirror directly\n");
overwrite_file ("$copath/T/foo", "back to mirror directly\n");
$svk->add ("$copath/T/foo");
$svk->status ($copath);

is_output ($svk, 'commit', ['-m', 'commit to mirrored path', $copath],
        ['Commit into mirrored path: merging back directly.',
        "Merging back to mirror source $uri/A.",
        'Merge back committed as revision 24.',
        "Syncing $uri/A",
        'Retrieving log information from 24 to 24',
        'Committed revision 7 from revision 24.']);
mkdir ("$copath/N");
$svk->add ("$copath/N");
is_output ($svk, 'commit', ['-m', 'commit to deep mirrored path', $copath],
        ['Commit into mirrored path: merging back directly.',
        "Merging back to mirror source $uri/A.",
        'Merge back committed as revision 25.',
        "Syncing $uri/A",
        'Retrieving log information from 25 to 25',
        'Committed revision 8 from revision 25.']);
append_file ("$copath/T/xd", "back to mirror directly again\n");
$svk->commit ('-m', 'commit to deep mirrored path', "$copath/T/xd");
ok(1);

$svk->copy ('-m', 'branch in source', '/test/A', '/test/A-98');
$svk->copy ('-m', 'branch in source', '/test/A-98', '/test/A-99');

$svk->mirror ('//m-99', "$uri/A-99");
$svk->copy ('-m', 'make a copy', '//m-99', '//m-99-intermediate');
$svk->move ('-m', 'move the copy', '//m-99-intermediate', '//m-99-copy');

my ($copath2, $corpath2) = get_copath ('svm2');
$svk->checkout ('//m-99-copy', $copath2);
is_output($svk, 'update', ['--sync', '--merge', $copath2], [
        "Syncing $uri/A-99",
        'Retrieving log information from 1 to 28',
        'Committed revision 13 from revision 28.',
        'Auto-merging (10, 13) /m-99 to /m-99-copy (base /m-99:10).',
        'A   Q',
        'A   Q/qz',
        'A   T',
        'A   T/foo',
        'A   T/xd',
        'A   be',
        'A   N',
        "New merge ticket: $suuid:/A-99:28",
        'Committed revision 14.',
        "Syncing //m-99-copy(/m-99-copy) in $corpath2 to 14.",
        __('A   t/checkout/svm2/Q'),
        __('A   t/checkout/svm2/Q/qz'),
        __('A   t/checkout/svm2/T'),
        __('A   t/checkout/svm2/T/foo'),
        __('A   t/checkout/svm2/T/xd'),
        __('A   t/checkout/svm2/be'),
        __('A   t/checkout/svm2/N'), ]);

is_output($svk, 'smerge', ['-m', '', '--from', $copath2], [
        "Auto-merging (0, 14) /m-99-copy to /m-99 (base /m-99:13).",
        "Merging back to mirror source $uri/A-99.",
        "Empty merge.",
        ]);

my ($copath3, $corpath3) = get_copath ('svm3');
$svk->checkout ('//m-99', $copath3);
append_file ("$copath3/T/xd", "modify something\n");
$svk->commit ('-m', 'local modification from mirrored path', "$copath3");
append_file ("$copath3/T/xd", "modify something again\n");
$svk->commit ('-m', 'local modification from mirrored path', "$copath3");

is_output($svk, 'update', ['--sync', '--merge', '--incremental', "$copath2/T"], [
        "Syncing $uri/A-99",
        'Auto-merging (13, 16) /m-99 to /m-99-copy (base /m-99:13).',
        '===> Auto-merging (13, 15) /m-99 to /m-99-copy (base /m-99:13).',
        'U   T/xd',
        "New merge ticket: $suuid:/A-99:29",
        'Committed revision 17.',
        '===> Auto-merging (15, 16) /m-99 to /m-99-copy (base /m-99:15).',
        'U   T/xd',
        "New merge ticket: $suuid:/A-99:30",
        'Committed revision 18.',
        "Syncing //m-99-copy/T(/m-99-copy/T) in ".__("$corpath2/T to 18."),
        __("U   $copath2/T/xd"),
        ]);


is_output_like ($svk, 'mirror', ['--list'],
            qr"//m.*$uri/A\n//m-99.*$uri/A-99");

is_output_like ($svk, 'mirror', ['//m-99', "$uri/A-99"],
            qr"already", 'repeated mirror failed');

is_output_like ($svk, 'mirror', ['--detach', '//l'],
            qr"not a mirrored", '--detach on non-mirrored path');

is_output_like ($svk, 'mirror', ['--detach', '//m/T'],
            qr"inside", '--detach inside a mirrored path');

is_output ($svk, 'mirror', ['--detach', '//m'], [
            "Mirror path '//m' detached.",
            ], '--detach on mirrored path');

is_output_like ($svk, 'mirror', ['--detach', '//m'],
            qr"not a mirrored", '--detach on non-mirrored path');

is_output ($svk, 'mirror', ['//m', $uri.($spath eq '/' ? '' : $spath)],
	   ['/m already exists.']);

$svk->copy ('-m', 'make a copy', '//m-99-copy', '//m-99-copy-twice');

my ($copath4, $corpath4) = get_copath ('svm4');
$svk->checkout ('//m-99-copy-twice', $copath4);
is_output($svk, 'update', ['--sync', '--merge', $copath4], [
        "Syncing $uri/A-99",
        'Auto-merging (16, 16) /m-99 to /m-99-copy-twice (base /m-99:16).',
        "Empty merge.",
        "Syncing //m-99-copy-twice(/m-99-copy-twice) in $corpath4 to 20.",
        ]);

is_output($svk, 'smerge', ['-m', '', '--sync', '--from', $copath4], [
        "Auto-merging (0, 20) /m-99-copy-twice to /m-99 (base /m-99:16).",
        "Merging back to mirror source $uri/A-99.",
        "Empty merge.",
        ]);

is_output ($svk, 'delete', ['-m', 'die!', '//m-99'],
        ['Committed revision 22.']);
SKIP:{
skip 'recover not implemented.', 4;

$answer = 'y';
is_output ($svk, 'mirror', ['--recover', '//m'],
	   ['Analyzing revision 19...',
            '----------------------------------------------------------------------',
            'SVM: discard mirror for /m',
            'Analyzing revision 9...',
            '----------------------------------------------------------------------',
            'commit to deep mirrored path',
            'Committed revision 23.',
            'Committed revision 24.',
            "Property 'svm:headrev' set on repository revision 24.",
            "Property 'svn:author' set on repository revision 24.",
            "Property 'svn:date' set on repository revision 24.",
            "Property 'svn:log' set on repository revision 24.",
            'Mirror state successfully recovered.',
            'Committed revision 25.',
            '//m added back to the list of mirrored paths.',
           ]);

is_output ($svk, 'mirror', ['--recover', '//m'],
	   ['Analyzing revision 24...',
            '----------------------------------------------------------------------',
            'commit to deep mirrored path',
            'No need to revert; it is already the head revision.',
           ]);
$svk->mv (-m => 'move on mirror', '//m/Q' => '//m/Q-moved');
is_ancestor ($svk, '//m/Q-moved', '/m/Q', 6);

is_output ($svk, 'ps', ['foo' => 'bar', -m => 'ps on mirror', '//m/Q-moved'],
	   ["Merging back to mirror source $uri/A.",
	    'Merge back committed as revision 32.',
	    "Syncing $uri/A",
	    'Retrieving log information from 32 to 32',
	    'Committed revision 27 from revision 32.']);

}