The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use Test::More tests => 25;
use strict;
use File::Path;
use Cwd;
use SVK::Test;

my ($xd, $svk) = build_test();
our $output;
our ($copath, $corpath) = get_copath ('smerge-delete');
$svk->mkdir ('-m', 'trunk', '//trunk');
$svk->checkout ('//trunk', $copath);
my ($repospath, undef, $repos) = $xd->find_repos ('//', 1);
my $uuid = $repos->fs->get_uuid;

mkdir "$copath/A";
mkdir "$copath/A/deep";
mkdir "$copath/A/deep/stay";
mkdir "$copath/A/deep/deeper";
mkdir "$copath/B";
overwrite_file ("$copath/A/foo", "foobar\n");
overwrite_file ("$copath/A/deep/foo", "foobar\n");
overwrite_file ("$copath/A/bar", "foobar\n");
overwrite_file ("$copath/A/normal", "foobar\n");
overwrite_file ("$copath/test.pl", "foobarbazzz\n");
$svk->add ("$copath/test.pl", "$copath/A", "$copath/B");
$svk->commit ('-m', 'init', "$copath");

$svk->cp ('-m', 'branch', '//trunk', '//local');

$svk->rm ('-m', 'rm A on trunk', '//trunk/A');
$svk->rm ('-m', 'rm B on trunk', '//trunk/B');
append_file ("$copath/A/foo", "modified\n");
overwrite_file ("$copath/A/unused", "foobar\n");
my $oldwd = getcwd;
chdir ($copath);
is_output ($svk, 'up', [],
	   ["Syncing //trunk(/trunk) in $corpath to 5.",
	    __('C   A'),
	    __('D   A/bar'),
	    __('D   A/deep'),
	    __('C   A/foo'),
	    __('D   A/normal'),
	    __('C   A/unused'),
	    __('D   B'),
	    '3 conflicts found.'
	   ], 'delete entry but modified on checkout');
chdir ($oldwd);
ok (-e "$copath/A/foo", 'local file not deleted');
ok (-e "$copath/A/unused", 'unversioned file not deleted');
ok (!-e "$copath/A/bar", 'delete merged');
ok (!-e "$copath/B/foo", 'unmodified dir deleted');
$svk->resolved ('-R', "$copath/A");
rmtree (["$copath/A"]);
$svk->switch ('//local', $copath);
append_file ("$copath/A/foo", "modified\n");
overwrite_file ("$copath/A/unused", "foobar\n");
is_output ($svk, 'smerge', ['//trunk', $copath],
	   ['Auto-merging (2, 5) /trunk to /local (base /trunk:2).',
	    __"C   $copath/A",
	    __"D   $copath/A/bar",
	    __"D   $copath/A/deep",
	    __"C   $copath/A/foo",
	    __"D   $copath/A/normal",
	    __"C   $copath/A/unused",
	    __"D   $copath/B",
	    "New merge ticket: $uuid:/trunk:5",
	    '3 conflicts found.'
	   ]);
is_output ($svk, 'st', [$copath],
	   [
	    __"C   $copath/A/foo",
	    __"C   $copath/A/unused",
	    __"D   $copath/A/bar",
	    __"D   $copath/A/deep",
	    __"D   $copath/A/deep/deeper",
	    __"D   $copath/A/deep/foo",
	    __"D   $copath/A/deep/stay",
	    __"D   $copath/A/normal",
	    __"C   $copath/A",
	    __"D   $copath/B",
	    __" M  $copath",
	   ]);

ok (-e "$copath/A/unused", 'unversioned file not deleted');
ok (-e "$copath/A/foo", 'local file not deleted');
ok (!-e "$copath/B/foo", 'unmodified dir deleted');
$svk->revert ('-R', $copath);
is_output ($svk, 'st', [$copath],
	   [__"?   $copath/A/unused"]);
append_file ("$copath/A/foo", "modified\n");
overwrite_file ("$copath/A/unused", "foobar\n");
$svk->add ("$copath/A/unused");
$svk->rm ("$copath/A/bar");
$svk->rm ("$copath/A/deep/deeper");
is_output ($svk, 'commit', ['-m', 'local modification', $copath],
	   ['Committed revision 6.']);
is_output ($svk, 'smerge', ['-C', '//trunk', '//local'],
	   ['Auto-merging (2, 5) /trunk to /local (base /trunk:2).',
	    'C   A',
	    'D   A/bar',
	    'D   A/deep',
	    'C   A/foo',
	    'D   A/normal',
	    'C   A/unused',
	    'D   B',
	    "New merge ticket: $uuid:/trunk:5",
	    'Empty merge.',
	    '3 conflicts found.']);

is_output ($svk, 'smerge', ['//trunk', $copath],
	   ['Auto-merging (2, 5) /trunk to /local (base /trunk:2).',
	    __"C   $copath/A",
	    __"D   $copath/A/bar",
	    __"D   $copath/A/deep",
	    __"C   $copath/A/foo",
	    __"D   $copath/A/normal",
	    __"C   $copath/A/unused",
	    __"D   $copath/B",
	    "New merge ticket: $uuid:/trunk:5",
	    '3 conflicts found.']);

