ansible/roles/distgit/files/mass-branching-gitolite.py
Pierre-Yves Chibon 56efae7e16 Do not relying on the existance of 3 spaces to make decisions
Signed-off-by: Pierre-Yves Chibon <pingou@pingoured.fr>
2018-02-21 15:21:21 +01:00

118 lines
3.4 KiB
Python

#!/usr/bin/python
"""
This script is meant to be run in pkgs01.stg or pkgs02 (ie the dist-git
servers) and will be adding the specified new git branch to the gitolite
configuration so users can push to that branch.
Basically the script takes two inputs, the new branch name (for example
f28, f29, epel8....) and a file containing the namespace/name of all the
git repositories for which the gitolite configuration should be updated.
"""
from __future__ import print_function
import argparse
import os
import sys
_base_path = '/srv/git/'
_branch_from = 'master'
def _get_arguments():
""" Set and retrieve the command line arguments. """
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
'gitbranch',
help='The new git branch to create')
parser.add_argument(
'inputfile',
help='The input file listing the repositories to update')
parser.add_argument(
'output',
help='File where to write the new config (It may be a good idea to '
'not over-write the current configuration file so you can diff '
'the current with the new one')
return parser.parse_args()
def main():
""" Main function of the program. """
print(
'Did you stop the service `pagure_gitolite_worker` to ensure '
'nothing touches this file while we work on it?')
answer = raw_input('[y/N] ')
if answer.lower() != 'y':
print('You said no, so you know what to do ;-)')
return 1
args = _get_arguments()
if not os.path.isfile(args.inputfile):
print('%s does not appear to be a file' % args.inputfile)
return 1
repos = None
with open(args.inputfile) as stream:
repos = [row.strip() for row in stream]
if not repos:
print('%s appears to be empty' % args.inputfile)
return 1
config_file = os.path.join(
_base_path, '.gitolite', 'conf', 'gitolite.conf')
if not os.path.isfile(config_file):
print('%s does not appear to be a file or to exist' % config_file)
return 1
config = None
with open(config_file) as stream:
config = [row.rstrip() for row in stream]
if not config:
print('%s appears to be empty' % config_file)
return 1
output = []
process = False
for row in config:
if row.strip().startswith('repo '):
name = row.strip().split()[-1]
if name.startswith('rpms/'):
name = 'rpm/%s' % name[5:]
elif name.startswith('modules/'):
name = 'module/%s' % name[8:]
if name in repos:
process = True
else:
process = False
if process and " ".join(row.strip().split()).startswith('RWC master ='):
new_row = row
new_row = new_row.replace(' master =', ' {} ='.format(args.gitbranch), 1)
output.append(new_row)
output.append(row)
print(
'Done updating the config, writing the new content to {}'.format(
args.output))
with open(args.output, 'w') as stream:
stream.write('\n'.join(output))
print(
'Now put the new configuration file in place (if it needs to be) '
'then run `` sudo -u pagure HOME=/srv/git gitolite compile `` \n'
'and finally, restart the `pagure_gitolite_worker` service.')
return 0
if __name__ == '__main__':
sys.exit(main())