#!/bin/sh

# print a list of PostgreSQL versions that are supported for the platform this
# script runs on.
# Note: Newer installed versions than the highest one listed here are always
# considered supported, so that backports will not cause an "obsolete" warning.
#
# /usr/share/postgresql-common/supported-versions decides which PostgreSQL
# server versions are supported. This information is used
# 1) for notifying users of obsolete versions, suggesting to upgrade
# 2) by postgresql-common itself (in debian/rules) to determine the
#    dependencies of the postgresql meta packages (default version), and to
#    generate the list of postgresql-server-dev-* packages
#    postgresql-server-dev-all depends on
# 3) by the pg_buildext tool to decide which server versions to build extension
#    modules for
#
# The *last* version returned here will be considered the default version, the
# remaining lines list other supported versions in an undefined order.
#
# * PG_SUPPORTED_VERSIONS
# * DEB_PG_SUPPORTED_VERSIONS
# * ~/.pg_supported_versions
# * /etc/postgresql-common/supported_versions
# (in that order) can be used to override the defaults. (Tokens separated by
# newlines.)
#
# Recognized tokens:
# default: use the appropiate defaults for the current distribution and release
#          (as determined by os-release or lsb_release)
# debian [release]: use Debian defaults
# debian-backports [release]: use Debian Backports defaults
# ubuntu [release]: use Ubuntu defaults
# pgdg [release]: use defaults for apt.postgresql.org
# installed: consider all installed versions supported (determined by
#            postgresql-server-dev-X.Y packages)
# X.Y: consider this version supported
#
# (C) 2005-2016 Martin Pitt <mpitt@debian.org>
# (C) 2012-2016 Christoph Berg <myon@debian.org>

set -eu

# at build time, use our pgcommon.sh, not the system one (this assumes
# debian/supported-versions is one directory deeper than ./pgcommon.sh)
if [ -e "${0%/supported-versions}/../pgcommon.sh" ]; then
    . "${0%/supported-versions}/../pgcommon.sh"
else
    . /usr/share/postgresql-common/pgcommon.sh
fi

DEFAULT="9.5"

# functions

default() {
    case "$DISTRO" in
        [uU]buntu)
            ubuntu "$RELEASE"
            ;;
        [dD]ebian)
            debian "$RELEASE"
            ;;
        *)
            echo "supported-versions: WARNING! Unknown distribution: $DISTRO" >&2
            if  echo $ID_LIKE | egrep  '(^| )ubuntu($| )' > /dev/null; then
                echo "ubuntu found in ID_LIKE, treating as Ubuntu" >&2
                ubuntu "$RELEASE"
            elif echo $ID_LIKE | egrep  '(^| )debian($| )' > /dev/null; then
                echo "debian found in ID_LIKE, treating as Debian" >&2
                debian "$RELEASE"
            else
                echo "Please submit this as a bug report to your distribution." >&2
                /bin/echo -e "$DEFAULT"
            fi
            ;;
    esac
}

ubuntu() {
    case "$1" in
        12.04)
            /bin/echo -e "9.1"
            ;;
        14.04)
            /bin/echo -e "9.3"
            ;;
        14.10|15.04|15.10)
            /bin/echo -e "9.4"
            ;;
        16.04)
            /bin/echo -e "9.5"
            ;;
        *)
            echo "supported-versions: WARNING: Unknown Ubuntu release: $1" >&2
            /bin/echo -e "$DEFAULT"
            ;;
    esac
}

debian() {
    case "$1" in
        5.0*) # Lenny
            /bin/echo -e "8.3"
            ;;
        6.0*) # Squeeze
            /bin/echo -e "8.4"
            ;;
        7|7.*) # Wheezy
            /bin/echo -e "9.1"
            ;;
        8|8.*) # Jessie
            /bin/echo -e "9.4"
            ;;
        testing | unstable)
            /bin/echo -e "$DEFAULT"
            ;;
        *)
            echo "supported-versions: WARNING: Unknown Debian release: $1" >&2
            /bin/echo -e "$DEFAULT"
            ;;
    esac
}

debian_backports() {
    case "$1" in
        5.0*) # Lenny
            /bin/echo -e "8.3"
            ;;
        6.0*) # Squeeze
            /bin/echo -e "8.4\n9.1"
            ;;
        7|7.*) # Wheezy
            /bin/echo -e "9.1\n9.4"
            ;;
        8|8.*) # Jessie
            /bin/echo -e "9.4"
            ;;
        testing | unstable)
            /bin/echo -e "$DEFAULT"
            ;;
        *)
            echo "supported-versions: WARNING: Unknown Debian release: $1" >&2
            /bin/echo -e "$DEFAULT"
            ;;
    esac
}

pgdg() {
    case $1 in
        testing | unstable)
            /bin/echo -e "9.1\n9.2\n9.3\n9.4\n9.5" # 9.5 default
            ;;
        *)
            /bin/echo -e "9.1\n9.2\n9.3\n9.4\n9.5" # 9.5 default
            ;;
    esac
}

installed() {
    dpkg -l 'postgresql-server-dev-[1-9].*' | \
        sed -ne 's/^ii *postgresql-server-dev-\([^ ]*\).*/\1/p'
}

# main

if [ "${PG_SUPPORTED_VERSIONS:-}" ] ; then
    SUPPORTED_VERSIONS=$(echo "$PG_SUPPORTED_VERSIONS" | xargs -n1)
elif [ "${DEB_PG_SUPPORTED_VERSIONS:-}" ] ; then
    SUPPORTED_VERSIONS=$(echo "$DEB_PG_SUPPORTED_VERSIONS" | xargs -n1)
elif [ -f ${HOME:-}/.pg_supported_versions ] ; then
    SUPPORTED_VERSIONS="$(cat ${HOME:-}/.pg_supported_versions)"
elif [ -f ${PGSYSCONFDIR:-/etc/postgresql-common}/supported_versions ] ; then
    SUPPORTED_VERSIONS="$(cat ${PGSYSCONFDIR:-/etc/postgresql-common}/supported_versions)"
else
    SUPPORTED_VERSIONS="default"
fi

echo "$SUPPORTED_VERSIONS" | while read version release; do
    COMMENT="#"
    case $version in
        "") ;;
        $COMMENT*) ;;
        default)
            get_release
            default
            ;;
        debian)
            get_release
            debian "${release:-$RELEASE}"
            ;;
        debian-backports)
            get_release
            debian_backports "${release:-$RELEASE}"
            ;;
        ubuntu)
            get_release
            ubuntu "${release:-$RELEASE}"
            ;;
        pgdg) # apt.postgresql.org
            get_release
            pgdg "${release:-$RELEASE}"
            ;;
        installed)
            installed
            ;;
        *)
            /bin/echo -e "$version"
            ;;
    esac
done

exit 0
