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;
eval { require SVN::Mirror; 1 } or plan skip_all => 'require SVN::Mirror';
plan tests => 26;

use Cwd;
use File::Path;

my ($xd, $svk) = build_test('test');
my ($copath, $corpath) = get_copath ('import');
my ($repospath, undef, $repos) = $xd->find_repos ('//', 1);

sub copath { SVK::Path::Checkout->copath($copath, @_) }

is_output_like ($svk, 'import', [], qr'SYNOPSIS', 'import - help');
is_output_like ($svk, 'import', ['foo','bar','baz'], qr'SYNOPSIS', 'import - help');

mkdir $copath;
overwrite_file ("$copath/filea", "foobarbazz");
overwrite_file ("$copath/fileb", "foobarbazz");
overwrite_file ("$copath/filec", "foobarbazz");
overwrite_file ("$copath/exe", "foobarbazz");
overwrite_file ("$copath/filea~","foobarbazz"); # Test for import honoring global ignores
mkdir "$copath/.DS_Store"; # Test for import honoring global ignores for directories
overwrite_file ("$copath/.DS_Store/ignored","foobarbazz"); # Test for import pruning trees on directories in global ignores

chmod (0755, "$copath/exe");
mkdir "$copath/dir";
overwrite_file ("$copath/dir/filed", "foobarbazz");

is_output ($svk, 'import', ['-Cm', 'test import', $copath, '//import'],
	   ['Import path //import will be created.',
	    "Directory $corpath will be imported to depotpath //import."]);
is_output ($svk, 'import', ['-m', 'test import', $copath, '//import'],
	   ['Committed revision 1.',
	    'Import path //import initialized.',
	    'Committed revision 2.',
	    "Directory $corpath imported to depotpath //import as revision 2."]);

is_output_like ($svk, 'status', [$copath], qr'not a checkout path');

overwrite_file ("$copath/filea", "foobarbazzblah");
overwrite_file ("$copath/dir/filed", "foobarbazzbozo");

unlink "$copath/fileb";

$svk->import ('-m', 'test import', '//import', $copath);
is_output ($svk, 'import', ['-m', 'test import into file', '//import/filec', $copath], 
	   [qr'^import destination cannot be a file at ']);

unlink "$copath/filec";
$svk->import ('-t', '-m', 'import -t', '//import', $copath);
ok($xd->{modified}, 'will update svk config');
is_output ($svk, 'status', [$copath], []);
rmtree [$copath];
$svk->checkout ('//import', $copath);

ok (-e copath ('filea'));
ok (!-e copath ('fileb'));
ok (!-e copath ('filec'));
ok (-e copath ('dir/filed'));
ok (_x(copath ('exe')), 'executable bit imported');
ok (!-e copath ('filea~'));
ok (!-e copath ('.DS_Store'));
ok (!-e copath ('.DS_Store/ignored'));
unlink (copath ('exe'));

my $oldwd = getcwd;
chdir ($copath);

is_output ($svk, 'import', ['//import'], ["Import source ($corpath) is a checkout path; use --from-checkout."]);

$svk->import ('-f', '-m', 'import -f', '//import');
is_output ($svk, 'status', [], []);

chdir ($oldwd);

rmtree ["$copath/dir"];

overwrite_file ("$copath/dir", "now file\n");
$svk->import ('-C', '-f', '//import', $copath);
$svk->import ('-f', '-m', 'import -f', '//import', $copath);

rmtree [$copath];
$svk->checkout ('//import', $copath);
ok (-f copath ('dir'));

my ($srepospath, $spath, $srepos) = $xd->find_repos ('/test/A', 1);
$svk->mkdir ('-m', 'init', '/test/A');
SKIP: {
skip 'SVN::Mirror not installed', 7 unless HAS_SVN_MIRROR;
my $uri = uri($srepospath.($spath eq '/' ? '' : $spath));
$svk->mirror ('//m', $uri);
$svk->sync ('//m');
is_output ($svk, 'import', ['--from-checkout', '-m', 'import into mirrored path', '//m', $copath],
	   ["Import path (/m) is different from the copath (/import)"]);
rmtree [$copath];
$svk->checkout ('//m', $copath);
overwrite_file ("$copath/filea", "foobarbazz");
waste_rev ($svk, '/test/F') for 1..10;
$svk->import ('--from-checkout', '-m', 'import into mirrored path', '//m', $copath);

is ($srepos->fs->youngest_rev, 22, 'import to remote directly');

append_file ("$copath/filea", "fnord");

$svk->import ('--from-checkout', '-m', 'import into mirrored path', '//m', $copath);

is ($srepos->fs->youngest_rev, 23, 'import to remote directly with proper base rev');

$svk->import ('--from-checkout', '-m', 'import into mirrored path', $copath, '//m');

is ($srepos->fs->youngest_rev, 24, 'import to remote directly with proper base rev');

$svk->checkout ('--detach', $copath);

is_output ($svk, 'import', ['-m', 'import into mirrored path from noncheckout', '//m/hate', $copath],
	   ["Merging back to mirror source $uri.",
	    'Merge back committed as revision 25.',
	    "Syncing $uri",
	    "Retrieving log information from 24 to 25",
	    "Committed revision 11 from revision 25.",
	    "Import path //m/hate initialized.",
	    "Merging back to mirror source $uri.",
	    "Merge back committed as revision 26.",
	    "Syncing $uri",
	    "Retrieving log information from 26 to 26",
	    "Committed revision 12 from revision 26.",
	    "Directory $corpath imported to depotpath //m/hate as revision 12."]);
our $answer = ['//m/hate'];
$svk->import (-m => 'via prompt', $copath);
is ($srepos->fs->youngest_rev, 27);

rmtree [$copath];
is_output ($svk, 'import', ['-m', 'bad copath', '//m/more', $copath],
	   [__"Path $corpath does not exist."]);

}