from argparse import ArgumentParser import os from typing import List from attr import dataclass from productmd.common import parse_nvra @dataclass class Package: nvra: str path: str def search_rpms(top_dir) -> List[Package]: """ Search for all *.rpm files recursively in given top directory Returns: list: list of paths """ rpms = [] for root, dirs, files in os.walk(top_dir): path = root.split(os.sep) for file in files: if not file.endswith('.rpm'): continue nvra, _ = os.path.splitext(file) rpms.append( Package(nvra=nvra, path=os.path.join('/', *path, file)) ) return rpms def copy_rpms(packages: List[Package], target_top_dir: str): """ Search synced repos for rpms and prepare koji-like structure for pungi Instead of repos, use following structure: # ls /mnt/koji/ i686/ noarch/ x86_64/ Returns: Nothing: """ for package in packages: info = parse_nvra(package.nvra) target_arch_dir = os.path.join(target_top_dir, info['arch']) os.makedirs(target_arch_dir, exist_ok=True) target_file = os.path.join(target_arch_dir, os.path.basename(package.path)) if not os.path.exists(target_file): try: os.link(package.path, target_file) except OSError: # hardlink failed, try symlinking os.symlink(package.path, target_file) def cli_main(): parser = ArgumentParser() parser.add_argument('-p', '--path', required=True) parser.add_argument('-t', '--target', required=True) namespace = parser.parse_args() rpms = search_rpms(namespace.path) copy_rpms(rpms, namespace.target) if __name__ == '__main__': cli_main()