Ticket #7715: t7715-fix-eligible-start-r8299.2.patch
| File t7715-fix-eligible-start-r8299.2.patch, 7.2 KB (added by cboos, 3 years ago) |
|---|
-
trac/versioncontrol/svn_fs.py
433 433 434 434 return SubversionNode(path, rev, self, self.pool) 435 435 436 def _get_node_revs(self, path, rev=None): 437 """Return the revisions affecting `path` between its creation and 438 `rev`. 436 def _get_node_revs(self, path, last=None, first=None): 437 """Return the revisions affecting `path` between `first` and `last` 438 revs. If `first` is not given, it goes down to the revision in which 439 the branch was created. 439 440 """ 440 node = self.get_node(path, rev)441 node = self.get_node(path, last) 441 442 revs = [] 442 443 for (p, r, chg) in node.get_history(): 443 if p != path :444 if p != path or (first and r < first): 444 445 break 445 446 revs.append(r) 446 447 return revs … … 785 786 return fs.node_prop(self.root, self._scoped_path_utf8, name, 786 787 self.pool()) 787 788 789 def get_copy_origin(self): 790 root_and_path = fs.closest_copy(self.root, self._scoped_path_utf8) 791 if root_and_path: 792 root, path = root_and_path 793 rev = fs.revision_root_revision(root) 794 if (path, rev) == (self.path, self.rev): 795 rev, path = fs.copied_from(root, path) 796 return SubversionNode(path, rev, self.repos, self.pool, root) 788 797 798 789 799 class SubversionChangeset(Changeset): 790 800 791 801 def __init__(self, rev, authz, scope, fs_ptr, pool=None): -
trac/versioncontrol/web_ui/browser.py
343 343 except NoSuchChangeset, e: 344 344 raise ResourceNotFound(e.message, _('Invalid Changeset Number')) 345 345 346 context = Context.from_request(req, 'source', path, node.created_rev)346 context = Context.from_request(req, 'source', path, rev_or_latest) 347 347 348 348 path_links = get_path_links(req.href, path, rev, order, desc) 349 349 if len(path_links) > 1: -
trac/versioncontrol/cache.py
14 14 # 15 15 # Author: Christopher Lenz <cmlenz@gmx.de> 16 16 17 import bisect18 17 from datetime import datetime 19 18 import os 20 19 import posixpath … … 233 232 def get_node(self, path, rev=None): 234 233 return self.repos.get_node(path, rev) 235 234 236 def _get_node_revs(self, path, rev=None):237 """Return the revisions affecting `path` between its creation and238 `rev`.235 def _get_node_revs(self, path, last=None, first=None): 236 """Return the revisions affecting `path` between `first` and `last` 237 revisions. 239 238 """ 240 rev = self.normalize_rev(rev)241 node = self.get_node(path, rev) # Check node existence and perms239 last = self.normalize_rev(last) 240 node = self.get_node(path, last) # Check node existence and perms 242 241 db = self.getdb() 243 242 cursor = db.cursor() 243 rev_as_int = db.cast('rev', 'int') 244 if not first: 245 cursor.execute("SELECT rev FROM node_change " 246 "WHERE path = %%s " 247 " AND change_type IN ('A', 'C', 'M') " 248 " AND %s <= %%s " 249 "ORDER BY %s DESC " 250 "LIMIT 1" % ((rev_as_int,) * 2), 251 (path, last)) 252 first = 0 253 for row in cursor: 254 first = int(row[0]) 244 255 cursor.execute("SELECT DISTINCT rev FROM node_change " 245 256 "WHERE (path = %%s OR path %s) " 246 " AND %s <= %%s" % (db.like(), db.cast('rev', 'int')), 247 (path, db.like_escape(path + '/') + '%', rev)) 257 " AND %s >= %%s AND %s <= %%s" % 258 (db.like(), rev_as_int, rev_as_int), 259 (path, db.like_escape(path + '/') + '%', first, last)) 248 260 revs = [int(row[0]) for row in cursor] 249 261 revs.sort() 250 cursor.execute("SELECT rev FROM node_change " 251 "WHERE path = %%s " 252 " AND change_type IN ('A', 'C', 'M') " 253 " AND %s <= %%s " 254 "ORDER BY %s DESC " 255 "LIMIT 1" % ((db.cast('rev', 'int'),) * 2), 256 (path, rev)) 257 created = 0 258 for row in cursor: 259 created = int(row[0]) 260 return revs[bisect.bisect_left(revs, created):] 262 return revs 261 263 262 264 def has_node(self, path, rev=None): 263 265 return self.repos.has_node(path, rev) -
trac/versioncontrol/svn_prop.py
120 120 revs_label = (_('merged'), _('blocked'))[name.endswith('blocked')] 121 121 revs_cols = has_eligible and 2 or None 122 122 repos = self.env.get_repository() 123 target_path = context.resource.id 124 target_rev = context.resource.version 125 if has_eligible: 126 branch_starts = {} 127 node = repos.get_node(target_path, target_rev) 128 while node: 129 node = node.get_copy_origin() 130 if node and node.path != target_path: 131 branch_starts[node.path] = node.rev + 1 123 132 rows = [] 124 133 for line in props[name].splitlines(): 125 134 path, revs = line.split(':', 1) … … 128 137 deleted = False 129 138 if 'LOG_VIEW' in context.perm('source', spath): 130 139 try: 131 node = repos.get_node(spath, context.resource.version)140 node = repos.get_node(spath, target_rev) 132 141 row = [self._get_source_link(path, context), 133 142 self._get_revs_link(revs_label, context, 134 143 spath, revs)] 135 144 if has_eligible: 136 eligible = set(repos._get_node_revs(spath, 137 context.resource.version)) 145 first_rev = branch_starts.get(path) 146 eligible = set(repos._get_node_revs(spath, target_rev, 147 first_rev)) 138 148 eligible -= set(Ranges(revs)) 139 149 blocked = self._get_blocked_revs(props, name, spath) 140 150 eligible -= set(Ranges(blocked)) … … 237 247 removed = old_revs - new_revs 238 248 try: 239 249 all_revs = set(repos._get_node_revs(spath)) 250 # TODO: also pass first_rev here, for getting smaller a set 251 # (this is an optmization fix, result is already correct) 240 252 added &= all_revs 241 253 removed &= all_revs 242 254 except NoSuchNode:
