diff --git a/plugins/labhub.py b/plugins/labhub.py index 7616ba06..1ab9692c 100644 --- a/plugins/labhub.py +++ b/plugins/labhub.py @@ -381,3 +381,89 @@ def pr_stats(self, msg, match): state=type(self).community_state(pr_count) ) yield reply + + + @re_botcmd(pattern=r'^migrate\s+https://(github|gitlab)\.com/([^/]+)/([^/]+)/+issues/(\d+)\s+https://(github|gitlab)\.com/([^/]+)/([^/]+)/*$', # Ignore LineLengthBear, PyCodeStyleBear + re_cmd_name_help='migrate ', # Ignore LineLengthBear, PyCodeStyleBear + flags=re.IGNORECASE) + def migrate_issue(self, msg, match): + """Migrate an issue from one repo + to another repo of coala""" # Ignore QuotesBear + org = match.group(2) + repo_name_orig = match.group(3) + issue_number = match.group(4) + + try: + assert org == self.GH_ORG_NAME or org == self.GL_ORG_NAME + except AssertionError: + yield 'First repository not owned by our org.' + return + + try: + assert match.group(6) == self.GH_ORG_NAME or match.group(6) == self.GL_ORG_NAME + except AssertionError: + yield 'Second repository not owned by our org.' + return + + repo_name_final = match.group(7) + + if repo_name_orig in self.REPOS and repo_name_final in self.REPOS: + pass + else: + return tenv().get_template( + 'labhub/errors/no-repository.jinja2.md' + ).render( + target=user, + ) + + user = msg.frm.nick + if self.TEAMS[self.GH_ORG_NAME + ' maintainers'].is_member(user): + pass + else: + return tenv().get_template( + 'labhub/errors/not-maintainer.jinja2.md' + ).render( + action='migrate issues', + target=user, + ) + + try: + old_issue = self.REPOS[repo_name_orig].get_issue(int(issue_number)) + except KeyError: + return 'Issue doesn\'t exist.' + + if old_issue.is_closed(): + return 'Issue cannot be migrated as it has been closed already.' + else: + pass + + old_issue.add_labels('Invalid') + + new_issue_title = str(old_issue.title) + new_issue_description = str(old_issue.body).rstrip() + extra_msg = '\n\nMigrated issue from '+old_issue.html_url + extra_msg += ' by @'+user + new_issue = self.REPOS[repo_name_final].create_issue(new_issue_title, new_issue_description + extra_msg) # Ignore LineLengthBear, PyCodeStyleBear + + new_issue.add_labels(old_issue.labels) + + old_comments_iter = old_issue.iter_comments() + while(True): + try: + com = old_comments_iter.next() + auth = com.user + url = com.html_url + old_body = com.body + update_dt = com.updated_at + new_body = old_body.rstrip()+'\n\nOriginally written by @'+auth+' on '+str(update_dt) # Ignore LineLengthBear, PyCodeStyleBear + new_body += ' and can view it [here!]('+url+')' + new_issue.create_comment(new_body) + except StopIteration: + break + + url_new = new_issue.html_url + msg_to_old_repo = '\n\nIssue has been migrated to another [repository here!]('+url_new+') by @'+user+'.' # Ignore LineLengthBear, PyCodeStyleBear + edited_body = str(old_issue.body).rstip()+msg_to_old_repo + old_issue.edit(body = edited_body) + old_issue.close() +