#!/usr/bin/env python3

"""
Copies current subproject git repository to create a cache
"""

import shutil
import os
import argparse
import subprocess

PARSER = argparse.ArgumentParser()
PARSER.add_argument('subprojects_dir')
PARSER.add_argument('--build', action="store_true", default=False)
PARSER.add_argument('--cache-dir', default="/subprojects")


def create_cache_in_image(options):
    os.makedirs(options.cache_dir, exist_ok=True)
    print("Creating cache from %s" % options.subprojects_dir)
    for project_name in os.listdir(options.subprojects_dir):
        project_path = os.path.join(options.subprojects_dir, project_name)

        if project_name != "packagecache" and not os.path.exists(os.path.join(project_path, '.git')):
            continue

        if os.path.exists(os.path.join(options.cache_dir, project_name)):
            continue

        print("Copying %s" % project_name)
        shutil.copytree(project_path, os.path.join(options.cache_dir, project_name))

    media_path = os.path.join(options.subprojects_dir, '..', '.git',
        'modules', 'subprojects', 'gst-integration-testsuites', 'medias')
    if os.path.exists(os.path.join(options.cache_dir, 'medias.git')):
        return

    if os.path.exists(media_path):
        print("Creating media cache")
        shutil.copytree(media_path, os.path.join(options.cache_dir, 'medias.git'))
    else:
        print("Did not find medias in %s" % media_path)


def copy_cache(options):
    for path in [options.cache_dir]:
        if not os.path.exists(path):
            print("%s doesn't exist." % path)
            continue

        for project_name in os.listdir(path):
            project_path = os.path.join(options.subprojects_dir, project_name)
            cache_dir = os.path.join(path, project_name)

            if project_name == 'medias.git':
                project_path = os.path.join(options.subprojects_dir, '..', '.git', 'modules',
                    'subprojects', 'gst-integration-testsuites')
                os.makedirs(project_path, exist_ok=True)
                project_path = os.path.join(project_path, 'medias')

            if os.path.exists(project_path):
                print("- Ignoring %s" % cache_dir)
                continue

            if not os.path.isdir(cache_dir):
                print("- Ignoring %s" % cache_dir)
                continue

            print("Copying from %s -> %s" % (cache_dir, project_path))
            shutil.copytree(cache_dir, project_path)

            # workaround `meson subprojects download` only providing a shallow
            # clone.
            # If we need to change refs, then the git repo will only ever be
            # able to reference the originally cloned ref.
            git_path = os.path.join(project_path, '.git')
            if os.path.exists(git_path):
                subprocess.check_call(['git', '-C', git_path, 'remote', 'set-branches', 'origin', '*'])

    subprocess.check_call(['meson', 'subprojects', 'update', '--reset'])


def upgrade_meson():
    # MESON_COMMIT variable can be set when creating a pipeline to test meson pre releases
    meson_commit = os.environ.get('MESON_COMMIT')
    if meson_commit:
        url = f'git+https://github.com/mesonbuild/meson.git@{meson_commit}'
        subprocess.check_call(['pip3', 'install', '--upgrade', url])


if __name__ == "__main__":
    options = PARSER.parse_args()

    if options.build:
        create_cache_in_image(options)
    else:
        upgrade_meson()
        copy_cache(options)
