#!/usr/bin/perl
use strict;
use warnings;

# Clearly you don't need a program to make one measly symlink, but the git
# describe command involved in generating the VERSION string is a bit fiddly.

use Getopt::Long;
use FindBin;
use Config;

# meant to be run from the root of the gitolite tree, one level above 'src'
BEGIN { $ENV{GL_BINDIR} = $FindBin::RealBin . "/src"; }
BEGIN { $ENV{GL_LIBDIR} = "$ENV{GL_BINDIR}/lib"; }
use lib $ENV{GL_LIBDIR};
use Gitolite::Common;

=for usage
Usage (from gitolite clone directory):

    ./install
        to run gitolite using an absolute or relative path, for example
        'src/gitolite' or '/full/path/to/this/dir/src/gitolite'

    ./install -ln [<dir>]
        to symlink just the gitolite executable to some <dir> that is in
        $PATH.  <dir> defaults to $HOME/bin if <dir> not specified.  <dir> is
        assumed to exist; gitolite will not create it.

        Please provide a full path, not a relative path.

    ./install -to <dir>
        to copy the entire 'src' directory to <dir>.  If <dir> is not in
        $PATH, use the full path to run gitolite commands.

        Please provide a full path, not a relative path.

    <perl-executable> ./install -to <dir>
        to copy the entire 'src' directory to <dir>, but will replace
        all of the shebangs with the path to <perl-executable>.  This
        is a way to force gitolite to use some perl that is not
        installed at /usr/bin/perl.

Simplest use, if $HOME/bin exists and is in $PATH, is:

    git clone https://github.com/sitaramc/gitolite
    gitolite/install -ln

    # now run setup
    gitolite setup -pk /path/to/YourName.pub
=cut

my ( $to, $ln, $help, $quiet );

GetOptions(
    'to=s' => \$to,
    'ln:s' => \$ln,
    'help|h'    => \$help,
    'quiet|q'    => \$quiet,
);
usage() if $to and $ln or $help;
$ln = "$ENV{HOME}/bin" if defined($ln) and not $ln;
for my $d ($ln, $to) {
    next unless $d;    # ignore empty values
    unless ( $d =~ m(^/) ) {
        print STDERR "FATAL: please use an absolute path, not a relative path\n";
        usage();
    }
    if ( not -d $d ) {
        print STDERR "FATAL: '$d' does not exist.\n";
        usage();
    }
}

chdir($ENV{GL_BINDIR});
my $version = `git describe --tags --long --dirty=-dt 2>/dev/null`;
unless ($version =~ /^v\d/) {
    print STDERR "git describe failed; cannot deduce version number\n";
    $version = "(unknown)";
}

if ($to) {
    _mkdir($to);
    system("cp -RpP * $to");
    _print( "$to/VERSION", $version );

    # Replace shebangs if necessary.
    my $thisperl = $Config{perlpath};
    if ($thisperl ne '/usr/bin/perl') {
        system("cd $to; grep -r -l /usr/bin/perl | xargs perl -pi -e 's(^#!/usr/bin/perl)(#!$thisperl)'");
    }
} elsif ($ln) {
    ln_sf( $ENV{GL_BINDIR}, "gitolite", $ln );
    _print( "VERSION", $version );
} else {
    say "use the following full path for gitolite:";
    say "\t$ENV{GL_BINDIR}/gitolite";
    _print( "VERSION", $version );
}
