e27ac0ddbe
We uses `pyupgrade --py3-plus` to automatically replace all occurence of `Text`. But manual fix is required to remove the unused imports. Note that with this configuration pyupgrade also convert string literals to .format(...) style, which is manually not included in the commit as well.
104 lines
3.4 KiB
Python
Executable file
104 lines
3.4 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
# Zulip notification post-receive hook.
|
|
#
|
|
# The "post-receive" script is run after receive-pack has accepted a pack
|
|
# and the repository has been updated. It is passed arguments in through
|
|
# stdin in the form
|
|
# <oldrev> <newrev> <refname>
|
|
# For example:
|
|
# aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
|
|
|
|
import os
|
|
import os.path
|
|
import subprocess
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
import zulip_git_config as config
|
|
|
|
VERSION = "0.9"
|
|
|
|
if config.ZULIP_API_PATH is not None:
|
|
sys.path.append(config.ZULIP_API_PATH)
|
|
|
|
import zulip
|
|
|
|
client = zulip.Client(
|
|
email=config.ZULIP_USER,
|
|
site=config.ZULIP_SITE,
|
|
api_key=config.ZULIP_API_KEY,
|
|
client="ZulipGit/" + VERSION,
|
|
)
|
|
|
|
|
|
def git_repository_name() -> str:
|
|
output = subprocess.check_output(["git", "rev-parse", "--is-bare-repository"])
|
|
if output.strip() == "true":
|
|
return os.path.basename(os.getcwd())[: -len(".git")]
|
|
else:
|
|
return os.path.basename(os.path.dirname(os.getcwd()))
|
|
|
|
|
|
def git_commit_range(oldrev: str, newrev: str) -> str:
|
|
log_cmd = ["git", "log", "--reverse", "--pretty=%aE %H %s", "%s..%s" % (oldrev, newrev)]
|
|
commits = ""
|
|
for ln in subprocess.check_output(log_cmd, universal_newlines=True).splitlines():
|
|
author_email, commit_id, subject = ln.split(None, 2)
|
|
if hasattr(config, "format_commit_message"):
|
|
commits += config.format_commit_message(author_email, subject, commit_id)
|
|
else:
|
|
commits += "!avatar(%s) %s\n" % (author_email, subject)
|
|
return commits
|
|
|
|
|
|
def send_bot_message(oldrev: str, newrev: str, refname: str) -> None:
|
|
repo_name = git_repository_name()
|
|
branch = refname.replace("refs/heads/", "")
|
|
destination = config.commit_notice_destination(repo_name, branch, newrev)
|
|
if destination is None:
|
|
# Don't forward the notice anywhere
|
|
return
|
|
|
|
new_head = newrev[:12]
|
|
old_head = oldrev[:12]
|
|
|
|
if (
|
|
oldrev == "0000000000000000000000000000000000000000"
|
|
or newrev == "0000000000000000000000000000000000000000"
|
|
):
|
|
# New branch pushed or old branch removed
|
|
added = ""
|
|
removed = ""
|
|
else:
|
|
added = git_commit_range(oldrev, newrev)
|
|
removed = git_commit_range(newrev, oldrev)
|
|
|
|
if oldrev == "0000000000000000000000000000000000000000":
|
|
message = "`%s` was pushed to new branch `%s`" % (new_head, branch)
|
|
elif newrev == "0000000000000000000000000000000000000000":
|
|
message = "branch `%s` was removed (was `%s`)" % (branch, old_head)
|
|
elif removed:
|
|
message = "`%s` was pushed to `%s`, **REMOVING**:\n\n%s" % (new_head, branch, removed)
|
|
if added:
|
|
message += "\n**and adding**:\n\n" + added
|
|
message += "\n**A HISTORY REWRITE HAS OCCURRED!**"
|
|
message += "\n@everyone: Please check your local branches to deal with this."
|
|
elif added:
|
|
message = "`%s` was deployed to `%s` with:\n\n%s" % (new_head, branch, added)
|
|
else:
|
|
message = "`%s` was pushed to `%s`... but nothing changed?" % (new_head, branch)
|
|
|
|
message_data = {
|
|
"type": "stream",
|
|
"to": destination["stream"],
|
|
"subject": destination["subject"],
|
|
"content": message,
|
|
}
|
|
client.send_message(message_data)
|
|
|
|
|
|
for ln in sys.stdin:
|
|
oldrev, newrev, refname = ln.strip().split()
|
|
send_bot_message(oldrev, newrev, refname)
|