def create_new_adi(self, wanted_requests, split=False):
        source_projects_expand = self.config.get('source_projects_expand',
                                                 '').split()
        # if we don't call it, there is no invalidate function added
        requests = self.api.get_open_requests()
        if len(wanted_requests):
            requests = []
            rf = RequestFinder(self.api)
            for p in wanted_requests:
                requests.append(rf.load_request(p))

        splitter = RequestSplitter(self.api, requests, in_ring=False)
        splitter.filter_add('./action[@type="submit" or @type="delete"]')
        if len(wanted_requests):
            splitter.filter_add_requests([str(p) for p in wanted_requests])
            # wanted_requests forces all requests into a single group.
        else:
            if split:
                splitter.group_by('./@id')
            else:
                splitter.group_by('./action/source/@project')

        splitter.split()

        for group in sorted(splitter.grouped.keys()):
            print(Fore.YELLOW + (group if group != '' else 'wanted') +
                  Fore.RESET)

            name = None
            for request in splitter.grouped[group]['requests']:
                request_id = int(request.get('id'))
                target = request.find('./action/target')
                target_package = target.get('package')
                line = '- {} {}{:<30}{}'.format(request_id, Fore.CYAN,
                                                target_package, Fore.RESET)

                message = self.api.ignore_format(request_id)
                if message:
                    print(line + '\n' + Fore.WHITE + message + Fore.RESET)
                    continue

                # Auto-superseding request in adi command
                stage_info, code = self.api.update_superseded_request(request)
                if stage_info:
                    print(line +
                          ' ({})'.format(SupersedeCommand.CODE_MAP[code]))
                    continue

                # Only create staging projec the first time a non superseded
                # request is processed from a particular group.
                if name is None:
                    use_frozenlinks = group in source_projects_expand and not split
                    name = self.api.create_adi_project(None, use_frozenlinks,
                                                       group)

                if not self.api.rq_to_prj(request_id, name):
                    return False

                print(line + Fore.GREEN + ' (staged in {})'.format(name) +
                      Fore.RESET)
    def perform(self, packages, move=False, by_dp=False, split=False):
        """
        Perform the list command
        """
        if len(packages):
            requests = set()
            if move:
                items = RequestFinder.find_staged_sr(packages,
                                                     self.api).items()
                print(items)
                for request, request_project in items:
                    staging_project = request_project['staging']
                    self.api.rm_from_prj(staging_project, request_id=request)
                    self.api.add_review(request,
                                        by_group=self.api.cstaging_group,
                                        msg='Please recheck')
            else:
                items = RequestFinder.find_sr(packages, self.api).items()

            for request, request_project in items:
                requests.add(request)
            self.create_new_adi(requests, split=split)
        else:
            self.check_adi_projects()
            if self.api.is_user_member_of(self.api.user,
                                          self.api.cstaging_group):
                self.create_new_adi((), by_dp=by_dp, split=split)
    def perform(self, requests, move=False, from_=None, no_freeze=False):
        """
        Select package and move it accordingly by arguments
        :param target_project: project we want to target
        :param requests: requests we are working with
        :param move: wether to move the requests or not
        :param from_: location where from move the requests
        """

        if self.api.is_adi_project(self.target_project):
            no_freeze = True

        # If the project is not frozen enough yet freeze it
        if not (no_freeze or self.api.prj_frozen_enough(self.target_project)):
            print('Freeze the prj first')
            return False
            # FreezeCommand(self.api).perform(self.target_project)

        # picks new candidate requests only if it's not to move requests
        # ie. the review state of staging-project must be new if newcand is True
        newcand = not move

        for request in RequestFinder.find_sr(requests, self.api, newcand):
            if not self.select_request(request, move, from_):
                return False

        # Notify everybody about the changes
        self.api.update_status_comments(self.target_project, 'select')
        for fprj in self.affected_projects:
            self.api.update_status_comments(fprj, 'select')

        # now make sure we enable the prj if the prj contains any ringed package
        self.api.build_switch_staging_project(self.target_project)

        return True
    def perform(self, packages, cleanup, message):
        """
        Remove request from staging project
        :param packages: packages/requests to delete from staging projects
        """

        if cleanup:
            obsolete = self.api.project_status_requests(
                'obsolete', self.filter_obsolete)
            if len(obsolete) > 0:
                print('Cleanup {} obsolete requests'.format(len(obsolete)))
                packages += tuple(obsolete)

        affected_projects = set()
        for request, request_project in RequestFinder.find_staged_sr(
                packages, self.api).items():
            staging_project = request_project['staging']
            affected_projects.add(staging_project)
            print('Unselecting "{}" from "{}"'.format(request,
                                                      staging_project))
            self.api.rm_from_prj(staging_project, request_id=request)

            req = get_request(self.api.apiurl, str(request))
            if message:
                self.api.add_ignored_request(request, message)
                self.comment.add_comment(request_id=str(request),
                                         comment=message)
            elif req.state.name in ('new', 'review'):
                print(
                    '  Consider marking the request ignored to let others know not to restage.'
                )

        # Notify everybody about the changes
        for prj in affected_projects:
            self.api.update_status_or_deactivate(prj, 'unselect')
