#!/usr/bin/python3
# Builds on python2.X and python3
# $Id: setup.py,v 1.2 2002/01/08 07:13:21 jgg Exp $
import glob
import os
import shutil
import subprocess
import sys

from setuptools import Extension, setup
from setuptools.command.install import install

cmdclass = {}

try:
    from DistUtilsExtra.auto import clean_build_tree
    from DistUtilsExtra.command import build_extra, build_i18n
except ImportError:
    print("W: [python%s] DistUtilsExtra import error." % sys.version[:3])
else:
    cmdclass["build"] = build_extra.build_extra
    cmdclass["build_i18n"] = build_i18n.build_i18n
    cmdclass["clean"] = clean_build_tree


class InstallTypeinfo(install):
    def run(self):
        install.run(self)
        for pyi in glob.glob("typehinting/*.pyi"):
            stubs = os.path.basename(pyi).split(".")[0] + "-stubs"
            stubs = os.path.join(self.install_purelib, stubs)
            if not os.path.exists(stubs):
                os.makedirs(stubs)
            shutil.copy(pyi, os.path.join(stubs, "__init__.pyi"))


cmdclass["install"] = InstallTypeinfo


def get_version():
    """Get a PEP 0440 compatible version string"""
    version = os.environ.get("DEBVER")
    if not version:
        proc = subprocess.Popen(
            ["dpkg-parsechangelog", "-SVersion"],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )
        out, _ = proc.communicate()
        if proc.returncode == 0:
            version = out.decode("utf-8")

    version = version.strip()

    if not version:
        return version

    version = version.replace("~alpha", ".a")
    version = version.replace("~beta", ".b")
    version = version.replace("~rc", ".rc")
    version = version.replace("~exp", ".dev")
    version = version.replace("ubuntu", "+ubuntu")
    version = version.replace("tanglu", "+tanglu")
    version = version.split("build")[0]

    return version


# The apt_pkg module.
files = [
    "apt_pkgmodule.cc",
    "acquire.cc",
    "cache.cc",
    "cdrom.cc",
    "configuration.cc",
    "depcache.cc",
    "generic.cc",
    "hashes.cc",
    "hashstring.cc",
    "indexfile.cc",
    "metaindex.cc",
    "pkgmanager.cc",
    "pkgmanagerprogress.cc",
    "pkgrecords.cc",
    "pkgsrcrecords.cc",
    "policy.cc",
    "progress.cc",
    "sourcelist.cc",
    "string.cc",
    "tag.cc",
    "lock.cc",
    "acquire-item.cc",
    "python-apt-helpers.cc",
    "cachegroup.cc",
    "orderlist.cc",
    "hashstringlist.cc",
]
files = sorted(["python/" + fname for fname in files], key=lambda s: s[:-3])
apt_pkg = Extension(
    "apt_pkg",
    files,
    # Hack around resolution order for duplicate versioned symbols so we prefer the stdc++ ones
    libraries=["stdc++", "apt-pkg"],
    extra_compile_args=[
        "-Wno-write-strings",
        "-DAPT_8_CLEANER_HEADERS",
        "-DAPT_9_CLEANER_HEADERS",
        "-DAPT_10_CLEANER_HEADERS",
        "-DPY_SSIZE_T_CLEAN",
    ],
)

# The apt_inst module
files = [
    "python/apt_instmodule.cc",
    "python/generic.cc",
    "python/arfile.cc",
    "python/tarfile.cc",
]
apt_inst = Extension(
    "apt_inst",
    files,
    libraries=["apt-pkg"],
    extra_compile_args=["-Wno-write-strings", "-DPY_SSIZE_T_CLEAN"],
)

# Replace the leading _ that is used in the templates for translation
if len(sys.argv) > 1 and sys.argv[1] == "build":
    if not os.path.exists("build/data/templates/"):
        os.makedirs("build/data/templates")
    for template in glob.glob("data/templates/*.info.in"):
        source = open(template)
        build = open("build/" + template[:-3], "w")
        for line in source:
            build.write(line.lstrip("_"))
        source.close()
        build.close()
    for template in glob.glob("data/templates/*.mirrors"):
        shutil.copy(template, os.path.join("build", template))


setup(
    name="python-apt",
    description="Python bindings for APT",
    version=get_version(),
    author="APT Development Team",
    author_email="deity@lists.debian.org",
    ext_modules=[apt_pkg, apt_inst],
    packages=["apt", "apt.progress", "aptsources"],
    package_data={
        "apt": ["*.pyi", "py.typed"],
    },
    data_files=[
        ("share/python-apt/templates", glob.glob("build/data/templates/*.info")),
        ("share/python-apt/templates", glob.glob("data/templates/*.mirrors")),
    ],
    cmdclass=cmdclass,
    license="GNU GPL",
    platforms="posix",
)
