From cf8be1c862204655aa1ae2520fec32ef9b05d740 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Karl=20Hasselstr=C3=B6m?= Date: Wed, 23 Jul 2008 23:29:10 +0200 Subject: [PATCH] Log subprocess activity to a file MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit If the user sets $STGIT_SUBPROCESS_LOG to a log mode followed by a colon and a file name, append the log to that file instead of writing it to stdout. Signed-off-by: Karl Hasselström --- stgit/out.py | 11 +++++++---- stgit/run.py | 35 +++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/stgit/out.py b/stgit/out.py index 485b830..753c176 100644 --- a/stgit/out.py +++ b/stgit/out.py @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import sys, textwrap class MessagePrinter(object): - def __init__(self): + def __init__(self, file = None): class Output(object): def __init__(self, write, flush): self.write = write @@ -68,9 +68,12 @@ class MessagePrinter(object): self.new_line() self.write(string) self.at_start_of_line = string.endswith('\n') - self.__stderr = Output(sys.stderr.write, sys.stderr.flush) - self.__stdout = Output(sys.stdout.write, sys.stdout.flush) - if sys.stdout.isatty(): + if file: + self.__stdout = self.__stderr = Output(file.write, file.flush) + else: + self.__stdout = Output(sys.stdout.write, sys.stdout.flush) + self.__stderr = Output(sys.stdout.write, sys.stdout.flush) + if file or sys.stdout.isatty(): self.__out = self.__stdout self.__err = self.__stdout else: diff --git a/stgit/run.py b/stgit/run.py index 0b79729..9d50e43 100644 --- a/stgit/run.py +++ b/stgit/run.py @@ -27,12 +27,22 @@ class RunException(StgException): subprocess.""" pass -_all_log_modes = ['debug', 'profile'] -_log_mode = os.environ.get('STGIT_SUBPROCESS_LOG', '') -if _log_mode and not _log_mode in _all_log_modes: - out.warn(('Unknown log mode "%s" specified in $STGIT_SUBPROCESS_LOG.' - % _log_mode), - 'Valid values are: %s' % ', '.join(_all_log_modes)) +def get_log_mode(spec): + if not ':' in spec: + spec += ':' + (log_mode, outfile) = spec.split(':', 1) + all_log_modes = ['debug', 'profile'] + if log_mode and not log_mode in all_log_modes: + out.warn(('Unknown log mode "%s" specified in $STGIT_SUBPROCESS_LOG.' + % log_mode), + 'Valid values are: %s' % ', '.join(all_log_modes)) + if outfile: + f = MessagePrinter(open(outfile, 'a')) + else: + f = out + return (log_mode, f) + +(_log_mode, _logfile) = get_log_mode(os.environ.get('STGIT_SUBPROCESS_LOG', '')) class Run: exc = RunException @@ -47,22 +57,23 @@ class Run: self.__discard_stderr = False def __log_start(self): if _log_mode == 'debug': - out.start('Running subprocess %s' % self.__cmd) + _logfile.start('Running subprocess %s' % self.__cmd) if self.__cwd != None: - out.info('cwd: %s' % self.__cwd) + _logfile.info('cwd: %s' % self.__cwd) if self.__env != None: for k in sorted(self.__env.iterkeys()): if k not in os.environ or os.environ[k] != self.__env[k]: - out.info('%s: %s' % (k, self.__env[k])) + _logfile.info('%s: %s' % (k, self.__env[k])) elif _log_mode == 'profile': - out.start('Running subprocess %s' % self.__cmd[0]) + _logfile.start('Running subprocess %s' % self.__cmd[0]) self.__starttime = datetime.datetime.now() def __log_end(self, retcode): if _log_mode == 'debug': - out.done('return code: %d' % retcode) + _logfile.done('return code: %d' % retcode) elif _log_mode == 'profile': duration = datetime.datetime.now() - self.__starttime - out.done('%1.3f s' % (duration.microseconds/1e6 + duration.seconds)) + _logfile.done('%1.3f s' % (duration.microseconds/1e6 + + duration.seconds)) def __check_exitcode(self): if self.__good_retvals == None: return -- 2.11.0