Example #5
0
    def perform(self, requests, cleanup=False):
        """
        Unignore a request by removing from ignore list.
        """

        requests_ignored = self.api.get_ignored_requests()
        length = len(requests_ignored)

        if len(requests) == 1 and requests[0] == 'all':
            requests_ignored = {}
        else:
            for request_id in RequestFinder.find_sr(requests, self.api):
                if request_id in requests_ignored.keys():
                    print('{}: unignored'.format(request_id))
                    del requests_ignored[request_id]
                    self.api.del_ignored_request(request_id)
                    self.comment.add_comment(request_id=str(request_id),
                                             comment=self.MESSAGE)

        if cleanup:
            now = datetime.now()
            for request_id in set(requests_ignored):
                request = get_request(self.api.apiurl, str(request_id))
                if request.state.name not in ('new', 'review'):
                    changed = dateutil.parser.parse(request.state.when)
                    diff = now - changed
                    if diff.days > 3:
                        print('Removing {} which was {} {} days ago'.format(
                            request_id, request.state.name, diff.days))
                        self.api.del_ignored_request(request_id)

        return True
    def perform(self, target_project, requests, move=False, from_=None):
        """
        Select package and move it accordingly by arguments
        :param target_project: project we want to target
        :param requests: requests we are working with
        :param move: wether to move the requests or not
        :param from_: location where from move the requests
        """

        # If the project is not frozen enough yet freeze it
        if not self.api.prj_frozen_enough(target_project):
            print('Freeze the prj first')
            return False
            # FreezeCommand(self.api).perform(target_project)
        self.target_project = target_project

        for request in RequestFinder.find_sr(requests, self.api):
            if not self.select_request(request, move, from_):
                return False

        # Notify everybody about the changes
        self.api.update_status_comments(target_project, 'select')
        for fprj in self.affected_projects:
            self.api.update_status_comments(fprj, 'select')

        # now make sure we enable the prj if the prj contains any ringed package
        self.api.build_switch_staging_project(target_project)

        return True
    def perform(self, requests, message=None):
        """
        Ignore a request from "list" and "adi" commands until unignored.
        """

        requests_ignored = self.api.get_ignored_requests()
        length = len(requests_ignored)

        for request_id in RequestFinder.find_sr(requests, self.api):
            if request_id in requests_ignored:
                print('{}: already ignored'.format(request_id))
                continue

            print('{}: ignored'.format(request_id))
            requests_ignored[request_id] = message
            comment = message if message else self.MESSAGE
            self.comment.add_comment(request_id=str(request_id), comment=comment)

        diff = len(requests_ignored) - length
        if diff > 0:
            self.api.set_ignored_requests(requests_ignored)
            print('Ignored {} requests'.format(diff))
        else:
            print('No new requests to ignore')

        return True
Example #8
0
    def perform(self, requests, move=False, filter_from=None, no_freeze=False):
        """
        Select package and move it accordingly by arguments
        :param target_project: project we want to target
        :param requests: requests we are working with
        :param move: wether to move the requests or not
        :param filter_from: filter request list to only those from a specific staging
        """

        if self.api.is_adi_project(self.target_project):
            no_freeze = True

        # If the project is not frozen enough yet freeze it
        if not (no_freeze or self.api.prj_frozen_enough(self.target_project)):
            print('Freeze the prj first')
            return False
            # FreezeCommand(self.api).perform(self.target_project)

        # picks new candidate requests only if it's not to move requests
        # ie. the review state of staging-project must be new if newcand is True
        newcand = not move

        requests = RequestFinder.find_sr(requests, self.api, newcand)
        requests_count = len(requests)
        for index, request in enumerate(requests, start=1):
            print('({}/{}) '.format(index, requests_count), end='')
            if not self.select_request(request, move, filter_from):
                return False

        # Notify everybody about the changes
        self.api.update_status_or_deactivate(self.target_project, 'select')
        for fprj in self.affected_projects:
            self.api.update_status_or_deactivate(fprj, 'select')

        return True
