Esempio n. 1
0
    def add_reviewer(self, account_id):
        """
        Endpoint for adding a reviewer to a change-id
        :param account_id: The user account that should be added as a reviewer
        :type account_id: str
        :return: You get a True boolean type if the addition of this user was successful
        :rtype: bool
        :except: LookupError, AlreadyExists, UnhandledError
        """
        r_endpoint = "/a/changes/%s/reviewers" % self._change_id
        payload = {"reviewer": "%s" % account_id}

        req = self._gerrit_con.call(request='post',
                                    r_endpoint=r_endpoint,
                                    r_payload=payload)

        result = req.content.decode('utf-8')

        if "does not identify a registered user or group" in result:
            raise LookupError(result)

        # If the above doesn't match then it should be json data we get.
        json_result = decode_json(result)

        try:
            if len(json_result.get('reviewers', False)) == 0:
                raise AlreadyExists('The requested user \'%s\' is \
                    already an reviewer' % account_id)
            elif len(json_result.get('reviewers', False)) >= 1:
                return True
        except TypeError:
            raise UnhandledError(json_result)
Esempio n. 2
0
    def get_project(self, name):
        """
        Get ProjectInfo for a project
        :returns: Dict of the ProjectInfo for the project
        :rtype: dict
        :exception: ValueError, UnhandledError
        """

        if name == '':
            raise KeyError('Project name required')

        r_endpoint = "/a/projects/%s/" % name

        req = self._gerrit_con.call(r_endpoint=r_endpoint)

        status_code = req.status_code
        result = req.content.decode('utf-8')

        if status_code == 200:
            project_info = decode_json(result)
            self.name = project_info.get('name')
            self.parent = project_info.get('parent')
            self.description = project_info.get('description')
            self.state = project_info.get('state')
            self.branches = project_info.get('branches')
            self.web_links = project_info.get('web_links')
            return self
        elif status_code == 404:
            raise ValueError(result)
        else:
            raise UnhandledError(result)
Esempio n. 3
0
    def create_project(self, name, options):
        """
        Create a project
        :param name: Name of the project
        :type name: str
        :param options: Additional options
        :type options: dict

        :return: Project if successful
        :rtype: gerrit.projects.Project
        :exception: AlreadyExists, UnhandledError
        """

        r_endpoint = "/a/projects/%s" % name

        if options is None:
            options = {}

        req = self._gerrit_con.call(
            request='put',
            r_endpoint=r_endpoint,
            r_payload=options,
        )

        result = req.content.decode('utf-8')

        if req.status_code == 201:
            return self.get_project(name)
        elif req.status_code == 409:
            raise AlreadyExists(result)
        else:
            raise UnhandledError(result)
Esempio n. 4
0
    def submit_change(self, options=None):
        """
        Submit the change
        :param options: Additional options
        :type options: dict
        :return: On success, the updated Change object
        :rtype: Change object
        """

        r_endpoint = {
            'pre': '/a/changes/',
            'data': self.full_id,
            'post': '/submit/',
        }

        if options is None:
            options = {}

        req = self._gerrit_con.call(
            request='post',
            r_endpoint=r_endpoint,
            r_payload=options,
        )

        result = req.content.decode('utf-8')

        if req.status_code == 200:
            self.status = decode_json(result).get('status')
        else:
            raise UnhandledError(result)
Esempio n. 5
0
    def set_review(self, labels=None, message='', comments=None):
        """
        Endpoint to create a review for a change_id and a specific patch set
        :param labels: This is used to set +2 Code-Review for example.
        :type labels: dict
        :param message: The message will appear in the actually change-request page.
        :type message: str
        :param comments: This will become comments in the code.
        :type comments: dict
        """

        if not labels:
            labels = {}
        if not comments:
            comments = {}
        r_endpoint = "/a/changes/%s/revisions/%s/review" % (self._change_id,
                                                            self._revision_id)
        payload = {}

        if labels:
            payload['labels'] = labels
        if message:
            payload['message'] = message
        if comments:
            payload['comments'] = comments

        req = self._gerrit_con.call(request='post',
                                    r_endpoint=r_endpoint,
                                    r_payload=payload)

        status_code = req.status_code
        if status_code == 200:
            return True
        else:
            raise UnhandledError(req.content)
