#!/bin/sh
''''[ ! -z $VIRTUAL_ENV ] && exec python -u -- "$0" ${1+"$@"}; command -v python3 > /dev/null && exec python3 -u -- "$0" ${1+"$@"}; exec python2 -u -- "$0" ${1+"$@"} # '''

import sys
import os
import argparse
import re
import tempfile
import urllib.request

HERE = os.path.dirname(__file__)
ROOT = os.path.abspath(os.path.join(HERE, ".."))
sys.path.insert(0, ROOT)
import paella

#----------------------------------------------------------------------------------------------

class GitSetup(paella.Setup):
    def __init__(self, args):
        paella.Setup.__init__(self, nop=args.nop)

    def common_first(self):
        self.install("git")

#----------------------------------------------------------------------------------------------

class GitSetupModern(paella.Setup):
    SCM_GIT_BASE_URL = "https://kernel.org/pub/software/scm/git/"

    def __init__(self, args):
        paella.Setup.__init__(self, nop=args.nop)
        self.install_git_docs = args.docs
        self.git_version = args.version or self.git_latest_ver()
        self.prefix = "/usr/local"

    def git_latest_ver(self):
        response = urllib.request.urlopen(self.SCM_GIT_BASE_URL)
        versions = list(set(re.findall("[0-9]+\.[0-9]+\.[0-9]", response.read().decode("utf-8"))))
        versions.sort(key=lambda s: list(map(int, s.split('.'))))
        return versions[-1]

    def common_first(self):
        self.install_downloaders()

    def macos(self):
        self.prefix = "~/.local"

    def debian_compat(self):
        self.run("{pwd}/getgcc".format(pwd=HERE))
        self.install("dh-autoreconf libcurl4-gnutls-dev libexpat1-dev \
                      gettext libz-dev libssl-dev")
        if self.install_git_docs:
            self.install("install-info gettext asciidoc xmlto docbook2x")

    def redhat_compat(self):
        self.run("{pwd}/getgcc --modern".format(pwd=HERE))
        self.install("dh-autoreconf curl-devel expat-devel gettext-devel \
                      gettext-devel openssl-devel perl-devel zlib-devel getopt")
        if self.install_git_docs:
            self.install("asciidoc xmlto docbook2X")
            self.run("ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi", sudo=True)

    def common_last(self):
        with tempfile.TemporaryDirectory() as tmpdirname:
            self.run("""
                cd {tmp_dir}
                curl -L -O {base_url}git-{git_ver}.tar.gz
                tar -zxf git-{git_ver}.tar.gz
                cd git-{git_ver}
                export LDFLAGS=-L/usr/local/lib64
                make configure
                ./configure --prefix={prefix}
                make all {docs}
                """.format(
                    base_url=self.SCM_GIT_BASE_URL, 
                    git_ver=self.git_version,
                    tmp_dir=tmpdirname,
                    prefix=self.prefix,
                    docs="doc info" if self.install_git_docs else ""))

            self.run("""
                cd {tmp_dir}/git-{git_ver}
                make prefix={prefix} install {docs}
                """.format(
                    tmp_dir=tmpdirname,
                    git_ver=self.git_version,
                    prefix=self.prefix,
                    docs="install-doc install-html install-info" if self.install_git_docs else ""),
                sudo=True)


#----------------------------------------------------------------------------------------------

class GitHubCLISetup(paella.Setup):
    def __init__(self, args):
        paella.Setup.__init__(self, nop=args.nop)

    def debian_compat(self):
        self.run("""
        curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
        chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
        echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null
        apt update
        apt install -y gh
        """, sudo=True)

    def redhat_compat(self):
        self.run("yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo", sudo=True)
        self.install("gh")

    def macos(self):
        self.install("gh")

#----------------------------------------------------------------------------------------------

class GitExtSetup(paella.Setup):
    def __init__(self, args):
        paella.Setup.__init__(self, nop=args.nop)

    def common_first(self):
        self.install("tig")

#----------------------------------------------------------------------------------------------

parser = argparse.ArgumentParser(description='Install Git')
parser.add_argument('-n', '--nop', action="store_true", help='no operation')
parser.add_argument('--version', metavar='VER', type=str, default=None, help="git version to install")
parser.add_argument('--modern', action="store_true", help='install latest git')
parser.add_argument('--github', action="store_true", help='install GitHub CLI (gh)')
parser.add_argument('--docs', action="store_true", help='install Git documentation')
parser.add_argument('--no-ext', action="store_true", help='skip instlaling extra utilities')
# parser.add_argument('--lfs', action="store_true", help='install Git LFS')
# parser.add_argument('--tig', action="store_true", help='install tig (text-mode interface for Git)')
args = parser.parse_args()

if args.modern:
    GitSetupModern(args).setup()
else:
    GitSetup(args).setup()

if args.github:
    GitHubCLISetup(args).setup()

if not args.no_ext:
    GitExtSetup(args).setup()