Example #9
0
    def perform(self, requests, message=None):
        """
        Ignore a request from "list" and "adi" commands until unignored.
        """

        requests_ignored = self.api.get_ignored_requests()
        length = len(requests_ignored)

        for request_id in RequestFinder.find_sr(requests, self.api):
            if request_id in requests_ignored:
                print('{}: already ignored'.format(request_id))
                continue

            print('{}: ignored'.format(request_id))
            requests_ignored[request_id] = message
            comment = message if message else self.MESSAGE
            self.comment.add_comment(request_id=str(request_id),
                                     comment=comment)

        diff = len(requests_ignored) - length
        if diff > 0:
            self.api.set_ignored_requests(requests_ignored)
            print('Ignored {} requests'.format(diff))
        else:
            print('No new requests to ignore')

        return True
    def perform(self, packages):
        """
        Repair request in staging project or move it out
        :param packages: packages/requests to repair in staging projects
        """

        for reqid in RequestFinder.find_sr(packages, self.api):
            self.repair(reqid)
Example #11
0
    def perform(self, packages):
        """
        Repair request in staging project or move it out
        :param packages: packages/requests to repair in staging projects
        """

        for reqid in RequestFinder.find_sr(packages, self.api):
            self.repair(reqid)
Example #12
0
    def perform(self, requests, message=None):
        """
        Ignore a request from "list" and "adi" commands until unignored.
        """

        for request_id in RequestFinder.find_sr(requests, self.api):
            print('{}: ignored'.format(request_id))
            comment = message if message else self.MESSAGE
            self.api.add_ignored_request(request_id, comment)
            self.comment.add_comment(request_id=str(request_id), comment=comment)

        return True
    def perform(self, packages, cleanup=False):
        """
        Repair request in staging project or move it out
        :param packages: packages/requests to repair in staging projects
        """

        if cleanup:
            untracked = self.api.project_status_requests('untracked')
            if len(untracked) > 0:
                print('Cleanup {} untracked requests'.format(len(untracked)))
                packages += tuple(untracked)

        for reqid in RequestFinder.find_sr(packages, self.api):
            self.repair(reqid)
    def perform(self, packages, move=False, by_dp=False, split=False):
        """
        Perform the list command
        """
        if len(packages):
            requests = set()
            if move:
                items = RequestFinder.find_staged_sr(packages, self.api).items()
                print(items)
                for request, request_project in items:
                    staging_project = request_project['staging']
                    self.api.rm_from_prj(staging_project, request_id=request)
                    self.api.add_review(request, by_group=self.api.cstaging_group, msg='Please recheck')
            else:
                items = RequestFinder.find_sr(packages, self.api).items()

            for request, request_project in items:
                requests.add(request)
            self.create_new_adi(requests, split=split)
        else:
            self.check_adi_projects()
            if self.api.is_user_member_of(self.api.user, self.api.cstaging_group):
                self.create_new_adi((), by_dp=by_dp, split=split)
    def perform(self, packages, cleanup=False):
        """
        Repair request in staging project or move it out
        :param packages: packages/requests to repair in staging projects
        """

        if cleanup:
            untracked = self.api.project_status_requests('untracked')
            if len(untracked) > 0:
                print('Cleanup {} untracked requests'.format(len(untracked)))
                packages += tuple(untracked)

        for reqid in RequestFinder.find_sr(packages, self.api):
            self.repair(reqid)
Example #16
0
 def perform(self, packages):
     """
     Perform the list command
     """
     if len(packages):
         requests = set()
         for request, request_project in RequestFinder.find_sr(packages,
                                                               self.api).items():
             requests.add(request)
         self.create_new_adi(requests)
     else:
         self.check_adi_projects() 
         if self.api.is_user_member_of(self.api.user, 'factory-staging'):
             self.create_new_adi(())
