The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/bin/bash

##############################################################################
# THIS IS THE PINTO INSTALLER
#
# This bash script will install pinto as a standalone application.
#
# By default, pinto and all of its dependencies will be built into the 
# ~/opt/local/pinto directory.  You can change this location by setting the
# PINTO_HOME environment variable before running this script.
#
# The purpose of a standalone installation is to isolate pinto from whatever
# other Perl modules you may have in your environment.  So if you ever upgrade
# or change those modules, pinto will not be affected.  Nor does installing 
# pinto affect any of the modules your other apps are using.
#
# The most common way to run this installer is like this:
#
#   curl -L http://getpinto.stratopan.com | bash
#
# Or if you prefer to use wget then run this command:
#
#   wget -O - http://getpinto.stratopan.com | bash
#
# After a succesful installation, you'll be instructed on how to amend your
# ~/.profile (or ~/.bashrc, or whatever you prefer) so that pinto runs
# naturally in your everyday shell environment.
#
# All the depndencies for pinto come from a curated repository hosted at
# http://stratopan.com.  That repository contains specific versions of all 
# the modules that pinto needs.  So those may not be the latest versions,
# but they are versions that I know will work (and that's the whole point
# of having a pinto repository anyway).
#
# If this installer doesn't work for you, then you can fallback to installing
# the App::Pinto module from CPAN.  Again, cpanm(1) is really excellent for
# that, but you can use cpan(1) too.  When installing from CPAN, you'll be 
# getting the versions of modules that are in the CPAN index at that moment, 
# which may or may not be 100% compatible with pinto (usually they are, but 
# you never know).
#
# CONFIGURATION
#
# The following environment variables can be used to control the installation:
#
# PINTO_HOME
#
#   Sets the directory where pinto will be installed. 
#   Defaults to $HOME/opt/local/pinto
#
# PINTO_REPO_URL
#
#   Sets the URL of the repository that provides pinto's dependencies
#   Defaults to https://www.stratopan.com/thaljef/OpenSource/pinto-release
#
# PINTO_INSTALLER_AGENT
#
#   Sets the name of the tool that will be used to fetch cpanm.  If set, 
#   it must be either 'curl' or 'wget'.  If not set, the installer will
#   fallback to either 'curl' or 'wget' (in that order) depending on what
#   you already have installed.
#
# PERL_CPANM_OPT
#
#   Sets the default options for cpanm, which is used to install pinto.  This
#   can be useful if you need to specify a certain agent such as lwp, curl,
#   or wget.  See https://metacpan.org/module/cpanm for more details.
#
# Copyright 2013 Jeffrey Ryan Thalhammer <jeff@stratopan.com>
#
##############################################################################

set -ue

#-----------------------------------------------------------------------------
# You can set these variables beforehand to override defaults

PINTO_REPO_URL=${PINTO_REPO_URL:="https://www.stratopan.com/thaljef/OpenSource/pinto-release"}
PINTO_HOME=${PINTO_HOME:="$HOME/opt/local/pinto"}

#-----------------------------------------------------------------------------
# Decide which agent to use.  Set PINTO_INSTALLER_AGENT to override

if  [ -z ${PINTO_INSTALLER_AGENT:-} ]; then

    if type curl > /dev/null 2>&1; then
        PINTO_INSTALLER_AGENT='curl'
    elif type wget > /dev/null 2>&1; then 
        PINTO_INSTALLER_AGENT='wget'
    else
        echo "Must have curl or wget to install pinto"
        exit 1
    fi
fi

#-----------------------------------------------------------------------------
# Bootstrap cpanm

PINTO_CPANM_URL=${PINTO_CPANM_URL:="https://raw.githubusercontent.com/thaljef/Pinto/master/etc/cpanm"}
PINTO_SBIN="$PINTO_HOME/sbin"
PINTO_CPANM_EXE="$PINTO_SBIN/cpanm"

mkdir -p "$PINTO_SBIN"

if   [ $PINTO_INSTALLER_AGENT = 'curl' ]; then
	curl --silent --show-error --location $PINTO_CPANM_URL > "$PINTO_CPANM_EXE"
elif [ $PINTO_INSTALLER_AGENT = 'wget' ]; then 
	wget --no-verbose --output-document - $PINTO_CPANM_URL > "$PINTO_CPANM_EXE"
else
	echo "Invalid PINTO_INSTALLER_AGENT ($PINTO_INSTALLER_AGENT)."
        echo "If set, PINTO_INSTALLER_AGENT must be 'curl' or 'wget'".
        exit 1;
fi

chmod 755 "$PINTO_CPANM_EXE"

#-----------------------------------------------------------------------------
# Do installation

echo "Installing pinto into $PINTO_HOME"

# Workaround for removal of "." from @INC in perl 5.26.0
export PERL_USE_UNSAFE_INC=1

"$PINTO_CPANM_EXE" --notest --quiet --mirror $PINTO_REPO_URL --mirror-only  \
      --local-lib-contained "$PINTO_HOME" --man-pages Pinto

# TODO: send the build log and `perl -V` back for analysis
if [ $? -ne 0 ] ; then echo "Installation failed."; exit 1; fi

#-----------------------------------------------------------------------------
# Remove scripts and man pages that aren't from pinto

(cd "$PINTO_HOME/bin";      ls | grep -iv pinto | xargs rm -f)
(cd "$PINTO_HOME/man/man1"; ls | grep -iv pinto | xargs rm -f)
(cd "$PINTO_HOME/man/man3"; ls | grep -iv pinto | xargs rm -f)

#-----------------------------------------------------------------------------
# Create the etc/ directory

PINTO_ETC="$PINTO_HOME/etc"
mkdir -p "$PINTO_ETC"

#-----------------------------------------------------------------------------
# Write the bash setup file in etc/

PINTO_BASHRC="$PINTO_ETC/bashrc"

cat > "$PINTO_BASHRC" <<END_CONFIG
###        THIS IS A GENERATED FILE -- DO NOT EDIT         ###
export PINTO_HOME="$PINTO_HOME"
export PATH="\$PINTO_HOME/bin:\$PATH"
export MANPATH="\$PINTO_HOME/man:\$MANPATH"

###        PUT YOUR CUSTOMIZATIONS IN \$HOME/.pintorc      ###
if [ -f "\$HOME/.pintorc" ]; then source "\$HOME/.pintorc"; fi
END_CONFIG

#-----------------------------------------------------------------------------
# Display instructions

cat <<END_MSG
pinto has been installed at $PINTO_HOME.  
To activate it, give this command:

  source $PINTO_HOME/etc/bashrc

To make pinto part of your everyday environment, add that 
last command to your ~/.profile or ~/.bashrc file as well.

We want your feedback!  Help us make Pinto better by
writing a review of Pinto at http://cpanratings.perl.org.

Got questions about Pinto?  We have the answers!  Contact
us at team@stratopan.com or on the #pinto channel on IRC.
END_MSG

#-----------------------------------------------------------------------------
# Done

exit 0