Show More
@@ -149,6 +149,22 b' def rawsmartset(repo, subset, x, order):' | |||||
149 | return x & subset |
|
149 | return x & subset | |
150 |
|
150 | |||
151 |
|
151 | |||
|
152 | def raw_node_set(repo, subset, x, order): | |||
|
153 | """argument is a list of nodeid, resolve and use them""" | |||
|
154 | nodes = _ordered_node_set(repo, x) | |||
|
155 | if order == followorder: | |||
|
156 | return subset & nodes | |||
|
157 | else: | |||
|
158 | return nodes & subset | |||
|
159 | ||||
|
160 | ||||
|
161 | def _ordered_node_set(repo, nodes): | |||
|
162 | if not nodes: | |||
|
163 | return baseset() | |||
|
164 | to_rev = repo.changelog.index.rev | |||
|
165 | return baseset([to_rev(r) for r in nodes]) | |||
|
166 | ||||
|
167 | ||||
152 | def rangeset(repo, subset, x, y, order): |
|
168 | def rangeset(repo, subset, x, y, order): | |
153 | m = getset(repo, fullreposet(repo), x) |
|
169 | m = getset(repo, fullreposet(repo), x) | |
154 | n = getset(repo, fullreposet(repo), y) |
|
170 | n = getset(repo, fullreposet(repo), y) | |
@@ -2772,6 +2788,7 b' methods = {' | |||||
2772 | b"parent": parentspec, |
|
2788 | b"parent": parentspec, | |
2773 | b"parentpost": parentpost, |
|
2789 | b"parentpost": parentpost, | |
2774 | b"smartset": rawsmartset, |
|
2790 | b"smartset": rawsmartset, | |
|
2791 | b"nodeset": raw_node_set, | |||
2775 | } |
|
2792 | } | |
2776 |
|
2793 | |||
2777 | relations = { |
|
2794 | relations = { |
@@ -392,7 +392,7 b' def _analyze(x):' | |||||
392 | elif op == b'negate': |
|
392 | elif op == b'negate': | |
393 | s = getstring(x[1], _(b"can't negate that")) |
|
393 | s = getstring(x[1], _(b"can't negate that")) | |
394 | return _analyze((b'string', b'-' + s)) |
|
394 | return _analyze((b'string', b'-' + s)) | |
395 | elif op in (b'string', b'symbol', b'smartset'): |
|
395 | elif op in (b'string', b'symbol', b'smartset', b'nodeset'): | |
396 | return x |
|
396 | return x | |
397 | elif op == b'rangeall': |
|
397 | elif op == b'rangeall': | |
398 | return (op, None) |
|
398 | return (op, None) | |
@@ -441,8 +441,9 b' def _optimize(x):' | |||||
441 | return 0, x |
|
441 | return 0, x | |
442 |
|
442 | |||
443 | op = x[0] |
|
443 | op = x[0] | |
444 | if op in (b'string', b'symbol', b'smartset'): |
|
444 | if op in (b'string', b'symbol', b'smartset', b'nodeset'): | |
445 | return 0.5, x # single revisions are small |
|
445 | # single revisions are small, and set of already computed revision are assumed to be cheap. | |
|
446 | return 0.5, x | |||
446 | elif op == b'and': |
|
447 | elif op == b'and': | |
447 | wa, ta = _optimize(x[1]) |
|
448 | wa, ta = _optimize(x[1]) | |
448 | wb, tb = _optimize(x[2]) |
|
449 | wb, tb = _optimize(x[2]) | |
@@ -784,6 +785,8 b' def formatspec(expr, *args):' | |||||
784 | if isinstance(arg, set): |
|
785 | if isinstance(arg, set): | |
785 | arg = sorted(arg) |
|
786 | arg = sorted(arg) | |
786 | ret.append(_formatintlist(list(arg))) |
|
787 | ret.append(_formatintlist(list(arg))) | |
|
788 | elif t == b'nodeset': | |||
|
789 | ret.append(_formatlistexp(list(arg), b"n")) | |||
787 | else: |
|
790 | else: | |
788 | raise error.ProgrammingError(b"unknown revspec item type: %r" % t) |
|
791 | raise error.ProgrammingError(b"unknown revspec item type: %r" % t) | |
789 | return b''.join(ret) |
|
792 | return b''.join(ret) | |
@@ -801,6 +804,10 b' def spectree(expr, *args):' | |||||
801 | newtree = (b'smartset', smartset.baseset(arg)) |
|
804 | newtree = (b'smartset', smartset.baseset(arg)) | |
802 | inputs.append(newtree) |
|
805 | inputs.append(newtree) | |
803 | ret.append(b"$") |
|
806 | ret.append(b"$") | |
|
807 | elif t == b'nodeset': | |||
|
808 | newtree = (b'nodeset', arg) | |||
|
809 | inputs.append(newtree) | |||
|
810 | ret.append(b"$") | |||
804 | else: |
|
811 | else: | |
805 | raise error.ProgrammingError(b"unknown revspec item type: %r" % t) |
|
812 | raise error.ProgrammingError(b"unknown revspec item type: %r" % t) | |
806 | expr = b''.join(ret) |
|
813 | expr = b''.join(ret) | |
@@ -863,6 +870,12 b' def _parseargs(expr, args):' | |||||
863 | ret.append((b'baseset', arg)) |
|
870 | ret.append((b'baseset', arg)) | |
864 | pos += 1 |
|
871 | pos += 1 | |
865 | continue |
|
872 | continue | |
|
873 | elif islist and d == b'n' and arg: | |||
|
874 | # we cannot turn the node into revision yet, but not | |||
|
875 | # serializing them will same a lot of time for large set. | |||
|
876 | ret.append((b'nodeset', arg)) | |||
|
877 | pos += 1 | |||
|
878 | continue | |||
866 | try: |
|
879 | try: | |
867 | ret.append((None, f(list(arg), d))) |
|
880 | ret.append((None, f(list(arg), d))) | |
868 | except (TypeError, ValueError): |
|
881 | except (TypeError, ValueError): |
General Comments 0
You need to be logged in to leave comments.
Login now