Example #17
0
 def perform(self, packages):
     """
     Perform the list command
     """
     if len(packages):
         requests = set()
         for request, request_project in RequestFinder.find_sr(
                 packages, self.api).items():
             requests.add(request)
         self.create_new_adi(requests)
     else:
         self.check_adi_projects()
         if self.api.is_user_member_of(self.api.user, 'factory-staging'):
             self.create_new_adi(())
    def perform(self,
                requests,
                move=False,
                filter_from=None,
                no_freeze=False,
                remove_exclusion=False):
        """
        Select package and move it accordingly by arguments
        :param target_project: project we want to target
        :param requests: requests we are working with
        :param move: wether to move the requests or not
        :param filter_from: filter request list to only those from a specific staging
        """

        if self.api.is_adi_project(self.target_project):
            no_freeze = True

        # If the project is not frozen enough yet freeze it
        if not (no_freeze or self.api.prj_frozen_enough(self.target_project)):
            print(
                'Project needs to be frozen or there was no change for last %d days.'
                % MAX_FROZEN_AGE)
            print(
                'Please freeze the project or use an option to ignore the time from the last freee.'
            )
            return False

        # picks new candidate requests only if it's not to move requests
        # ie. the review state of staging-project must be new if newcand is True
        newcand = not move

        requests = RequestFinder.find_sr(requests,
                                         self.api,
                                         newcand,
                                         consider_stagings=move)
        requests_count = len(requests)
        for index, request in enumerate(requests, start=1):
            print('({}/{}) '.format(index, requests_count), end='')
            if not self.select_request(
                    request, move, filter_from,
                    remove_exclusion=remove_exclusion):
                return False

        # Notify everybody about the changes
        self.api.update_status_or_deactivate(self.target_project, 'select')
        for fprj in self.affected_projects:
            self.api.update_status_or_deactivate(fprj, 'select')

        return True
    def perform(self, packages):
        """
        Remove request from staging project
        :param packages: packages/requests to delete from staging projects
        """

        affected_projects = set()
        for request, request_project in RequestFinder.find_staged_sr(packages, self.api).items():
            staging_project = request_project["staging"]
            affected_projects.add(staging_project)
            msg = 'Unselecting "{}" from "{}"'.format(request, staging_project)
            print(msg)
            self.api.rm_from_prj(staging_project, request_id=request)
            self.api.add_review(request, by_group=self.api.cstaging_group, msg="Please recheck")

        # Notify everybody about the changes
        for prj in affected_projects:
            self.api.update_status_comments(prj, "unselect")
    def perform(self, packages):
        """
        Remove request from staging project
        :param packages: packages/requests to delete from staging projects
        """

        affected_projects = set()
        for request, request_project in RequestFinder.find_staged_sr(packages,
                                                                     self.api).items():
            staging_project = request_project['staging']
            affected_projects.add(staging_project)
            msg = 'Unselecting "{}" from "{}"'.format(request, staging_project)
            print(msg)
            self.api.rm_from_prj(staging_project, request_id=request, msg='Removing from {}, re-evaluation needed'.format(staging_project))
            self.api.add_review(request, by_group=self.api.cstaging_group, msg='Requesting new staging review')

        # Notify everybody about the changes
        for prj in affected_projects:
            self.api.update_status_comments(prj, 'unselect')
    def perform(self, packages):
        """
        Remove request from staging project
        :param packages: packages/requests to delete from staging projects
        """

        affected_projects = set()
        for request, request_project in RequestFinder.find_staged_sr(
                packages, self.api).items():
            staging_project = request_project['staging']
            affected_projects.add(staging_project)
            msg = 'Unselecting "{}" from "{}"'.format(request, staging_project)
            print(msg)
            self.api.rm_from_prj(staging_project, request_id=request)
            self.api.add_review(request,
                                by_group=self.api.cstaging_group,
                                msg='Please recheck')

        # Notify everybody about the changes
        for prj in affected_projects:
            self.api.update_status_comments(prj, 'unselect')
