
use lib 'lib';
use Search::Elasticsearch;
use Capture::Tiny qw(capture_merged tee_merged);

my $es = Search::Elasticsearch->new;
my $base_url
    = "https://download.elasticsearch.org/elasticsearch/elasticsearch";

my @startup_opts = qw(
    -Des.network.host=localhost
    -Des.discovery.zen.ping.multicast.enabled=false
    -Des.discovery.zen.ping_timeout=1
    -Des.node.bench=true
    -Des.script.disable_dynamic=false
);

sub run(@);

if ( my $version = $ENV{ES_VERSION} ) {
    eval { run qw(killall java) };

    mkdir('servers');
    chdir 'servers' or die $!;
    my $es_dir = "elasticsearch-${version}";

    # Download ES version
    unless ( -d $es_dir ) {
        print "Downloading Elasticsearch v$version\n";
        run 'curl', '-O', "$base_url/$es_dir.zip";
        run 'unzip', "$es_dir.zip";
    }

    # Start ES
    print "Starting Elasticsearch v$version\n";
    if ( $version =~ /^0/ ) {
        run "$es_dir/bin/elasticsearch", @startup_opts;
    }
    else {
        run "$es_dir/bin/elasticsearch", "-d", @startup_opts;
    }
    chdir "..";

    # Wait for it to start
    local $| = 1;
    for ( 1 .. 20 ) {
        eval { $es->ping } and last;
        print ".";
        sleep 1;
    }
    print "\n";
}
else {
    print "No ES_VERSION provided. Using running instance\n";
}

chdir 'elasticsearch' or die $!;
run qw(git fetch);

print "Retrieving Elasticsearch version\n";

my $info    = $es->info;
my $version = $info->{version}{number};

# For 0.90.* versions, use the most recent commit of 0.90
if ( $version =~ /^0.90/ ) {
    print "Checking out 0.90\n";
    run qw(git checkout -B 0.90 origin/0.90);
    exit;
}

# Check out the build hash
my $hash = $info->{version}{build_hash};
unless ( length($hash) == 40 ) {
    print "Unknown build hash: $hash\n";
    print "Using latest master";
    run qw(git checkout -B master origin/master);
    exit;
}

print "Checkout out commit: $hash\n";
run qw(git checkout -B temp ), $hash;
exit;

#===================================
sub run (@) {
#===================================
    my @args = @_;
    my ( $out, $ok ) = capture_merged { system(@args) == 0 };

    die "Error executing: @args\n$out"
        unless $ok;

    return $out;
}

