#!/usr/bin/python3

import os
import sys
import subprocess

lmde_releases = ['debian', 'betsy', 'cindy', 'debbie', 'elsie', 'faye']
mint_releases = ['maya', 'qiana', 'rebecca', 'rafaela', 'rosa', 'sarah', 'serena', 'sonya', 'tara', 'tessa', 'tina', 'tricia', 'ulyana', 'ulyssa', 'uma', 'una', 'vanessa', 'vera', 'victoria', 'virginia', 'wilma', 'xia']

class Package:

    def __init__(self, name):
        self.name = name
        self.version = None


class Release:

    def __init__(self, name):
        self.name = name
        self.packages = []
        self.is_lmde = (name in lmde_releases)


def read_list(filename):
    array = []
    filehandle = open(filename)
    for line in filehandle.readlines():
        line = line.strip()
        if line == "" or line.startswith("#"):
            continue
        array.append(line)
    return array


def remove_version_suffix(version):
    for release in (lmde_releases + mint_releases):
        version = version.replace("+%s" % release, "")
    return version

lmde_specific_packages = read_list("/usr/share/mint-dev-tools/packages/lmde.list")
ubuntu_specific_packages = read_list("/usr/share/mint-dev-tools/packages/ubuntu.list")
obsolete_packages = read_list("/usr/share/mint-dev-tools/packages/ignored.list")

os.system("mkdir -p .compare-releases")
os.system("rm -rf .compare-releases/*")

release1 = Release(sys.argv[1])
release2 = Release(sys.argv[2])

for component in ["main", "upstream", "import", "backport"]:

    for release in [release1, release2]:
        os.system("wget -O .compare-releases/sources.gz http://packages.linuxmint.com/dists/%s/%s/source/Sources.gz 2> /dev/null" % (release.name, component))
        os.system("gzip -d .compare-releases/sources.gz")
        os.system("mv .compare-releases/sources .compare-releases/%s" % release.name)

        with open(".compare-releases/%s" % release.name, 'r') as source_file:
            package = None
            for line in source_file:
                line = line.strip()
                if line.startswith("Package: "):
                    name = line.replace("Package: ", "")
                    package = Package(name)
                    release.packages.append(package)
                elif line.startswith("Version: "):
                    version = line.replace("Version: ", "")
                    package.version = version

    os.system("rm -rf .compare-releases/*")

missing_packages = []
lower_versions = []

# Find packages missing in release1
for package in release1.packages:
    if package.name in obsolete_packages:
        continue

    if release1.is_lmde and not release2.is_lmde:
        # ignore LMDE-specific packages
        if package.name in lmde_specific_packages:
            continue

        # ignore GTK3-related packages
        if package.name in ['mint-themes-gtk3']:
            continue

        # ignore debian/lmde packages are they're not supported in Mint
        found_keyword = False
        for keyword in ['debian', 'lmde']:
            if keyword in package.name:
                found_keyword = True
                break
        if found_keyword:
            continue

    if not release1.is_lmde and release2.is_lmde:
        # ignore Mint/Ubuntu-specific packages
        if package.name in ubuntu_specific_packages:
            continue

        # ignore GTK3-related packages
        if package.name in ['mint-themes-gtk3']:
            continue

        # ignore KDE/Xfce packages are they're not supported in LMDE
        found_keyword = False
        for keyword in ['kde', 'xfce', 'kcm']:
            if keyword in package.name:
                found_keyword = True
                break
        if found_keyword:
            continue

    equivalent_package = None
    for package2 in release2.packages:
        if package2.name == package.name:
            equivalent_package = package2
            break
    if equivalent_package is None:
        missing_packages.append("    {0:30}: {1}".format(package.name, package.version))
    else:
        # Compare versions
        version1 = remove_version_suffix(package.version)
        version2 = remove_version_suffix(equivalent_package.version)
        output = subprocess.getoutput("dpkg --compare-versions %s gt %s && echo 'NOK'" % (version1, version2))
        if (output == 'NOK'):
            lower_versions.append("    {0:30}: {1} < {2}".format(package.name, equivalent_package.version, package.version))

print()
print("Missing packages in %s" % release2.name)
for line in sorted(missing_packages):
    print(line)

print()
print("Lower versions in %s" % release2.name)
for line in sorted(lower_versions):
    print(line)
print()
