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)
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)
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)
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)
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)
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
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)
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
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)