[PATCH 4 of 6] color: move 'write' logic to the core ui class

Yuya Nishihara yuya at tcha.org
Thu Feb 23 09:11:20 EST 2017


On Wed, 22 Feb 2017 17:54:35 +0100, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
> # Date 1487590299 -3600
> #      Mon Feb 20 12:31:39 2017 +0100
> # Node ID 0f2be97ca31046bbf9c9f37fcdacf7b406e94054
> # Parent  9a9e8b28b717e30ed43030cc64f115a4356193de
> # EXP-Topic color
> color: move 'write' logic to the core ui class

> --- a/mercurial/ui.py	Mon Feb 20 12:31:24 2017 +0100
> +++ b/mercurial/ui.py	Mon Feb 20 12:31:39 2017 +0100
> @@ -779,28 +779,40 @@ class ui(object):
>      def write(self, *args, **opts):
>          '''write args to output
>  
> -        By default, this method simply writes to the buffer or stdout,
> -        but extensions or GUI tools may override this method,
> -        write_err(), popbuffer(), and label() to style output from
> -        various parts of hg.
> +        By default, this method simply writes to the buffer or stdout.
> +        Color mode can be set on the UI class to have the output decorated
> +        with color modifier before behing writed to stdout.
>  
> -        An optional keyword argument, "label", can be passed in.
> -        This should be a string containing label names separated by
> -        space. Label names take the form of "topic.type". For example,
> -        ui.debug() issues a label of "ui.debug".
> +        The color used is controled by an optional keyword argument, "label".
> +        This should be a string containing label names separated by space.
> +        Label names take the form of "topic.type". For example, ui.debug()
> +        issues a label of "ui.debug".
>  
>          When labeling output for a specific command, a label of
>          "cmdname.type" is recommended. For example, status issues
>          a label of "status.modified" for modified files.
>          '''
>          if self._buffers and not opts.get('prompt', False):
> -            self._buffers[-1].extend(a for a in args)
> +            if self._bufferapplylabels:
> +                label = opts.get('label', '')
> +                self._buffers[-1].extend(self.label(a, label) for a in args)
> +            else:
> +                self._buffers[-1].extend(args)
> +        elif self._colormode == 'win32':
> +            for a in args:
> +                # windows color printing is its own can of crab, defer to
> +                # the color module and that is it.
> +                color.win32print(a, self.fout.write, **opts)

Nit: perhaps win32print() should be counted as a stdio_blocked section.

>          else:
> +            msgs = args
> +            if self._colormode is not None:
> +                label = opts.get('label', '')
> +                msgs = [self.label(a, label) for a in args]
>              self._progclear()
>              # opencode timeblockedsection because this is a critical path
>              starttime = util.timer()
>              try:
> -                for a in args:
> +                for a in msgs:
>                      self.fout.write(a)
>              finally:
>                  self._blockedtimes['stdio_blocked'] += \


More information about the Mercurial-devel mailing list