is_output ($svk, 'status', [$copath],
	   [__"D   $copath/A/deep",
	    __"D   $copath/A/deep/foo",
	    __"D   $copath/A/deep/stay",
	    __"C   $copath/A/foo",
	    __"D   $copath/A/normal",
	    __"C   $copath/A/unused",
	    __"C   $copath/A",
	    __"D   $copath/B",
	    __" M  $copath"], 'merge partial deletes to checkout');

$svk->revert ('-R', $copath);
$svk->resolved ('-R', $copath);

overwrite_file ("$copath/A/deep/foo", "bah foobar\n");
$svk->commit ('-m', 'local modification', $copath);

is_output ($svk, 'smerge', ['-C', '//trunk', '//local'],
	   ['Auto-merging (2, 5) /trunk to /local (base /trunk:2).',
	    'C   A',
	    'D   A/bar',
	    'C   A/deep',
	    'D   A/deep/deeper',
	    'C   A/deep/foo',
	    'D   A/deep/stay',
	    'C   A/foo',
	    'D   A/normal',
	    'C   A/unused',
	    'D   B',
	    "New merge ticket: $uuid:/trunk:5",
	    'Empty merge.',
	    '5 conflicts found.']);

is_output ($svk, 'smerge', ['//trunk', $copath],
	   ['Auto-merging (2, 5) /trunk to /local (base /trunk:2).',
	    __"C   $copath/A",
	    __"D   $copath/A/bar",
	    __"C   $copath/A/deep",
	    __"D   $copath/A/deep/deeper",
	    __"C   $copath/A/deep/foo",
	    __"D   $copath/A/deep/stay",
	    __"C   $copath/A/foo",
	    __"D   $copath/A/normal",
	    __"C   $copath/A/unused",
	    __"D   $copath/B",
	    "New merge ticket: $uuid:/trunk:5",
	    '5 conflicts found.']);

is_output ($svk, 'status', [$copath],
	   [__"C   $copath/A/deep/foo",
	    __"D   $copath/A/deep/stay",
	    __"C   $copath/A/deep",
	    __"C   $copath/A/foo",
	    __"D   $copath/A/normal",
	    __"C   $copath/A/unused",
	    __"C   $copath/A",
	    __"D   $copath/B",
	    __" M  $copath"], 'merge partial deletes to checkout');

$svk->resolved ('-R', $copath);
$svk->commit ('-m', 'merged', $copath);

$svk->rm ('-m', 'kill test.pl', '//trunk/test.pl');

is_output ($svk, 'smerge', ['//trunk', $copath],
	   ['Auto-merging (5, 9) /trunk to /local (base /trunk:5).',
	    __"D   $copath/test.pl",
	    "New merge ticket: $uuid:/trunk:9"]);
is_output ($svk, 'status', [$copath],
	   [__"D   $copath/test.pl",
	    __" M  $copath"]);

$svk->revert ('-R', $copath);
overwrite_file ("$copath/test.pl", "modified\n");
is_output ($svk, 'smerge', ['//trunk', $copath],
	   ['Auto-merging (5, 9) /trunk to /local (base /trunk:5).',
	    __"C   $copath/test.pl",
	    "New merge ticket: $uuid:/trunk:9",
	    '1 conflict found.']);
$svk->revert ('-R', $copath);

$svk->mkdir ('-m', 'new dir C on trunk', '//trunk/C');
is_output ($svk, 'smerge', ['-m', 'merge down clean', '//trunk', '//local'],
	   ['Auto-merging (5, 10) /trunk to /local (base /trunk:5).',
	    "A   C",
	    "D   test.pl",
	    "New merge ticket: $uuid:/trunk:10",
	    'Committed revision 11.']);

$svk->update ($copath);

my $unversioned = "$copath/C/unversioned.txt";
overwrite_file ($unversioned, "I am here\n");

$svk->rm ('-m', 'rm C on trunk', '//trunk/C');

is_output ($svk, 'smerge', ['//trunk', $copath],
	   ['Auto-merging (10, 12) /trunk to /local (base /trunk:10).',
	    status_native ($copath,
			   'C  ', "C",
			   'C  ', "C/unversioned.txt"),
	    "New merge ticket: $uuid:/trunk:12",
	    '2 conflicts found.']);

ok (-e $unversioned, 'unversioned file not deleted');

$svk->revert(-R => $copath);
$svk->switch('//local', $copath);

$svk->rm("$copath/A/foo");
$svk->mkdir("$copath/A/foo");

$svk->rm(-m => 'hate', '//local/A/foo');

is_output($svk, 'up', [$copath],
	  ['Syncing //local(/local) in '.__($corpath).' to 13.',
	   __("C   $copath/A/foo"),
	   '1 conflict found.']);