#!/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.']);