diff --git a/pagure/cli/admin.py b/pagure/cli/admin.py index cc840ca..0d1482d 100644 --- a/pagure/cli/admin.py +++ b/pagure/cli/admin.py @@ -172,7 +172,7 @@ def do_generate_acl(_): 'Do you want to re-generate the gitolite.conf file then ' 'calling: %s' % cmd) if _ask_confirmation(): - pagure.lib.git.generate_gitolite_acls() + pagure.lib.git._generate_gitolite_acls() print('Gitolite ACLs updated') diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 675ab7f..94973a1 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -34,6 +34,7 @@ import pagure.lib import pagure.lib.notify from pagure.lib import model from pagure.lib.repo import PagureRepo +from pagure.lib import tasks _log = logging.getLogger(__name__) @@ -183,6 +184,10 @@ def _get_gitolite_command(): def generate_gitolite_acls(): + tasks.generate_gitolite_acls.delay() + + +def _generate_gitolite_acls(): """ Generate the gitolite configuration file for all repos """ _log.info('Refresh gitolite configuration') diff --git a/pagure/lib/tasks.py b/pagure/lib/tasks.py index eb7b2b6..151e744 100644 --- a/pagure/lib/tasks.py +++ b/pagure/lib/tasks.py @@ -8,16 +8,26 @@ """ +import os +import os.path +import shutil + from celery import Celery from celery.result import AsyncResult +import pygit2 +import tempfile +import six + import pagure +from pagure import APP import pagure.lib +import pagure.lib.git conn = Celery('tasks', - broker='redis://%s' % pagure.APP.config['REDIS_HOST'], - backend='redis://%s' % pagure.APP.config['REDIS_HOST']) + broker='redis://%s' % APP.config['REDIS_HOST'], + backend='redis://%s' % APP.config['REDIS_HOST']) def get_result(uuid): @@ -32,12 +42,94 @@ def ret(endpoint, **kwargs): @conn.task def generate_gitolite_acls(): - # TODO: Implement gitolite acl stuff - return 'TODO' + pagure.lib.git._generate_gitolite_acls() @conn.task -def create_project(namespace, name, add_readme, ignore_existing_repo): - # TODO: Implement creation (see pagure.lib.new_project after return) +def create_project(username, namespace, name, add_readme, ignore_existing_repo): + project = pagure.lib._get_project(pagure.SESSION, namespace=namespace, + name=name, with_lock=True) + userobj = pagure.lib.search_user(pagure.SESSION, username=username) + gitrepo = os.path.join(APP.config['GIT_FOLDER'], project.path) + + # Add the readme file if it was asked + if not add_readme: + pygit2.init_repository(gitrepo, bare=True) + else: + temp_gitrepo_path = tempfile.mkdtemp(prefix='pagure-') + temp_gitrepo = pygit2.init_repository(temp_gitrepo_path, bare=False) + author = userobj.fullname or userobj.user + author_email = userobj.default_email + if six.PY2: + author = author.encode('utf-8') + author_email = author_email.encode('utf-8') + author = pygit2.Signature(author, author_email) + content = u"# %s\n\n%s" % (name, project.description) + readme_file = os.path.join(temp_gitrepo.workdir, "README.md") + with open(readme_file, 'wb') as stream: + stream.write(content.encode('utf-8')) + temp_gitrepo.index.add_all() + temp_gitrepo.index.write() + tree = temp_gitrepo.index.write_tree() + temp_gitrepo.create_commit( + 'HEAD', author, author, 'Added the README', tree, []) + pygit2.clone_repository(temp_gitrepo_path, gitrepo, bare=True) + shutil.rmtree(temp_gitrepo_path) + + # Make the repo exportable via apache + 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(APP.config['DOCS_FOLDER'], project.path) + if os.path.exists(docrepo): + if not ignore_existing_repo: + shutil.rmtree(gitrepo) + raise pagure.exceptions.RepoExistsException( + 'The docs repo "%s" already exists' % project.path + ) + else: + pygit2.init_repository(docrepo, bare=True) + + ticketrepo = os.path.join(APP.config['TICKETS_FOLDER'], project.path) + if os.path.exists(ticketrepo): + if not ignore_existing_repo: + shutil.rmtree(gitrepo) + shutil.rmtree(docrepo) + raise pagure.exceptions.RepoExistsException( + 'The tickets repo "%s" already exists' % project.path + ) + else: + pygit2.init_repository( + ticketrepo, bare=True, + mode=pygit2.C.GIT_REPOSITORY_INIT_SHARED_GROUP) + + requestrepo = os.path.join(APP.config['REQUESTS_FOLDER'], project.path) + if os.path.exists(requestrepo): + if not ignore_existing_repo: + shutil.rmtree(gitrepo) + shutil.rmtree(docrepo) + shutil.rmtree(ticketrepo) + raise pagure.exceptions.RepoExistsException( + 'The requests repo "%s" already exists' % project.path + ) + else: + pygit2.init_repository( + requestrepo, bare=True, + mode=pygit2.C.GIT_REPOSITORY_INIT_SHARED_GROUP) + + # Install the default hook + # TODO: This needs enabling, but doesn't work in my env + #plugin = pagure.lib.plugins.get_plugin('default') + #dbobj = plugin.db_object() + #dbobj.active = True + #dbobj.project_id = project.id + #pagure.SESSION.add(dbobj) + #pagure.SESSION.flush() + #plugin.set_up(project) + #plugin.install(project, dbobj) + #pagure.SESSION.commit() + generate_gitolite_acls.delay() return ret('view_repo', repo=name, namespace=namespace)