pagure-new/pagure/hooks/files/pagure_hook_requests.py

106 lines
2.9 KiB
Python
Raw Normal View History

2016-09-21 23:21:07 +00:00
#! /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:])