#!/usr/bin/perl -w
use strict;
use Test::More tests => 25;
use SVK::Test;
our ($answer, $output);
my ($xd, $svk) = build_test();
my ($copath, $corpath) = get_copath ('smerge-external');
$answer = 's'; # skip
$svk->mkdir ('-m', 'the trunk', '//trunk');
$svk->co ('//trunk', $copath);
overwrite_file ("$copath/test.pl", "#!/usr/bin/perl -w\nsub { 'this is sub' }\n#common\n#common2\n\n\n");
$svk->add ("$copath/test.pl");
$svk->ps ("svn:eol-style", "native", "$copath/test.pl");
$svk->commit ('-m', 'test.pl', $copath);
$svk->cp ('-m', 'local branch of trunk', '//trunk', '//local');
overwrite_file ("$copath/test.pl", "#!/usr/bin/perl -T -w\nsub { 'this is sub on local' }\n#common\n\nsub newsub { undef }\n#common2\n\n\n");
$svk->commit ('-m', 'change on trunk', $copath);
$svk->switch ('//local', $copath);
overwrite_file ("$copath/test.pl", "#!/usr/bin/perl -w\nsub { 'this is sub on trunk' }\n#common\n\nsub newsub { undef }\n#common2\n\n\n#trunk\ntrunk additions (do not kill!)\n");
$svk->commit ('-m', 'change on local', $copath);
is_output_like ($svk, 'sm', ['-C', '//trunk', '//local'],
qr|1 conflict found.|);
$ENV{SVKRESOLVE} = '';
$answer = 't'; # yours
$svk->sm ('//trunk', $copath);
is_output ($svk, 'diff', ["$copath/test.pl"],
[__"=== $copath/test.pl",
"==================================================================",
__"--- $copath/test.pl\t(revision 5)",
__"+++ $copath/test.pl\t(local)",
__('@@ -1,5 +1,5 @@'),
"-#!/usr/bin/perl -w",
"-sub { 'this is sub on trunk' }",
"+#!/usr/bin/perl -T -w",
"+sub { 'this is sub on local' }",
" #common",
" ",
" sub newsub { undef }",
], 'svk-merge mine');
$answer = 't'; # theirs
$svk->sm ('-m', 'merge from trunk to local', '//trunk', '//local');
is_output ($svk, 'diff', ["//trunk/test.pl", "//local/test.pl"],
[__"=== test.pl",
"==================================================================",
"--- test.pl\t(/trunk/test.pl)\t(revision 6)",
"+++ test.pl\t(/local/test.pl)\t(revision 6)",
__('@@ -6,3 +6,5 @@'),
" #common2",
" ",
" ",
"+#trunk",
"+trunk additions (do not kill!)",
], 'svk-merge mine');
is_output ($svk, 'up', ["$copath"],
["Syncing //local(/local) in $corpath to 6.",
__"g $copath/test.pl"], 'svk-merge theirs');
overwrite_file ("$copath/test.pl", "#!/usr/bin/perl -T -w\nsub { 'this is sub on trunk' }\n#local\n#common\n\nsub newsub { undef }\n");
$svk->commit ('-m', 'change on local', $copath);
$svk->switch ('//trunk', $copath);
overwrite_file ("$copath/test.pl", "#!/usr/bin/perl -T -w\nsub { 'this is sub on trunk' }\n#common\n\nsub newsub { undef }\n#trunk\n");
$svk->commit ('-m', 'change on trunk', $copath);
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'],
qr|G test\.pl|);
overwrite_file ("$copath/test.pl", "trunk!\n");
$svk->commit ('-m', 'change on trunk', $copath);
$svk->switch ('//local', $copath);
$svk->up($copath);
overwrite_file ("$copath/test.pl", "local!\n");
$svk->commit ('-m', 'change on local', $copath);
is_output_like ($svk, 'sm', ['-C', '//trunk', '//local'],
qr|1 conflict found.|);
# $SVKRESOLVE trumps $answer
$ENV{SVKRESOLVE} = 's'; # skip
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'],
qr|C test\.pl|);
$answer = 's'; # skip
$ENV{SVKRESOLVE} = 'd'; # diff
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'], qr|
\+>>>> YOUR VERSION test\.pl \(/local\) (\d+)\r?
.*\r?
\+==== ORIGINAL VERSION test\.pl \1\r?
\+.*\r?
\+==== THEIR VERSION test\.pl \(/trunk\) \1\r?
\+.*!\r?
\+<<<< \1\r?
|s);
$ENV{SVKRESOLVE} = 'dm'; # diff merged
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'], qr|
\+>>>> YOUR VERSION test.pl \(/local\) (\d+)\r?
\+.*\r?
\+==== ORIGINAL VERSION test.pl \1\r?
.*\r?
\+==== THEIR VERSION test.pl \(/trunk\) \1\r?
\+.*\r?
\+<<<< \1\r?
|s);
$ENV{SVKRESOLVE} = 'dy'; # diff yours
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'], qr|
-#!/usr/bin/perl -T -w\r?
-sub { 'this is sub on trunk' }\r?
-#common\r?
-\r?
-sub newsub { undef }\r?
-#trunk\r?
\+local!\r?
|s);
$ENV{SVKRESOLVE} = 'dt'; # diff theirs
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'], qr|
-#!/usr/bin/perl -T -w\r?
-sub { 'this is sub on trunk' }\r?
-#common\r?
-\r?
-sub newsub { undef }\r?
-#trunk\r?
\+trunk!\r?
|s);
$ENV{SVKRESOLVE} = 'h'; # help
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'],
qr|NAME.*DESCRIPTION|s);
$ENV{SVKRESOLVE} = 'e'; # edit
$answer = 'a'; # accept
set_editor(<< "TMP");
\$_ = shift;
open _, ">\$_" or die \$!;
print _ "edited\\n";
TMP
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'],
qr|G test\.pl|);
$svk->up($copath);
is_file_content ("$copath/test.pl", "edited\n");
$svk->switch ('//trunk', $copath);
overwrite_file ("$copath/test.pl", "trunk 2!\n");
$svk->commit ('-m', 'change on trunk', $copath);
$svk->switch ('//local', $copath);
overwrite_file ("$copath/test.pl", "local 2!\n");
$svk->commit ('-m', 'change on local', $copath);
is_output_like ($svk, 'sm', ['-C', '//trunk', '//local'],
qr|1 conflict found.|);
set_editor(<< "TMP");
\$_ = \$ARGV[6];
open _, ">\$_" or die \$!;
print _ "merged\\n";
TMP
$ENV{SVKMERGE} = $ENV{SVN_EDITOR};
$ENV{SVKRESOLVE} = 'm'; # merge
$answer = 'a'; # accept
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'],
qr|G test\.pl|);
$svk->up($copath);
is_file_content ("$copath/test.pl", "merged\n");
# merge deleted files interactive
$svk->switch ('//trunk', $copath);
$svk->up($copath);
overwrite_file ("$copath/foo", "trunk\n");
$svk->add ("$copath/foo");
$svk->commit ('-m', 'foo', $copath);
$svk->sm ('-m', 'merge from trunk to local', '//trunk', '//local');
$svk->delete ('-m', 'delete foo in trunk', '//trunk/foo');
$svk->switch ('//local', $copath);
$svk->up($copath);
overwrite_file ("$copath/foo", "local\n");
$svk->commit ('-m', 'change on local', $copath);
$ENV{SVKRESOLVE} = 't'; # thiers
is_output ($svk, 'sm', ['-C', '//trunk', '//local'],
['Auto-merging (16, 18) /trunk to /local (base /trunk:16).',
'C foo',
qr'New merge ticket:',
'Empty merge.',
'1 conflict found.']);
is_output ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'],
['Auto-merging (16, 18) /trunk to /local (base /trunk:16).',
'D foo',
qr'New merge ticket:',
'Committed revision 20.']);
$svk->switch ('//trunk', $copath);
$svk->up($copath);
overwrite_file ("$copath/foo", "trunk\n");
$svk->add ("$copath/foo");
$svk->commit ('-m', 'foo', $copath);
$svk->sm ('-m', 'merge from trunk to local', '//trunk', '//local');
$svk->delete ('-m', 'delete foo in trunk', '//trunk/foo');
$svk->switch ('//local', $copath);
$svk->up($copath);
overwrite_file ("$copath/foo", "local\n");
$svk->commit ('-m', 'change on local', $copath);
$ENV{SVKRESOLVE} = 'y'; # thiers
is_output_like ($svk, 'sm', ['-C', '//trunk', '//local'],
qr|1 conflict found.|);
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'],
qr|G foo|);
is_file_content ("$copath/foo", "local\n");
$svk->delete ('-m', 'delete foo in local(cleanup)', '//local/foo');
$svk->switch ('//trunk', $copath);
$svk->up($copath);
overwrite_file ("$copath/foo", "trunk\n");
$svk->add ("$copath/foo");
$svk->commit ('-m', 'foo', $copath);
$svk->sm ('-m', 'merge from trunk to local', '//trunk', '//local');
$svk->delete ('-m', 'delete foo in trunk', '//trunk/foo');
$svk->switch ('//local', $copath);
$svk->up($copath);
overwrite_file ("$copath/foo", "local\n");
$svk->commit ('-m', 'change on local', $copath);
$ENV{SVKRESOLVE} = 'e'; # thiers
$answer = 'a';
set_editor(<< "TMP");
\$_ = shift;
open _, ">\$_" or die \$!;
print _ "merged\\n";
TMP
is_output_like ($svk, 'sm', ['-C', '//trunk', '//local'],
qr|1 conflict found.|);
is_output_like ($svk, 'sm', ['-m', 'merge to local again', '//trunk', '//local'],
qr|G foo|);
$svk->up($copath);
is_file_content ("$copath/foo", "merged\n");
$svk->delete ('-m', 'delete foo in local(cleanup)', '//local/foo');