#!/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)