comparison kallithea/model/db.py @ 6619:865c1f65244c

repositories: make sure repositories not only differ in casing Repositories only differing in case cause problems: * it can't be stored on case insensitive filesystems (Windows and MacOS) * some databases can't easily handle case sensitive queries * users will most certainly be confused by names that only differ in case We will keep trying to be case sensitive on systems that can ... but on some systems wrong casings might work. We don't care. The validators are changed to prevent mixed case repo and repo group names. Repository sensitivity tests are removed, and insensitivity tests are added instead.
author domruf <dominikruf@gmail.com>
date Thu, 23 Mar 2017 23:49:19 +0100
parents f58ed40c9a72
children b60fb9461b18
comparison
equal deleted inserted replaced
6618:cc1b5e0e01e8 6619:865c1f65244c
1119 @classmethod 1119 @classmethod
1120 def guess_instance(cls, value): 1120 def guess_instance(cls, value):
1121 return super(Repository, cls).guess_instance(value, Repository.get_by_repo_name) 1121 return super(Repository, cls).guess_instance(value, Repository.get_by_repo_name)
1122 1122
1123 @classmethod 1123 @classmethod
1124 def get_by_repo_name(cls, repo_name): 1124 def get_by_repo_name(cls, repo_name, case_insensitive=False):
1125 q = Session().query(cls).filter(cls.repo_name == repo_name) 1125 """Get the repo, defaulting to database case sensitivity.
1126 case_insensitive will be slower and should only be specified if necessary."""
1127 if case_insensitive:
1128 q = Session().query(cls).filter(func.lower(cls.repo_name) == func.lower(repo_name))
1129 else:
1130 q = Session().query(cls).filter(cls.repo_name == repo_name)
1126 q = q.options(joinedload(Repository.fork)) \ 1131 q = q.options(joinedload(Repository.fork)) \
1127 .options(joinedload(Repository.owner)) \ 1132 .options(joinedload(Repository.owner)) \
1128 .options(joinedload(Repository.group)) 1133 .options(joinedload(Repository.group))
1129 return q.scalar() 1134 return q.scalar()
1130 1135