#! /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. """ import json import os import re import sys import subprocess # 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 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 pagure.APP.config.get('HOOK_DEBUG', False): print line (oldrev, newrev, refname) = line.strip().split(' ', 2) if pagure.APP.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=pagure.APP.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: 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=pagure.APP.config['GIT_FOLDER'], docfolder=pagure.APP.config['DOCS_FOLDER'], ticketfolder=pagure.APP.config['TICKETS_FOLDER'], requestfolder=pagure.APP.config['REQUESTS_FOLDER'], ) def main(args): run_as_post_receive_hook() if __name__ == '__main__': main(sys.argv[1:])