# HG changeset patch # User Yuya Nishihara # Date 2018-01-02 08:13:18 # Node ID 7a0a90d63a8c9f14b6eb1965639604801e462a53 # Parent 668c5a527eff7cabbb8b98f32f3a6c94d6dd19b6 log: use revsetlang.formatspec() to concatenate list expression This rewrites 'not ancestors(x) and not ...' as 'not (ancestors(x) or ...)' so we can use '%lr'. 'isinstance(val, list)' is replaced with 'listop' to make sure 'listop' is applied. diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -41,6 +41,7 @@ from . import ( registrar, revlog, revset, + revsetlang, scmutil, smartset, templatekw, @@ -2347,13 +2348,13 @@ def _makenofollowlogfilematcher(repo, pa '_fdescendants': ('_firstdescendants(%(val)s)', None), '_matchfiles': ('_matchfiles(%(val)s)', None), 'date': ('date(%(val)r)', None), - 'branch': ('branch(%(val)r)', ' or '), - '_patslog': ('filelog(%(val)r)', ' or '), - '_patsfollow': ('follow(%(val)r)', ' or '), - '_patsfollowfirst': ('_followfirst(%(val)r)', ' or '), - 'keyword': ('keyword(%(val)r)', ' or '), - 'prune': ('not ancestors(%(val)r)', ' and '), - 'user': ('user(%(val)r)', ' or '), + 'branch': ('branch(%(val)r)', '%lr'), + '_patslog': ('filelog(%(val)r)', '%lr'), + '_patsfollow': ('follow(%(val)r)', '%lr'), + '_patsfollowfirst': ('_followfirst(%(val)r)', '%lr'), + 'keyword': ('keyword(%(val)r)', '%lr'), + 'prune': ('ancestors(%(val)r)', 'not %lr'), + 'user': ('user(%(val)r)', '%lr'), } def _makelogrevset(repo, pats, opts, revs): @@ -2473,14 +2474,15 @@ def _makelogrevset(repo, pats, opts, rev continue if op not in _opt2logrevset: continue - revop, andor = _opt2logrevset[op] + revop, listop = _opt2logrevset[op] if '%(val)' not in revop: expr.append(revop) else: - if not isinstance(val, list): + if not listop: e = revop % {'val': val} else: - e = '(' + andor.join((revop % {'val': v}) for v in val) + ')' + e = [revop % {'val': v} for v in val] + e = revsetlang.formatspec(listop, e) expr.append(e) if expr: diff --git a/tests/test-glog.t b/tests/test-glog.t --- a/tests/test-glog.t +++ b/tests/test-glog.t @@ -1500,12 +1500,14 @@ glog always reorders nodes which explain (func (symbol 'branch') (string 'default')) - (func - (symbol 'branch') - (string 'branch')) - (func - (symbol 'branch') - (string 'branch')))) + (or + (list + (func + (symbol 'branch') + (string 'branch')) + (func + (symbol 'branch') + (string 'branch')))))) , , - , + , - >>>, - , - >>> + >, + , + >>>> Dedicated repo for --follow and paths filtering. The g is crafted to have 2 filelog topological heads in a linear changeset graph.