Show More
@@ -29,12 +29,13 b' to make a backup of your configuration f' | |||||
29 | content after the automerge. |
|
29 | content after the automerge. | |
30 |
|
30 | |||
31 | .. note:: |
|
31 | .. note:: | |
32 | The next steps only apply to upgrading from non bugfix releases eg. from |
|
32 | Please always make sure your .ini files are upto date. Often errors are | |
33 | any minor or major releases. Bugfix releases (eg. 1.1.2->1.1.3) will |
|
33 | caused by missing params added in new versions. | |
34 | not have any database schema changes or whoosh library updates. |
|
34 | ||
35 |
|
35 | |||
36 | It is also recommended that you rebuild the whoosh index after upgrading since |
|
36 | It is also recommended that you rebuild the whoosh index after upgrading since | |
37 | the new whoosh version could introduce some incompatible index changes. |
|
37 | the new whoosh version could introduce some incompatible index changes. Please | |
|
38 | Read the changelog to see if there were any changes to whoosh. | |||
38 |
|
39 | |||
39 |
|
40 | |||
40 | The final step is to upgrade the database. To do this simply run:: |
|
41 | The final step is to upgrade the database. To do this simply run:: |
@@ -53,7 +53,7 b' log = logging.getLogger(__name__)' | |||||
53 |
|
53 | |||
54 | def anchor_url(revision, path): |
|
54 | def anchor_url(revision, path): | |
55 | fid = h.FID(revision, path) |
|
55 | fid = h.FID(revision, path) | |
56 | return h.url.current(anchor=fid, **request.GET) |
|
56 | return h.url.current(anchor=fid, **dict(request.GET)) | |
57 |
|
57 | |||
58 |
|
58 | |||
59 | def get_ignore_ws(fid, GET): |
|
59 | def get_ignore_ws(fid, GET): |
@@ -28,8 +28,8 b' import calendar' | |||||
28 | import logging |
|
28 | import logging | |
29 | from time import mktime |
|
29 | from time import mktime | |
30 | from datetime import timedelta, date |
|
30 | from datetime import timedelta, date | |
31 | from itertools import product |
|
|||
32 | from urlparse import urlparse |
|
31 | from urlparse import urlparse | |
|
32 | from rhodecode.lib.compat import product | |||
33 |
|
33 | |||
34 | from rhodecode.lib.vcs.exceptions import ChangesetError, EmptyRepositoryError, \ |
|
34 | from rhodecode.lib.vcs.exceptions import ChangesetError, EmptyRepositoryError, \ | |
35 | NodeDoesNotExistError |
|
35 | NodeDoesNotExistError |
@@ -379,3 +379,21 b' if __platform__ in PLATFORM_WIN:' | |||||
379 |
|
379 | |||
380 | else: |
|
380 | else: | |
381 | kill = os.kill |
|
381 | kill = os.kill | |
|
382 | ||||
|
383 | ||||
|
384 | #============================================================================== | |||
|
385 | # itertools.product | |||
|
386 | #============================================================================== | |||
|
387 | ||||
|
388 | try: | |||
|
389 | from itertools import product | |||
|
390 | except ImportError: | |||
|
391 | def product(*args, **kwds): | |||
|
392 | # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy | |||
|
393 | # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 | |||
|
394 | pools = map(tuple, args) * kwds.get('repeat', 1) | |||
|
395 | result = [[]] | |||
|
396 | for pool in pools: | |||
|
397 | result = [x + [y] for x in result for y in pool] | |||
|
398 | for prod in result: | |||
|
399 | yield tuple(prod) |
@@ -24,6 +24,7 b'' | |||||
24 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
24 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
25 |
|
25 | |||
26 | import os |
|
26 | import os | |
|
27 | import re | |||
27 | import logging |
|
28 | import logging | |
28 | import datetime |
|
29 | import datetime | |
29 | import traceback |
|
30 | import traceback | |
@@ -56,6 +57,8 b' from rhodecode.model.repos_group import ' | |||||
56 |
|
57 | |||
57 | log = logging.getLogger(__name__) |
|
58 | log = logging.getLogger(__name__) | |
58 |
|
59 | |||
|
60 | REMOVED_REPO_PAT = re.compile(r'rm__\d{8}_\d{6}_\d{6}__.*') | |||
|
61 | ||||
59 |
|
62 | |||
60 | def recursive_replace(str_, replace=' '): |
|
63 | def recursive_replace(str_, replace=' '): | |
61 | """Recursive replace of given sign to just one instance |
|
64 | """Recursive replace of given sign to just one instance | |
@@ -393,6 +396,10 b' def map_groups(groups):' | |||||
393 | # group = rgm.create(group_name, desc, parent, just_db=True) |
|
396 | # group = rgm.create(group_name, desc, parent, just_db=True) | |
394 | # sa.commit() |
|
397 | # sa.commit() | |
395 |
|
398 | |||
|
399 | # skip folders that are now removed repos | |||
|
400 | if REMOVED_REPO_PAT.match(group_name): | |||
|
401 | break | |||
|
402 | ||||
396 | if group is None: |
|
403 | if group is None: | |
397 | log.debug('creating group level: %s group_name: %s' % (lvl, group_name)) |
|
404 | log.debug('creating group level: %s group_name: %s' % (lvl, group_name)) | |
398 | group = RepoGroup(group_name, parent) |
|
405 | group = RepoGroup(group_name, parent) |
@@ -487,7 +487,7 b' def UniqSystemEmail(old_data):' | |||||
487 | class _UniqSystemEmail(formencode.validators.FancyValidator): |
|
487 | class _UniqSystemEmail(formencode.validators.FancyValidator): | |
488 | def to_python(self, value, state): |
|
488 | def to_python(self, value, state): | |
489 | value = value.lower() |
|
489 | value = value.lower() | |
490 |
if old_data.get('email' |
|
490 | if (old_data.get('email') or '').lower() != value: | |
491 | user = User.get_by_email(value, case_insensitive=True) |
|
491 | user = User.get_by_email(value, case_insensitive=True) | |
492 | if user: |
|
492 | if user: | |
493 | raise formencode.Invalid( |
|
493 | raise formencode.Invalid( |
@@ -38,7 +38,7 b' from rhodecode.lib import helpers as h' | |||||
38 | from rhodecode.lib import safe_str |
|
38 | from rhodecode.lib import safe_str | |
39 | from rhodecode.lib.auth import HasRepoPermissionAny, HasReposGroupPermissionAny |
|
39 | from rhodecode.lib.auth import HasRepoPermissionAny, HasReposGroupPermissionAny | |
40 | from rhodecode.lib.utils import get_repos as get_filesystem_repos, make_ui, \ |
|
40 | from rhodecode.lib.utils import get_repos as get_filesystem_repos, make_ui, \ | |
41 | action_logger, EmptyChangeset |
|
41 | action_logger, EmptyChangeset, REMOVED_REPO_PAT | |
42 | from rhodecode.model import BaseModel |
|
42 | from rhodecode.model import BaseModel | |
43 | from rhodecode.model.db import Repository, RhodeCodeUi, CacheInvalidation, \ |
|
43 | from rhodecode.model.db import Repository, RhodeCodeUi, CacheInvalidation, \ | |
44 | UserFollowing, UserLog, User, RepoGroup |
|
44 | UserFollowing, UserLog, User, RepoGroup | |
@@ -182,6 +182,9 b' class ScmModel(BaseModel):' | |||||
182 | repos = {} |
|
182 | repos = {} | |
183 |
|
183 | |||
184 | for name, path in get_filesystem_repos(repos_path, recursive=True): |
|
184 | for name, path in get_filesystem_repos(repos_path, recursive=True): | |
|
185 | # skip removed repos | |||
|
186 | if REMOVED_REPO_PAT.match(name): | |||
|
187 | continue | |||
185 |
|
188 | |||
186 | # name need to be decomposed and put back together using the / |
|
189 | # name need to be decomposed and put back together using the / | |
187 | # since this is internal storage separator for rhodecode |
|
190 | # since this is internal storage separator for rhodecode |
@@ -42,8 +42,8 b'' | |||||
42 | </tr> |
|
42 | </tr> | |
43 | </thead> |
|
43 | </thead> | |
44 |
|
44 | |||
45 |
%for cnt,repo in enumerate(c.repos_list |
|
45 | %for cnt,repo in enumerate(c.repos_list): | |
46 | <tr class="parity${cnt%2}"> |
|
46 | <tr class="parity${(cnt+1)%2}"> | |
47 | <td class="quick_repo_menu"> |
|
47 | <td class="quick_repo_menu"> | |
48 | ${dt.quick_menu(repo['name'])} |
|
48 | ${dt.quick_menu(repo['name'])} | |
49 | </td> |
|
49 | </td> |
@@ -69,8 +69,8 b'' | |||||
69 | </tr> |
|
69 | </tr> | |
70 | </thead> |
|
70 | </thead> | |
71 | <tbody> |
|
71 | <tbody> | |
72 |
%for cnt,repo in enumerate(c.repos_list |
|
72 | %for cnt,repo in enumerate(c.repos_list): | |
73 | <tr class="parity${cnt%2}"> |
|
73 | <tr class="parity${(cnt+1)%2}"> | |
74 | ##QUICK MENU |
|
74 | ##QUICK MENU | |
75 | <td class="quick_repo_menu"> |
|
75 | <td class="quick_repo_menu"> | |
76 | ${dt.quick_menu(repo['name'])} |
|
76 | ${dt.quick_menu(repo['name'])} | |
@@ -115,7 +115,7 b'' | |||||
115 | </div> |
|
115 | </div> | |
116 | </div> |
|
116 | </div> | |
117 | <script> |
|
117 | <script> | |
118 | YUD.get('repo_count').innerHTML = ${cnt}; |
|
118 | YUD.get('repo_count').innerHTML = ${cnt+1}; | |
119 | var func = function(node){ |
|
119 | var func = function(node){ | |
120 | return node.parentNode.parentNode.parentNode.parentNode; |
|
120 | return node.parentNode.parentNode.parentNode.parentNode; | |
121 | } |
|
121 | } |
General Comments 0
You need to be logged in to leave comments.
Login now