[PATCH 2 of 5] ui: allow capture of subprocess output

Yuya Nishihara yuya at tcha.org
Fri Apr 24 10:39:20 CDT 2015


On Fri, 24 Apr 2015 15:46:08 +0100, Pierre-Yves David wrote:
> On 04/24/2015 02:49 PM, Yuya Nishihara wrote:
> > On Fri, 24 Apr 2015 00:56:22 +0100, Pierre-Yves David wrote:
> >> # HG changeset patch
> >> # User Pierre-Yves David <pierre-yves.david at fb.com>
> >> # Date 1429797459 -3600
> >> #      Thu Apr 23 14:57:39 2015 +0100
> >> # Branch stable
> >> # Node ID 8aea112e68b1f90f8b2917f06fd4081116502c64
> >> # Parent  61a2951a30f7c18501027501f7642dd632e72fcd
> >> ui: allow capture of subprocess output
> >>
> >> We want to capture hooks output during bundle2 processing. For this purpose we
> >> introduce a new 'subproc' argument to 'ui.pushbuffer'. When set, the output of
> >> sub process created through 'ui.system' will be captured in the buffer too.
> >>
> >> This will be used in the next changeset.
> >
> >>       def write_err(self, *args, **opts):
> >>           try:
> >> -            if self._bufferstates and self._bufferstates[-1]:
> >> +            if self._bufferstates and self._bufferstates[-1][0]:
> >>                   return self.write(*args, **opts)
> >>               if not getattr(self.fout, 'closed', False):
> >>                   self.fout.flush()
> >>               for a in args:
> >>                   self.ferr.write(str(a))
> >> @@ -832,12 +836,15 @@ class ui(object):
> >>
> >>       def system(self, cmd, environ={}, cwd=None, onerr=None, errprefix=None):
> >>           '''execute shell command with appropriate output stream. command
> >>           output will be redirected if fout is not stdout.
> >>           '''
> >> +        out = self.fout
> >> +        if util.any(s[1] for s in self._bufferstates):
> >> +            out = self
> >
> > Nitpick, why does it check any bufferstates unlike write_error() ?
> 
> The idea is to turn a "flag" on saying "now I want subprocess being 
> capture". So buffer push at lower level should not disable the 
> subprocess output capture.
> 
> That said write_error should probably do something similar.

I see.

> That said², we should probably capture the errors output in the buffer 
> that request it (in both err and subprocess case but it does not seems 
> too critical for now/stable.

For default branch, maybe we can do ui.fin = ui.fout = StringIO() to capture
all outputs during bundle2 processing.


More information about the Mercurial-devel mailing list