123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- #!/usr/bin/env python
- import argparse
- import requests
- import os
- from sqlalchemy.exc import SQLAlchemyError
- if 'PAGURE_CONFIG' not in os.environ \
- and os.path.exists('/etc/pagure/pagure.cfg'):
- print 'Using configuration file `/etc/pagure/pagure.cfg`'
- os.environ['PAGURE_CONFIG'] = '/etc/pagure/pagure.cfg'
- import pagure
- import pagure.lib
- import pagure.lib.model
- def get_poc_of_pkgs(debug=False):
- """ Retrieve a dictionary giving the point of contact of each package
- in pkgdb.
- """
- if debug:
- print 'Querying pkgdb'
- PKGDB_URL = 'https://admin.stg.fedoraproject.org/pkgdb/api/'
- req = requests.get(PKGDB_URL + 'bugzilla').text
- if debug:
- print 'Pkgdb data retrieved, getting POC'
- pkgs = {}
- for line in req.split('\n'):
- line = line.strip()
- if not line or line.startswith('#'):
- continue
- line = line.split('|')
- if len(line) < 4:
- continue
- pkgs[line[1]] = line[3]
- return pkgs
- def main(folder, debug=False):
- """
- Logic:
- - Query the list of maintainer/PoC from pkgdb
- - Browse the directory
- - For each git in the directory, create the project with the correct POC
- """
- pocs = get_poc_of_pkgs(debug=debug)
- if debug:
- print 'Adding the user to the DB'
- for user in sorted(set(pocs.values())):
- if debug:
- print user
- try:
- pagure.lib.set_up_user(
- session=pagure.SESSION,
- username=user,
- fullname=user,
- default_email='%s@fedoraproject.org' % user,
- keydir=pagure.APP.config.get('GITOLITE_KEYDIR', None),
- )
- pagure.SESSION.commit()
- except SQLAlchemyError as err:
- pagure.SESSION.rollback()
- print 'ERROR with user %s' % user
- print err
- for project in sorted(os.listdir(folder)):
- if debug:
- print project
- if not project.endswith('.git'):
- if debug:
- print ' -skip: not a git repository'
- continue
- if project.split('.git')[0] not in pocs:
- if debug:
- print ' -skip: no pocs'
- continue
- try:
- name = project.split('.git')[0]
- orig_name = name
- name = 'rpms/%s' % name
- if name in pagure.APP.config['BLACKLISTED_PROJECTS']:
- raise pagure.exceptions.RepoExistsException(
- 'No project "%s" are allowed to be created due to potential '
- 'conflicts in URLs with pagure itself' % name
- )
- user_obj = pagure.lib.__get_user(pagure.SESSION, pocs[orig_name])
- allowed_prefix = pagure.APP.config[
- 'ALLOWED_PREFIX'] + [grp for grp in user_obj.groups]
- first_part, _, second_part = name.partition('/')
- if second_part and first_part not in allowed_prefix:
- raise pagure.exceptions.PagureException(
- 'The prefix of your project must be in the list of allowed '
- 'prefixes set by the admins of this pagure instance, or the name '
- 'of a group of which you are a member.'
- )
- gitfolder = pagure.APP.config['GIT_FOLDER']
- docfolder = pagure.APP.config['DOCS_FOLDER']
- ticketfolder = pagure.APP.config['TICKETS_FOLDER']
- requestfolder = pagure.APP.config['REQUESTS_FOLDER']
- gitrepo = os.path.join(gitfolder, '%s.git' % name)
- project = pagure.lib.model.Project(
- name=name,
- description=None,
- url=None,
- avatar_email=None,
- user_id=user_obj.id,
- parent_id=None,
- hook_token=pagure.lib.login.id_generator(40)
- )
- pagure.SESSION.add(project)
- # Make sure we won't have SQLAlchemy error before we create the repo
- pagure.SESSION.flush()
- http_clone_file = os.path.join(gitrepo, 'git-daemon-export-ok')
- if not os.path.exists(http_clone_file):
- with open(http_clone_file, 'w') as stream:
- pass
- docrepo = os.path.join(docfolder, project.path)
- if os.path.exists(docrepo):
- shutil.rmtree(gitrepo)
- raise pagure.exceptions.RepoExistsException(
- 'The docs repo "%s" already exists' % project.path
- )
- pygit2.init_repository(docrepo, bare=True)
- ticketrepo = os.path.join(ticketfolder, project.path)
- if os.path.exists(ticketrepo):
- shutil.rmtree(gitrepo)
- shutil.rmtree(docrepo)
- raise pagure.exceptions.RepoExistsException(
- 'The tickets repo "%s" already exists' % project.path
- )
- pygit2.init_repository(
- ticketrepo, bare=True,
- mode=pygit2.C.GIT_REPOSITORY_INIT_SHARED_GROUP)
- requestrepo = os.path.join(requestfolder, project.path)
- if os.path.exists(requestrepo):
- shutil.rmtree(gitrepo)
- shutil.rmtree(docrepo)
- shutil.rmtree(ticketrepo)
- raise pagure.exceptions.RepoExistsException(
- 'The requests repo "%s" already exists' % project.path
- )
- pygit2.init_repository(
- requestrepo, bare=True,
- mode=pygit2.C.GIT_REPOSITORY_INIT_SHARED_GROUP)
- pagure.SESSION.commit()
- except pagure.exceptions.PagureException as err:
- print 'ERROR with project %s' % project
- print err
- except SQLAlchemyError as err: # pragma: no cover
- pagure.SESSION.rollback()
- print 'ERROR (DB) with project %s' % project
- print err
- if __name__ == '__main__':
- parser = argparse.ArgumentParser(
- description='Script creating projects on pagure based on the git '
- 'repos present in the specified folder and the pkgdb information.'
- )
- parser.add_argument(
- 'folder',
- help='Folder containing all the git repos of the projects to create')
- parser.add_argument(
- '--debug', dest='debug', action='store_true', default=False,
- help='Print the debugging output')
- args = parser.parse_args()
- main(args.folder, debug=args.debug)
|