Example #22
0
    def perform(self, packages, cleanup=False):
        """
        Remove request from staging project
        :param packages: packages/requests to delete from staging projects
        """

        if cleanup:
            obsolete = self.api.project_status_requests(
                'obsolete', self.filter_obsolete)
            if len(obsolete) > 0:
                print('Cleanup {} obsolete requests'.format(len(obsolete)))
                packages += tuple(obsolete)

        ignored_requests = self.api.get_ignored_requests()
        affected_projects = set()
        for request, request_project in RequestFinder.find_staged_sr(
                packages, self.api).items():
            staging_project = request_project['staging']
            affected_projects.add(staging_project)
            msg = 'Unselecting "{}" from "{}"'.format(request, staging_project)
            print(msg)
            self.api.rm_from_prj(
                staging_project,
                request_id=request,
                msg='Removing from {}, re-evaluation needed'.format(
                    staging_project))
            self.api.add_review(request,
                                by_group=self.api.cstaging_group,
                                msg='Requesting new staging review')

            req = get_request(self.api.apiurl, str(request))
            if req.state.name in (
                    'new', 'review') and request not in ignored_requests:
                print(
                    '  Consider marking the request ignored to let others know not to restage.'
                )

        # Notify everybody about the changes
        for prj in affected_projects:
            self.api.update_status_or_deactivate(prj, 'unselect')
    def perform(self, requests, cleanup=False):
        """
        Unignore a request by removing from ignore list.
        """

        requests_ignored = self.api.get_ignored_requests()
        length = len(requests_ignored)

        if len(requests) == 1 and requests[0] == 'all':
            requests_ignored = {}
        else:
            for request_id in RequestFinder.find_sr(requests, self.api):
                if request_id in requests_ignored:
                    print('{}: unignored'.format(request_id))
                    del requests_ignored[request_id]
                    self.comment.add_comment(request_id=str(request_id), comment=self.MESSAGE)

        if cleanup:
            now = datetime.now()
            for request_id in set(requests_ignored):
                request = get_request(self.api.apiurl, str(request_id))
                if request.state.name not in ('new', 'review'):
                    changed = dateutil.parser.parse(request.state.when)
                    diff = now - changed
                    if diff.days > 3:
                        print('Removing {} which was {} {} days ago'
                              .format(request_id, request.state.name, diff.days))
                        del requests_ignored[request_id]

        diff = length - len(requests_ignored)
        if diff > 0:
            self.api.set_ignored_requests(requests_ignored)
            print('Unignored {} requests'.format(diff))
        else:
            print('No requests to unignore')

        return True
    def perform(self, requests, move=False,
                filter_from=None, no_freeze=False):
        """
        Select package and move it accordingly by arguments
        :param target_project: project we want to target
        :param requests: requests we are working with
        :param move: wether to move the requests or not
        :param filter_from: filter request list to only those from a specific staging
        """

        if self.api.is_adi_project(self.target_project):
            no_freeze = True

        # If the project is not frozen enough yet freeze it
        if not (no_freeze or self.api.prj_frozen_enough(self.target_project)):
            print('Project needs to be frozen or there was no change for last %d days.' % MAX_FROZEN_AGE)
            print('Please freeze the project or use an option to ignore the time from the last freee.')
            return False
            # FreezeCommand(self.api).perform(self.target_project)

        # picks new candidate requests only if it's not to move requests
        # ie. the review state of staging-project must be new if newcand is True
        newcand = not move

        requests = RequestFinder.find_sr(requests, self.api, newcand)
        requests_count = len(requests)
        for index, request in enumerate(requests, start=1):
            print('({}/{}) '.format(index, requests_count), end='')
            if not self.select_request(request, move, filter_from):
                return False

        # Notify everybody about the changes
        self.api.update_status_or_deactivate(self.target_project, 'select')
        for fprj in self.affected_projects:
            self.api.update_status_or_deactivate(fprj, 'select')

        return True
    def perform(self, requests, move=False,
                from_=None, no_freeze=False):
        """
        Select package and move it accordingly by arguments
        :param target_project: project we want to target
        :param requests: requests we are working with
        :param move: wether to move the requests or not
        :param from_: location where from move the requests
        """

        if self.api.is_adi_project(self.target_project):
            no_freeze = True

        # If the project is not frozen enough yet freeze it
        if not (no_freeze or self.api.prj_frozen_enough(self.target_project)):
            print('Freeze the prj first')
            return False
            # FreezeCommand(self.api).perform(self.target_project)

        # picks new candidate requests only if it's not to move requests
        # ie. the review state of staging-project must be new if newcand is True
        newcand = not move

        for request in RequestFinder.find_sr(requests, self.api, newcand):
            if not self.select_request(request, move, from_):
                return False

        # Notify everybody about the changes
        self.api.update_status_comments(self.target_project, 'select')
        for fprj in self.affected_projects:
            self.api.update_status_comments(fprj, 'select')

        # now make sure we enable the prj if the prj contains any ringed package
        self.api.build_switch_staging_project(self.target_project)

        return True