Beispiel #1
0
    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]
Beispiel #2
0
 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))
Beispiel #3
0
 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()
Beispiel #6
0
 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()
Beispiel #7
0
    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))
Beispiel #8
0
    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)