# HG changeset patch # User Thomas De Schampheleire # Date 1528572285 -7200 # Node ID 401fe08bc6b8c7b5301f07f854d5c02d3201ed9d # Parent e2519d2e74c2e690a35f05cf44893a570e89bf97 utils: move repo_name_slug to utils2 to prevent import cycle on setup_db After commit 57a733313e4f, 'gearbox setup-db -c my.ini' fails with an import cycle as follows: Traceback (most recent call last): File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/bin/gearbox", line 11, in sys.exit(main()) File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/gearbox/main.py", line 199, in main return gearbox.run(args) File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/gearbox/main.py", line 145, in run return self._run_subcommand(remainder) File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/gearbox/main.py", line 149, in _run_subcommand subcommand = self.command_manager.find_command(argv) File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/gearbox/commandmanager.py", line 78, in find_command cmd_factory = cmd_ep.resolve() File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2324, in resolve module = __import__(self.module_name, fromlist=['__name__'], level=0) File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/lib/paster_commands/setup_db.py", line 27, in from kallithea.lib.db_manage import DbManage File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/lib/db_manage.py", line 47, in from kallithea.model.repo_group import RepoGroupModel File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/model/repo_group.py", line 35, in import kallithea.lib.utils File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/lib/utils.py", line 48, in from kallithea.model.repo_group import RepoGroupModel ImportError: cannot import name RepoGroupModel i.e. kallithea.model.repo_group wants to import kallithea.lib.utils which in turn wants to import kallithea.model.repo_group. In fact there exists kallithea.lib.utils and kallithea.lib.utils2. The current split is that 'utils2' contains 'simple' utilities, none of which depend on kallithea models, controllers, ... In contrast, 'utils' does rely on such kallithea classes. As kallithea.model.repo_group was only include kallithea.lib.utils for its repo_name_slug method, which has no dependency on other kallithea classes, move that method (and its dependent recursive_replace) to kallithea.lib.utils2 instead. This fixes the import cycle. diff -r e2519d2e74c2 -r 401fe08bc6b8 kallithea/lib/utils.py --- a/kallithea/lib/utils.py Sat Jun 09 16:30:22 2018 +0200 +++ b/kallithea/lib/utils.py Sat Jun 09 21:24:45 2018 +0200 @@ -34,7 +34,6 @@ from tg import request, response from tg.i18n import ugettext as _ -from webhelpers.text import collapse, remove_formatting, strip_tags from beaker.cache import _cache_decorate from kallithea.lib.vcs.utils.hgcompat import ui, config @@ -54,42 +53,6 @@ REMOVED_REPO_PAT = re.compile(r'rm__\d{8}_\d{6}_\d{6}_.*') -def recursive_replace(str_, replace=' '): - """ - Recursive replace of given sign to just one instance - - :param str_: given string - :param replace: char to find and replace multiple instances - - Examples:: - >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-') - 'Mighty-Mighty-Bo-sstones' - """ - - if str_.find(replace * 2) == -1: - return str_ - else: - str_ = str_.replace(replace * 2, replace) - return recursive_replace(str_, replace) - - -def repo_name_slug(value): - """ - Return slug of name of repository - This function is called on each creation/modification - of repository to prevent bad names in repo - """ - - slug = remove_formatting(value) - slug = strip_tags(slug) - - for c in """`?=[]\;'"<>,/~!@#$%^&*()+{}|: """: - slug = slug.replace(c, '-') - slug = recursive_replace(slug, '-') - slug = collapse(slug, '-') - return slug - - #============================================================================== # PERM DECORATOR HELPERS FOR EXTRACTING NAMES FOR PERM CHECKS #============================================================================== diff -r e2519d2e74c2 -r 401fe08bc6b8 kallithea/lib/utils2.py --- a/kallithea/lib/utils2.py Sat Jun 09 16:30:22 2018 +0200 +++ b/kallithea/lib/utils2.py Sat Jun 09 21:24:45 2018 +0200 @@ -15,7 +15,9 @@ kallithea.lib.utils2 ~~~~~~~~~~~~~~~~~~~~ -Some simple helper functions +Some simple helper functions. +Note: all these functions should be independent of Kallithea classes, i.e. +models, controllers, etc. to prevent import cycles. This file was forked by the Kallithea project in July 2014. Original author and date, and relevant copyright and licensing information is below: @@ -37,6 +39,7 @@ import webob import urlobject +from webhelpers.text import collapse, remove_formatting, strip_tags from tg.i18n import ugettext as _, ungettext from kallithea.lib.vcs.utils.lazy import LazyProperty @@ -646,3 +649,39 @@ def urlreadable(s, _cleanstringsub=re.compile('[^-a-zA-Z0-9./]+').sub): return _cleanstringsub('_', safe_str(s)).rstrip('_') + + +def recursive_replace(str_, replace=' '): + """ + Recursive replace of given sign to just one instance + + :param str_: given string + :param replace: char to find and replace multiple instances + + Examples:: + >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-') + 'Mighty-Mighty-Bo-sstones' + """ + + if str_.find(replace * 2) == -1: + return str_ + else: + str_ = str_.replace(replace * 2, replace) + return recursive_replace(str_, replace) + + +def repo_name_slug(value): + """ + Return slug of name of repository + This function is called on each creation/modification + of repository to prevent bad names in repo + """ + + slug = remove_formatting(value) + slug = strip_tags(slug) + + for c in """`?=[]\;'"<>,/~!@#$%^&*()+{}|: """: + slug = slug.replace(c, '-') + slug = recursive_replace(slug, '-') + slug = collapse(slug, '-') + return slug diff -r e2519d2e74c2 -r 401fe08bc6b8 kallithea/model/repo.py --- a/kallithea/model/repo.py Sat Jun 09 16:30:22 2018 +0200 +++ b/kallithea/model/repo.py Sat Jun 09 21:24:45 2018 +0200 @@ -33,7 +33,7 @@ from datetime import datetime from sqlalchemy.orm import subqueryload -import kallithea.lib.utils +import kallithea.lib.utils2 from kallithea.lib.utils import make_ui, is_valid_repo_uri from kallithea.lib.vcs.backends import get_backend from kallithea.lib.utils2 import LazyProperty, safe_str, safe_unicode, \ @@ -316,7 +316,7 @@ if 'repo_name' in kwargs: repo_name = kwargs['repo_name'] - if kallithea.lib.utils.repo_name_slug(repo_name) != repo_name: + if kallithea.lib.utils2.repo_name_slug(repo_name) != repo_name: raise Exception('invalid repo name %s' % repo_name) cur_repo.repo_name = cur_repo.get_new_name(repo_name) @@ -367,7 +367,7 @@ # with name and path of group repo_name_full = repo_name repo_name = repo_name.split(self.URL_SEPARATOR)[-1] - if kallithea.lib.utils.repo_name_slug(repo_name) != repo_name: + if kallithea.lib.utils2.repo_name_slug(repo_name) != repo_name: raise Exception('invalid repo name %s' % repo_name) new_repo = Repository() diff -r e2519d2e74c2 -r 401fe08bc6b8 kallithea/model/repo_group.py --- a/kallithea/model/repo_group.py Sat Jun 09 16:30:22 2018 +0200 +++ b/kallithea/model/repo_group.py Sat Jun 09 21:24:45 2018 +0200 @@ -32,7 +32,7 @@ import shutil import datetime -import kallithea.lib.utils +import kallithea.lib.utils2 from kallithea.lib.utils2 import LazyProperty from kallithea.model.db import RepoGroup, Session, Ui, UserRepoGroupToPerm, \ @@ -136,7 +136,7 @@ def create(self, group_name, group_description, owner, parent=None, just_db=False, copy_permissions=False): try: - if kallithea.lib.utils.repo_name_slug(group_name) != group_name: + if kallithea.lib.utils2.repo_name_slug(group_name) != group_name: raise Exception('invalid repo group name %s' % group_name) owner = User.guess_instance(owner) @@ -295,7 +295,7 @@ repo_group.parent_group = RepoGroup.get(kwargs['parent_group_id']) if 'group_name' in kwargs: group_name = kwargs['group_name'] - if kallithea.lib.utils.repo_name_slug(group_name) != group_name: + if kallithea.lib.utils2.repo_name_slug(group_name) != group_name: raise Exception('invalid repo group name %s' % group_name) repo_group.group_name = repo_group.get_new_name(group_name) new_path = repo_group.full_path diff -r e2519d2e74c2 -r 401fe08bc6b8 kallithea/model/validators.py --- a/kallithea/model/validators.py Sat Jun 09 16:30:22 2018 +0200 +++ b/kallithea/model/validators.py Sat Jun 09 21:24:45 2018 +0200 @@ -31,8 +31,8 @@ ) from kallithea.lib.compat import OrderedSet from kallithea.lib import ipaddr -from kallithea.lib.utils import repo_name_slug, is_valid_repo_uri -from kallithea.lib.utils2 import str2bool, aslist +from kallithea.lib.utils import is_valid_repo_uri +from kallithea.lib.utils2 import str2bool, aslist, repo_name_slug from kallithea.model.db import RepoGroup, Repository, UserGroup, User from kallithea.lib.exceptions import LdapImportError from kallithea.config.routing import ADMIN_PREFIX