#!/usr/bin/python3 import argparse import concurrent.futures import logging import pathlib import sys import osc.core from lib.git_exporter import GitExporter from lib.importer import Importer from lib.test_exporter import TestExporter URL_OBS = "https://api.opensuse.org" URL_IBS = "https://api.suse.de" # The order is relevant (from older to newer initial codebase) # TODO: make something with these, for now we look purely at openSUSE:Factory PROJECTS = [ # ("SUSE:SLE-12:GA", "SLE_12", URL_IBS), # ("SUSE:SLE-12:Update", "SLE_12", URL_IBS), # ("SUSE:SLE-12-SP1:GA", "SLE_12_SP1", URL_IBS), # ("SUSE:SLE-12-SP1:Update", "SLE_12_SP1", URL_IBS), # ("SUSE:SLE-12-SP2:GA", "SLE_12_SP2", URL_IBS), # ("SUSE:SLE-12-SP2:Update", "SLE_12_SP2", URL_IBS), # ("SUSE:SLE-12-SP3:GA", "SLE_12_SP3", URL_IBS), # ("SUSE:SLE-12-SP3:Update", "SLE_12_SP3", URL_IBS), # ("SUSE:SLE-12-SP4:GA", "SLE_12_SP4", URL_IBS), # ("SUSE:SLE-12-SP4:Update", "SLE_12_SP4", URL_IBS), # ("SUSE:SLE-12-SP5:GA", "SLE_12_SP5", URL_IBS), # ("SUSE:SLE-12-SP5:Update", "SLE_12_SP5", URL_IBS), # ("SUSE:SLE-15:GA", "SLE_15", URL_IBS), # ("SUSE:SLE-15:Update", "SLE_15", URL_IBS), # ("SUSE:SLE-15-SP1:GA", "SLE_15_SP1", URL_IBS), # ("SUSE:SLE-15-SP1:Update", "SLE_15_SP1", URL_IBS), # ("SUSE:SLE-15-SP2:GA", "SLE_15_SP2", URL_IBS), # ("SUSE:SLE-15-SP2:Update", "SLE_15_SP2", URL_IBS), # ("SUSE:SLE-15-SP3:GA", "SLE_15_SP3", URL_IBS), # ("SUSE:SLE-15-SP3:Update", "SLE_15_SP3", URL_IBS), # ("SUSE:SLE-15-SP4:GA", "SLE_15_SP4", URL_IBS), # ("SUSE:SLE-15-SP4:Update", "SLE_15_SP4", URL_IBS), ] def export_package(package, repodir, cachedir, gc): exporter = GitExporter(URL_OBS, "openSUSE:Factory", package, repodir, cachedir) exporter.set_gc_interval(gc) exporter.export_as_git() def main(): parser = argparse.ArgumentParser(description="OBS history importer into git") parser.add_argument("packages", help="OBS package names", nargs="*") parser.add_argument( "-r", "--repodir", required=False, default=pathlib.Path("repos"), type=pathlib.Path, help="Local git repository directory", ) parser.add_argument( "-c", "--cachedir", required=False, type=pathlib.Path, help="Local cache directory", ) parser.add_argument( "-g", "--gc", metavar="N", type=int, default=200, help="Garbage recollect and pack the git history each N commits", ) parser.add_argument( "--level", "-l", default="INFO", help="logging level", ) parser.add_argument( "--export", action="store_true", help="Export database fields for the given package as YAML", ) args = parser.parse_args() if args.level: numeric_level = getattr(logging, args.level.upper(), None) if not isinstance(numeric_level, int): print(f"Invalid log level: {args.level}") sys.exit(-1) logging.basicConfig(level=numeric_level) if numeric_level == logging.DEBUG: osc.conf.config["debug"] = True requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True if args.export: if len(args.packages) != 1: print("Can only export one package") sys.exit(1) TestExporter(args.packages[0]).run() return if not args.cachedir: args.cachedir = pathlib.Path("~/.cache/git-import/").expanduser() importer = Importer(URL_OBS, "openSUSE:Factory", args.packages) importer.import_into_db() if len(args.packages) != 1: with concurrent.futures.ProcessPoolExecutor(max_workers=8) as executor: fs = [ executor.submit( export_package, package, args.repodir, args.cachedir, args.gc ) for package in args.packages ] concurrent.futures.wait(fs) else: export_package(args.packages[0], args.repodir, args.cachedir, args.gc) if __name__ == "__main__": main()