def execute(self, command, hint=None, cwd=None, extra_env=None): kws = { 'close_fds': True } if isinstance(command, (str, unicode)): displayed_command = command kws['shell'] = True else: displayed_command = ' '.join(command) self.phasefp.write('<span class="command">%s</span>\n' % escape(displayed_command)) if self.verbose: print ' $', displayed_command kws['stdin'] = subprocess.PIPE kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.PIPE if hint in ('cvs', 'svn', 'hg-update.py'): def format_line(line, error_output, fp=self.phasefp): if line[-1] == '\n': line = line[:-1] if self.verbose: print line if line.startswith('C '): fp.write('<span class="conflict">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) kws['stderr'] = subprocess.STDOUT else: def format_line(line, error_output, fp=self.phasefp): if line[-1] == '\n': line = line[:-1] if self.verbose: if error_output: print >> sys.stderr, line else: print line if error_output: fp.write('<span class="error">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) command = self._prepare_execute(command) try: p = subprocess.Popen(command, **kws) except OSError as e: self.phasefp.write('<span class="error">' + _('Error: %s') % escape(str(e)) + '</span>\n') raise CommandError(str(e)) cmds.pprint_output(p, format_line) if p.returncode != 0: raise CommandError(_('Error running %s') % command, p.returncode)
def test_pprint_output(self): try: p = subprocess.Popen(["echo", "foo\nbar"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) except OSError: raise unittest.SkipTest("no echo command") arguments = [] pprint_output(p, lambda *args: arguments.append(args)) self.assertEqual(arguments, [('foo\n', False), ('bar\n', False)])
if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) command = self._prepare_execute(command) try: p = subprocess.Popen(command, **kws) except OSError, e: self.modulefp.write('<span class="error">Error: %s</span>\n' % escape(str(e))) raise CommandError(str(e)) cmds.pprint_output(p, format_line) self.modulefp.write('</pre>\n') self.modulefp.flush() if p.returncode != 0: raise CommandError('Error running %s' % print_args['command'], p.returncode) def start_build(self): assert self.outputdir # close stdin sys.stdin.close() info = [] import socket un = os.uname()
def execute(self, command, hint=None, cwd=None, extra_env=None): if not command: raise CommandError(_('No command given')) kws = {'close_fds': True} print_args = {'cwd': ''} if cwd: print_args['cwd'] = cwd else: try: print_args['cwd'] = os.getcwd() except OSError: pass if isinstance(command, (str, unicode)): kws['shell'] = True print_args['command'] = command else: print_args['command'] = ' '.join(command) # get rid of hint if pretty printing is disabled. if not self.config.pretty_print: hint = None elif os.name == 'nt': # pretty print also doesn't work on Windows; # see https://bugzilla.gnome.org/show_bug.cgi?id=670349 hint = None if not self.config.quiet_mode: if self.config.print_command_pattern: try: print self.config.print_command_pattern % print_args except TypeError as e: raise FatalError('\'print_command_pattern\' %s' % e) except KeyError as e: raise FatalError(_('%(configuration_variable)s invalid key' ' %(key)s' % \ {'configuration_variable' : '\'print_command_pattern\'', 'key' : e})) kws['stdin'] = subprocess.PIPE if hint in ('cvs', 'svn', 'hg-update.py'): kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.STDOUT else: kws['stdout'] = None kws['stderr'] = None if self.config.quiet_mode: kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.STDOUT if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) command = self._prepare_execute(command) try: p = subprocess.Popen(command, **kws) except OSError as e: raise CommandError(str(e)) output = [] if hint in ('cvs', 'svn', 'hg-update.py'): conflicts = [] def format_line(line, error_output, conflicts=conflicts, output=output): if line.startswith('C '): conflicts.append(line) if self.config.quiet_mode: output.append(line) return if line[-1] == '\n': line = line[:-1] if line.startswith('C '): print '%s%s%s' % (t_colour[12], line, t_reset) elif line.startswith('M '): print '%s%s%s' % (t_colour[10], line, t_reset) elif line.startswith('? '): print '%s%s%s' % (t_colour[8], line, t_reset) else: print line cmds.pprint_output(p, format_line) if conflicts: uprint(_('\nConflicts during checkout:\n')) for line in conflicts: sys.stdout.write('%s %s%s\n' % (t_colour[12], line, t_reset)) # make sure conflicts fail if p.returncode == 0 and hint == 'cvs': p.returncode = 1 elif self.config.quiet_mode: def format_line(line, error_output, output=output): output.append(line) cmds.pprint_output(p, format_line) else: try: p.communicate() except KeyboardInterrupt: try: os.kill(p.pid, signal.SIGINT) except OSError: # process might already be dead. pass try: if p.wait() != 0: if self.config.quiet_mode: print ''.join(output) raise CommandError( _('########## Error running %s') % print_args['command'], p.returncode) except OSError: # it could happen on a really badly-timed ctrl-c (see bug 551641) raise CommandError( _('########## Error running %s') % print_args['command'])
class TinderboxBuildScript(buildscript.BuildScript): help_url = 'http://live.gnome.org/JhbuildIssues/' triedcheckout = None def __init__(self, config, module_list): buildscript.BuildScript.__init__(self, config, module_list) self.indexfp = None self.modulefp = None self.outputdir = os.path.abspath(config.tinderbox_outputdir) if not os.path.exists(self.outputdir): os.makedirs(self.outputdir) os.environ['TERM'] = 'dumb' self.charset = _encoding def timestamp(self): tm = time.time() s = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(tm)) msecs = max(int((tm - int(tm)) * 1000), 0) return '%s.%03d' % (s, msecs) def message(self, msg, module_num=-1): '''Display a message to the user''' if self.modulefp: self.modulefp.write('<div><b class="message">%s</b> ' '<span class="timestamp">%s</span></div>\n' % (escape(msg), self.timestamp())) else: # do something with messages outside of builds of module builds pass def set_action(self, action, module, module_num=-1, action_target=None): if module_num == -1: module_num = self.module_num if not action_target: action_target = module.name self.message('%s %s' % (action, action_target), module_num) def execute(self, command, hint=None, cwd=None, extra_env=None): assert self.modulefp, 'not currently building a module' kws = { 'close_fds': True } self.modulefp.write('<pre>') if isinstance(command, (str, unicode)): self.modulefp.write('<span class="command">%s</span>\n' % escape(command)) kws['shell'] = True else: self.modulefp.write('<span class="command">%s</span>\n' % escape(' '.join(command))) kws['stdin'] = subprocess.PIPE kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.PIPE if hint == 'cvs': def format_line(line, error_output, fp=self.modulefp): if line[-1] == '\n': line = line[:-1] if line.startswith('C '): fp.write('<span class="conflict">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) kws['stderr'] = subprocess.STDOUT else: def format_line(line, error_output, fp=self.modulefp): if line[-1] == '\n': line = line[:-1] if error_output: fp.write('<span class="error">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) try: p = subprocess.Popen(command, **kws) except OSError, e: self.modulefp.write('<span class="error">Error: %s</span>\n' % escape(str(e))) raise CommandError(str(e)) cmds.pprint_output(p, format_line) self.modulefp.write('</pre>\n') self.modulefp.flush() if p.returncode != 0: raise CommandError('Error running %s' % command, p.returncode)
if self.config.quiet_mode: output.append(line) return if line[-1] == '\n': line = line[:-1] if line.startswith('C '): print '%s%s%s' % (t_colour[12], line, t_reset) elif line.startswith('M '): print '%s%s%s' % (t_colour[10], line, t_reset) elif line.startswith('? '): print '%s%s%s' % (t_colour[8], line, t_reset) else: print line cmds.pprint_output(p, format_line) if conflicts: uprint(_('\nConflicts during checkout:\n')) for line in conflicts: sys.stdout.write('%s %s%s\n' % (t_colour[12], line, t_reset)) # make sure conflicts fail if p.returncode == 0 and hint == 'cvs': p.returncode = 1 elif self.config.quiet_mode: def format_line(line, error_output, output = output): output.append(line) cmds.pprint_output(p, format_line) else: try: p.communicate() except KeyboardInterrupt:
def execute(self, command, hint=None, cwd=None, extra_env=None): assert self.modulefp, 'not currently building a module' kws = {'close_fds': True} print_args = {} if cwd: print_args['cwd'] = cwd else: print_args['cwd'] = os.getcwd() self.modulefp.write('<pre>') if isinstance(command, string_types): kws['shell'] = True print_args['command'] = command else: print_args['command'] = ' '.join(command) if self.config.print_command_pattern: try: commandstr = self.config.print_command_pattern % print_args self.modulefp.write('<span class="command">%s</span>\n' % escape(commandstr)) except TypeError as e: raise FatalError('\'print_command_pattern\' %s' % e) except KeyError as e: raise FatalError(_('%(configuration_variable)s invalid key' ' %(key)s' % \ {'configuration_variable' : '\'print_command_pattern\'', 'key' : e})) kws['stdin'] = subprocess.PIPE kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.PIPE if hint == 'cvs': def format_line(line, error_output, fp=self.modulefp): if line[-1] == '\n': line = line[:-1] if line.startswith('C '): fp.write('<span class="conflict">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) kws['stderr'] = subprocess.STDOUT else: def format_line(line, error_output, fp=self.modulefp): if line[-1] == '\n': line = line[:-1] if error_output: fp.write('<span class="error">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) command = self._prepare_execute(command) try: p = subprocess.Popen(command, **kws) except OSError as e: self.modulefp.write('<span class="error">Error: %s</span>\n' % escape(str(e))) raise CommandError(str(e)) cmds.pprint_output(p, format_line) self.modulefp.write('</pre>\n') self.modulefp.flush() if p.returncode != 0: raise CommandError('Error running %s' % print_args['command'], p.returncode)
def execute(self, command, hint=None, cwd=None, extra_env=None): if not command: raise CommandError(_('No command given')) kws = { 'close_fds': True } print_args = {'cwd': ''} if cwd: print_args['cwd'] = cwd else: try: print_args['cwd'] = os.getcwd() except OSError: pass if isinstance(command, (str, unicode)): kws['shell'] = True print_args['command'] = command else: print_args['command'] = ' '.join(command) # get rid of hint if pretty printing is disabled. if not self.config.pretty_print: hint = None elif os.name == 'nt': # pretty print also doesn't work on Windows; # see https://bugzilla.gnome.org/show_bug.cgi?id=670349 hint = None if not self.config.quiet_mode: if self.config.print_command_pattern: try: print self.config.print_command_pattern % print_args except TypeError as e: raise FatalError('\'print_command_pattern\' %s' % e) except KeyError as e: raise FatalError(_('%(configuration_variable)s invalid key' ' %(key)s' % \ {'configuration_variable' : '\'print_command_pattern\'', 'key' : e})) kws['stdin'] = subprocess.PIPE if hint in ('cvs', 'svn', 'hg-update.py'): kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.STDOUT else: kws['stdout'] = None kws['stderr'] = None if self.config.quiet_mode: kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.STDOUT if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) command = self._prepare_execute(command) try: p = subprocess.Popen(command, **kws) except OSError as e: raise CommandError(str(e)) output = [] if hint in ('cvs', 'svn', 'hg-update.py'): conflicts = [] def format_line(line, error_output, conflicts = conflicts, output = output): if line.startswith('C '): conflicts.append(line) if self.config.quiet_mode: output.append(line) return if line[-1] == '\n': line = line[:-1] if line.startswith('C '): print '%s%s%s' % (t_colour[12], line, t_reset) elif line.startswith('M '): print '%s%s%s' % (t_colour[10], line, t_reset) elif line.startswith('? '): print '%s%s%s' % (t_colour[8], line, t_reset) else: print line cmds.pprint_output(p, format_line) if conflicts: uprint(_('\nConflicts during checkout:\n')) for line in conflicts: sys.stdout.write('%s %s%s\n' % (t_colour[12], line, t_reset)) # make sure conflicts fail if p.returncode == 0 and hint == 'cvs': p.returncode = 1 elif self.config.quiet_mode: def format_line(line, error_output, output = output): output.append(line) cmds.pprint_output(p, format_line) else: try: p.communicate() except KeyboardInterrupt: try: os.kill(p.pid, signal.SIGINT) except OSError: # process might already be dead. pass try: if p.wait() != 0: if self.config.quiet_mode: print ''.join(output) raise CommandError(_('########## Error running %s') % print_args['command'], p.returncode) except OSError: # it could happen on a really badly-timed ctrl-c (see bug 551641) raise CommandError(_('########## Error running %s') % print_args['command'])
def execute(self, command, hint=None, cwd=None, extra_env=None): assert self.modulefp, 'not currently building a module' kws = { 'close_fds': True } print_args = {} if cwd: print_args['cwd'] = cwd else: print_args['cwd'] = os.getcwd() self.modulefp.write('<pre>') if isinstance(command, (str, unicode)): kws['shell'] = True print_args['command'] = command else: print_args['command'] = ' '.join(command) if self.config.print_command_pattern: try: commandstr = self.config.print_command_pattern % print_args self.modulefp.write('<span class="command">%s</span>\n' % escape(commandstr)) except TypeError as e: raise FatalError('\'print_command_pattern\' %s' % e) except KeyError as e: raise FatalError(_('%(configuration_variable)s invalid key' ' %(key)s' % \ {'configuration_variable' : '\'print_command_pattern\'', 'key' : e})) kws['stdin'] = subprocess.PIPE kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.PIPE if hint == 'cvs': def format_line(line, error_output, fp=self.modulefp): if line[-1] == '\n': line = line[:-1] if line.startswith('C '): fp.write('<span class="conflict">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) kws['stderr'] = subprocess.STDOUT else: def format_line(line, error_output, fp=self.modulefp): if line[-1] == '\n': line = line[:-1] if error_output: fp.write('<span class="error">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) command = self._prepare_execute(command) try: p = subprocess.Popen(command, **kws) except OSError as e: self.modulefp.write('<span class="error">Error: %s</span>\n' % escape(str(e))) raise CommandError(str(e)) cmds.pprint_output(p, format_line) self.modulefp.write('</pre>\n') self.modulefp.flush() if p.returncode != 0: raise CommandError('Error running %s' % print_args['command'], p.returncode)
class TerminalBuildScript(buildscript.BuildScript): triedcheckout = None is_end_of_build = False def __init__(self, config, module_list): buildscript.BuildScript.__init__(self, config, module_list) self.trayicon = trayicon.TrayIcon(config) self.notify = notify.Notify(config) def message(self, msg, module_num=-1): '''Display a message to the user''' if module_num == -1: module_num = self.module_num if module_num > 0: progress = ' [%d/%d]' % (module_num, len(self.modulelist)) else: progress = '' if not (self.config.quiet_mode and self.config.progress_bar): uprint('%s*** %s ***%s%s' % (t_bold, msg, progress, t_reset)) else: progress_percent = 1.0 * (module_num - 1) / len(self.modulelist) self.display_status_line(progress_percent, module_num, msg) if is_xterm: sys.stdout.write('\033]0;jhbuild:%s%s\007' % (uencode(msg), progress)) sys.stdout.flush() self.trayicon.set_tooltip('%s%s' % (msg, progress)) def set_action(self, action, module, module_num=-1, action_target=None): if module_num == -1: module_num = self.module_num if not action_target: action_target = module.name self.message('%s %s' % (action, action_target), module_num) def display_status_line(self, progress, module_num, message): if self.is_end_of_build: # hardcode progress to 100% at the end of the build progress = 1 columns = curses.tigetnum('cols') width = columns / 2 num_hashes = int(round(progress * width)) progress_bar = '[' + (num_hashes * '=') + ( (width - num_hashes) * '-') + ']' module_no_digits = len(str(len(self.modulelist))) format_str = '%%%dd' % module_no_digits module_pos = '[' + format_str % module_num + '/' + format_str % len( self.modulelist) + ']' output = '%s %s %s%s%s' % (progress_bar, module_pos, t_bold, message, t_reset) text_width = len(output) - (len(t_bold) + len(t_reset)) if text_width > columns: output = output[:columns + len(t_bold)] + t_reset else: output += ' ' * (columns - text_width) sys.stdout.write('\r' + output) if self.is_end_of_build: sys.stdout.write('\n') sys.stdout.flush() def execute(self, command, hint=None, cwd=None, extra_env=None): if not command: raise CommandError(_('No command given')) kws = {'close_fds': True} if isinstance(command, (str, unicode)): kws['shell'] = True pretty_command = command else: pretty_command = ' '.join(command) if not self.config.quiet_mode: print pretty_command kws['stdin'] = subprocess.PIPE if hint in ('cvs', 'svn', 'hg-update.py'): kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.STDOUT else: kws['stdout'] = None kws['stderr'] = None if self.config.quiet_mode: kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.STDOUT if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) try: p = subprocess.Popen(command, **kws) except OSError, e: raise CommandError(str(e)) output = [] if hint in ('cvs', 'svn', 'hg-update.py'): conflicts = [] def format_line(line, error_output, conflicts=conflicts, output=output): if line.startswith('C '): conflicts.append(line) if self.config.quiet_mode: output.append(line) return if line[-1] == '\n': line = line[:-1] if not self.config.pretty_print: hint = None print line return if line.startswith('C '): print '%s%s%s' % (t_colour[12], line, t_reset) elif line.startswith('M '): print '%s%s%s' % (t_colour[10], line, t_reset) elif line.startswith('? '): print '%s%s%s' % (t_colour[8], line, t_reset) else: print line cmds.pprint_output(p, format_line) if conflicts: uprint(_('\nConflicts during checkout:\n')) for line in conflicts: sys.stdout.write('%s %s%s\n' % (t_colour[12], line, t_reset)) # make sure conflicts fail if p.returncode == 0 and hint == 'cvs': p.returncode = 1 elif self.config.quiet_mode: def format_line(line, error_output, output=output): output.append(line) cmds.pprint_output(p, format_line) else: try: p.communicate() except KeyboardInterrupt: try: os.kill(p.pid, signal.SIGINT) except OSError: # process might already be dead. pass try: if p.wait() != 0: if self.config.quiet_mode: print ''.join(output) raise CommandError( _('########## Error running %s') % pretty_command) except OSError: # it could happen on a really badly-timed ctrl-c (see bug 551641) raise CommandError( _('########## Error running %s') % pretty_command)
def execute(self, command, hint=None, cwd=None, extra_env=None): kws = { 'close_fds': True } if isinstance(command, string_types): displayed_command = command kws['shell'] = True else: displayed_command = ' '.join(command) self.phasefp.write('<span class="command">%s</span>\n' % escape(displayed_command)) if self.verbose: print(' $', displayed_command) kws['stdin'] = subprocess.PIPE kws['stdout'] = subprocess.PIPE kws['stderr'] = subprocess.PIPE if hint in ('cvs', 'svn', 'hg-update.py'): def format_line(line, error_output, fp=self.phasefp): if line[-1] == '\n': line = line[:-1] if self.verbose: print(line) if line.startswith('C '): fp.write('<span class="conflict">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) kws['stderr'] = subprocess.STDOUT else: def format_line(line, error_output, fp=self.phasefp): if line[-1] == '\n': line = line[:-1] if self.verbose: if error_output: print(line, file=sys.stderr) else: print(line) if error_output: fp.write('<span class="error">%s</span>\n' % escape(line)) else: fp.write('%s\n' % escape(line)) if cwd is not None: kws['cwd'] = cwd if extra_env is not None: kws['env'] = os.environ.copy() kws['env'].update(extra_env) command = self._prepare_execute(command) try: p = subprocess.Popen(command, **kws) except OSError as e: self.phasefp.write('<span class="error">' + _('Error: %s') % escape(str(e)) + '</span>\n') raise CommandError(str(e)) cmds.pprint_output(p, format_line) if p.returncode != 0: raise CommandError(_('Error running %s') % command, p.returncode)