# HG changeset patch # User Christian Ebert # Date 1289214683 0 # Node ID d36150edc23154b19016a59aac2c325538860759 # Parent 3450d7f7d1a321d1965dff45aa5f65face5aeb40# Parent ff1badf6ae7a1995c7eecb83831fdb88197a5da3 Merge with stable diff -r 3450d7f7d1a3 -r d36150edc231 tests/run-tests.py --- a/tests/run-tests.py Fri Nov 05 10:00:11 2010 +0000 +++ b/tests/run-tests.py Mon Nov 08 11:11:23 2010 +0000 @@ -454,6 +454,15 @@ vlog("# Running", cmd) return run(cmd, options, replacements) +needescape = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search +escapesub = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub +escapemap = dict((chr(i), r'\x%02x' % i) for i in range(256)) +escapemap.update({'\\': '\\\\', '\r': r'\r'}) +def escapef(m): + return escapemap[m.group(0)] +def stringescape(s): + return escapesub(escapef, s) + def tsttest(test, options, replacements): t = open(test) out = [] @@ -464,6 +473,8 @@ after = {} expected = {} for n, l in enumerate(t): + if not l.endswith('\n'): + l += '\n' if l.startswith(' $ '): # commands after.setdefault(pos, []).append(l) prepos = pos @@ -480,8 +491,6 @@ # non-command/result - queue up for merged output after.setdefault(pos, []).append(l) - if script and not script[-1].endswith('\n'): - script[-1] = script[-1] + '\n' script.append('echo %s %s $?\n' % (salt, n + 1)) fd, name = tempfile.mkstemp(suffix='hg-tst') @@ -531,29 +540,38 @@ postout = [] ret = 0 for n, l in enumerate(output): - if l.startswith(salt): + lout, lcmd = l, None + if salt in l: + lout, lcmd = l.split(salt, 1) + + if lout: + if lcmd: + lout += ' (no-eol)\n' + + el = None + if pos in expected and expected[pos]: + el = expected[pos].pop(0) + + if el == lout: # perfect match (fast) + postout.append(" " + lout) + elif (el and + (el.endswith(" (re)\n") and rematch(el[:-6] + '\n', lout) or + el.endswith(" (glob)\n") and globmatch(el[:-8] + '\n', lout)) or + el.endswith(" (esc)\n") and el.decode('string-escape') == l): + postout.append(" " + el) # fallback regex/glob/esc match + else: + if needescape(lout): + lout = stringescape(lout.rstrip('\n')) + " (esc)\n" + postout.append(" " + lout) # let diff deal with it + + if lcmd: # add on last return code - ret = int(l.split()[2]) + ret = int(lcmd.split()[1]) if ret != 0: postout.append(" [%s]\n" % ret) if pos in after: postout += after.pop(pos) - pos = int(l.split()[1]) - else: - el = None - if pos in expected and expected[pos]: - el = expected[pos].pop(0) - - if el == l: # perfect match (fast) - postout.append(" " + l) - elif el and el.decode('string-escape') == l: - postout.append(" " + el) # \-escape match - elif (el and - (el.endswith(" (re)\n") and rematch(el[:-6] + '\n', l) or - el.endswith(" (glob)\n") and globmatch(el[:-8] + '\n', l))): - postout.append(" " + el) # fallback regex/glob match - else: - postout.append(" " + l) # let diff deal with it + pos = int(lcmd.split()[0]) if pos in after: postout += after.pop(pos)