view mercurial/formatter.py @ 20508:91d4f82c2d3b

run-tests: add possibility for test-runners to report a "warned" test result A test result is recognized as "warned" when the test runner returns the exit code False. (False is similar to 0, which is reporting a command has run sucessfully.) The only difference in display is that the failure message while running writes "Warning:" instead of "ERROR:". The diff output is the same as when the test fails. Runing "run-tests.py -i" asks to accept the changed result also for tests reported as "warned". When running tests, a "warned" test would look like this: .. --- xxxx\tests\test-something.t +++ xxxx\tests\test-something.t.err @@ -1279,7 +1279,7 @@ $ echo anything $ hg commit -S -m whatever committing subrepository s - committing subrepository s/sbs + committing subrepository s/sbs (glob) warning: something happened committing subrepository t $ echo something Warning: xxxx\tests\test-sOMETHING.t output changed ~.s...s...s.. Reporting a test result as "warned" will be used in following patches.
author Simon Heimberg <simohe@besonet.ch>
date Thu, 13 Feb 2014 08:26:13 +0100
parents 3326fd05eb1f
children 1f72226064b8
line wrap: on
line source

# formatter.py - generic output formatting for mercurial
#
# Copyright 2012 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

class baseformatter(object):
    def __init__(self, ui, topic, opts):
        self._ui = ui
        self._topic = topic
        self._style = opts.get("style")
        self._template = opts.get("template")
        self._item = None
    def __bool__(self):
        '''return False if we're not doing real templating so we can
        skip extra work'''
        return True
    def _showitem(self):
        '''show a formatted item once all data is collected'''
        pass
    def startitem(self):
        '''begin an item in the format list'''
        if self._item is not None:
            self._showitem()
        self._item = {}
    def data(self, **data):
        '''insert data into item that's not shown in default output'''
        self._item.update(data)
    def write(self, fields, deftext, *fielddata, **opts):
        '''do default text output while assigning data to item'''
        for k, v in zip(fields.split(), fielddata):
            self._item[k] = v
    def condwrite(self, cond, fields, deftext, *fielddata, **opts):
        '''do conditional write (primarily for plain formatter)'''
        for k, v in zip(fields.split(), fielddata):
            self._item[k] = v
    def plain(self, text, **opts):
        '''show raw text for non-templated mode'''
        pass
    def end(self):
        '''end output for the formatter'''
        if self._item is not None:
            self._showitem()

class plainformatter(baseformatter):
    '''the default text output scheme'''
    def __init__(self, ui, topic, opts):
        baseformatter.__init__(self, ui, topic, opts)
    def __bool__(self):
        return False
    def startitem(self):
        pass
    def data(self, **data):
        pass
    def write(self, fields, deftext, *fielddata, **opts):
        self._ui.write(deftext % fielddata, **opts)
    def condwrite(self, cond, fields, deftext, *fielddata, **opts):
        '''do conditional write'''
        if cond:
            self._ui.write(deftext % fielddata, **opts)
    def plain(self, text, **opts):
        self._ui.write(text, **opts)
    def end(self):
        pass

class debugformatter(baseformatter):
    def __init__(self, ui, topic, opts):
        baseformatter.__init__(self, ui, topic, opts)
        self._ui.write("%s = {\n" % self._topic)
    def _showitem(self):
        self._ui.write("    " + repr(self._item) + ",\n")
    def end(self):
        baseformatter.end(self)
        self._ui.write("}\n")

def formatter(ui, topic, opts):
    if ui.configbool('ui', 'formatdebug'):
        return debugformatter(ui, topic, opts)
    return plainformatter(ui, topic, opts)