# HG changeset patch # User Marcin Kuzminski # Date 2018-02-20 16:49:26 # Node ID 0cd3ef360321b3045fa3680a775f9b14fa3c5eb9 # Parent e5345aa55ba0ca6b3541dd1918fc12c6cef6b618 code: code fixes and small adjustments diff --git a/rhodecode/apps/_base/__init__.py b/rhodecode/apps/_base/__init__.py --- a/rhodecode/apps/_base/__init__.py +++ b/rhodecode/apps/_base/__init__.py @@ -209,7 +209,9 @@ class RepoAppView(BaseAppView): try: self.rhodecode_vcs_repo = self.db_repo.scm_instance() if self.rhodecode_vcs_repo: - self.path_filter = PathFilter(self.rhodecode_vcs_repo.get_path_permissions(c.auth_user.username)) + path_perms = self.rhodecode_vcs_repo.get_path_permissions( + c.auth_user.username) + self.path_filter = PathFilter(path_perms) else: self.path_filter = PathFilter(None) except RepositoryRequirementError as e: @@ -218,7 +220,7 @@ class RepoAppView(BaseAppView): self.rhodecode_vcs_repo = None self.path_filter = None - c.path_filter = self.path_filter # used by atom_feed_entry.mako + c.path_filter = self.path_filter # used by atom_feed_entry.mako if (not c.repository_requirements_missing and self.rhodecode_vcs_repo is None): @@ -244,7 +246,8 @@ class RepoAppView(BaseAppView): return default def _get_f_path(self, matchdict, default=None): - return self.path_filter.assert_path_permissions(self._get_f_path_unchecked(matchdict, default)) + f_path_match = self._get_f_path_unchecked(matchdict, default) + return self.path_filter.assert_path_permissions(f_path_match) class PathFilter(object): diff --git a/rhodecode/lib/vcs/backends/base.py b/rhodecode/lib/vcs/backends/base.py --- a/rhodecode/lib/vcs/backends/base.py +++ b/rhodecode/lib/vcs/backends/base.py @@ -639,10 +639,8 @@ class BaseRepository(object): warnings.warn("Use in_memory_commit instead", DeprecationWarning) return self.in_memory_commit - # def get_path_permissions(self, username): """ - Returns a path permission checker or None if not supported :param username: session user name @@ -1677,18 +1675,20 @@ class PatternPathPermissionChecker(BaseP def __init__(self, includes, excludes): self.includes = includes self.excludes = excludes - self.includes_re = [] if not includes else [re.compile(fnmatch.translate(pattern)) for pattern in includes] - self.excludes_re = [] if not excludes else [re.compile(fnmatch.translate(pattern)) for pattern in excludes] + self.includes_re = [] if not includes else [ + re.compile(fnmatch.translate(pattern)) for pattern in includes] + self.excludes_re = [] if not excludes else [ + re.compile(fnmatch.translate(pattern)) for pattern in excludes] @property def has_full_access(self): return '*' in self.includes and not self.excludes def has_access(self, path): - for re in self.excludes_re: - if re.match(path): + for regex in self.excludes_re: + if regex.match(path): return False - for re in self.includes_re: - if re.match(path): + for regex in self.includes_re: + if regex.match(path): return True - return False \ No newline at end of file + return False diff --git a/rhodecode/lib/vcs/backends/git/commit.py b/rhodecode/lib/vcs/backends/git/commit.py --- a/rhodecode/lib/vcs/backends/git/commit.py +++ b/rhodecode/lib/vcs/backends/git/commit.py @@ -28,7 +28,6 @@ from itertools import chain from StringIO import StringIO from zope.cachedescriptors.property import Lazy as LazyProperty -from pyramid.compat import configparser from rhodecode.lib.datelib import utcdate_fromtimestamp from rhodecode.lib.utils import safe_unicode, safe_str @@ -40,6 +39,7 @@ from rhodecode.lib.vcs.nodes import ( FileNode, DirNode, NodeKind, RootNode, SubModuleNode, ChangedFileNodesGenerator, AddedFileNodesGenerator, RemovedFileNodesGenerator, LargeFileNode) +from rhodecode.lib.vcs.compat import configparser class GitCommit(base.BaseCommit): diff --git a/rhodecode/lib/vcs/backends/hg/repository.py b/rhodecode/lib/vcs/backends/hg/repository.py --- a/rhodecode/lib/vcs/backends/hg/repository.py +++ b/rhodecode/lib/vcs/backends/hg/repository.py @@ -21,10 +21,9 @@ """ HG repository module """ -import ConfigParser +import os import logging import binascii -import os import shutil import urllib @@ -32,8 +31,7 @@ from zope.cachedescriptors.property impo from rhodecode.lib.compat import OrderedDict from rhodecode.lib.datelib import ( - date_to_timestamp_plus_offset, utcdate_fromtimestamp, makedate, - date_astimestamp) + date_to_timestamp_plus_offset, utcdate_fromtimestamp, makedate) from rhodecode.lib.utils import safe_unicode, safe_str from rhodecode.lib.vcs import connection, exceptions from rhodecode.lib.vcs.backends.base import ( @@ -45,6 +43,7 @@ from rhodecode.lib.vcs.backends.hg.inmem from rhodecode.lib.vcs.exceptions import ( EmptyRepositoryError, RepositoryError, TagAlreadyExistError, TagDoesNotExistError, CommitDoesNotExistError, SubrepoMergeError) +from rhodecode.lib.vcs.compat import configparser hexlify = binascii.hexlify nullid = "\0" * 20 @@ -778,6 +777,7 @@ class MercurialRepository(BaseRepository else: merge_possible = True + needs_push = False if merge_possible: try: merge_commit_id, needs_push = shadow_repo._local_merge( @@ -892,36 +892,43 @@ class MercurialRepository(BaseRepository self._remote.invalidate_vcs_cache() def get_path_permissions(self, username): - hgacl_file = self.path + '/.hg/hgacl' + hgacl_file = os.path.join(self.path, '.hg/hgacl') + + def read_patterns(suffix): + svalue = None + try: + svalue = hgacl.get('narrowhgacl', username + suffix) + except configparser.NoOptionError: + try: + svalue = hgacl.get('narrowhgacl', 'default' + suffix) + except configparser.NoOptionError: + pass + if not svalue: + return None + result = ['/'] + for pattern in svalue.split(): + result.append(pattern) + if '*' not in pattern and '?' not in pattern: + result.append(pattern + '/*') + return result + if os.path.exists(hgacl_file): try: - hgacl = ConfigParser.RawConfigParser() + hgacl = configparser.RawConfigParser() hgacl.read(hgacl_file) - def read_patterns(suffix): - svalue = None - try: - svalue = hgacl.get('narrowhgacl', username + suffix) - except ConfigParser.NoOptionError: - try: - svalue = hgacl.get('narrowhgacl', 'default' + suffix) - except ConfigParser.NoOptionError: - pass - if not svalue: - return None - result = ['/'] - for pattern in svalue.split(): - result.append(pattern) - if '*' not in pattern and '?' not in pattern: - result.append(pattern + '/*') - return result + includes = read_patterns('.includes') excludes = read_patterns('.excludes') - return BasePathPermissionChecker.create_from_patterns(includes, excludes) + return BasePathPermissionChecker.create_from_patterns( + includes, excludes) except BaseException as e: - raise exceptions.RepositoryRequirementError('Cannot read ACL settings for {}: {}'.format(self.name, e)) + msg = 'Cannot read ACL settings from {} on {}: {}'.format( + hgacl_file, self.name, e) + raise exceptions.RepositoryRequirementError(msg) else: return None + class MercurialIndexBasedCollectionGenerator(CollectionGenerator): def _commit_factory(self, commit_id): diff --git a/rhodecode/lib/vcs/compat.py b/rhodecode/lib/vcs/compat.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/vcs/compat.py @@ -0,0 +1,1 @@ +from pyramid.compat import configparser \ No newline at end of file