#!/usr/bin/python3 import sys import json import logging import argparse import linaro_gerrit from update_gerrit_parents_conf import PARENT_MAP # update_gerrit_parents_conf.py should contain per-server parent map in # the following format: # (prefix, parent project) # or # (prefix, (parent, more parents...)) # e.g.: # #PARENT_MAP = { # "https://review.linaro.org": [ # ("toolchain", # ("Toolchain-Projects", "Toolchain-Upstream-Mirrors")), # ("infrastructure", "infrastructure"), # ], #} parser = argparse.ArgumentParser( description='Update Gerrit project parents based on tree prefix') parser.add_argument('--server', help="Server to use config for (if differs from --base)") parser.add_argument('--limit', type=int, default=-1, help="Process at most LIMIT projects") linaro_gerrit.add_gerrit_args(parser, def_loglevel="INFO") args = parser.parse_args() linaro_gerrit.apply_gerrit_conf(args) logging.basicConfig() log = logging.getLogger("update-gerrit-parents") log.setLevel(getattr(logging, args.loglevel.upper())) gerrit = linaro_gerrit.LinaroGerrit(args.base, args.username, args.password, args.noverify, args.loglevel, args.dryrun) parent_map = PARENT_MAP[args.server or args.base] proj_map = gerrit.list_projects(parents=True) limit = args.limit for name, info in list(proj_map.items()): if limit == 0: break for prefix, parents in parent_map: if name != prefix and name.startswith(prefix): if not isinstance(parents, tuple): parents = (parents,) if info["parent"] == "All-Projects": if len(parents) == 1: log.debug("Current parent of %s is %s, setting to %s", name, info["parent"], parents[0]) gerrit.set_project_parent(name, parents[0]) limit -= 1 else: log.warn("Current parent of %s is %s, should be one of %s", name, info["parent"], parents) elif info["parent"] not in parents: log.info("Parent of '%s' is '%s', but not among expected %s", name, info["parent"], parents) else: log.debug("Parent of '%s' is already '%s'", name, info["parent"]) # If matched one rule, skip processing next break