##// END OF EJS Templates
celery: move repo create tasks to repo model - that's where it belongs...
Mads Kiilerich -
r8616:1d3b6744 default
parent child Browse files
Show More
@@ -21,6 +21,7 b' class CeleryConfig(object):'
21 imports = [
21 imports = [
22 'kallithea.lib.indexers.daemon',
22 'kallithea.lib.indexers.daemon',
23 'kallithea.model.async_tasks',
23 'kallithea.model.async_tasks',
24 'kallithea.model.repo',
24 ]
25 ]
25 task_always_eager = False
26 task_always_eager = False
26
27
@@ -40,10 +40,10 b' import celery.utils.log'
40 from tg import config
40 from tg import config
41
41
42 import kallithea
42 import kallithea
43 from kallithea.lib import celerylib, conf, ext_json, hooks
43 from kallithea.lib import celerylib, conf, ext_json
44 from kallithea.lib.utils2 import asbool, ascii_bytes
44 from kallithea.lib.utils2 import asbool, ascii_bytes
45 from kallithea.lib.vcs.utils import author_email, author_name
45 from kallithea.lib.vcs.utils import author_email, author_name
46 from kallithea.model import db, meta, repo, userlog
46 from kallithea.model import db, meta
47
47
48
48
49 __all__ = ['get_commits_stats', 'send_email']
49 __all__ = ['get_commits_stats', 'send_email']
@@ -333,150 +333,6 b' def send_email(recipients, subject, body'
333 log.error(traceback.format_exc())
333 log.error(traceback.format_exc())
334
334
335
335
336 @celerylib.task
337 def create_repo(form_data, cur_user):
338 cur_user = db.User.guess_instance(cur_user)
339
340 owner = cur_user
341 repo_name = form_data['repo_name']
342 repo_name_full = form_data['repo_name_full']
343 repo_type = form_data['repo_type']
344 description = form_data['repo_description']
345 private = form_data['repo_private']
346 clone_uri = form_data.get('clone_uri')
347 repo_group = form_data['repo_group']
348 landing_rev = form_data['repo_landing_rev']
349 copy_fork_permissions = form_data.get('copy_permissions')
350 copy_group_permissions = form_data.get('repo_copy_permissions')
351 fork_of = form_data.get('fork_parent_id')
352 state = form_data.get('repo_state', db.Repository.STATE_PENDING)
353
354 # repo creation defaults, private and repo_type are filled in form
355 defs = db.Setting.get_default_repo_settings(strip_prefix=True)
356 enable_statistics = defs.get('repo_enable_statistics')
357 enable_downloads = defs.get('repo_enable_downloads')
358
359 try:
360 db_repo = repo.RepoModel()._create_repo(
361 repo_name=repo_name_full,
362 repo_type=repo_type,
363 description=description,
364 owner=owner,
365 private=private,
366 clone_uri=clone_uri,
367 repo_group=repo_group,
368 landing_rev=landing_rev,
369 fork_of=fork_of,
370 copy_fork_permissions=copy_fork_permissions,
371 copy_group_permissions=copy_group_permissions,
372 enable_statistics=enable_statistics,
373 enable_downloads=enable_downloads,
374 state=state
375 )
376
377 userlog.action_logger(cur_user, 'user_created_repo',
378 form_data['repo_name_full'], '')
379
380 meta.Session().commit()
381 # now create this repo on Filesystem
382 repo.RepoModel()._create_filesystem_repo(
383 repo_name=repo_name,
384 repo_type=repo_type,
385 repo_group=db.RepoGroup.guess_instance(repo_group),
386 clone_uri=clone_uri,
387 )
388 db_repo = db.Repository.get_by_repo_name(repo_name_full)
389 hooks.log_create_repository(db_repo.get_dict(), created_by=owner.username)
390
391 # update repo changeset caches initially
392 db_repo.update_changeset_cache()
393
394 # set new created state
395 db_repo.set_state(db.Repository.STATE_CREATED)
396 meta.Session().commit()
397 except Exception as e:
398 log.warning('Exception %s occurred when forking repository, '
399 'doing cleanup...' % e)
400 # rollback things manually !
401 db_repo = db.Repository.get_by_repo_name(repo_name_full)
402 if db_repo:
403 db.Repository.delete(db_repo.repo_id)
404 meta.Session().commit()
405 repo.RepoModel()._delete_filesystem_repo(db_repo)
406 raise
407
408
409 @celerylib.task
410 def create_repo_fork(form_data, cur_user):
411 """
412 Creates a fork of repository using interval VCS methods
413
414 :param form_data:
415 :param cur_user:
416 """
417 base_path = kallithea.CONFIG['base_path']
418 cur_user = db.User.guess_instance(cur_user)
419
420 repo_name = form_data['repo_name'] # fork in this case
421 repo_name_full = form_data['repo_name_full']
422
423 repo_type = form_data['repo_type']
424 owner = cur_user
425 private = form_data['private']
426 clone_uri = form_data.get('clone_uri')
427 repo_group = form_data['repo_group']
428 landing_rev = form_data['landing_rev']
429 copy_fork_permissions = form_data.get('copy_permissions')
430
431 try:
432 fork_of = db.Repository.guess_instance(form_data.get('fork_parent_id'))
433
434 repo.RepoModel()._create_repo(
435 repo_name=repo_name_full,
436 repo_type=repo_type,
437 description=form_data['description'],
438 owner=owner,
439 private=private,
440 clone_uri=clone_uri,
441 repo_group=repo_group,
442 landing_rev=landing_rev,
443 fork_of=fork_of,
444 copy_fork_permissions=copy_fork_permissions
445 )
446 userlog.action_logger(cur_user, 'user_forked_repo:%s' % repo_name_full,
447 fork_of.repo_name, '')
448 meta.Session().commit()
449
450 source_repo_path = os.path.join(base_path, fork_of.repo_name)
451
452 # now create this repo on Filesystem
453 repo.RepoModel()._create_filesystem_repo(
454 repo_name=repo_name,
455 repo_type=repo_type,
456 repo_group=db.RepoGroup.guess_instance(repo_group),
457 clone_uri=source_repo_path,
458 )
459 db_repo = db.Repository.get_by_repo_name(repo_name_full)
460 hooks.log_create_repository(db_repo.get_dict(), created_by=owner.username)
461
462 # update repo changeset caches initially
463 db_repo.update_changeset_cache()
464
465 # set new created state
466 db_repo.set_state(db.Repository.STATE_CREATED)
467 meta.Session().commit()
468 except Exception as e:
469 log.warning('Exception %s occurred when forking repository, '
470 'doing cleanup...' % e)
471 # rollback things manually !
472 db_repo = db.Repository.get_by_repo_name(repo_name_full)
473 if db_repo:
474 db.Repository.delete(db_repo.repo_id)
475 meta.Session().commit()
476 repo.RepoModel()._delete_filesystem_repo(db_repo)
477 raise
478
479
480 def __get_codes_stats(repo_name):
336 def __get_codes_stats(repo_name):
481 scm_repo = db.Repository.get_by_repo_name(repo_name).scm_instance
337 scm_repo = db.Repository.get_by_repo_name(repo_name).scm_instance
482
338
@@ -33,13 +33,13 b' import traceback'
33 from datetime import datetime
33 from datetime import datetime
34
34
35 import kallithea.lib.utils2
35 import kallithea.lib.utils2
36 from kallithea.lib import hooks, webutils
36 from kallithea.lib import celerylib, hooks, webutils
37 from kallithea.lib.auth import HasRepoPermissionLevel, HasUserGroupPermissionLevel
37 from kallithea.lib.auth import HasRepoPermissionLevel, HasUserGroupPermissionLevel
38 from kallithea.lib.exceptions import AttachedForksError
38 from kallithea.lib.exceptions import AttachedForksError
39 from kallithea.lib.utils import is_valid_repo_uri, make_ui
39 from kallithea.lib.utils import is_valid_repo_uri, make_ui
40 from kallithea.lib.utils2 import LazyProperty, get_current_authuser, obfuscate_url_pw, remove_prefix
40 from kallithea.lib.utils2 import LazyProperty, get_current_authuser, obfuscate_url_pw, remove_prefix
41 from kallithea.lib.vcs.backends import get_backend
41 from kallithea.lib.vcs.backends import get_backend
42 from kallithea.model import db, meta, scm
42 from kallithea.model import db, meta, scm, userlog
43
43
44
44
45 log = logging.getLogger(__name__)
45 log = logging.getLogger(__name__)
@@ -404,8 +404,7 b' class RepoModel(object):'
404 :param form_data:
404 :param form_data:
405 :param cur_user:
405 :param cur_user:
406 """
406 """
407 from kallithea.model import async_tasks
407 return create_repo(form_data, cur_user)
408 return async_tasks.create_repo(form_data, cur_user)
409
408
410 def _update_permissions(self, repo, perms_new=None, perms_updates=None,
409 def _update_permissions(self, repo, perms_new=None, perms_updates=None,
411 check_perms=True):
410 check_perms=True):
@@ -447,8 +446,7 b' class RepoModel(object):'
447 :param form_data:
446 :param form_data:
448 :param cur_user:
447 :param cur_user:
449 """
448 """
450 from kallithea.model import async_tasks
449 return create_repo_fork(form_data, cur_user)
451 return async_tasks.create_repo_fork(form_data, cur_user)
452
450
453 def delete(self, repo, forks=None, fs_remove=True, cur_user=None):
451 def delete(self, repo, forks=None, fs_remove=True, cur_user=None):
454 """
452 """
@@ -695,3 +693,147 b' class RepoModel(object):'
695 shutil.move(rm_path, os.path.join(self.repos_path, _d))
693 shutil.move(rm_path, os.path.join(self.repos_path, _d))
696 else:
694 else:
697 log.error("Can't find repo to delete in %r", rm_path)
695 log.error("Can't find repo to delete in %r", rm_path)
696
697
698 @celerylib.task
699 def create_repo(form_data, cur_user):
700 cur_user = db.User.guess_instance(cur_user)
701
702 owner = cur_user
703 repo_name = form_data['repo_name']
704 repo_name_full = form_data['repo_name_full']
705 repo_type = form_data['repo_type']
706 description = form_data['repo_description']
707 private = form_data['repo_private']
708 clone_uri = form_data.get('clone_uri')
709 repo_group = form_data['repo_group']
710 landing_rev = form_data['repo_landing_rev']
711 copy_fork_permissions = form_data.get('copy_permissions')
712 copy_group_permissions = form_data.get('repo_copy_permissions')
713 fork_of = form_data.get('fork_parent_id')
714 state = form_data.get('repo_state', db.Repository.STATE_PENDING)
715
716 # repo creation defaults, private and repo_type are filled in form
717 defs = db.Setting.get_default_repo_settings(strip_prefix=True)
718 enable_statistics = defs.get('repo_enable_statistics')
719 enable_downloads = defs.get('repo_enable_downloads')
720
721 try:
722 db_repo = RepoModel()._create_repo(
723 repo_name=repo_name_full,
724 repo_type=repo_type,
725 description=description,
726 owner=owner,
727 private=private,
728 clone_uri=clone_uri,
729 repo_group=repo_group,
730 landing_rev=landing_rev,
731 fork_of=fork_of,
732 copy_fork_permissions=copy_fork_permissions,
733 copy_group_permissions=copy_group_permissions,
734 enable_statistics=enable_statistics,
735 enable_downloads=enable_downloads,
736 state=state
737 )
738
739 userlog.action_logger(cur_user, 'user_created_repo',
740 form_data['repo_name_full'], '')
741
742 meta.Session().commit()
743 # now create this repo on Filesystem
744 RepoModel()._create_filesystem_repo(
745 repo_name=repo_name,
746 repo_type=repo_type,
747 repo_group=db.RepoGroup.guess_instance(repo_group),
748 clone_uri=clone_uri,
749 )
750 db_repo = db.Repository.get_by_repo_name(repo_name_full)
751 hooks.log_create_repository(db_repo.get_dict(), created_by=owner.username)
752
753 # update repo changeset caches initially
754 db_repo.update_changeset_cache()
755
756 # set new created state
757 db_repo.set_state(db.Repository.STATE_CREATED)
758 meta.Session().commit()
759 except Exception as e:
760 log.warning('Exception %s occurred when forking repository, '
761 'doing cleanup...' % e)
762 # rollback things manually !
763 db_repo = db.Repository.get_by_repo_name(repo_name_full)
764 if db_repo:
765 db.Repository.delete(db_repo.repo_id)
766 meta.Session().commit()
767 RepoModel()._delete_filesystem_repo(db_repo)
768 raise
769
770
771 @celerylib.task
772 def create_repo_fork(form_data, cur_user):
773 """
774 Creates a fork of repository using interval VCS methods
775
776 :param form_data:
777 :param cur_user:
778 """
779 base_path = kallithea.CONFIG['base_path']
780 cur_user = db.User.guess_instance(cur_user)
781
782 repo_name = form_data['repo_name'] # fork in this case
783 repo_name_full = form_data['repo_name_full']
784
785 repo_type = form_data['repo_type']
786 owner = cur_user
787 private = form_data['private']
788 clone_uri = form_data.get('clone_uri')
789 repo_group = form_data['repo_group']
790 landing_rev = form_data['landing_rev']
791 copy_fork_permissions = form_data.get('copy_permissions')
792
793 try:
794 fork_of = db.Repository.guess_instance(form_data.get('fork_parent_id'))
795
796 RepoModel()._create_repo(
797 repo_name=repo_name_full,
798 repo_type=repo_type,
799 description=form_data['description'],
800 owner=owner,
801 private=private,
802 clone_uri=clone_uri,
803 repo_group=repo_group,
804 landing_rev=landing_rev,
805 fork_of=fork_of,
806 copy_fork_permissions=copy_fork_permissions
807 )
808 userlog.action_logger(cur_user, 'user_forked_repo:%s' % repo_name_full,
809 fork_of.repo_name, '')
810 meta.Session().commit()
811
812 source_repo_path = os.path.join(base_path, fork_of.repo_name)
813
814 # now create this repo on Filesystem
815 RepoModel()._create_filesystem_repo(
816 repo_name=repo_name,
817 repo_type=repo_type,
818 repo_group=db.RepoGroup.guess_instance(repo_group),
819 clone_uri=source_repo_path,
820 )
821 db_repo = db.Repository.get_by_repo_name(repo_name_full)
822 hooks.log_create_repository(db_repo.get_dict(), created_by=owner.username)
823
824 # update repo changeset caches initially
825 db_repo.update_changeset_cache()
826
827 # set new created state
828 db_repo.set_state(db.Repository.STATE_CREATED)
829 meta.Session().commit()
830 except Exception as e:
831 log.warning('Exception %s occurred when forking repository, '
832 'doing cleanup...' % e)
833 # rollback things manually !
834 db_repo = db.Repository.get_by_repo_name(repo_name_full)
835 if db_repo:
836 db.Repository.delete(db_repo.repo_id)
837 meta.Session().commit()
838 RepoModel()._delete_filesystem_repo(db_repo)
839 raise
@@ -158,7 +158,6 b' known_violations = set(['
158 ('kallithea.lib.utils', 'kallithea.model'), # clean up utils
158 ('kallithea.lib.utils', 'kallithea.model'), # clean up utils
159 ('kallithea.lib.utils', 'kallithea.model.db'),
159 ('kallithea.lib.utils', 'kallithea.model.db'),
160 ('kallithea.lib.utils', 'kallithea.model.scm'),
160 ('kallithea.lib.utils', 'kallithea.model.scm'),
161 ('kallithea.model.async_tasks', 'kallithea.lib.hooks'),
162 ('kallithea.model.async_tasks', 'kallithea.model'),
161 ('kallithea.model.async_tasks', 'kallithea.model'),
163 ('kallithea.model', 'kallithea.lib.auth'), # auth.HasXXX
162 ('kallithea.model', 'kallithea.lib.auth'), # auth.HasXXX
164 ('kallithea.model', 'kallithea.lib.auth_modules'), # validators
163 ('kallithea.model', 'kallithea.lib.auth_modules'), # validators
General Comments 0
You need to be logged in to leave comments. Login now