1480 if expected.get(pos, None): |
1480 if expected.get(pos, None): |
1481 els = expected[pos] |
1481 els = expected[pos] |
1482 |
1482 |
1483 optional = [] |
1483 optional = [] |
1484 for i, el in enumerate(els): |
1484 for i, el in enumerate(els): |
1485 |
1485 r = False |
1486 r = self.linematch(el, lout) |
1486 if el: |
|
1487 r = self.linematch(el, lout) |
1487 if isinstance(r, str): |
1488 if isinstance(r, str): |
1488 if r == '-glob': |
1489 if r == '-glob': |
1489 lout = ''.join(el.rsplit(' (glob)', 1)) |
1490 lout = ''.join(el.rsplit(' (glob)', 1)) |
1490 r = '' # Warn only this line. |
1491 r = '' # Warn only this line. |
1491 elif r == "retry": |
1492 elif r == "retry": |
1604 else: |
1605 else: |
1605 res += re.escape(c) |
1606 res += re.escape(c) |
1606 return TTest.rematch(res, l) |
1607 return TTest.rematch(res, l) |
1607 |
1608 |
1608 def linematch(self, el, l): |
1609 def linematch(self, el, l): |
1609 retry = False |
|
1610 if el == l: # perfect match (fast) |
1610 if el == l: # perfect match (fast) |
1611 return True |
1611 return True |
1612 if el: |
1612 retry = False |
1613 if el.endswith(b" (?)\n"): |
1613 if el.endswith(b" (?)\n"): |
1614 retry = "retry" |
1614 retry = "retry" |
1615 el = el[:-5] + b"\n" |
1615 el = el[:-5] + b"\n" |
|
1616 else: |
|
1617 m = optline.match(el) |
|
1618 if m: |
|
1619 conditions = [c for c in m.group(2).split(b' ')] |
|
1620 |
|
1621 el = m.group(1) + b"\n" |
|
1622 if not self._iftest(conditions): |
|
1623 retry = "retry" # Not required by listed features |
|
1624 |
|
1625 if el.endswith(b" (esc)\n"): |
|
1626 if PYTHON3: |
|
1627 el = el[:-7].decode('unicode_escape') + '\n' |
|
1628 el = el.encode('utf-8') |
1616 else: |
1629 else: |
1617 m = optline.match(el) |
1630 el = el[:-7].decode('string-escape') + '\n' |
1618 if m: |
1631 if el == l or os.name == 'nt' and el[:-1] + b'\r\n' == l: |
1619 conditions = [c for c in m.group(2).split(b' ')] |
1632 return True |
1620 |
1633 if el.endswith(b" (re)\n"): |
1621 el = m.group(1) + b"\n" |
1634 return TTest.rematch(el[:-6], l) or retry |
1622 if not self._iftest(conditions): |
1635 if el.endswith(b" (glob)\n"): |
1623 retry = "retry" # Not required by listed features |
1636 # ignore '(glob)' added to l by 'replacements' |
1624 |
1637 if l.endswith(b" (glob)\n"): |
1625 if el.endswith(b" (esc)\n"): |
1638 l = l[:-8] + b"\n" |
1626 if PYTHON3: |
1639 return TTest.globmatch(el[:-8], l) or retry |
1627 el = el[:-7].decode('unicode_escape') + '\n' |
1640 if os.altsep: |
1628 el = el.encode('utf-8') |
1641 _l = l.replace(b'\\', b'/') |
1629 else: |
1642 if el == _l or os.name == 'nt' and el[:-1] + b'\r\n' == _l: |
1630 el = el[:-7].decode('string-escape') + '\n' |
|
1631 if el == l or os.name == 'nt' and el[:-1] + b'\r\n' == l: |
|
1632 return True |
1643 return True |
1633 if el.endswith(b" (re)\n"): |
|
1634 return TTest.rematch(el[:-6], l) or retry |
|
1635 if el.endswith(b" (glob)\n"): |
|
1636 # ignore '(glob)' added to l by 'replacements' |
|
1637 if l.endswith(b" (glob)\n"): |
|
1638 l = l[:-8] + b"\n" |
|
1639 return TTest.globmatch(el[:-8], l) or retry |
|
1640 if os.altsep: |
|
1641 _l = l.replace(b'\\', b'/') |
|
1642 if el == _l or os.name == 'nt' and el[:-1] + b'\r\n' == _l: |
|
1643 return True |
|
1644 return retry |
1644 return retry |
1645 |
1645 |
1646 @staticmethod |
1646 @staticmethod |
1647 def parsehghaveoutput(lines): |
1647 def parsehghaveoutput(lines): |
1648 '''Parse hghave log lines. |
1648 '''Parse hghave log lines. |