def run(self, ctxt: context.Context, rule: rules.EvaluatedRule) -> check_api.Result: if not config.GITHUB_APP: return check_api.Result( check_api.Conclusion.FAILURE, "Unavailable with GitHub Action", "Due to GitHub Action limitation, the `rebase` command is only available " "with the Mergify GitHub App.", ) if ctxt.is_behind: if ctxt.github_workflow_changed(): return check_api.Result( check_api.Conclusion.ACTION_REQUIRED, "Pull request must be rebased manually.", "GitHub App like Mergify are not allowed to rebase pull request where `.github/workflows` is changed.", ) try: branch_updater.update_with_git(ctxt, "rebase", self.config["bot_account"]) return check_api.Result( check_api.Conclusion.SUCCESS, "Branch has been successfully rebased", "", ) except branch_updater.BranchUpdateFailure as e: return check_api.Result(check_api.Conclusion.FAILURE, "Branch rebase failed", str(e)) else: return check_api.Result(check_api.Conclusion.SUCCESS, "Branch already up to date", "")
def merge_report(self, ctxt: context.Context) -> typing.Optional[check_api.Result]: if ctxt.pull["draft"]: conclusion = check_api.Conclusion.PENDING title = "Draft flag needs to be removed" summary = "" elif ctxt.pull["merged"]: if ctxt.pull["merged_by"] is None: mode = "somehow" elif ctxt.pull["merged_by"]["login"] in [ "mergify[bot]", "mergify-test[bot]", ]: mode = "automatically" else: mode = "manually" conclusion = check_api.Conclusion.SUCCESS title = "The pull request has been merged %s" % mode summary = "The pull request has been merged %s at *%s*" % ( mode, ctxt.pull["merge_commit_sha"], ) elif ctxt.pull["state"] == "closed": conclusion = check_api.Conclusion.CANCELLED title = "The pull request has been closed manually" summary = "" # NOTE(sileht): Take care of all branch protection state elif ctxt.pull["mergeable_state"] == "dirty": conclusion = check_api.Conclusion.CANCELLED title = "Merge conflict needs to be solved" summary = "" elif ctxt.pull["mergeable_state"] == "unknown": conclusion = check_api.Conclusion.FAILURE title = "Pull request state reported as `unknown` by GitHub" summary = "" # FIXME(sileht): We disable this check as github wrongly report # mergeable_state == blocked sometimes. The workaround is to try to merge # it and if that fail we checks for blocking state. # elif ctxt.pull["mergeable_state"] == "blocked": # conclusion = "failure" # title = "Branch protection settings are blocking automatic merging" # summary = "" elif ( ctxt.pull["mergeable_state"] == "behind" and self.config["strict"] is StrictMergeParameter.false ): # Strict mode has been enabled in branch protection but not in # mergify conclusion = check_api.Conclusion.FAILURE title = "Branch protection setting 'strict' conflicts with Mergify configuration" summary = "" elif ctxt.github_workflow_changed(): conclusion = check_api.Conclusion.ACTION_REQUIRED title = "Pull request must be merged manually." summary = """GitHub App like Mergify are not allowed to merge pull request where `.github/workflows` is changed. <br /> This pull request must be merged manually.""" # NOTE(sileht): remaining state "behind, clean, unstable, has_hooks # are OK for us else: return None return check_api.Result(conclusion, title, summary)