Esempio n. 6
0
    def get_change(self, project, branch, change_id):
        """
        Get ChangeInfo for a change
        :returns: Dict of the ChangeInfo for the change
        :rtype: Change
        :exception: ValueError, UnhandledError
        """
        if isinstance(project, Project):
            project = project.name

        if project == '':
            raise KeyError('Project required')

        if branch == '':
            raise KeyError('Branch required')

        if change_id == '':
            raise KeyError('Id required')

        # HTTP REST API HEADERS
        self._change_id = '%s~%s~%s' % (project, branch, change_id)

        r_endpoint = {
            'pre': '/a/changes/',
            'data': self._change_id,
        }

        req = self._gerrit_con.call(r_endpoint=r_endpoint)

        status_code = req.status_code
        result = req.content.decode('utf-8')

        if status_code == 200:
            change_info = decode_json(result)
        elif status_code == 404:
            raise ValueError(result)
        else:
            raise UnhandledError(result)

        self.full_id = change_info.get('id')
        if self.full_id is not None:
            self.full_id = urllib.parse.unquote(self.full_id)
        self.project = change_info.get('project')
        self.branch = change_info.get('branch')
        self.change_id = change_info.get('change_id')
        self.subject = change_info.get('subject')
        self.status = change_info.get('status')
        self.created = change_info.get('created')
        self.updated = change_info.get('updated')
        self.mergable = change_info.get('mergable')
        self.insertions = change_info.get('insertions')
        self.deletions = change_info.get('deletions')
        self.number = change_info.get('number')
        self.owner = change_info.get('owner')

        return self
Esempio n. 7
0
    def create_change(self, project, subject, branch, options):
        """
        Create a change
        :param project: Project to create change in
        :type project: str or gerrit.project.Project
        :param subject: Subject of the change
        :type subject: str
        :param branch: The name of the target branch
        :type branch: str
        :param options: Additional options
        :type options: dict
        """

        r_endpoint = "/a/changes/"

        if isinstance(project, Project):
            project = project.name

        data = {
            'project': project,
            'subject': subject,
            'branch': branch,
        }

        if options is None:
            options = {}

        for key in options.keys():
            data[key] = options[key]

        req = self._gerrit_con.call(
            request='post',
            r_endpoint=r_endpoint,
            r_payload=data,
        )

        result = req.content.decode('utf-8')

        if req.status_code == 201:
            change = Change(self._gerrit_con)
            return change.get_change(project, branch,
                                     decode_json(result).get('change_id'))
        else:
            raise UnhandledError(result)
Esempio n. 8
0
    def list_reviewers(self):
        """
        Endpoint to list reviewers for a change-id
        :returns: The reviews for the specified change-id at init
        :rtype: dict
        :exception: ValueError, UnhandledError
        """
        r_endpoint = "/a/changes/%s/reviewers/" % self._change_id

        req = self._gerrit_con.call(r_endpoint=r_endpoint)

        status_code = req.status_code
        result = req.content.decode('utf-8')

        if status_code == 404:
            raise ValueError(result)
        elif status_code != 200:
            raise UnhandledError(result)

        json_result = decode_json(result)

        return json_result
Esempio n. 9
0
    def delete(self, options=None):
        """
        Delete the project, requires delete-project plugin
        :returns: True if delete succeeds
        :rtype: Bool
        :exception: UnhandledError
        """
        r_endpoint = '/a/projects/%s' % self.name

        req = self._gerrit_con.call(
            request='delete',
            r_endpoint=r_endpoint,
            r_headers={},
            r_payload=options,
        )

        status_code = req.status_code

        if status_code == 204:
            return True
        else:
            result = req.content.decode('utf-8')
            raise UnhandledError(result)