#!/bin/bash

if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then
    set -x
fi
set -eu
set -o pipefail

if [[ $DISTRO_NAME =~ (opensuse|fedora|centos|centos7|rhel7) ]]; then

    _do_py3=0
    packages="python-virtualenv python-pip python-setuptools"
    if [[ $DISTRO_NAME =~ (fedora) ]]; then
        _do_py3=1
        packages+=" python3-virtualenv python3-pip python3-setuptools"
    fi

    # force things to happen so our assumptions hold
    pip_args="-U --force-reinstall"

    # GENERAL WARNING : mixing packaged python libraries with
    # pip-installed versions always creates issues.  Upstream
    # openstack-infra uses this a lot (especially devstack) but be
    # warned: here be dragons :)

    # Firstly we want to install the system packages.  Otherwise later
    # on somebody does a "yum install python-virtualenv" and goes and
    # overwrites the pip installed version with the packaged version,
    # leading to all sorts of weird version issues.
    if [[ $DISTRO_NAME = opensuse ]]; then
        zypper -n install $packages
    else
        ${YUM:-yum} install -y $packages
    fi

    # install the latest python2 pip; this overwrites packaged pip
    python /tmp/get-pip.py ${pip_args}

    # pip and setuptools are closely related; we want to ensure the
    # latest for sanity.  Because distro packages don't include enough
    # info in the egg for pip to be certain it has fully uninstalled
    # the old package, for safety we clear it out by hand (this seems
    # to have been a problem with very old to new updates,
    # e.g. centos6 to current-era, but less so for smaller jumps).
    # There is a bit of chicken-and-egg problem with pip in that it
    # requires setuptools for some operations, such as wheel creation.
    # But just installing setuptools shouldn't require setuptools
    # itself, so we are safe for this small section.
    rm -rf /usr/lib/python2.7/site-packages/setuptools*
    pip install ${pip_args} setuptools

    if [[ $_do_py3 -eq 1 ]]; then
        # Repeat above for python3
        # You would think that installing python3 bits first, then
        # python2 would work -- alas get-pip.py doesn't seem to leave
        # python3 alone:
        #  https://github.com/pypa/pip/issues/4435
        python3 /tmp/get-pip.py ${pip_args}
        rm -rf /usr/lib/python3.?/site-packages/setuptools*
        pip3 install ${pip_args} setuptools
        # reclaim /usr/bin/pip back to pip2
        ln -sf /usr/bin/pip2 /usr/bin/pip
    fi

    # now install latest virtualenv.  it vendors stuff it needs so
    # doesn't have issues with other system packages.

    # python[2|3]-virtualenv package has installed versioned scripts
    # (/usr/bin/virtualenv-[2|3]) but upstream does not!  (see [2]).
    # For consistency, clear them out and then reinstall so we're just
    # left with python2's version
    # [2] http://pkgs.fedoraproject.org/cgit/rpms/python-virtualenv.git/tree/python-virtualenv.spec#n116)
    rm /usr/bin/virtualenv*
    if [[ $_do_py3 -eq 1 ]]; then
        pip3 install ${pip_args} virtualenv
    fi
    pip install ${pip_args} virtualenv

    # at this point, we should have the latest
    # pip/setuptools/virtualenv packages for python2 & 3, and
    # "/usr/bin/pip" and "/usr/bin/virtualenv" should be python2
    # versions.

    if [[ $DISTRO_NAME = opensuse ]]; then
        for pkg in virtualenv pip setuptools; do
            cat - >> /etc/zypp/locks <<EOF
type: package
match_type: glob
case_sensitive: on
solvable_name: python-$pkg
EOF
        done
    else
        # Add this to exclude so that we don't install a later package
        # over it if it updates.  Note that fedora-minimal, bootstrapped
        # via yum, can have an old yum.conf around, so look for dnf first.
        if [[ -f /etc/dnf/dnf.conf ]]; then
            conf=/etc/dnf/dnf.conf
        elif [[ -f /etc/yum.conf ]]; then
            conf=/etc/yum.conf
        else
            die "No conf to modify?"
        fi
        echo "exclude=$packages" >> ${conf}
    fi
elif [[ $DISTRO_NAME = gentoo ]]; then
    packages="dev-python/pip dev-python/virtualenv"
    emerge -U $packages
else
    # pre-install packages so dependencies are there.  We will
    # overwrite with latest below.
    packages="python-pip python3-pip python-virtualenv"
    # unfortunately older ubuntu (trusty) doesn't have a
    # python3-virtualenv package -- it seems it wasn't ready at the
    # time and you had to use "python -m venv".  Since then virtualenv
    # has gained 3.4 support so the pip install below will work
    if [[ ${DIB_PYTHON_VERSION} == 3 ]]; then
        packages=$(echo "$packages" | sed s/python-virtualenv/python3-virtualenv/)
    fi

    apt-get -y install $packages

    # force things to happen so our assumptions hold
    pip_args="-U --force-reinstall"

    # These install into /usr/local/bin so override any packages, even
    # if installed later.

    python3 /tmp/get-pip.py $pip_args
    python2 /tmp/get-pip.py $pip_args

    pip3 install $pip_args virtualenv
    pip install $pip_args virtualenv
fi
