def run(dry_run, gitlab_project_id=None, gitlab_merge_request_id=None): instance = queries.get_gitlab_instance() settings = queries.get_app_interface_settings() gl = GitLabApi(instance, project_id=gitlab_project_id, settings=settings) labels = gl.get_merge_request_labels(gitlab_merge_request_id) output = 'yes' if 'skip-ci' in labels else 'no' print(output)
def run(dry_run, gitlab_project_id=None, gitlab_merge_request_id=None): instance = queries.get_gitlab_instance() settings = queries.get_app_interface_settings() gl = GitLabApi(instance, project_id=gitlab_project_id, settings=settings) project_labels = gl.get_project_labels() labels = gl.get_merge_request_labels(gitlab_merge_request_id) changed_paths = \ gl.get_merge_request_changed_paths(gitlab_merge_request_id) guessed_labels = guess_labels(project_labels, changed_paths) labels_to_add = [l for l in guessed_labels if l not in labels] if labels_to_add: logging.info(['add_labels', labels_to_add]) gl.add_labels_to_merge_request(gitlab_merge_request_id, labels_to_add)
class GitlabForkCompliance: OK = 0x0000 ERR_MASTER_BRANCH = 0x0001 ERR_NOT_A_MEMBER = 0x0002 ERR_NOT_A_MAINTAINER = 0x0004 def __init__(self, project_id, mr_id, maintainers_group): self.exit_code = self.OK self.maintainers_group = maintainers_group self.instance = queries.get_gitlab_instance() self.settings = queries.get_app_interface_settings() self.gl_cli = GitLabApi(self.instance, project_id=project_id, settings=self.settings) self.mr = self.gl_cli.get_merge_request(mr_id) self.src = GitLabApi(self.instance, project_id=self.mr.source_project_id, settings=self.settings) def run(self): self.exit_code |= self.check_branch() self.exit_code |= self.check_bot_access() if self.exit_code: sys.exit(self.exit_code) # At this point, we know that the bot is a maintainer, so # we check if all the maintainers are in the fork, adding those # who are not group = self.gl_cli.gl.groups.get(self.maintainers_group) maintainers = group.members.list() project_maintainers = self.src.get_project_maintainers() for member in maintainers: if member.username in project_maintainers: continue LOG.info([f'adding {member.username} as maintainer']) user_payload = {'user_id': member.id, 'access_level': MAINTAINER_ACCESS} member = self.src.project.members.create(user_payload) member.save() # Last but not least, we remove the blocked label, in case # it is set mr_labels = self.gl_cli.get_merge_request_labels(self.mr.iid) if BLOCKED_LABEL in mr_labels: self.gl_cli.remove_label_from_merge_request(self.mr.iid, BLOCKED_LABEL) sys.exit(self.exit_code) def check_branch(self): # The Merge Request can use the 'master' source branch if self.mr.source_branch == 'master': self.handle_error('source branch can not be master', MSG_BRANCH) return self.ERR_MASTER_BRANCH return self.OK def check_bot_access(self): # The bot needs access to the fork project try: project_bot = self.src.project.members.get(self.gl_cli.user.id) except GitlabGetError: self.handle_error('access denied for user {bot}', MSG_ACCESS) return self.ERR_NOT_A_MEMBER # The bot has to be a maintainer of the fork project if not project_bot or project_bot.access_level != MAINTAINER_ACCESS: self.handle_error('{bot} is not a maintainer in the fork project', MSG_ACCESS) return self.ERR_NOT_A_MAINTAINER return self.OK def handle_error(self, log_msg, mr_msg): LOG.error([log_msg.format(bot=self.gl_cli.user.username)]) self.gl_cli.add_label_to_merge_request(self.mr.iid, BLOCKED_LABEL) comment = mr_msg.format(user=self.mr.author['username'], bot=self.gl_cli.user.username, project_name=self.gl_cli.project.name) self.mr.notes.create({'body': comment})