# HG changeset patch # User Martin von Zweigbergk # Date 1530555253 25200 # Node ID f83600efa1ca13be584abe5707eaa1bde46adb5c # Parent 3fb46734508d5ca28f1ce1cbbf986c064b163d89 tests: don't allow reodering of glob/re lines across non-glob/re lines As shown in the test case added in the previous patch, it can be really hard to interpret diffs from the test runner if there are multiple lines that would match a given glob or regular expression. It looks like this has been the case since 1ad0ddf8cccc (run-tests: teach _processoutput to handle multiple lines of churn, 2016-03-17). It seems like the point of that was to preserve the "(glob)" annotation on lines even if they got moved. This patch tries to preserve that but only allows the lines to be moved past other glob/re lines. Differential Revision: https://phab.mercurial-scm.org/D3881 diff -r 3fb46734508d -r f83600efa1ca tests/run-tests.py --- a/tests/run-tests.py Fri Jun 29 11:29:03 2018 -0700 +++ b/tests/run-tests.py Mon Jul 02 11:14:13 2018 -0700 @@ -1484,7 +1484,7 @@ for i, el in enumerate(els): r = False if el: - r = self.linematch(el, lout) + r, exact = self.linematch(el, lout) if isinstance(r, str): if r == '-glob': lout = ''.join(el.rsplit(' (glob)', 1)) @@ -1508,6 +1508,11 @@ if not self._iftest(conditions): optional.append(i) + if exact: + # Don't allow line to be matches against a later + # line in the output + els.pop(i) + break if r: if r == "retry": @@ -1608,7 +1613,7 @@ def linematch(self, el, l): if el == l: # perfect match (fast) - return True + return True, True retry = False if el.endswith(b" (?)\n"): retry = "retry" @@ -1629,19 +1634,19 @@ else: el = el[:-7].decode('string-escape') + '\n' if el == l or os.name == 'nt' and el[:-1] + b'\r\n' == l: - return True + return True, True if el.endswith(b" (re)\n"): - return TTest.rematch(el[:-6], l) or retry + return (TTest.rematch(el[:-6], l) or retry), False if el.endswith(b" (glob)\n"): # ignore '(glob)' added to l by 'replacements' if l.endswith(b" (glob)\n"): l = l[:-8] + b"\n" - return TTest.globmatch(el[:-8], l) or retry + return (TTest.globmatch(el[:-8], l) or retry), False if os.altsep: _l = l.replace(b'\\', b'/') if el == _l or os.name == 'nt' and el[:-1] + b'\r\n' == _l: - return True - return retry + return True, True + return retry, True @staticmethod def parsehghaveoutput(lines): diff -r 3fb46734508d -r f83600efa1ca tests/test-run-tests.py --- a/tests/test-run-tests.py Fri Jun 29 11:29:03 2018 -0700 +++ b/tests/test-run-tests.py Mon Jul 02 11:14:13 2018 -0700 @@ -40,7 +40,7 @@ assert not re.search(br'[^ \w\\/\r\n()*?]', expected + output), \ b'single backslash or unknown char' test = run_tests.TTest(b'test-run-test.t', b'.', b'.') - match = test.linematch(expected, output) + match, exact = test.linematch(expected, output) if isinstance(match, str): return 'special: ' + match elif isinstance(match, bytes): diff -r 3fb46734508d -r f83600efa1ca tests/test-run-tests.t --- a/tests/test-run-tests.t Fri Jun 29 11:29:03 2018 -0700 +++ b/tests/test-run-tests.t Mon Jul 02 11:14:13 2018 -0700 @@ -142,21 +142,18 @@ --- $TESTTMP/test-failure-globs.t +++ $TESTTMP/test-failure-globs.t.err - @@ -2,10 +2,10 @@ + @@ -2,9 +2,9 @@ context context key: 1 - value: a - + value: * (glob) + + value: not a key: 2 - value: b - + value: * (glob) + + value: not b key: 3 - - value: * (glob) - + value: c + value: * (glob) key: 4 - - value: * (glob) - + value: d ERROR: test-failure-globs.t output changed !