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


"""Pagure specific hook to update pull-requests stored in the database
based on the information pushed in the requests git repository.
"""

from __future__ import print_function

import json
import os
import sys


# We need to access the database
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.lib.git  # noqa: E402


_config = pagure.config.config.reload_config()
abspath = os.path.abspath(os.environ['GIT_DIR'])


def get_files_to_load(new_commits_list):

    print('Files changed by new commits:\n')
    file_list = []
    new_commits_list.reverse()
    for commit in new_commits_list:
        filenames = pagure.lib.git.read_git_lines(
            ['diff-tree', '--no-commit-id', '--name-only', '-r', commit],
            abspath)
        for line in filenames:
            if line.strip():
                file_list.append(line.strip())

    return file_list


def run_as_post_receive_hook():

    file_list = set()
    for line in sys.stdin:
        if _config.get('HOOK_DEBUG', False):
            print(line)
        (oldrev, newrev, refname) = line.strip().split(' ', 2)

        if _config.get('HOOK_DEBUG', False):
            print('  -- Old rev')
            print(oldrev)
            print('  -- New rev')
            print(newrev)
            print('  -- Ref name')
            print(refname)

        if set(newrev) == set(['0']):
            print("Deleting a reference/branch, so we won't run the "
                  "pagure hook")
            return

        tmp = set(get_files_to_load(
            pagure.lib.git.get_revs_between(oldrev, newrev, abspath, refname)))
        file_list = file_list.union(tmp)

    reponame = pagure.lib.git.get_repo_name(abspath)
    username = pagure.lib.git.get_username(abspath)
    namespace = pagure.lib.git.get_repo_namespace(
        abspath, gitfolder=_config['REQUESTS_FOLDER'])
    print('repo:', reponame, username, namespace)

    for filename in file_list:
        print('To load: %s' % filename)
        json_data = None
        data = ''.join(
            pagure.lib.git.read_git_lines(
                ['show', 'HEAD:%s' % filename], abspath))
        if data:
            try:
                json_data = json.loads(data)
            except ValueError:
                pass
        if json_data:
            pagure.lib.git.update_request_from_git(
                pagure.SESSION,
                reponame=reponame,
                namespace=namespace,
                username=username,
                request_uid=filename,
                json_data=json_data,
                gitfolder=_config['GIT_FOLDER'],
                docfolder=_config['DOCS_FOLDER'],
                ticketfolder=_config['TICKETS_FOLDER'],
                requestfolder=_config['REQUESTS_FOLDER'],
            )


def main(args):
    run_as_post_receive_hook()


if __name__ == '__main__':
    main(sys.argv[1:])