Blob Blame Raw
#!/usr/bin/env python

from __future__ import print_function

import os
import sys

import fedmsg
import fedmsg.config


if 'PAGURE_CONFIG' not in os.environ \
        and os.path.exists('/etc/pagure/pagure.cfg'):
    os.environ['PAGURE_CONFIG'] = '/etc/pagure/pagure.cfg'


import pagure  # noqa: E402
import pagure.lib.git  # noqa: E402

abspath = os.path.abspath(os.environ['GIT_DIR'])


print("Emitting a message to the fedmsg bus.")
config = fedmsg.config.load_config([], None)
config['active'] = True
config['endpoints']['relay_inbound'] = config['relay_inbound']
fedmsg.init(name='relay_inbound', **config)

_config = pagure.config.config.reload_config()

seen = []

# Read in all the rev information git-receive-pack hands us.
for line in sys.stdin.readlines():
    (oldrev, newrev, refname) = line.strip().split(' ', 2)

    forced = False
    if set(newrev) == set(['0']):
        print("Deleting a reference/branch, so we won't run the "
              "pagure hook")
        break
    elif set(oldrev) == set(['0']):
        print("New reference/branch")
        oldrev = '^%s' % oldrev
    elif pagure.lib.git.is_forced_push(oldrev, newrev, abspath):
        forced = True
        base = pagure.lib.git.get_base_revision(oldrev, newrev, abspath)
        if base:
            oldrev = base[0]

    revs = pagure.lib.git.get_revs_between(
        oldrev, newrev, abspath, refname, forced=forced)

    project_name = pagure.lib.git.get_repo_name(abspath)
    username = pagure.lib.git.get_username(abspath)
    namespace = pagure.lib.git.get_repo_namespace(abspath)
    project = pagure.lib._get_project(
        pagure.SESSION, project_name, username, namespace=namespace,
        case=_config.get('CASE_SENSITIVE', False))

    if not project:
        project = project_name

    auths = set()
    for rev in revs:
        email = pagure.lib.git.get_author_email(rev, abspath)
        name = pagure.lib.git.get_author(rev, abspath)
        author = pagure.lib.search_user(pagure.SESSION, email=email) or name
        auths.add(author)

    authors = []
    for author in auths:
        if isinstance(author, basestring):
            author = author
        else:
            author = author.to_json(public=True)
        authors.append(author)

    if revs:
        revs.reverse()
        print("* Publishing information for %i commits" % len(revs))
        pagure.lib.notify.log(
            project=project,
            topic="git.receive",
            msg=dict(
                total_commits=len(revs),
                start_commit=revs[0],
                end_commit=revs[-1],
                branch=refname,
                forced=forced,
                authors=list(authors),
                agent=os.environ['GL_USER'],
                repo=project.to_json(public=True)
                if not isinstance(project, basestring) else project,
            ),
            redis=pagure.lib.REDIS,
        )