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

105 lines
2.9 KiB
Python
Executable file

#! /usr/bin/env python2
"""Pagure specific hook to update tickets stored in the database based on
the information pushed in the tickets 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
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:
if commit == new_commits_list[0]:
filenames = pagure.lib.git.read_git_lines(
['diff-tree', '--no-commit-id', '--name-only', '-r', '--root',
commit], abspath)
else:
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['TICKETS_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 and 'files' not in filename:
try:
json_data = json.loads(data)
except:
pass
if json_data:
pagure.lib.git.update_ticket_from_git(
pagure.SESSION,
reponame=reponame,
namespace=namespace,
username=username,
issue_uid=filename,
json_data=json_data)
def main(args):
run_as_post_receive_hook()
if __name__ == '__main__':
main(sys.argv[1:])