From a3d1b1505f44acb1f370594ac3978811f3af0251 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 03 2014 12:59:49 +0000 Subject: Add base work for the progit hook to update the ticket information in the DB upon push --- diff --git a/progit/hooks/files/progit_hook_tickets.py b/progit/hooks/files/progit_hook_tickets.py new file mode 100644 index 0000000..47655b0 --- /dev/null +++ b/progit/hooks/files/progit_hook_tickets.py @@ -0,0 +1,112 @@ +#! /usr/bin/env python2 + + +"""Progit specific hook to update tickets stored in the database based on +the information pushed in the tickets git repository. +""" + +import os +import re +import sys +import subprocess + + +# We need to access the database +if 'PROGIT_CONFIG' not in os.environ \ + and os.path.exists('/etc/progit/progit.cfg'): + print 'Using configuration file `/etc/progit/progit.cfg`' + os.environ['PROGIT_CONFIG'] = '/etc/progit/progit.cfg' + +sys.path.insert(0, os.path.expanduser('~/repos/gitrepo/progit')) + + +def read_git_output(args, input=None, keepends=False, **kw): + """Read the output of a Git command.""" + + return read_output(['git'] + args, input=input, keepends=keepends, **kw) + + +def read_git_lines(args, keepends=False, **kw): + """Return the lines output by Git command. + + Return as single lines, with newlines stripped off.""" + + return read_git_output(args, keepends=True, **kw).splitlines(keepends) + + +def read_output(cmd, input=None, keepends=False, **kw): + if input: + stdin = subprocess.PIPE + else: + stdin = None + p = subprocess.Popen( + cmd, stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kw + ) + (out, err) = p.communicate(input) + retcode = p.wait() + if retcode: + print 'ERROR: %s =-- %s' % (cmd, retcode) + if not keepends: + out = out.rstrip('\n\r') + return out + + +def get_files_to_load(new_commits_list): + + print 'Files changed by new commits:\n\n' + file_list = [] + for line in read_git_lines( + ['show', '--pretty="format:"', '--name-only', '-r'] + + new_commits_list, + keepends=False, + ): + if line.strip(): + file_list.append(line.strip()) + + return file_list + + +def get_commits_id(fromrev, torev): + ''' Retrieve the list commit between two revisions and return the list + of their identifier. + ''' + cmd = ['rev-list', '%s...%s' %(torev, fromrev)] + return read_git_lines(cmd) + + +def get_repo_name(): + ''' Return the name of the git repo based on its path. + ''' + repo = os.path.basename(os.getcwd()).split('.git')[0] + return repo + + +def run_as_post_receive_hook(): + + file_list = set() + for line in sys.stdin: + print line + (oldrev, newrev, refname) = line.strip().split(' ', 2) + + print ' -- Old rev' + print oldrev + print ' -- New rev' + print newrev + print ' -- Ref name' + print refname + + file_list.union( + set(get_files_to_load(get_commits_id(oldrev, newrev)))) + + for filename in file_list: + print 'To load: %s' % filename + + print 'repo:', get_repo_name() + + +def main(args): + run_as_post_receive_hook() + + +if __name__ == '__main__': + main(sys.argv[1:])