def __init__(self, project_name, project_info, local_dir, fetch=True): self.project_name = project_name self.recombinations = dict() self.commits = dict() log.info('Current project:\n' + pprint.pformat(project_info)) self.original_project = project_info['original'] self.replica_project = project_info['replica'] self.deploy_name = project_info['deploy-name'] self.rev_deps = None if 'rev-deps' in project_info: self.rev_deps = project_info['rev-deps'] self.test_types = [] if "tests" in project_info['replica'] and project_info["replica"]["tests"] is not None: self.test_types = project_info["replica"]["tests"] self.replication_strategy = project_info['replication-strategy'] self.test_minimum_score = 0 self.patches_branch_suffix = "-patches" self.target_branch_suffix = "-tag" # Set up local repo self.underlayer = Underlayer(project_name, local_dir) # Set up remotes self.underlayer.set_replica(self.replica_project['location'], self.replica_project['name'], fetch=fetch) self.underlayer.set_original(self.original_project['type'], self.original_project['location'], self.original_project['name'], fetch=fetch) if "mirror" in project_info['replica']: self.underlayer.set_replica_mirror(project_info['replica']['mirror'], self.replica_project['name'],fetch=fetch) # Set up branches hypermap # get branches from original # self.original_branches = self.underlayer.list_branches('original') self.original_branches = project_info['original']['watch-branches'] self.backports_startref = dict() for original_branch in self.original_branches: if 'backports-start' in self.original_project: self.backports_startref[original_branch] = self.original_project['backports-start'][original_branch] # apply mapping to find target branch try: replica_branch = project_info['replica']['branch-mappings'][original_branch] except KeyError: replica_branch = original_branch target_branch = '%s%s' % (replica_branch, self.target_branch_suffix) patches_branch = '%s%s' % (replica_branch, self.patches_branch_suffix) self.underlayer.set_branch_maps(original_branch, replica_branch, target_branch, patches_branch) self.recombinations[replica_branch] = None self.commits[replica_branch] = {} self.ref_locks = dict() if 'ref-locks' in self.replica_project: for branch in self.replica_project['ref-locks']: # no advancement will be performed past this revision on this branch self.ref_locks[branch] = self.replica_project['ref-locks'][branch]
def poll_replica(self, patches_branch=None): log.info("Scanning replica repos for new patches") for project_name in self.projects: try: project = self.projects[project_name] project.scan_replica_patches(patches_branch=patches_branch) except Exception, e: traceback.print_exc(file=sys.stdout) log.error(e) logsummary.error("Project %s skipped, reason: %s" % (project_name, e))
def check_approved_recombinations(self, recomb_id=None): log.info("Checking for approved recombinations to handle") for project_name in self.projects: try: log.info("Checking project '%s'" % project_name) project = self.projects[project_name] project.check_approved_recombinations(recomb_id=recomb_id) except Exception, e: traceback.print_exc(file=sys.stdout) log.error(e) logsummary.error("Project %s skipped, reason: %s" % (project_name, e))
def upload(self, reviewers=None, successremove=True): result_data = self.remote.upload_change(self.branch, self.topic, reviewers=reviewers, successremove=successremove) if result_data: self.load_data(result_data) #self.number = result_data['number'] #self.uuid = result_data['uuid'] #self.status = result_data['status'] #self.patchset_number = result_data['patchset_number'] log.info("Recombination with Change-Id %s uploaded in replica gerrit with number %s" % (self.uuid, self.number)) else: return False return True
def serve_requests(self): ur = self.user_requests log.debugvar('ur') if self.user_requests: log.info("Serving user requests in recombination %s comments" % self.uuid) for comment_id in self.user_requests: if self.user_requests[comment_id]['outcome'] != "completed": if self.user_requests[comment_id]['type'] == "DISCARD": served = { 'user-request': { 'comment-id' : comment_id, 'type': self.user_requests[comment_id]['type'], 'outcome': 'completed'}, 'recombine-status': 'DISCARDED'} comment = yaml.safe_dump(served) self.comment(comment, code_review="-2") raise ValueError self.abandon()
def janitor(self): for project_name in self.projects: project = self.projects[project_name] log.info("Cleaning up %s replica repositories" % project_name) log.info("Deleting service branches from mirror") project.delete_service_branches() log.info("delete stale branches from replica") project.delete_stale_branches()
def __init__(self, projects_conf, base_dir, filter_projects=None, filter_method=None, filter_branches=None, fetch=True): self.projects = dict() self.projects_conf = projects_conf self.base_dir = base_dir # extract reverse dependencies for project in self.projects_conf: self.projects_conf[project]["rev-deps"] = {} for project in self.projects_conf: if "test-teps" in self.projects_conf[project]: for test_dep in self.projects_conf[project]["test-deps"]: rev_dep = { project: { "tags": self.projects_conf[project]["test-deps"][test_dep], "tests": self.projects_conf[project]["replica"]["tests"] } } self.projects_conf[test_dep]["rev-deps"].update(rev_dep) # restrict project to operate on projects = copy.deepcopy(projects_conf) project_list = list(projects) if filter_method: new_projects = dict() log.info('Filtering projects with watch method: %s' % filter_method) for project_name in projects: if projects[project_name]['original'][ 'watch-method'] == filter_method: new_projects[project_name] = projects[project_name] projects = new_projects if filter_projects: new_projects = dict() log.info('Filtering projects with names: %s' % filter_projects) project_names = filter_projects.split(',') for project_name in project_names: if project_name not in project_list: log.error( "Project %s is not present in projects configuration" % project_name) try: new_projects[project_name] = projects[project_name] except KeyError: log.warning( "Project %s already discarded by previous filter" % project_name) projects = new_projects if filter_branches: log.info("Filtering branches: %s" % filter_branches) branches = filter_branches.split(',') for project_name in projects: projects[project_name]['original']['watch-branches'] = branches if not projects: log.error("Project list to operate on is empty") raise ValueError log.debugvar('projects') logsummary.info( "initializing and updating local repositories for relevant projects" ) for project_name in projects: try: self.projects[project_name] = Project(project_name, projects[project_name], self.base_dir + "/" + project_name, fetch=fetch) logsummary.info("Project: %s initialized" % project_name) except Exception, e: traceback.print_exc(file=sys.stdout) log.error(e) logsummary.error("Project %s skipped, reason: %s" % (project_name, e))
def __init__(self, project_name, project_info, local_dir, fetch=True): self.project_name = project_name self.recombinations = dict() self.commits = dict() log.info('Current project:\n' + pprint.pformat(project_info)) self.original_project = project_info['original'] self.replica_project = project_info['replica'] self.deploy_name = project_info['deploy-name'] self.rev_deps = None if 'rev-deps' in project_info: self.rev_deps = project_info['rev-deps'] self.test_types = [] if "tests" in project_info['replica'] and project_info["replica"][ "tests"] is not None: self.test_types = project_info["replica"]["tests"] self.replication_strategy = project_info['replication-strategy'] self.test_minimum_score = 0 self.patches_branch_suffix = "-patches" self.target_branch_suffix = "-tag" # Set up local repo self.underlayer = Underlayer(project_name, local_dir) # Set up remotes self.underlayer.set_replica(self.replica_project['location'], self.replica_project['name'], fetch=fetch) self.underlayer.set_original(self.original_project['type'], self.original_project['location'], self.original_project['name'], fetch=fetch) if "mirror" in project_info['replica']: self.underlayer.set_replica_mirror( project_info['replica']['mirror'], self.replica_project['name'], fetch=fetch) # Set up branches hypermap # get branches from original # self.original_branches = self.underlayer.list_branches('original') self.original_branches = project_info['original']['watch-branches'] self.backports_startref = dict() for original_branch in self.original_branches: if 'backports-start' in self.original_project: self.backports_startref[ original_branch] = self.original_project[ 'backports-start'][original_branch] # apply mapping to find target branch try: replica_branch = project_info['replica']['branch-mappings'][ original_branch] except KeyError: replica_branch = original_branch target_branch = '%s%s' % (replica_branch, self.target_branch_suffix) patches_branch = '%s%s' % (replica_branch, self.patches_branch_suffix) self.underlayer.set_branch_maps(original_branch, replica_branch, target_branch, patches_branch) self.recombinations[replica_branch] = None self.commits[replica_branch] = {} self.ref_locks = dict() if 'ref-locks' in self.replica_project: for branch in self.replica_project['ref-locks']: # no advancement will be performed past this revision on this branch self.ref_locks[branch] = self.replica_project['ref-locks'][ branch]
def sync_replica(self): replica_branch = self.replica_change.branch log.info("Advancing replica branch %s to %s " % (replica_branch, self.original_change.revision)) self.underlayer.sync_replica(replica_branch, self.original_change.revision)