pagure_force_commit_hook.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/env python
  2. """Pagure specific hook to block non-fastforward pushes.
  3. """
  4. from __future__ import print_function, unicode_literals
  5. import os
  6. import sys
  7. if 'PAGURE_CONFIG' not in os.environ \
  8. and os.path.exists('/etc/pagure/pagure.cfg'):
  9. os.environ['PAGURE_CONFIG'] = '/etc/pagure/pagure.cfg'
  10. import pagure # noqa: E402
  11. import pagure.exceptions # noqa: E402
  12. import pagure.lib.link # noqa: E402
  13. import pagure.lib.plugins # noqa: E402
  14. _config = pagure.config.config
  15. abspath = os.path.abspath(os.environ['GIT_DIR'])
  16. def run_as_pre_receive_hook():
  17. reponame = pagure.lib.git.get_repo_name(abspath)
  18. namespace = pagure.lib.git.get_repo_namespace(abspath)
  19. username = pagure.lib.git.get_username(abspath)
  20. session = pagure.lib.create_session(_config['DB_URL'])
  21. if _config.get('HOOK_DEBUG', False):
  22. print('repo: ', reponame)
  23. print('user: ', username)
  24. print('namspaces:', namespace)
  25. repo = pagure.lib._get_project(
  26. session, reponame, user=username, namespace=namespace)
  27. if not repo:
  28. print('Unknown repo %s of username: %s in namespace %s' % (
  29. reponame, username, namespace))
  30. session.close()
  31. sys.exit(1)
  32. plugin = pagure.lib.plugins.get_plugin('Block non fast-forward pushes')
  33. plugin.db_object()
  34. # Get the list of branches
  35. branches = []
  36. if repo.pagure_force_commit_hook:
  37. branches = [
  38. branch.strip()
  39. for branch in repo.pagure_force_commit_hook.branches.split(',')
  40. if branch.strip()]
  41. for line in sys.stdin:
  42. if _config.get('HOOK_DEBUG', False):
  43. print(line)
  44. (oldrev, newrev, refname) = line.strip().split(' ', 2)
  45. refname = refname.replace('refs/heads/', '')
  46. if refname in branches or branches == ['*']:
  47. if _config.get('HOOK_DEBUG', False):
  48. print(' -- Old rev')
  49. print(oldrev)
  50. print(' -- New rev')
  51. print(newrev)
  52. print(' -- Ref name')
  53. print(refname)
  54. if set(newrev) == set(['0']):
  55. print("Deletion is forbidden")
  56. session.close()
  57. sys.exit(1)
  58. elif pagure.lib.git.is_forced_push(oldrev, newrev, abspath):
  59. print("Non fast-forward push are forbidden")
  60. session.close()
  61. sys.exit(1)
  62. session.close()
  63. def main(args):
  64. run_as_pre_receive_hook()
  65. if __name__ == '__main__':
  66. main(sys.argv[1:])