Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/ui.py @ 24848:2f88821856eb stable
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.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 23 Apr 2015 14:57:39 +0100 |
parents | 28d76bc069db |
children | 09049042ab99 |
comparison
equal
deleted
inserted
replaced
24847:b705e5ab3b07 | 24848:2f88821856eb |
---|---|
74 | 74 |
75 class ui(object): | 75 class ui(object): |
76 def __init__(self, src=None): | 76 def __init__(self, src=None): |
77 # _buffers: used for temporary capture of output | 77 # _buffers: used for temporary capture of output |
78 self._buffers = [] | 78 self._buffers = [] |
79 # _bufferstates: Should the temporary capture includes stderr | 79 # _bufferstates: |
80 # should the temporary capture include stderr and subprocess output | |
80 self._bufferstates = [] | 81 self._bufferstates = [] |
81 self.quiet = self.verbose = self.debugflag = self.tracebackflag = False | 82 self.quiet = self.verbose = self.debugflag = self.tracebackflag = False |
82 self._reportuntrusted = True | 83 self._reportuntrusted = True |
83 self._ocfg = config.config() # overlay | 84 self._ocfg = config.config() # overlay |
84 self._tcfg = config.config() # trusted | 85 self._tcfg = config.config() # trusted |
538 | 539 |
539 @util.propertycache | 540 @util.propertycache |
540 def paths(self): | 541 def paths(self): |
541 return paths(self) | 542 return paths(self) |
542 | 543 |
543 def pushbuffer(self, error=False): | 544 def pushbuffer(self, error=False, subproc=False): |
544 """install a buffer to capture standard output of the ui object | 545 """install a buffer to capture standard output of the ui object |
545 | 546 |
546 If error is True, the error output will be captured too.""" | 547 If error is True, the error output will be captured too. |
548 | |
549 If subproc is True, output from subprocesses (typically hooks) will be | |
550 captured too.""" | |
547 self._buffers.append([]) | 551 self._buffers.append([]) |
548 self._bufferstates.append(error) | 552 self._bufferstates.append((error, subproc)) |
549 | 553 |
550 def popbuffer(self, labeled=False): | 554 def popbuffer(self, labeled=False): |
551 '''pop the last buffer and return the buffered output | 555 '''pop the last buffer and return the buffered output |
552 | 556 |
553 If labeled is True, any labels associated with buffered | 557 If labeled is True, any labels associated with buffered |
583 for a in args: | 587 for a in args: |
584 self.fout.write(str(a)) | 588 self.fout.write(str(a)) |
585 | 589 |
586 def write_err(self, *args, **opts): | 590 def write_err(self, *args, **opts): |
587 try: | 591 try: |
588 if self._bufferstates and self._bufferstates[-1]: | 592 if self._bufferstates and self._bufferstates[-1][0]: |
589 return self.write(*args, **opts) | 593 return self.write(*args, **opts) |
590 if not getattr(self.fout, 'closed', False): | 594 if not getattr(self.fout, 'closed', False): |
591 self.fout.flush() | 595 self.fout.flush() |
592 for a in args: | 596 for a in args: |
593 self.ferr.write(str(a)) | 597 self.ferr.write(str(a)) |
832 | 836 |
833 def system(self, cmd, environ={}, cwd=None, onerr=None, errprefix=None): | 837 def system(self, cmd, environ={}, cwd=None, onerr=None, errprefix=None): |
834 '''execute shell command with appropriate output stream. command | 838 '''execute shell command with appropriate output stream. command |
835 output will be redirected if fout is not stdout. | 839 output will be redirected if fout is not stdout. |
836 ''' | 840 ''' |
841 out = self.fout | |
842 if util.any(s[1] for s in self._bufferstates): | |
843 out = self | |
837 return util.system(cmd, environ=environ, cwd=cwd, onerr=onerr, | 844 return util.system(cmd, environ=environ, cwd=cwd, onerr=onerr, |
838 errprefix=errprefix, out=self.fout) | 845 errprefix=errprefix, out=out) |
839 | 846 |
840 def traceback(self, exc=None, force=False): | 847 def traceback(self, exc=None, force=False): |
841 '''print exception traceback if traceback printing enabled or forced. | 848 '''print exception traceback if traceback printing enabled or forced. |
842 only to call in exception handler. returns true if traceback | 849 only to call in exception handler. returns true if traceback |
843 printed.''' | 850 printed.''' |