diff --git a/docs/upgrade.rst b/docs/upgrade.rst --- a/docs/upgrade.rst +++ b/docs/upgrade.rst @@ -29,12 +29,13 @@ to make a backup of your configuration f content after the automerge. .. note:: - The next steps only apply to upgrading from non bugfix releases eg. from - any minor or major releases. Bugfix releases (eg. 1.1.2->1.1.3) will - not have any database schema changes or whoosh library updates. + Please always make sure your .ini files are upto date. Often errors are + caused by missing params added in new versions. + It is also recommended that you rebuild the whoosh index after upgrading since -the new whoosh version could introduce some incompatible index changes. +the new whoosh version could introduce some incompatible index changes. Please +Read the changelog to see if there were any changes to whoosh. The final step is to upgrade the database. To do this simply run:: diff --git a/rhodecode/controllers/changeset.py b/rhodecode/controllers/changeset.py --- a/rhodecode/controllers/changeset.py +++ b/rhodecode/controllers/changeset.py @@ -53,7 +53,7 @@ log = logging.getLogger(__name__) def anchor_url(revision, path): fid = h.FID(revision, path) - return h.url.current(anchor=fid, **request.GET) + return h.url.current(anchor=fid, **dict(request.GET)) def get_ignore_ws(fid, GET): diff --git a/rhodecode/controllers/summary.py b/rhodecode/controllers/summary.py --- a/rhodecode/controllers/summary.py +++ b/rhodecode/controllers/summary.py @@ -28,8 +28,8 @@ import calendar import logging from time import mktime from datetime import timedelta, date -from itertools import product from urlparse import urlparse +from rhodecode.lib.compat import product from rhodecode.lib.vcs.exceptions import ChangesetError, EmptyRepositoryError, \ NodeDoesNotExistError diff --git a/rhodecode/lib/compat.py b/rhodecode/lib/compat.py --- a/rhodecode/lib/compat.py +++ b/rhodecode/lib/compat.py @@ -379,3 +379,21 @@ if __platform__ in PLATFORM_WIN: else: kill = os.kill + + +#============================================================================== +# itertools.product +#============================================================================== + +try: + from itertools import product +except ImportError: + def product(*args, **kwds): + # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy + # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 + pools = map(tuple, args) * kwds.get('repeat', 1) + result = [[]] + for pool in pools: + result = [x + [y] for x in result for y in pool] + for prod in result: + yield tuple(prod) diff --git a/rhodecode/lib/utils.py b/rhodecode/lib/utils.py --- a/rhodecode/lib/utils.py +++ b/rhodecode/lib/utils.py @@ -24,6 +24,7 @@ # along with this program. If not, see . import os +import re import logging import datetime import traceback @@ -56,6 +57,8 @@ from rhodecode.model.repos_group import log = logging.getLogger(__name__) +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 @@ -393,6 +396,10 @@ def map_groups(groups): # group = rgm.create(group_name, desc, parent, just_db=True) # sa.commit() + # skip folders that are now removed repos + if REMOVED_REPO_PAT.match(group_name): + break + if group is None: log.debug('creating group level: %s group_name: %s' % (lvl, group_name)) group = RepoGroup(group_name, parent) diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -487,7 +487,7 @@ def UniqSystemEmail(old_data): class _UniqSystemEmail(formencode.validators.FancyValidator): def to_python(self, value, state): value = value.lower() - if old_data.get('email', '').lower() != value: + if (old_data.get('email') or '').lower() != value: user = User.get_by_email(value, case_insensitive=True) if user: raise formencode.Invalid( diff --git a/rhodecode/model/scm.py b/rhodecode/model/scm.py --- a/rhodecode/model/scm.py +++ b/rhodecode/model/scm.py @@ -38,7 +38,7 @@ from rhodecode.lib import helpers as h from rhodecode.lib import safe_str from rhodecode.lib.auth import HasRepoPermissionAny, HasReposGroupPermissionAny from rhodecode.lib.utils import get_repos as get_filesystem_repos, make_ui, \ - action_logger, EmptyChangeset + action_logger, EmptyChangeset, REMOVED_REPO_PAT from rhodecode.model import BaseModel from rhodecode.model.db import Repository, RhodeCodeUi, CacheInvalidation, \ UserFollowing, UserLog, User, RepoGroup @@ -182,6 +182,9 @@ class ScmModel(BaseModel): repos = {} for name, path in get_filesystem_repos(repos_path, recursive=True): + # skip removed repos + if REMOVED_REPO_PAT.match(name): + continue # name need to be decomposed and put back together using the / # since this is internal storage separator for rhodecode diff --git a/rhodecode/templates/admin/repos/repos.html b/rhodecode/templates/admin/repos/repos.html --- a/rhodecode/templates/admin/repos/repos.html +++ b/rhodecode/templates/admin/repos/repos.html @@ -42,8 +42,8 @@ - %for cnt,repo in enumerate(c.repos_list,1): - + %for cnt,repo in enumerate(c.repos_list): + ${dt.quick_menu(repo['name'])} diff --git a/rhodecode/templates/index_base.html b/rhodecode/templates/index_base.html --- a/rhodecode/templates/index_base.html +++ b/rhodecode/templates/index_base.html @@ -69,8 +69,8 @@ - %for cnt,repo in enumerate(c.repos_list,1): - + %for cnt,repo in enumerate(c.repos_list): + ##QUICK MENU ${dt.quick_menu(repo['name'])} @@ -115,7 +115,7 @@