106 lines
2.9 KiB
Python
106 lines
2.9 KiB
Python
|
#! /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:])
|