|
Pierre-Yves Chibon |
8f4948 |
# -*- coding: utf-8 -*-
|
|
Pierre-Yves Chibon |
8f4948 |
|
|
Pierre-Yves Chibon |
8f4948 |
"""
|
|
Pierre-Yves Chibon |
5729b8 |
(c) 2016-2017 - Copyright Red Hat Inc
|
|
Pierre-Yves Chibon |
8f4948 |
|
|
Pierre-Yves Chibon |
8f4948 |
Authors:
|
|
Pierre-Yves Chibon |
8f4948 |
Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
|
|
Pierre-Yves Chibon |
8f4948 |
|
|
Pierre-Yves Chibon |
8f4948 |
"""
|
|
Pierre-Yves Chibon |
8f4948 |
|
|
Pierre-Yves Chibon |
67d1cc |
from __future__ import unicode_literals, print_function, absolute_import
|
|
Aurélien Bompard |
dcf6f6 |
|
|
Pierre-Yves Chibon |
420d37 |
import logging
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
import pygit2
|
|
Pierre-Yves Chibon |
420d37 |
import six
|
|
Pierre-Yves Chibon |
8f4948 |
|
|
Pierre-Yves Chibon |
420d37 |
import pagure.config
|
|
Pierre-Yves Chibon |
420d37 |
import pagure.exceptions
|
|
Pierre-Yves Chibon |
930073 |
import pagure.lib.query
|
|
Pierre-Yves Chibon |
420d37 |
import pagure.lib.tasks
|
|
Pierre-Yves Chibon |
420d37 |
import pagure.lib.tasks_services
|
|
Pierre-Yves Chibon |
420d37 |
import pagure.utils
|
|
Pierre-Yves Chibon |
420d37 |
from pagure.hooks import BaseHook, BaseRunner
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
_config = pagure.config.reload_config()
|
|
Pierre-Yves Chibon |
420d37 |
_log = logging.getLogger(__name__)
|
|
Pierre-Yves Chibon |
8f4948 |
|
|
Pierre-Yves Chibon |
8f4948 |
|
|
Pierre-Yves Chibon |
7190cf |
FEDMSG_INIT = False
|
|
Pierre-Yves Chibon |
7190cf |
|
|
Pierre-Yves Chibon |
7190cf |
|
|
Pierre-Yves Chibon |
420d37 |
def send_fedmsg_notifications(project, topic, msg):
|
|
Pierre-Yves Chibon |
5313a3 |
""" If the user or admin asked for fedmsg notifications on commit, this will
|
|
Pierre-Yves Chibon |
420d37 |
do it.
|
|
Pierre-Yves Chibon |
420d37 |
"""
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
5313a3 |
fedmsg_hook = pagure.lib.plugins.get_plugin("Fedmsg")
|
|
Pierre-Yves Chibon |
5313a3 |
fedmsg_hook.db_object()
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
5313a3 |
always_fedmsg = _config.get("ALWAYS_FEDMSG_ON_COMMITS") or None
|
|
Pierre-Yves Chibon |
5313a3 |
|
|
Pierre-Yves Chibon |
5313a3 |
# Send fedmsg and fedora-messaging notification
|
|
Pierre-Yves Chibon |
5313a3 |
# (if fedmsg and fedora-messaging are there and set-up)
|
|
Pierre-Yves Chibon |
5313a3 |
if always_fedmsg or (project.fedmsg_hook and project.fedmsg_hook.active):
|
|
Pierre-Yves Chibon |
a8bd0f |
if _config.get("FEDMSG_NOTIFICATIONS", True):
|
|
Pierre-Yves Chibon |
a8bd0f |
try:
|
|
Pierre-Yves Chibon |
7190cf |
global FEDMSG_INIT
|
|
Pierre-Yves Chibon |
a8bd0f |
print(" - to fedmsg")
|
|
Pierre-Yves Chibon |
a8bd0f |
import fedmsg
|
|
Pierre-Yves Chibon |
a8bd0f |
|
|
Pierre-Yves Chibon |
a8bd0f |
config = fedmsg.config.load_config([], None)
|
|
Pierre-Yves Chibon |
a8bd0f |
config["active"] = True
|
|
Pierre-Yves Chibon |
a8bd0f |
config["endpoints"]["relay_inbound"] = config["relay_inbound"]
|
|
Pierre-Yves Chibon |
7190cf |
if not FEDMSG_INIT:
|
|
Pierre-Yves Chibon |
7190cf |
fedmsg.init(name="relay_inbound", **config)
|
|
Pierre-Yves Chibon |
7190cf |
FEDMSG_INIT = True
|
|
Pierre-Yves Chibon |
a8bd0f |
|
|
Pierre-Yves Chibon |
a8bd0f |
pagure.lib.notify.fedmsg_publish(topic=topic, msg=msg)
|
|
Pierre-Yves Chibon |
a8bd0f |
except Exception:
|
|
Pierre-Yves Chibon |
a8bd0f |
_log.exception(
|
|
Pierre-Yves Chibon |
a8bd0f |
"Error sending fedmsg notifications on commit push"
|
|
Pierre-Yves Chibon |
a8bd0f |
)
|
|
Pierre-Yves Chibon |
a8bd0f |
|
|
Pierre-Yves Chibon |
a8bd0f |
if _config.get("FEDORA_MESSAGING_NOTIFICATIONS", False):
|
|
Pierre-Yves Chibon |
a8bd0f |
try:
|
|
Pierre-Yves Chibon |
a8bd0f |
print(" - to fedora-message")
|
|
Pierre-Yves Chibon |
a8bd0f |
pagure.lib.notify.fedora_messaging_publish(topic, msg)
|
|
Pierre-Yves Chibon |
a8bd0f |
except Exception:
|
|
Pierre-Yves Chibon |
a8bd0f |
_log.exception(
|
|
Pierre-Yves Chibon |
a8bd0f |
"Error sending fedora-messaging notifications on "
|
|
Pierre-Yves Chibon |
a8bd0f |
"commit push"
|
|
Pierre-Yves Chibon |
a8bd0f |
)
|
|
Pierre-Yves Chibon |
5313a3 |
|
|
Pierre-Yves Chibon |
5313a3 |
|
|
Pierre-Yves Chibon |
5313a3 |
def send_stomp_notifications(project, topic, msg):
|
|
Pierre-Yves Chibon |
5313a3 |
""" If the user or admin asked for stomp notifications on commit, this will
|
|
Pierre-Yves Chibon |
5313a3 |
do it.
|
|
Pierre-Yves Chibon |
5313a3 |
"""
|
|
Pierre-Yves Chibon |
5313a3 |
always_stomp = _config.get("ALWAYS_STOMP_ON_COMMITS") or None
|
|
Pierre-Yves Chibon |
5313a3 |
# Send stomp notification (if stomp is there and set-up)
|
|
Pierre-Yves Chibon |
5313a3 |
if always_stomp or (project.fedmsg_hook and project.fedmsg_hook.active):
|
|
Pierre-Yves Chibon |
5313a3 |
try:
|
|
Pierre-Yves Chibon |
5313a3 |
print(" - to stomp")
|
|
Pierre-Yves Chibon |
5313a3 |
pagure.lib.notify.stomp_publish(topic, msg)
|
|
Pierre-Yves Chibon |
5313a3 |
except Exception:
|
|
Pierre-Yves Chibon |
5313a3 |
_log.exception("Error sending stomp notifications on commit push")
|
|
Pierre-Yves Chibon |
5313a3 |
|
|
Pierre-Yves Chibon |
5313a3 |
|
|
Pierre-Yves Chibon |
5313a3 |
def send_mqtt_notifications(project, topic, msg):
|
|
Pierre-Yves Chibon |
5313a3 |
""" If the user or admin asked for mqtt notifications on commit, this will
|
|
Pierre-Yves Chibon |
5313a3 |
do it.
|
|
Pierre-Yves Chibon |
5313a3 |
"""
|
|
Pierre-Yves Chibon |
5313a3 |
always_mqtt = _config.get("ALWAYS_MQTT_ON_COMMITS") or None
|
|
Pierre-Yves Chibon |
5313a3 |
# Send mqtt notification (if mqtt is there and set-up)
|
|
Pierre-Yves Chibon |
5313a3 |
if always_mqtt or (project.fedmsg_hook and project.fedmsg_hook.active):
|
|
Pierre-Yves Chibon |
5313a3 |
try:
|
|
Pierre-Yves Chibon |
5313a3 |
print(" - to mqtt")
|
|
Pierre-Yves Chibon |
5313a3 |
pagure.lib.notify.mqtt_publish(topic, msg)
|
|
Pierre-Yves Chibon |
5313a3 |
except Exception:
|
|
Pierre-Yves Chibon |
5313a3 |
_log.exception("Error sending stomp notifications on commit push")
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
def send_webhook_notifications(project, topic, msg):
|
|
Pierre-Yves Chibon |
420d37 |
""" If the user asked for webhook notifications on commit, this will
|
|
Pierre-Yves Chibon |
420d37 |
do it.
|
|
Pierre-Yves Chibon |
420d37 |
"""
|
|
Pierre-Yves Chibon |
5313a3 |
if project.settings.get("Web-hooks"):
|
|
Pierre-Yves Chibon |
5313a3 |
try:
|
|
Pierre-Yves Chibon |
5313a3 |
print(" - to web-hooks")
|
|
Pierre-Yves Chibon |
5313a3 |
pagure.lib.tasks_services.webhook_notification.delay(
|
|
Pierre-Yves Chibon |
5313a3 |
topic=topic,
|
|
Pierre-Yves Chibon |
5313a3 |
msg=msg,
|
|
Pierre-Yves Chibon |
5313a3 |
namespace=project.namespace,
|
|
Pierre-Yves Chibon |
5313a3 |
name=project.name,
|
|
Pierre-Yves Chibon |
5313a3 |
user=project.user.username if project.is_fork else None,
|
|
Pierre-Yves Chibon |
5313a3 |
)
|
|
Pierre-Yves Chibon |
5313a3 |
except Exception:
|
|
Pierre-Yves Chibon |
5313a3 |
_log.exception(
|
|
Pierre-Yves Chibon |
5313a3 |
"Error sending web-hook notifications on commit push"
|
|
Pierre-Yves Chibon |
5313a3 |
)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
7190cf |
def send_action_notification(
|
|
Pierre-Yves Chibon |
7190cf |
session, subject, action, project, repodir, user, refname, rev
|
|
Pierre-Yves Chibon |
7190cf |
):
|
|
Pierre-Yves Chibon |
7190cf |
""" Send out-going notifications about the branch that was just deleted.
|
|
Pierre-Yves Chibon |
7190cf |
"""
|
|
Pierre-Yves Chibon |
7190cf |
email = pagure.lib.git.get_author_email(rev, repodir)
|
|
Pierre-Yves Chibon |
7190cf |
name = pagure.lib.git.get_author(rev, repodir)
|
|
Pierre-Yves Chibon |
7190cf |
author = pagure.lib.query.search_user(session, email=email)
|
|
Pierre-Yves Chibon |
7190cf |
if author:
|
|
Pierre-Yves Chibon |
7190cf |
author = author.to_json(public=True)
|
|
Pierre-Yves Chibon |
7190cf |
else:
|
|
Pierre-Yves Chibon |
7190cf |
author = name
|
|
Pierre-Yves Chibon |
7190cf |
|
|
Pierre-Yves Chibon |
7190cf |
topic = "git.%s.%s" % (subject, action)
|
|
Pierre-Yves Chibon |
7190cf |
msg = dict(
|
|
Pierre-Yves Chibon |
7190cf |
authors=[author],
|
|
Pierre-Yves Chibon |
7190cf |
agent=user,
|
|
Pierre-Yves Chibon |
7190cf |
repo=project.to_json(public=True)
|
|
Pierre-Yves Chibon |
7190cf |
if not isinstance(project, six.string_types)
|
|
Pierre-Yves Chibon |
7190cf |
else project,
|
|
Pierre-Yves Chibon |
7190cf |
)
|
|
Pierre-Yves Chibon |
7190cf |
if subject == "branch":
|
|
Pierre-Yves Chibon |
7190cf |
msg["branch"] = refname
|
|
Pierre-Yves Chibon |
7190cf |
elif subject == "tag":
|
|
Pierre-Yves Chibon |
7190cf |
msg["tag"] = refname
|
|
Pierre-Yves Chibon |
7190cf |
|
|
Pierre-Yves Chibon |
7190cf |
# Send blink notification to any 3rd party plugins, if there are any
|
|
Pierre-Yves Chibon |
7190cf |
pagure.lib.notify.blinker_publish(topic, msg)
|
|
Pierre-Yves Chibon |
7190cf |
|
|
Pierre-Yves Chibon |
7190cf |
if not project.private:
|
|
Pierre-Yves Chibon |
7190cf |
send_fedmsg_notifications(project, topic, msg)
|
|
Pierre-Yves Chibon |
7190cf |
send_stomp_notifications(project, topic, msg)
|
|
Pierre-Yves Chibon |
7190cf |
send_mqtt_notifications(project, topic, msg)
|
|
Pierre-Yves Chibon |
7190cf |
send_webhook_notifications(project, topic, msg)
|
|
Pierre-Yves Chibon |
7190cf |
|
|
Pierre-Yves Chibon |
7190cf |
|
|
Pierre-Yves Chibon |
420d37 |
def send_notifications(session, project, repodir, user, refname, revs, forced):
|
|
Pierre-Yves Chibon |
420d37 |
""" Send out-going notifications about the commits that have just been
|
|
Pierre-Yves Chibon |
420d37 |
pushed.
|
|
Pierre-Yves Chibon |
420d37 |
"""
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
auths = set()
|
|
Pierre-Yves Chibon |
420d37 |
for rev in revs:
|
|
Pierre-Yves Chibon |
420d37 |
email = pagure.lib.git.get_author_email(rev, repodir)
|
|
Pierre-Yves Chibon |
420d37 |
name = pagure.lib.git.get_author(rev, repodir)
|
|
Pierre-Yves Chibon |
930073 |
author = pagure.lib.query.search_user(session, email=email) or name
|
|
Pierre-Yves Chibon |
420d37 |
auths.add(author)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
authors = []
|
|
Pierre-Yves Chibon |
420d37 |
for author in auths:
|
|
Pierre-Yves Chibon |
420d37 |
if not isinstance(author, six.string_types):
|
|
Pierre-Yves Chibon |
420d37 |
author = author.to_json(public=True)
|
|
Pierre-Yves Chibon |
420d37 |
authors.append(author)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
if revs:
|
|
Pierre-Yves Chibon |
420d37 |
revs.reverse()
|
|
Pierre-Yves Chibon |
420d37 |
print("* Publishing information for %i commits" % len(revs))
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
topic = "git.receive"
|
|
Pierre-Yves Chibon |
420d37 |
msg = dict(
|
|
Pierre-Yves Chibon |
420d37 |
total_commits=len(revs),
|
|
Pierre-Yves Chibon |
420d37 |
start_commit=revs[0],
|
|
Pierre-Yves Chibon |
420d37 |
end_commit=revs[-1],
|
|
Pierre-Yves Chibon |
420d37 |
branch=refname,
|
|
Pierre-Yves Chibon |
420d37 |
forced=forced,
|
|
Pierre-Yves Chibon |
420d37 |
authors=list(authors),
|
|
Pierre-Yves Chibon |
420d37 |
agent=user,
|
|
Pierre-Yves Chibon |
420d37 |
repo=project.to_json(public=True)
|
|
Pierre-Yves Chibon |
420d37 |
if not isinstance(project, six.string_types)
|
|
Pierre-Yves Chibon |
420d37 |
else project,
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
daeb44 |
# Send blink notification to any 3rd party plugins, if there are any
|
|
Pierre-Yves Chibon |
daeb44 |
pagure.lib.notify.blinker_publish(topic, msg)
|
|
Pierre-Yves Chibon |
daeb44 |
|
|
Pierre-Yves Chibon |
5313a3 |
if not project.private:
|
|
Pierre-Yves Chibon |
5313a3 |
send_fedmsg_notifications(project, topic, msg)
|
|
Pierre-Yves Chibon |
5313a3 |
send_stomp_notifications(project, topic, msg)
|
|
Pierre-Yves Chibon |
5313a3 |
send_mqtt_notifications(project, topic, msg)
|
|
Pierre-Yves Chibon |
5313a3 |
send_webhook_notifications(project, topic, msg)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
if (
|
|
Pierre-Yves Chibon |
420d37 |
_config.get("PAGURE_CI_SERVICES")
|
|
Pierre-Yves Chibon |
420d37 |
and project.ci_hook
|
|
Pierre-Yves Chibon |
420d37 |
and project.ci_hook.active_commit
|
|
Pierre-Yves Chibon |
420d37 |
and not project.private
|
|
Pierre-Yves Chibon |
420d37 |
):
|
|
Pierre-Yves Chibon |
420d37 |
pagure.lib.tasks_services.trigger_ci_build.delay(
|
|
Pierre-Yves Chibon |
420d37 |
project_name=project.fullname,
|
|
Pierre-Yves Chibon |
420d37 |
cause=revs[-1],
|
|
Pierre-Yves Chibon |
420d37 |
branch=refname,
|
|
Pierre-Yves Chibon |
420d37 |
ci_type=project.ci_hook.ci_type,
|
|
Pierre-Yves Chibon |
fd1956 |
branch_to=None,
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
def inform_pull_request_urls(
|
|
Pierre-Yves Chibon |
420d37 |
session, project, commits, refname, default_branch
|
|
Pierre-Yves Chibon |
420d37 |
):
|
|
Pierre-Yves Chibon |
420d37 |
""" Inform the user about the URLs to open a new pull-request or visit
|
|
Pierre-Yves Chibon |
420d37 |
the existing one.
|
|
Pierre-Yves Chibon |
420d37 |
"""
|
|
Pierre-Yves Chibon |
420d37 |
target_repo = project
|
|
Pierre-Yves Chibon |
420d37 |
if project.is_fork:
|
|
Pierre-Yves Chibon |
420d37 |
target_repo = project.parent
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
ca7bbc |
pr_uids = []
|
|
Pierre-Yves Chibon |
ca7bbc |
|
|
Pierre-Yves Chibon |
420d37 |
if (
|
|
Pierre-Yves Chibon |
420d37 |
commits
|
|
Pierre-Yves Chibon |
420d37 |
and refname != default_branch
|
|
Pierre-Yves Chibon |
420d37 |
and target_repo.settings.get("pull_requests", True)
|
|
Pierre-Yves Chibon |
420d37 |
):
|
|
Pierre-Yves Chibon |
420d37 |
print()
|
|
Pierre-Yves Chibon |
930073 |
prs = pagure.lib.query.search_pull_requests(
|
|
Pierre-Yves Chibon |
420d37 |
session,
|
|
Pierre-Yves Chibon |
ca7bbc |
project_id_from=target_repo.id,
|
|
Pierre-Yves Chibon |
420d37 |
status="Open",
|
|
Pierre-Yves Chibon |
420d37 |
branch_from=refname,
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
ca7bbc |
if project.id != target_repo.id:
|
|
Pierre-Yves Chibon |
ca7bbc |
prs.extend(
|
|
Pierre-Yves Chibon |
ca7bbc |
pagure.lib.query.search_pull_requests(
|
|
Pierre-Yves Chibon |
ca7bbc |
session,
|
|
Pierre-Yves Chibon |
ca7bbc |
project_id_from=project.id,
|
|
Pierre-Yves Chibon |
ca7bbc |
status="Open",
|
|
Pierre-Yves Chibon |
ca7bbc |
branch_from=refname,
|
|
Pierre-Yves Chibon |
ca7bbc |
)
|
|
Pierre-Yves Chibon |
ca7bbc |
)
|
|
Pierre-Yves Chibon |
420d37 |
# Link to existing PRs if there are any
|
|
Pierre-Yves Chibon |
420d37 |
seen = len(prs) != 0
|
|
Pierre-Yves Chibon |
420d37 |
for pr in prs:
|
|
Pierre-Yves Chibon |
ca7bbc |
# Refresh the PR in the db and everywhere else where needed
|
|
Pierre-Yves Chibon |
ca7bbc |
pagure.lib.tasks.update_pull_request.delay(pr.uid)
|
|
Pierre-Yves Chibon |
ca7bbc |
|
|
Pierre-Yves Chibon |
420d37 |
# Link tickets with pull-requests if the commit mentions it
|
|
Pierre-Yves Chibon |
420d37 |
pagure.lib.tasks.link_pr_to_ticket.delay(pr.uid)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
# Inform the user about the PR
|
|
Pierre-Yves Chibon |
420d37 |
print("View pull-request for %s" % refname)
|
|
Pierre-Yves Chibon |
420d37 |
print(
|
|
Pierre-Yves Chibon |
420d37 |
" %s/%s/pull-request/%s"
|
|
Pierre-Yves Chibon |
420d37 |
% (_config["APP_URL"].rstrip("/"), pr.project.url_path, pr.id)
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
ca7bbc |
pr_uids.append(pr.uid)
|
|
Pierre-Yves Chibon |
974201 |
|
|
Pierre-Yves Chibon |
420d37 |
# If no existing PRs, provide the link to open one
|
|
Pierre-Yves Chibon |
420d37 |
if not seen:
|
|
Pierre-Yves Chibon |
420d37 |
print("Create a pull-request for %s" % refname)
|
|
Pierre-Yves Chibon |
420d37 |
print(
|
|
Pierre-Yves Chibon |
420d37 |
" %s/%s/diff/%s..%s"
|
|
Pierre-Yves Chibon |
420d37 |
% (
|
|
Pierre-Yves Chibon |
420d37 |
_config["APP_URL"].rstrip("/"),
|
|
Pierre-Yves Chibon |
420d37 |
project.url_path,
|
|
Pierre-Yves Chibon |
420d37 |
default_branch,
|
|
Pierre-Yves Chibon |
420d37 |
refname,
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
420d37 |
print()
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
ca7bbc |
return pr_uids
|
|
Pierre-Yves Chibon |
ca7bbc |
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
class DefaultRunner(BaseRunner):
|
|
Pierre-Yves Chibon |
420d37 |
""" Runner for the default hook."""
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
@staticmethod
|
|
Pierre-Yves Chibon |
420d37 |
def post_receive(session, username, project, repotype, repodir, changes):
|
|
Pierre-Yves Chibon |
420d37 |
""" Run the default post-receive hook.
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
For args, see BaseRunner.runhook.
|
|
Pierre-Yves Chibon |
420d37 |
"""
|
|
Pierre-Yves Chibon |
420d37 |
if repotype != "main":
|
|
Pierre-Yves Chibon |
420d37 |
if _config.get("HOOK_DEBUG", False):
|
|
Pierre-Yves Chibon |
998b35 |
print("Default hook only runs on the main project repository")
|
|
Patrick Uiterwijk |
4329df |
return
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
if changes:
|
|
Pierre-Yves Chibon |
420d37 |
# Retrieve the default branch
|
|
Pierre-Yves Chibon |
420d37 |
repo_obj = pygit2.Repository(repodir)
|
|
Pierre-Yves Chibon |
420d37 |
default_branch = None
|
|
Pierre-Yves Chibon |
420d37 |
if not repo_obj.is_empty and not repo_obj.head_is_unborn:
|
|
Pierre-Yves Chibon |
420d37 |
default_branch = repo_obj.head.shorthand
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
ca7bbc |
pr_uids = []
|
|
Pierre-Yves Chibon |
ca7bbc |
|
|
Pierre-Yves Chibon |
420d37 |
for refname in changes:
|
|
Pierre-Yves Chibon |
420d37 |
(oldrev, newrev) = changes[refname]
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
forced = False
|
|
Pierre-Yves Chibon |
420d37 |
if set(newrev) == set(["0"]):
|
|
Pierre-Yves Chibon |
7190cf |
if refname.startswith("refs/tags"):
|
|
Pierre-Yves Chibon |
7190cf |
refname = refname.replace("refs/tags/", "")
|
|
Pierre-Yves Chibon |
7190cf |
send_action_notification(
|
|
Pierre-Yves Chibon |
7190cf |
session,
|
|
Pierre-Yves Chibon |
7190cf |
"tag",
|
|
Pierre-Yves Chibon |
7190cf |
"deletion",
|
|
Pierre-Yves Chibon |
7190cf |
project,
|
|
Pierre-Yves Chibon |
7190cf |
repodir,
|
|
Pierre-Yves Chibon |
7190cf |
username,
|
|
Pierre-Yves Chibon |
7190cf |
refname,
|
|
Pierre-Yves Chibon |
7190cf |
oldrev,
|
|
Pierre-Yves Chibon |
7190cf |
)
|
|
Pierre-Yves Chibon |
7190cf |
print("Deleting a tag, so we won't run the " "pagure hook")
|
|
Pierre-Yves Chibon |
7190cf |
elif refname.startswith("refs/heads/"):
|
|
Pierre-Yves Chibon |
7190cf |
refname = refname.replace("refs/heads/", "")
|
|
Pierre-Yves Chibon |
7190cf |
send_action_notification(
|
|
Pierre-Yves Chibon |
7190cf |
session,
|
|
Pierre-Yves Chibon |
7190cf |
"branch",
|
|
Pierre-Yves Chibon |
7190cf |
"deletion",
|
|
Pierre-Yves Chibon |
7190cf |
project,
|
|
Pierre-Yves Chibon |
7190cf |
repodir,
|
|
Pierre-Yves Chibon |
7190cf |
username,
|
|
Pierre-Yves Chibon |
7190cf |
refname,
|
|
Pierre-Yves Chibon |
7190cf |
oldrev,
|
|
Pierre-Yves Chibon |
7190cf |
)
|
|
Pierre-Yves Chibon |
7190cf |
print(
|
|
Pierre-Yves Chibon |
7190cf |
"Deleting a branch, so we won't run the " "pagure hook"
|
|
Pierre-Yves Chibon |
7190cf |
)
|
|
Pierre-Yves Chibon |
7190cf |
else:
|
|
Pierre-Yves Chibon |
7190cf |
print(
|
|
Pierre-Yves Chibon |
7190cf |
"Deleting %s, so we wont run the pagure hook nor "
|
|
Pierre-Yves Chibon |
7190cf |
"send notifications"
|
|
Pierre-Yves Chibon |
7190cf |
)
|
|
Pierre-Yves Chibon |
7190cf |
continue
|
|
Pierre-Yves Chibon |
420d37 |
elif set(oldrev) == set(["0"]):
|
|
Pierre-Yves Chibon |
420d37 |
oldrev = "^%s" % oldrev
|
|
Pierre-Yves Chibon |
7190cf |
if refname.startswith("refs/tags"):
|
|
Pierre-Yves Chibon |
7190cf |
refname = refname.replace("refs/tags/", "")
|
|
Pierre-Yves Chibon |
7190cf |
send_action_notification(
|
|
Pierre-Yves Chibon |
7190cf |
session,
|
|
Pierre-Yves Chibon |
7190cf |
"tag",
|
|
Pierre-Yves Chibon |
7190cf |
"creation",
|
|
Pierre-Yves Chibon |
7190cf |
project,
|
|
Pierre-Yves Chibon |
7190cf |
repodir,
|
|
Pierre-Yves Chibon |
7190cf |
username,
|
|
Pierre-Yves Chibon |
7190cf |
refname,
|
|
Pierre-Yves Chibon |
7190cf |
newrev,
|
|
Pierre-Yves Chibon |
7190cf |
)
|
|
Pierre-Yves Chibon |
420d37 |
elif pagure.lib.git.is_forced_push(oldrev, newrev, repodir):
|
|
Pierre-Yves Chibon |
420d37 |
forced = True
|
|
Pierre-Yves Chibon |
420d37 |
base = pagure.lib.git.get_base_revision(
|
|
Pierre-Yves Chibon |
998b35 |
oldrev, newrev, repodir
|
|
Pierre-Yves Chibon |
998b35 |
)
|
|
Pierre-Yves Chibon |
420d37 |
if base:
|
|
Pierre-Yves Chibon |
420d37 |
oldrev = base[0]
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
refname = refname.replace("refs/heads/", "")
|
|
Pierre-Yves Chibon |
420d37 |
commits = pagure.lib.git.get_revs_between(
|
|
Pierre-Yves Chibon |
420d37 |
oldrev, newrev, repodir, refname
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
fccbed |
log_all = _config.get("LOG_ALL_COMMITS", False)
|
|
Pierre-Yves Chibon |
fccbed |
if log_all or refname == default_branch:
|
|
Pierre-Yves Chibon |
420d37 |
print(
|
|
Pierre-Yves Chibon |
420d37 |
"Sending to redis to log activity and send commit "
|
|
Pierre-Yves Chibon |
420d37 |
"notification emails"
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
420d37 |
else:
|
|
Pierre-Yves Chibon |
420d37 |
print("Sending to redis to send commit notification emails")
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
# This is logging the commit to the log table in the DB so we can
|
|
Pierre-Yves Chibon |
420d37 |
# render commits in the calendar heatmap.
|
|
Pierre-Yves Chibon |
420d37 |
# It is also sending emails about commits to people using the
|
|
Pierre-Yves Chibon |
420d37 |
# 'watch' feature to be made aware of new commits.
|
|
Pierre-Yves Chibon |
420d37 |
pagure.lib.tasks_services.log_commit_send_notifications.delay(
|
|
Pierre-Yves Chibon |
420d37 |
name=project.name,
|
|
Pierre-Yves Chibon |
420d37 |
commits=commits,
|
|
Pierre-Yves Chibon |
420d37 |
abspath=repodir,
|
|
Pierre-Yves Chibon |
420d37 |
branch=refname,
|
|
Pierre-Yves Chibon |
420d37 |
default_branch=default_branch,
|
|
Pierre-Yves Chibon |
420d37 |
namespace=project.namespace,
|
|
Pierre-Yves Chibon |
420d37 |
username=project.user.user if project.is_fork else None,
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
# This one is sending fedmsg and web-hook notifications for project
|
|
Pierre-Yves Chibon |
420d37 |
# that set them up
|
|
Pierre-Yves Chibon |
420d37 |
send_notifications(
|
|
Pierre-Yves Chibon |
998b35 |
session, project, repodir, username, refname, commits, forced
|
|
Pierre-Yves Chibon |
998b35 |
)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
# Now display to the user if this isn't the default branch links to
|
|
Pierre-Yves Chibon |
420d37 |
# open a new pr or review the existing one
|
|
Pierre-Yves Chibon |
ca7bbc |
pr_uids.extend(
|
|
Pierre-Yves Chibon |
ca7bbc |
inform_pull_request_urls(
|
|
Pierre-Yves Chibon |
ca7bbc |
session, project, commits, refname, default_branch
|
|
Pierre-Yves Chibon |
ca7bbc |
)
|
|
Pierre-Yves Chibon |
420d37 |
)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
ca7bbc |
# Refresh of all opened PRs
|
|
Pierre-Yves Chibon |
420d37 |
parent = project.parent or project
|
|
Pierre-Yves Chibon |
d5cf4f |
if not _config.get("GIT_HOOK_DB_RO", False):
|
|
Pierre-Yves Chibon |
5c0786 |
pagure.lib.tasks.refresh_pr_cache(
|
|
Pierre-Yves Chibon |
5c0786 |
parent.name,
|
|
Pierre-Yves Chibon |
5c0786 |
parent.namespace,
|
|
Pierre-Yves Chibon |
5c0786 |
parent.user.user if parent.is_fork else None,
|
|
Pierre-Yves Chibon |
5c0786 |
but_uids=pr_uids,
|
|
Pierre-Yves Chibon |
5c0786 |
)
|
|
Pierre-Yves Chibon |
5c0786 |
else:
|
|
Pierre-Yves Chibon |
5c0786 |
pagure.lib.tasks.refresh_pr_cache.delay(
|
|
Pierre-Yves Chibon |
5c0786 |
parent.name,
|
|
Pierre-Yves Chibon |
5c0786 |
parent.namespace,
|
|
Pierre-Yves Chibon |
5c0786 |
parent.user.user if parent.is_fork else None,
|
|
Pierre-Yves Chibon |
5c0786 |
but_uids=pr_uids,
|
|
Pierre-Yves Chibon |
5c0786 |
)
|
|
Pierre-Yves Chibon |
ca7bbc |
|
|
Pierre-Yves Chibon |
97d19d |
if not project.is_on_repospanner and _config.get(
|
|
Pierre-Yves Chibon |
97d19d |
"GIT_GARBAGE_COLLECT", False
|
|
Pierre-Yves Chibon |
97d19d |
):
|
|
Slavek Kabrda |
de8507 |
pagure.lib.tasks.git_garbage_collect.delay(
|
|
Slavek Kabrda |
de8507 |
project.repopath("main")
|
|
Slavek Kabrda |
de8507 |
)
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
420d37 |
|
|
Pierre-Yves Chibon |
8f4948 |
class Default(BaseHook):
|
|
Pierre-Yves Chibon |
9c2953 |
""" Default hooks. """
|
|
Pierre-Yves Chibon |
8f4948 |
|
|
Pierre-Yves Chibon |
9c2953 |
name = "default"
|
|
Pierre-Yves Chibon |
9c2953 |
description = (
|
|
Pierre-Yves Chibon |
9c2953 |
"Default hooks that should be enabled for each and every project."
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Pierre-Yves Chibon |
420d37 |
runner = DefaultRunner
|
|
Slavek Kabrda |
adbb5f |
|
|
Slavek Kabrda |
adbb5f |
@classmethod
|
|
Slavek Kabrda |
adbb5f |
def is_enabled_for(cls, project):
|
|
Slavek Kabrda |
adbb5f |
return True
|