[PATCH 2 of 2] run-tests: teach _processoutput to handle multiple lines of churn

timeless timeless at mozdev.org
Thu Mar 17 17:17:35 EDT 2016


# HG changeset patch
# User timeless <timeless at mozdev.org>
# Date 1458247926 0
#      Thu Mar 17 20:52:06 2016 +0000
# Node ID de59c3332e009f964ab9218d639e5635f8ea4305
# Parent  2d259ce76b6f0d4e11aac7f8e2a4db7785c3992d
run-tests: teach _processoutput to handle multiple lines of churn

Instead of treating expected output as happening in a precise order,
and assuming that if a line is missing it will never happen,
assume that expected output is a prioritized list of likely matching
lines.

This means that if:

 foo/bar (glob)
 baz/bad (glob)

changes to:

 baz/bad
 foo/bar

instead of generating:

 baz/bad
 foo/bar

For which we've lost both (glob) markers,
we will match both lines and generate:

 baz/bad (glob)
 foo/bar (glob)

This retains any special annotations we have for lines.

diff --git a/tests/run-tests.py b/tests/run-tests.py
--- a/tests/run-tests.py
+++ b/tests/run-tests.py
@@ -1108,10 +1108,14 @@
                     lout += b' (no-eol)\n'
 
                 # Find the expected output at the current position.
-                el = None
+                els = [None]
                 if expected.get(pos, None):
-                    el = expected[pos].pop(0)
-                if True:
+                    els = expected[pos]
+
+                i = 0
+                while i < len(els):
+                    el = els[i]
+
                     r = TTest.linematch(el, lout)
                     if isinstance(r, str):
                         if r == '+glob':
@@ -1122,11 +1126,19 @@
                             r = '' # Warn only this line.
                         elif r == "retry":
                             postout.append(b'  ' + el)
-                            continue
+                            els.pop(i)
+                            break
                         else:
                             log('\ninfo, unknown linematch result: %r\n' % r)
                             r = False
+                    if r:
+                        els.pop(i)
+                        break
+                    i += 1
+
                 if r:
+                    if r == "retry":
+                        continue
                     postout.append(b'  ' + el)
                 else:
                     if self.NEEDESCAPE(lout):


More information about the Mercurial-devel mailing list