##// END OF EJS Templates
merge beta into stable
marcink -
r2074:6c6718c0 merge default
parent child Browse files
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', '').lower() != value:
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,1):
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,1):
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