comparison mercurial/cmdutil.py @ 28253:c407583cf5f6 stable

log: fix order of revisions filtered by multiple OR options (issue5100) This is the simplest workaround for the issue of the ordering of revset, which is that the expression "x or y" takes over the ordering specified by the input set (or the left-hand-side expression.) For example, the following expression A & (x | y) will be evaluated as if (A & x) | (A & y) That's wrong because revset has ordering. I'm going to fix this problem in the revset module, but that wouldn't fit to stable. So, this patch just works around the common log cases. Since this change might have some impact on performance, it is enabled only if the expression built from log options has ' or ' operation.
author Yuya Nishihara <yuya@tcha.org>
date Mon, 15 Feb 2016 22:46:07 +0900
parents cb6a952efbf4
children c7f89ad87bae 97175d9bf7cf
comparison
equal deleted inserted replaced
28252:f5b2b358b8b7 28253:c407583cf5f6
2137 revs.reverse() 2137 revs.reverse()
2138 matcher = revset.match(repo.ui, expr) 2138 matcher = revset.match(repo.ui, expr)
2139 # Revset matches can reorder revisions. "A or B" typically returns 2139 # Revset matches can reorder revisions. "A or B" typically returns
2140 # returns the revision matching A then the revision matching B. Sort 2140 # returns the revision matching A then the revision matching B. Sort
2141 # again to fix that. 2141 # again to fix that.
2142 fixopts = ['branch', 'only_branch', 'keyword', 'user']
2143 oldrevs = revs
2142 revs = matcher(repo, revs) 2144 revs = matcher(repo, revs)
2143 if not opts.get('rev'): 2145 if not opts.get('rev'):
2144 revs.sort(reverse=True) 2146 revs.sort(reverse=True)
2147 elif len(pats) > 1 or any(len(opts.get(op, [])) > 1 for op in fixopts):
2148 # XXX "A or B" is known to change the order; fix it by filtering
2149 # matched set again (issue5100)
2150 revs = oldrevs & revs
2145 if limit is not None: 2151 if limit is not None:
2146 limitedrevs = [] 2152 limitedrevs = []
2147 for idx, r in enumerate(revs): 2153 for idx, r in enumerate(revs):
2148 if limit <= idx: 2154 if limit <= idx:
2149 break 2155 break