#!/usr/bin/perl

use strict;
use Test::More tests => 8;
use File::Path;
use File::Spec;

BEGIN {
require_ok 'SVN::Core';
require_ok 'SVN::Repos';
require_ok 'SVN::Fs';
require_ok 'SVN::Simple::Edit';
}

local $/;

my $repospath = "t/repos";
rmtree ([$repospath]) if -d $repospath;

$ENV{SVNFSTYPE} ||= (($SVN::Core::VERSION =~ /^1\.0/) ? 'bdb' : 'fsfs');

my $repos = SVN::Repos::create($repospath, undef, undef, undef,
			       {'fs-type' => $ENV{SVNFSTYPE}})
    or die "failed to create repository at $repospath";

my $uri = File::Spec->rel2abs( $repospath ) ;
$uri =~ s{^|\\}{/}g if ($^O eq 'MSWin32');
$uri = "file://$uri";

ok($repos);

my $fs = $repos->fs;

sub committed {
    diag "committed ".join(',',@_);
}

my $edit;

sub new_edit {
    my ($check) = @_;
    my $base = $fs->youngest_rev;
    $edit = SVN::Simple::Edit->
	new(_editor => [SVN::Repos::get_commit_editor
			($repos, $uri,
			 '/', 'root', 'FOO', \&committed)],
	    pool => SVN::Pool->new,
	    missing_handler => ($check ?
	    (&SVN::Simple::Edit::check_missing ($fs->revision_root ($base))) :
	    sub {
		my ($edit, $path) = @_;
		diag "build missing directory for $path";
		$edit->add_directory ($path);
	    }));
    $edit->open_root ($base);
    return $edit;
}

$edit = new_edit;

$edit->add_file ('trunk/deep/more/gfilea');
$edit->add_file ('trunk/deep2/more/gfileb');

$edit->add_file ('filea');

my $text = "FILEA CONTENT";
$edit->modify_file ('filea', $text);


$edit->add_file ('fileb');
open my ($fh), $0;
$edit->modify_file ('fileb', $fh);

$edit->close_edit();

cmp_ok($fs->youngest_rev, '==', 1);

my $filea = SVN::Fs::file_contents($fs->revision_root (1), 'filea');
is(<$filea>, $text, "content from string verified");
my $fileb = SVN::Fs::file_contents($fs->revision_root (1), 'fileb');
seek $fh, 0, 0;
is(<$fileb>, <$fh>, "content from stream verified");

$edit = new_edit;

$edit->modify_file($edit->open_file ('fileb'), 'foo');

$edit->close_edit;

$edit = new_edit(1);

#$edit->open_directory ('trunk');
#$edit->open_directory ('trunk/deep');
$edit->delete_entry ('trunk/deep/more');

$edit->close_edit;

$edit = new_edit;

$edit->open_directory ('trunk');
$edit->open_directory ('trunk/deep');
$edit->delete_entry ('trunk/deep/more');

$edit->close_edit;


syntax highlighted by Code2HTML, v. 0.9.1