76 lines
1.8 KiB
Python
76 lines
1.8 KiB
Python
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()
|