# HG changeset patch # User Mads Kiilerich # Date 2019-12-26 12:16:14 # Node ID e51ad2cd400e42698faa91ac5b4d21fa6e970eab # Parent e35373106528b29461b7f5144780cb9ec79f765d py3: drop the last uses of safe_str - they are no longer relevant when we don't have a separate unicode type diff --git a/kallithea/bin/kallithea_cli_repo.py b/kallithea/bin/kallithea_cli_repo.py --- a/kallithea/bin/kallithea_cli_repo.py +++ b/kallithea/bin/kallithea_cli_repo.py @@ -28,7 +28,7 @@ import click import kallithea.bin.kallithea_cli_base as cli_base from kallithea.lib.utils import REMOVED_REPO_PAT, repo2db_mapper -from kallithea.lib.utils2 import ask_ok, safe_str +from kallithea.lib.utils2 import ask_ok from kallithea.model.db import Repository, Ui from kallithea.model.meta import Session from kallithea.model.scm import ScmModel @@ -127,7 +127,7 @@ def repo_purge_deleted(ask, older_than): repos_location = Ui.get_repos_location() to_remove = [] - for dn_, dirs, f in os.walk(safe_str(repos_location)): + for dn_, dirs, f in os.walk(repos_location): alldirs = list(dirs) del dirs[:] if ('.hg' in alldirs or @@ -175,9 +175,8 @@ def repo_purge_deleted(ask, older_than): remove = True else: remove = ask_ok('The following repositories will be removed completely:\n%s\n' - 'Do you want to proceed? [y/n] ' - % '\n'.join(['%s deleted on %s' % (safe_str(x[0]), safe_str(x[1])) - for x in to_remove])) + 'Do you want to proceed? [y/n] ' % + '\n'.join('%s deleted on %s' % (path, date_) for path, date_ in to_remove)) if remove: for path, date_ in to_remove: diff --git a/kallithea/controllers/api/__init__.py b/kallithea/controllers/api/__init__.py --- a/kallithea/controllers/api/__init__.py +++ b/kallithea/controllers/api/__init__.py @@ -39,7 +39,7 @@ from kallithea.lib import ext_json from kallithea.lib.auth import AuthUser from kallithea.lib.base import _get_ip_addr as _get_ip from kallithea.lib.base import get_path_info -from kallithea.lib.utils2 import ascii_bytes, safe_str +from kallithea.lib.utils2 import ascii_bytes from kallithea.model.db import User @@ -53,7 +53,7 @@ class JSONRPCError(BaseException): super(JSONRPCError, self).__init__() def __str__(self): - return safe_str(self.message) + return self.message class JSONRPCErrorResponse(Response, HTTPException): diff --git a/kallithea/controllers/compare.py b/kallithea/controllers/compare.py --- a/kallithea/controllers/compare.py +++ b/kallithea/controllers/compare.py @@ -43,7 +43,7 @@ from kallithea.lib import helpers as h from kallithea.lib.auth import HasRepoPermissionLevelDecorator, LoginRequired from kallithea.lib.base import BaseRepoController, render from kallithea.lib.graphmod import graph_data -from kallithea.lib.utils2 import ascii_bytes, ascii_str, safe_bytes, safe_int, safe_str +from kallithea.lib.utils2 import ascii_bytes, ascii_str, safe_bytes, safe_int from kallithea.model.db import Repository @@ -135,10 +135,10 @@ class CompareController(BaseRepoControll from dulwich.client import SubprocessGitClient gitrepo = Repo(org_repo.path) - SubprocessGitClient(thin_packs=False).fetch(safe_str(other_repo.path), gitrepo) + SubprocessGitClient(thin_packs=False).fetch(other_repo.path, gitrepo) gitrepo_remote = Repo(other_repo.path) - SubprocessGitClient(thin_packs=False).fetch(safe_str(org_repo.path), gitrepo_remote) + SubprocessGitClient(thin_packs=False).fetch(org_repo.path, gitrepo_remote) revs = [ ascii_str(x.commit.id) diff --git a/kallithea/controllers/files.py b/kallithea/controllers/files.py --- a/kallithea/controllers/files.py +++ b/kallithea/controllers/files.py @@ -46,7 +46,7 @@ from kallithea.lib.auth import HasRepoPe from kallithea.lib.base import BaseRepoController, jsonify, render from kallithea.lib.exceptions import NonRelativePathError from kallithea.lib.utils import action_logger -from kallithea.lib.utils2 import convert_line_endings, detect_mode, safe_int, safe_str, safe_unicode, str2bool +from kallithea.lib.utils2 import convert_line_endings, detect_mode, safe_int, safe_unicode, str2bool from kallithea.lib.vcs.backends.base import EmptyChangeset from kallithea.lib.vcs.conf import settings from kallithea.lib.vcs.exceptions import ( @@ -232,8 +232,8 @@ class FilesController(BaseRepoController cs = self.__get_cs(revision) file_node = self.__get_filenode(cs, f_path) - response.content_disposition = 'attachment; filename=%s' % \ - safe_str(f_path.split(Repository.url_sep())[-1]) + response.content_disposition = \ + 'attachment; filename=%s' % f_path.split(Repository.url_sep())[-1] response.content_type = file_node.mimetype return file_node.content @@ -277,8 +277,7 @@ class FilesController(BaseRepoController mimetype, dispo = 'text/plain', 'inline' if dispo == 'attachment': - dispo = 'attachment; filename=%s' % \ - safe_str(f_path.split(os.sep)[-1]) + dispo = 'attachment; filename=%s' % f_path.split(os.sep)[-1] response.content_disposition = dispo response.content_type = mimetype @@ -508,8 +507,7 @@ class FilesController(BaseRepoController from kallithea import CONFIG rev_name = cs.raw_id[:12] - archive_name = '%s-%s%s' % (safe_str(repo_name.replace('/', '_')), - safe_str(rev_name), ext) + archive_name = '%s-%s%s' % (repo_name.replace('/', '_'), rev_name, ext) archive_path = None cached_archive_path = None diff --git a/kallithea/controllers/login.py b/kallithea/controllers/login.py --- a/kallithea/controllers/login.py +++ b/kallithea/controllers/login.py @@ -41,7 +41,6 @@ from kallithea.config.routing import url from kallithea.lib.auth import AuthUser, HasPermissionAnyDecorator from kallithea.lib.base import BaseController, log_in_user, render from kallithea.lib.exceptions import UserCreationError -from kallithea.lib.utils2 import safe_str from kallithea.model.db import Setting, User from kallithea.model.forms import LoginForm, PasswordResetConfirmationForm, PasswordResetRequestForm, RegisterForm from kallithea.model.meta import Session @@ -68,7 +67,7 @@ class LoginController(BaseController): return _re.match(came_from) is not None def index(self): - c.came_from = safe_str(request.GET.get('came_from', '')) + c.came_from = request.GET.get('came_from', '') if c.came_from: if not self._validate_came_from(c.came_from): log.error('Invalid came_from (not server-relative): %r', c.came_from) diff --git a/kallithea/controllers/pullrequests.py b/kallithea/controllers/pullrequests.py --- a/kallithea/controllers/pullrequests.py +++ b/kallithea/controllers/pullrequests.py @@ -43,7 +43,7 @@ from kallithea.lib.auth import HasRepoPe from kallithea.lib.base import BaseRepoController, jsonify, render from kallithea.lib.graphmod import graph_data from kallithea.lib.page import Page -from kallithea.lib.utils2 import ascii_bytes, safe_bytes, safe_int, safe_str +from kallithea.lib.utils2 import ascii_bytes, safe_bytes, safe_int from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError, EmptyRepositoryError from kallithea.model.changeset_status import ChangesetStatusModel from kallithea.model.comment import ChangesetCommentsModel @@ -82,12 +82,6 @@ class PullrequestsController(BaseRepoCon # list named branches that has been merged to this named branch - it should probably merge back peers = [] - if rev: - rev = safe_str(rev) - - if branch: - branch = safe_str(branch) - if branch_rev: # a revset not restricting to merge() would be better # (especially because it would get the branch point) @@ -586,7 +580,7 @@ class PullrequestsController(BaseRepoCon log.debug('running diff between %s and %s in %s', c.a_rev, c.cs_rev, org_scm_instance.path) try: - raw_diff = diffs.get_diff(org_scm_instance, rev1=safe_str(c.a_rev), rev2=safe_str(c.cs_rev), + raw_diff = diffs.get_diff(org_scm_instance, rev1=c.a_rev, rev2=c.cs_rev, ignore_whitespace=ignore_whitespace, context=line_context) except ChangesetDoesNotExistError: raw_diff = safe_bytes(_("The diff can't be shown - the PR revisions could not be found.")) diff --git a/kallithea/controllers/search.py b/kallithea/controllers/search.py --- a/kallithea/controllers/search.py +++ b/kallithea/controllers/search.py @@ -39,7 +39,7 @@ from kallithea.lib.auth import LoginRequ from kallithea.lib.base import BaseRepoController, render from kallithea.lib.indexers import CHGSET_IDX_NAME, CHGSETS_SCHEMA, IDX_NAME, SCHEMA, WhooshResultWrapper from kallithea.lib.page import Page -from kallithea.lib.utils2 import safe_int, safe_str +from kallithea.lib.utils2 import safe_int from kallithea.model.repo import RepoModel @@ -124,8 +124,8 @@ class SearchController(BaseRepoControlle page=p, item_count=res_ln, items_per_page=10, - type=safe_str(c.cur_type), - q=safe_str(c.cur_query), + type=c.cur_type, + q=c.cur_query, ) except QueryParserError: diff --git a/kallithea/lib/auth_modules/auth_container.py b/kallithea/lib/auth_modules/auth_container.py --- a/kallithea/lib/auth_modules/auth_container.py +++ b/kallithea/lib/auth_modules/auth_container.py @@ -29,7 +29,7 @@ import logging from kallithea.lib import auth_modules from kallithea.lib.compat import hybrid_property -from kallithea.lib.utils2 import safe_str, str2bool +from kallithea.lib.utils2 import str2bool from kallithea.model.db import Setting @@ -180,7 +180,7 @@ class KallitheaAuthPlugin(auth_modules.K # only way to log in is using environ username = None if userobj: - username = safe_str(getattr(userobj, 'username')) + username = getattr(userobj, 'username') if not username: # we don't have any objects in DB, user doesn't exist, extract diff --git a/kallithea/lib/auth_modules/auth_ldap.py b/kallithea/lib/auth_modules/auth_ldap.py --- a/kallithea/lib/auth_modules/auth_ldap.py +++ b/kallithea/lib/auth_modules/auth_ldap.py @@ -31,7 +31,6 @@ import logging from kallithea.lib import auth_modules from kallithea.lib.compat import hybrid_property from kallithea.lib.exceptions import LdapConnectionError, LdapImportError, LdapPasswordError, LdapUsernameError -from kallithea.lib.utils2 import safe_str log = logging.getLogger(__name__) @@ -70,11 +69,11 @@ class AuthLdap(object): port) for host in server.split(','))) - self.LDAP_BIND_DN = safe_str(bind_dn) - self.LDAP_BIND_PASS = safe_str(bind_pass) + self.LDAP_BIND_DN = bind_dn + self.LDAP_BIND_PASS = bind_pass - self.BASE_DN = safe_str(base_dn) - self.LDAP_FILTER = safe_str(ldap_filter) + self.BASE_DN = base_dn + self.LDAP_FILTER = ldap_filter self.SEARCH_SCOPE = getattr(ldap, 'SCOPE_%s' % search_scope) self.attr_login = attr_login @@ -139,7 +138,7 @@ class AuthLdap(object): try: log.debug('Trying simple bind with %s', dn) - server.simple_bind_s(dn, safe_str(password)) + server.simple_bind_s(dn, password) results = server.search_ext_s(dn, ldap.SCOPE_BASE, '(objectClass=*)') if len(results) == 1: diff --git a/kallithea/lib/base.py b/kallithea/lib/base.py --- a/kallithea/lib/base.py +++ b/kallithea/lib/base.py @@ -49,7 +49,7 @@ from kallithea.lib import auth_modules, from kallithea.lib.auth import AuthUser, HasPermissionAnyMiddleware from kallithea.lib.exceptions import UserCreationError from kallithea.lib.utils import get_repo_slug, is_valid_repo -from kallithea.lib.utils2 import AttributeDict, ascii_bytes, safe_int, safe_str, safe_unicode, set_hook_environment, str2bool +from kallithea.lib.utils2 import AttributeDict, ascii_bytes, safe_int, safe_unicode, set_hook_environment, str2bool from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError, EmptyRepositoryError, RepositoryError from kallithea.model import meta from kallithea.model.db import PullRequest, Repository, Setting, User @@ -242,7 +242,7 @@ class BaseVCSController(object): # If not authenticated by the container, running basic auth if not username: - self.authenticate.realm = safe_str(self.config['realm']) + self.authenticate.realm = self.config['realm'] result = self.authenticate(environ) if isinstance(result, str): paste.httpheaders.AUTH_TYPE.update(environ, 'basic') @@ -333,7 +333,7 @@ class BaseVCSController(object): try: log.info('%s action on %s repo "%s" by "%s" from %s', - parsed_request.action, self.scm_alias, parsed_request.repo_name, safe_str(user.username), ip_addr) + parsed_request.action, self.scm_alias, parsed_request.repo_name, user.username, ip_addr) app = self._make_app(parsed_request) return app(environ, start_response) except Exception: diff --git a/kallithea/lib/caching_query.py b/kallithea/lib/caching_query.py --- a/kallithea/lib/caching_query.py +++ b/kallithea/lib/caching_query.py @@ -24,8 +24,6 @@ from sqlalchemy.orm.interfaces import Ma from sqlalchemy.orm.query import Query from sqlalchemy.sql import visitors -from kallithea.lib.utils2 import safe_str - class CachingQuery(Query): """A Query subclass which optionally loads full results from a Beaker @@ -175,7 +173,7 @@ def _set_cache_parameters(query, region, "for region %r namespace %r" % (region, namespace) ) - query._cache_parameters = region, safe_str(namespace), cache_key + query._cache_parameters = region, namespace, cache_key class FromCache(MapperOption): diff --git a/kallithea/lib/hooks.py b/kallithea/lib/hooks.py --- a/kallithea/lib/hooks.py +++ b/kallithea/lib/hooks.py @@ -34,7 +34,7 @@ import mercurial.scmutil from kallithea.lib import helpers as h from kallithea.lib.exceptions import UserCreationError from kallithea.lib.utils import action_logger, make_ui -from kallithea.lib.utils2 import HookEnvironmentError, ascii_str, get_hook_environment, safe_bytes, safe_str +from kallithea.lib.utils2 import HookEnvironmentError, ascii_str, get_hook_environment, safe_bytes from kallithea.lib.vcs.backends.base import EmptyChangeset from kallithea.model.db import Repository, User @@ -44,7 +44,7 @@ def _get_scm_size(alias, root_path): alias += '.' size_scm, size_root = 0, 0 - for path, dirs, files in os.walk(safe_str(root_path)): + for path, dirs, files in os.walk(root_path): if path.find(alias) != -1: for f in files: try: @@ -318,8 +318,7 @@ def _hook_environment(repo_path): repo = Repository.get_by_full_path(repo_path) if not repo: - raise OSError('Repository %s not found in database' - % (safe_str(repo_path))) + raise OSError('Repository %s not found in database' % repo_path) baseui = make_ui() return baseui, repo @@ -397,5 +396,5 @@ def handle_git_post_receive(repo_path, g def rejectpush(ui, **kwargs): """Mercurial hook to be installed as pretxnopen and prepushkey for read-only repos""" ex = get_hook_environment() - ui.warn(safe_bytes("Push access to %r denied\n" % safe_str(ex.repository))) + ui.warn(safe_bytes("Push access to %r denied\n" % ex.repository)) return 1 diff --git a/kallithea/lib/indexers/daemon.py b/kallithea/lib/indexers/daemon.py --- a/kallithea/lib/indexers/daemon.py +++ b/kallithea/lib/indexers/daemon.py @@ -39,7 +39,7 @@ from whoosh.qparser import QueryParser from kallithea.config.conf import INDEX_EXTENSIONS, INDEX_FILENAMES from kallithea.lib.indexers import CHGSET_IDX_NAME, CHGSETS_SCHEMA, IDX_NAME, SCHEMA -from kallithea.lib.utils2 import safe_str, safe_unicode +from kallithea.lib.utils2 import safe_unicode from kallithea.lib.vcs.exceptions import ChangesetError, NodeDoesNotExistError, RepositoryError from kallithea.model.db import Repository from kallithea.model.scm import ScmModel @@ -132,7 +132,7 @@ class WhooshIndexingDaemon(object): cs = self._get_index_changeset(repo) for _topnode, _dirs, files in cs.walk('/'): for f in files: - index_paths_.add(os.path.join(safe_str(repo.path), safe_str(f.path))) + index_paths_.add(os.path.join(repo.path, f.path)) except RepositoryError: log.debug(traceback.format_exc()) @@ -141,19 +141,16 @@ class WhooshIndexingDaemon(object): def get_node(self, repo, path, index_rev=None): """ - gets a filenode based on given full path. It operates on string for - hg git compatibility. + gets a filenode based on given full path. :param repo: scm repo instance :param path: full path including root location :return: FileNode """ # FIXME: paths should be normalized ... or even better: don't include repo.path - path = safe_str(path) - repo_path = safe_str(repo.path) - assert path.startswith(repo_path) - assert path[len(repo_path)] in (os.path.sep, os.path.altsep) - node_path = path[len(repo_path) + 1:] + assert path.startswith(repo.path) + assert path[len(repo.path)] in (os.path.sep, os.path.altsep) + node_path = path[len(repo.path) + 1:] cs = self._get_index_changeset(repo, index_rev=index_rev) node = cs.get_node(node_path) return node diff --git a/kallithea/lib/middleware/simplehg.py b/kallithea/lib/middleware/simplehg.py --- a/kallithea/lib/middleware/simplehg.py +++ b/kallithea/lib/middleware/simplehg.py @@ -36,7 +36,7 @@ import mercurial.hgweb from kallithea.lib.base import BaseVCSController, get_path_info from kallithea.lib.utils import make_ui -from kallithea.lib.utils2 import safe_bytes, safe_str +from kallithea.lib.utils2 import safe_bytes log = logging.getLogger(__name__) @@ -137,13 +137,13 @@ class SimpleHg(BaseVCSController): """ Make an hgweb wsgi application. """ - str_repo_name = safe_str(parsed_request.repo_name) - repo_path = os.path.join(safe_str(self.basepath), str_repo_name) + repo_name = parsed_request.repo_name + repo_path = os.path.join(self.basepath, repo_name) baseui = make_ui(repo_path=repo_path) - hgweb_app = mercurial.hgweb.hgweb(safe_bytes(repo_path), name=str_repo_name, baseui=baseui) + hgweb_app = mercurial.hgweb.hgweb(safe_bytes(repo_path), name=safe_bytes(repo_name), baseui=baseui) def wrapper_app(environ, start_response): - environ['REPO_NAME'] = str_repo_name # used by mercurial.hgweb.hgweb + environ['REPO_NAME'] = repo_name # used by mercurial.hgweb.hgweb return hgweb_app(environ, start_response) return wrapper_app diff --git a/kallithea/lib/utils.py b/kallithea/lib/utils.py --- a/kallithea/lib/utils.py +++ b/kallithea/lib/utils.py @@ -40,7 +40,7 @@ from tg.i18n import ugettext as _ import kallithea.config.conf from kallithea.lib.exceptions import HgsubversionImportError -from kallithea.lib.utils2 import ascii_bytes, aslist, get_current_authuser, safe_bytes, safe_str +from kallithea.lib.utils2 import ascii_bytes, aslist, get_current_authuser, safe_bytes from kallithea.lib.vcs.backends.git.repository import GitRepository from kallithea.lib.vcs.backends.hg.repository import MercurialRepository from kallithea.lib.vcs.conf import settings @@ -174,7 +174,7 @@ def get_filesystem_repos(path): """ # remove ending slash for better results - path = safe_str(path.rstrip(os.sep)) + path = path.rstrip(os.sep) log.debug('now scanning in %s', path) def isdir(*n): @@ -269,7 +269,7 @@ def is_valid_repo(repo_name, base_path, :return True: if given path is a valid repository """ # TODO: paranoid security checks? - full_path = os.path.join(safe_str(base_path), safe_str(repo_name)) + full_path = os.path.join(base_path, repo_name) try: scm_ = get_scm(full_path) @@ -287,7 +287,7 @@ def is_valid_repo_group(repo_group_name, :param repo_name: :param base_path: """ - full_path = os.path.join(safe_str(base_path), safe_str(repo_group_name)) + full_path = os.path.join(base_path, repo_group_name) # check if it's not a repo if is_valid_repo(repo_group_name, base_path): diff --git a/kallithea/lib/utils2.py b/kallithea/lib/utils2.py --- a/kallithea/lib/utils2.py +++ b/kallithea/lib/utils2.py @@ -329,7 +329,7 @@ def get_clone_url(clone_uri_tmpl, prefix system_user = 'kallithea' # hardcoded default value ... args = { 'scheme': parsed_url.scheme, - 'user': urllib.parse.quote(safe_str(username or '')), + 'user': urllib.parse.quote(username or ''), 'netloc': parsed_url.netloc + prefix, # like "hostname:port/prefix" (with optional ":port" and "/prefix") 'prefix': prefix, # undocumented, empty or starting with / 'repo': repo_name, @@ -561,7 +561,7 @@ class Optional(object): def urlreadable(s, _cleanstringsub=re.compile('[^-a-zA-Z0-9./]+').sub): - return _cleanstringsub('_', safe_str(s)).rstrip('_') + return _cleanstringsub('_', s).rstrip('_') def recursive_replace(str_, replace=' '): diff --git a/kallithea/lib/vcs/backends/git/changeset.py b/kallithea/lib/vcs/backends/git/changeset.py --- a/kallithea/lib/vcs/backends/git/changeset.py +++ b/kallithea/lib/vcs/backends/git/changeset.py @@ -11,7 +11,7 @@ from kallithea.lib.vcs.conf import setti from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError, ChangesetError, ImproperArchiveTypeError, NodeDoesNotExistError, RepositoryError, VCSError from kallithea.lib.vcs.nodes import ( AddedFileNodesGenerator, ChangedFileNodesGenerator, DirNode, FileNode, NodeKind, RemovedFileNodesGenerator, RootNode, SubModuleNode) -from kallithea.lib.vcs.utils import ascii_bytes, ascii_str, date_fromtimestamp, safe_int, safe_str, safe_unicode +from kallithea.lib.vcs.utils import ascii_bytes, ascii_str, date_fromtimestamp, safe_int, safe_unicode from kallithea.lib.vcs.utils.lazy import LazyProperty @@ -23,7 +23,6 @@ class GitChangeset(BaseChangeset): def __init__(self, repository, revision): self._stat_modes = {} self.repository = repository - revision = safe_str(revision) try: commit = self.repository._repo[ascii_bytes(revision)] if isinstance(commit, objects.Tag): @@ -109,7 +108,6 @@ class GitChangeset(BaseChangeset): return path def _get_id_for_path(self, path): - path = safe_str(path) # FIXME: Please, spare a couple of minutes and make those codes cleaner; if path not in self._paths: path = path.strip('/') @@ -159,7 +157,7 @@ class GitChangeset(BaseChangeset): if path not in self._paths: raise NodeDoesNotExistError("There is no file nor directory " "at the given path '%s' at revision %s" - % (path, safe_str(self.short_id))) + % (path, self.short_id)) return self._paths[path] def _get_kind(self, path): @@ -252,7 +250,6 @@ class GitChangeset(BaseChangeset): Returns stat mode of the file at the given ``path``. """ # ensure path is traversed - path = safe_str(path) self._get_id_for_path(path) return self._stat_modes[path] @@ -288,15 +285,14 @@ class GitChangeset(BaseChangeset): iterating commits. """ self._get_filectx(path) - f_path = safe_str(path) if limit is not None: cmd = ['log', '-n', str(safe_int(limit, 0)), - '--pretty=format:%H', '-s', self.raw_id, '--', f_path] + '--pretty=format:%H', '-s', self.raw_id, '--', path] else: cmd = ['log', - '--pretty=format:%H', '-s', self.raw_id, '--', f_path] + '--pretty=format:%H', '-s', self.raw_id, '--', path] so = self.repository.run_git_command(cmd) ids = re.findall(r'[0-9a-fA-F]{40}', so) return [self.repository.get_changeset(sha) for sha in ids] diff --git a/kallithea/lib/vcs/backends/git/repository.py b/kallithea/lib/vcs/backends/git/repository.py --- a/kallithea/lib/vcs/backends/git/repository.py +++ b/kallithea/lib/vcs/backends/git/repository.py @@ -30,7 +30,7 @@ from kallithea.lib.vcs.backends.base imp from kallithea.lib.vcs.conf import settings from kallithea.lib.vcs.exceptions import ( BranchDoesNotExistError, ChangesetDoesNotExistError, EmptyRepositoryError, RepositoryError, TagAlreadyExistError, TagDoesNotExistError) -from kallithea.lib.vcs.utils import ascii_str, date_fromtimestamp, makedate, safe_bytes, safe_str, safe_unicode +from kallithea.lib.vcs.utils import ascii_str, date_fromtimestamp, makedate, safe_bytes, safe_unicode from kallithea.lib.vcs.utils.lazy import LazyProperty from kallithea.lib.vcs.utils.paths import abspath, get_user_home @@ -317,7 +317,6 @@ class GitRepository(BaseRepository): Returns normalized url. If schema is not given, would fall to filesystem (``file:///``) schema. """ - url = safe_str(url) if url != 'default' and '://' not in url: url = ':///'.join(('file', url)) return url diff --git a/kallithea/lib/vcs/backends/git/ssh.py b/kallithea/lib/vcs/backends/git/ssh.py --- a/kallithea/lib/vcs/backends/git/ssh.py +++ b/kallithea/lib/vcs/backends/git/ssh.py @@ -18,7 +18,6 @@ import os from kallithea.lib.hooks import log_pull_action from kallithea.lib.utils import make_ui from kallithea.lib.vcs.backends.ssh import BaseSshHandler -from kallithea.lib.vcs.utils import safe_str log = logging.getLogger(__name__) @@ -70,7 +69,7 @@ class GitSshHandler(BaseSshHandler): log_pull_action(ui=make_ui(), repo=self.db_repo.scm_instance._repo) else: # probably verb 'git-receive-pack', action 'push' if not self.allow_push: - self.exit('Push access to %r denied' % safe_str(self.repo_name)) + self.exit('Push access to %r denied' % self.repo_name) # Note: push logging is handled by Git post-receive hook # git shell is not a real shell but use shell inspired quoting *inside* the argument. diff --git a/kallithea/lib/vcs/backends/hg/changeset.py b/kallithea/lib/vcs/backends/hg/changeset.py --- a/kallithea/lib/vcs/backends/hg/changeset.py +++ b/kallithea/lib/vcs/backends/hg/changeset.py @@ -10,7 +10,7 @@ from kallithea.lib.vcs.conf import setti from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError, ChangesetError, ImproperArchiveTypeError, NodeDoesNotExistError, VCSError from kallithea.lib.vcs.nodes import ( AddedFileNodesGenerator, ChangedFileNodesGenerator, DirNode, FileNode, NodeKind, RemovedFileNodesGenerator, RootNode, SubModuleNode) -from kallithea.lib.vcs.utils import ascii_bytes, ascii_str, date_fromtimestamp, safe_bytes, safe_str, safe_unicode +from kallithea.lib.vcs.utils import ascii_bytes, ascii_str, date_fromtimestamp, safe_bytes, safe_unicode from kallithea.lib.vcs.utils.lazy import LazyProperty from kallithea.lib.vcs.utils.paths import get_dirs_for_path @@ -202,7 +202,7 @@ class MercurialChangeset(BaseChangeset): if path.endswith('/'): path = path.rstrip('/') - return safe_str(path) + return path def _get_kind(self, path): path = self._fix_path(path) diff --git a/kallithea/lib/vcs/backends/hg/repository.py b/kallithea/lib/vcs/backends/hg/repository.py --- a/kallithea/lib/vcs/backends/hg/repository.py +++ b/kallithea/lib/vcs/backends/hg/repository.py @@ -39,7 +39,7 @@ import mercurial.util from kallithea.lib.vcs.backends.base import BaseRepository, CollectionGenerator from kallithea.lib.vcs.exceptions import ( BranchDoesNotExistError, ChangesetDoesNotExistError, EmptyRepositoryError, RepositoryError, TagAlreadyExistError, TagDoesNotExistError, VCSError) -from kallithea.lib.vcs.utils import ascii_str, author_email, author_name, date_fromtimestamp, makedate, safe_bytes, safe_str, safe_unicode +from kallithea.lib.vcs.utils import ascii_str, author_email, author_name, date_fromtimestamp, makedate, safe_bytes, safe_unicode from kallithea.lib.vcs.utils.lazy import LazyProperty from kallithea.lib.vcs.utils.paths import abspath @@ -446,7 +446,6 @@ class MercurialRepository(BaseRepository """ Returns revision number for the given reference. """ - ref_name = safe_str(ref_name) if ref_type == 'rev' and not ref_name.strip('0'): return self.EMPTY_CHANGESET # lookup up the exact node id @@ -485,11 +484,9 @@ class MercurialRepository(BaseRepository def _get_url(self, url): """ - Returns normalized url. If schema is not given, would fall - to filesystem - (``file:///``) schema. + Returns normalized url. If schema is not given, fall back to + filesystem (``file:///``) schema. """ - url = safe_str(url) if url != 'default' and '://' not in url: url = "file:" + urllib.request.pathname2url(url) return url diff --git a/kallithea/lib/vcs/backends/ssh.py b/kallithea/lib/vcs/backends/ssh.py --- a/kallithea/lib/vcs/backends/ssh.py +++ b/kallithea/lib/vcs/backends/ssh.py @@ -25,7 +25,6 @@ import sys from kallithea.lib.auth import AuthUser, HasPermissionAnyMiddleware from kallithea.lib.utils2 import set_hook_environment -from kallithea.lib.vcs.utils import safe_str from kallithea.model.db import Repository, User, UserSshKeys from kallithea.model.meta import Session @@ -83,7 +82,7 @@ class BaseSshHandler(object): elif HasPermissionAnyMiddleware('repository.read')(self.authuser, self.repo_name): self.allow_push = False else: - self.exit('Access to %r denied' % safe_str(self.repo_name)) + self.exit('Access to %r denied' % self.repo_name) self.db_repo = Repository.get_by_repo_name(self.repo_name) if self.db_repo is None: diff --git a/kallithea/lib/vcs/nodes.py b/kallithea/lib/vcs/nodes.py --- a/kallithea/lib/vcs/nodes.py +++ b/kallithea/lib/vcs/nodes.py @@ -16,7 +16,7 @@ import stat from kallithea.lib.vcs.backends.base import EmptyChangeset from kallithea.lib.vcs.exceptions import NodeError, RemovedFileNodeError -from kallithea.lib.vcs.utils import safe_bytes, safe_str, safe_unicode +from kallithea.lib.vcs.utils import safe_bytes, safe_unicode from kallithea.lib.vcs.utils.lazy import LazyProperty @@ -102,7 +102,7 @@ class Node(object): if path.startswith('/'): raise NodeError("Cannot initialize Node objects with slash at " "the beginning as only relative paths are supported") - self.path = safe_str(path.rstrip('/')) # we store paths as str + self.path = path.rstrip('/') if path == '' and kind != NodeKind.DIR: raise NodeError("Only DirNode and its subclasses may be " "initialized with empty path") @@ -592,7 +592,7 @@ class SubModuleNode(Node): self.alias = alias # we have to use emptyChangeset here since this can point to svn/git/hg # submodules we cannot get from repository - self.changeset = EmptyChangeset(str(changeset), alias=alias) + self.changeset = EmptyChangeset(changeset, alias=alias) self.url = url def __repr__(self): diff --git a/kallithea/lib/vcs/utils/__init__.py b/kallithea/lib/vcs/utils/__init__.py --- a/kallithea/lib/vcs/utils/__init__.py +++ b/kallithea/lib/vcs/utils/__init__.py @@ -204,7 +204,7 @@ def author_email(author): m = email_re.search(author) if m is None: return '' - return safe_str(m.group(0)) + return m.group(0) def author_name(author): diff --git a/kallithea/model/db.py b/kallithea/model/db.py --- a/kallithea/model/db.py +++ b/kallithea/model/db.py @@ -49,7 +49,7 @@ from kallithea.lib import ext_json from kallithea.lib.caching_query import FromCache from kallithea.lib.exceptions import DefaultUserException from kallithea.lib.utils2 import ( - Optional, ascii_bytes, aslist, get_changeset_safe, get_clone_url, remove_prefix, safe_bytes, safe_int, safe_str, safe_unicode, str2bool, urlreadable) + Optional, ascii_bytes, aslist, get_changeset_safe, get_clone_url, remove_prefix, safe_bytes, safe_int, safe_unicode, str2bool, urlreadable) from kallithea.lib.vcs import get_backend from kallithea.lib.vcs.backends.base import EmptyChangeset from kallithea.lib.vcs.utils.helpers import get_scm @@ -1424,7 +1424,7 @@ class Repository(Base, BaseDbModel): return _c(rn) def scm_instance_no_cache(self): - repo_full_path = safe_str(self.repo_full_path) + repo_full_path = self.repo_full_path alias = get_scm(repo_full_path)[0] log.debug('Creating instance of %s repository from %s', alias, self.repo_full_path) @@ -2091,11 +2091,11 @@ class CacheInvalidation(Base, BaseDbMode """ inv_objs = Session().query(cls).filter(cls.cache_args == repo_name).all() log.debug('for repo %s got %s invalidation objects', - safe_str(repo_name), inv_objs) + repo_name, inv_objs) for inv_obj in inv_objs: log.debug('marking %s key for invalidation based on repo_name=%s', - inv_obj, safe_str(repo_name)) + inv_obj, repo_name) Session().delete(inv_obj) Session().commit() @@ -2517,7 +2517,7 @@ class Gist(Base, BaseDbModel): def scm_instance(self): from kallithea.lib.vcs import get_repo base_path = self.base_path() - return get_repo(os.path.join(safe_str(base_path), safe_str(self.gist_access_id))) + return get_repo(os.path.join(base_path, self.gist_access_id)) class UserSshKeys(Base, BaseDbModel): diff --git a/kallithea/model/repo.py b/kallithea/model/repo.py --- a/kallithea/model/repo.py +++ b/kallithea/model/repo.py @@ -39,7 +39,7 @@ from kallithea.lib.caching_query import from kallithea.lib.exceptions import AttachedForksError from kallithea.lib.hooks import log_delete_repository from kallithea.lib.utils import is_valid_repo_uri, make_ui -from kallithea.lib.utils2 import LazyProperty, get_current_authuser, obfuscate_url_pw, remove_prefix, safe_str +from kallithea.lib.utils2 import LazyProperty, get_current_authuser, obfuscate_url_pw, remove_prefix from kallithea.lib.vcs.backends import get_backend from kallithea.model.db import ( Permission, RepoGroup, Repository, RepositoryField, Session, Statistics, Ui, User, UserGroup, UserGroupRepoGroupToPerm, UserGroupRepoToPerm, UserRepoGroupToPerm, UserRepoToPerm) @@ -641,8 +641,7 @@ class RepoModel(object): _paths = [repo_store_location] else: _paths = [self.repos_path, new_parent_path, repo_name] - # we need to make it str for mercurial - repo_path = os.path.join(*(safe_str(x) for x in _paths)) + repo_path = os.path.join(*_paths) # check if this path is not a repository if is_valid_repo(repo_path, self.repos_path): @@ -686,8 +685,8 @@ class RepoModel(object): """ log.info('renaming repo from %s to %s', old, new) - old_path = safe_str(os.path.join(self.repos_path, old)) - new_path = safe_str(os.path.join(self.repos_path, new)) + old_path = os.path.join(self.repos_path, old) + new_path = os.path.join(self.repos_path, new) if os.path.isdir(new_path): raise Exception( 'Was trying to rename to already existing dir %s' % new_path @@ -702,7 +701,7 @@ class RepoModel(object): :param repo: repo object """ - rm_path = safe_str(os.path.join(self.repos_path, repo.repo_name)) + rm_path = os.path.join(self.repos_path, repo.repo_name) log.info("Removing %s", rm_path) _now = datetime.now() @@ -713,6 +712,6 @@ class RepoModel(object): args = repo.group.full_path_splitted + [_d] _d = os.path.join(*args) if os.path.exists(rm_path): - shutil.move(rm_path, safe_str(os.path.join(self.repos_path, _d))) + shutil.move(rm_path, os.path.join(self.repos_path, _d)) else: log.error("Can't find repo to delete in %r", rm_path) diff --git a/kallithea/model/scm.py b/kallithea/model/scm.py --- a/kallithea/model/scm.py +++ b/kallithea/model/scm.py @@ -41,7 +41,7 @@ from kallithea.lib.auth import HasPermis from kallithea.lib.exceptions import IMCCommitError, NonRelativePathError from kallithea.lib.hooks import process_pushed_raw_ids from kallithea.lib.utils import action_logger, get_filesystem_repos, make_ui -from kallithea.lib.utils2 import safe_bytes, safe_str, set_hook_environment +from kallithea.lib.utils2 import safe_bytes, set_hook_environment from kallithea.lib.vcs import get_backend from kallithea.lib.vcs.backends.base import EmptyChangeset from kallithea.lib.vcs.exceptions import RepositoryError @@ -190,7 +190,7 @@ class ScmModel(object): klass = get_backend(path[0]) if path[0] == 'hg' and path[0] in BACKENDS: - repos[name] = klass(safe_str(path[1]), baseui=baseui) + repos[name] = klass(path[1], baseui=baseui) if path[0] == 'git' and path[0] in BACKENDS: repos[name] = klass(path[1]) @@ -396,13 +396,8 @@ class ScmModel(object): """ user = User.guess_instance(user) IMC = self._get_IMC_module(repo.alias) - - # decoding here will force that we have proper encoded values - # in any other case this will throw exceptions and deny commit - content = safe_str(content) - path = safe_str(f_path) imc = IMC(repo) - imc.change(FileNode(path, content, mode=cs.get_file_mode(f_path))) + imc.change(FileNode(f_path, content, mode=cs.get_file_mode(f_path))) try: tip = imc.commit(message=message, author=author, parents=[cs], branch=cs.branch) @@ -478,12 +473,7 @@ class ScmModel(object): for f_path in nodes: content = nodes[f_path]['content'] f_path = self._sanitize_path(f_path) - f_path = safe_str(f_path) - # decoding here will force that we have proper encoded values - # in any other case this will throw exceptions and deny commit - if isinstance(content, (str,)): - content = safe_str(content) - else: + if not isinstance(content, str) and not isinstance(content, bytes): content = content.read() processed_nodes.append((f_path, content)) diff --git a/kallithea/tests/base.py b/kallithea/tests/base.py --- a/kallithea/tests/base.py +++ b/kallithea/tests/base.py @@ -22,7 +22,7 @@ import time import pytest from webtest import TestApp -from kallithea.lib.utils2 import ascii_str, safe_str +from kallithea.lib.utils2 import ascii_str from kallithea.model.db import User @@ -180,16 +180,15 @@ class TestController(object): def checkSessionFlash(self, response, msg=None, skip=0, _matcher=lambda msg, m: msg in m): if 'flash' not in response.session: - pytest.fail(safe_str(u'msg `%s` not found - session has no flash:\n%s' % (msg, response))) + pytest.fail(u'msg `%s` not found - session has no flash:\n%s' % (msg, response)) try: level, m = response.session['flash'][-1 - skip] if _matcher(msg, m): return except IndexError: pass - pytest.fail(safe_str(u'msg `%s` not found in session flash (skipping %s): %s' % - (msg, skip, - ', '.join('`%s`' % m for level, m in response.session['flash'])))) + pytest.fail(u'msg `%s` not found in session flash (skipping %s): %s' % + (msg, skip, ', '.join('`%s`' % m for level, m in response.session['flash']))) def checkSessionFlashRegex(self, response, regex, skip=0): self.checkSessionFlash(response, regex, skip=skip, _matcher=re.search) diff --git a/kallithea/tests/functional/test_admin_repos.py b/kallithea/tests/functional/test_admin_repos.py --- a/kallithea/tests/functional/test_admin_repos.py +++ b/kallithea/tests/functional/test_admin_repos.py @@ -7,7 +7,6 @@ import mock import pytest from kallithea.lib import vcs -from kallithea.lib.utils2 import safe_str from kallithea.model.db import Permission, RepoGroup, Repository, Ui, User, UserRepoToPerm from kallithea.model.meta import Session from kallithea.model.repo import RepoModel @@ -74,7 +73,7 @@ class _BaseTestCase(base.TestController) # test if the repository was created on filesystem try: - vcs.get_repo(safe_str(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name))) + vcs.get_repo(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name)) except vcs.exceptions.VCSError: pytest.fail('no repo %s in filesystem' % repo_name) @@ -149,7 +148,7 @@ class _BaseTestCase(base.TestController) # test if the repository was created on filesystem try: - vcs.get_repo(safe_str(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name_full))) + vcs.get_repo(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name_full)) except vcs.exceptions.VCSError: RepoGroupModel().delete(group_name) Session().commit() @@ -241,7 +240,7 @@ class _BaseTestCase(base.TestController) # test if the repository was created on filesystem try: - vcs.get_repo(safe_str(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name_full))) + vcs.get_repo(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name_full)) except vcs.exceptions.VCSError: RepoGroupModel().delete(group_name) Session().commit() @@ -298,7 +297,7 @@ class _BaseTestCase(base.TestController) # test if the repository was created on filesystem try: - vcs.get_repo(safe_str(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name_full))) + vcs.get_repo(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name_full)) except vcs.exceptions.VCSError: RepoGroupModel().delete(group_name) Session().commit() @@ -373,7 +372,7 @@ class _BaseTestCase(base.TestController) # test if the repository was created on filesystem try: - vcs.get_repo(safe_str(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name))) + vcs.get_repo(os.path.join(Ui.get_by_key('paths', '/').ui_value, repo_name)) except vcs.exceptions.VCSError: pytest.fail('no repo %s in filesystem' % repo_name) @@ -395,7 +394,7 @@ class _BaseTestCase(base.TestController) def test_delete_non_ascii(self): self.log_user() non_ascii = "ąęł" - repo_name = "%s%s" % (safe_str(self.NEW_REPO), non_ascii) + repo_name = "%s%s" % (self.NEW_REPO, non_ascii) description = 'description for newly created repo' + non_ascii response = self.app.post(base.url('repos'), fixture._get_repo_create_params(repo_private=False, diff --git a/kallithea/tests/functional/test_forks.py b/kallithea/tests/functional/test_forks.py --- a/kallithea/tests/functional/test_forks.py +++ b/kallithea/tests/functional/test_forks.py @@ -2,7 +2,6 @@ import urllib.parse -from kallithea.lib.utils2 import safe_str from kallithea.model.db import Repository, User from kallithea.model.meta import Session from kallithea.model.repo import RepoModel @@ -144,7 +143,7 @@ class _BaseTestCase(base.TestController) # create a fork repo_name = self.REPO org_repo = Repository.get_by_repo_name(repo_name) - fork_name = safe_str(self.REPO_FORK + u'-rødgrød') + fork_name = self.REPO_FORK + u'-rødgrød' creation_args = { 'repo_name': fork_name, 'repo_group': u'-1', @@ -165,7 +164,7 @@ class _BaseTestCase(base.TestController) assert fork_repo # fork the fork - fork_name_2 = safe_str(self.REPO_FORK + u'-blåbærgrød') + fork_name_2 = self.REPO_FORK + u'-blåbærgrød' creation_args = { 'repo_name': fork_name_2, 'repo_group': u'-1', diff --git a/kallithea/tests/vcs/test_hg.py b/kallithea/tests/vcs/test_hg.py --- a/kallithea/tests/vcs/test_hg.py +++ b/kallithea/tests/vcs/test_hg.py @@ -6,7 +6,6 @@ import pytest from kallithea.lib.vcs.backends.hg import MercurialChangeset, MercurialRepository from kallithea.lib.vcs.exceptions import NodeDoesNotExistError, RepositoryError, VCSError from kallithea.lib.vcs.nodes import NodeKind, NodeState -from kallithea.lib.vcs.utils import safe_str from kallithea.tests.vcs.conf import TEST_HG_REPO, TEST_HG_REPO_CLONE, TEST_HG_REPO_PULL, TESTS_TMP_PATH @@ -19,7 +18,7 @@ class TestMercurialRepository(object): % TEST_HG_REPO_CLONE) def setup_method(self): - self.repo = MercurialRepository(safe_str(TEST_HG_REPO)) + self.repo = MercurialRepository(TEST_HG_REPO) def test_wrong_repo_path(self): wrong_repo_path = os.path.join(TESTS_TMP_PATH, 'errorrepo') @@ -32,7 +31,7 @@ class TestMercurialRepository(object): def test_repo_clone(self): self.__check_for_existing_repo() - repo = MercurialRepository(safe_str(TEST_HG_REPO)) + repo = MercurialRepository(TEST_HG_REPO) repo_clone = MercurialRepository(TEST_HG_REPO_CLONE, src_url=TEST_HG_REPO, update_after_clone=True) assert len(repo.revisions) == len(repo_clone.revisions) @@ -42,7 +41,7 @@ class TestMercurialRepository(object): assert raw_id == repo_clone.get_changeset(raw_id).raw_id def test_repo_clone_with_update(self): - repo = MercurialRepository(safe_str(TEST_HG_REPO)) + repo = MercurialRepository(TEST_HG_REPO) repo_clone = MercurialRepository(TEST_HG_REPO_CLONE + '_w_update', src_url=TEST_HG_REPO, update_after_clone=True) assert len(repo.revisions) == len(repo_clone.revisions) @@ -55,7 +54,7 @@ class TestMercurialRepository(object): ) def test_repo_clone_without_update(self): - repo = MercurialRepository(safe_str(TEST_HG_REPO)) + repo = MercurialRepository(TEST_HG_REPO) repo_clone = MercurialRepository(TEST_HG_REPO_CLONE + '_wo_update', src_url=TEST_HG_REPO, update_after_clone=False) assert len(repo.revisions) == len(repo_clone.revisions) @@ -256,7 +255,7 @@ TODO: To be written... class TestMercurialChangeset(object): def setup_method(self): - self.repo = MercurialRepository(safe_str(TEST_HG_REPO)) + self.repo = MercurialRepository(TEST_HG_REPO) def _test_equality(self, changeset): revision = changeset.revision diff --git a/kallithea/tests/vcs/test_vcs.py b/kallithea/tests/vcs/test_vcs.py --- a/kallithea/tests/vcs/test_vcs.py +++ b/kallithea/tests/vcs/test_vcs.py @@ -5,7 +5,6 @@ import pytest from kallithea.lib.vcs import VCSError, get_backend, get_repo from kallithea.lib.vcs.backends.hg import MercurialRepository -from kallithea.lib.vcs.utils import safe_str from kallithea.tests.vcs.conf import TEST_GIT_REPO, TEST_HG_REPO, TESTS_TMP_PATH @@ -22,14 +21,14 @@ class TestVCS(object): alias = 'hg' path = TEST_HG_REPO backend = get_backend(alias) - repo = backend(safe_str(path)) + repo = backend(path) assert 'hg' == repo.alias def test_alias_detect_git(self): alias = 'git' path = TEST_GIT_REPO backend = get_backend(alias) - repo = backend(safe_str(path)) + repo = backend(path) assert 'git' == repo.alias def test_wrong_alias(self): @@ -41,28 +40,28 @@ class TestVCS(object): alias = 'hg' path = TEST_HG_REPO backend = get_backend(alias) - repo = backend(safe_str(path)) + repo = backend(path) - assert repo.__class__ == get_repo(safe_str(path), alias).__class__ - assert repo.path == get_repo(safe_str(path), alias).path + assert repo.__class__ == get_repo(path, alias).__class__ + assert repo.path == get_repo(path, alias).path def test_get_repo_autoalias_hg(self): alias = 'hg' path = TEST_HG_REPO backend = get_backend(alias) - repo = backend(safe_str(path)) + repo = backend(path) - assert repo.__class__ == get_repo(safe_str(path)).__class__ - assert repo.path == get_repo(safe_str(path)).path + assert repo.__class__ == get_repo(path).__class__ + assert repo.path == get_repo(path).path def test_get_repo_autoalias_git(self): alias = 'git' path = TEST_GIT_REPO backend = get_backend(alias) - repo = backend(safe_str(path)) + repo = backend(path) - assert repo.__class__ == get_repo(safe_str(path)).__class__ - assert repo.path == get_repo(safe_str(path)).path + assert repo.__class__ == get_repo(path).__class__ + assert repo.path == get_repo(path).path def test_get_repo_err(self): blank_repo_path = os.path.join(TESTS_TMP_PATH, 'blank-error-repo')