-# $Id$
-import time, os, re, glob, sys
+# -*- python3 -*-
+# Thierry Parmentelat <thierry.parmentelat@inria.fr>
+# Copyright (C) 2015 INRIA
+#
+import sys
+import time
+import os
+import re
+import glob
+import subprocess
from pprint import PrettyPrinter
options={}
def init_options(options_arg):
global options
- options=options_arg
+ options = options_arg
# how could this accept a list again ?
def header(message):
- now=time.strftime("%H:%M:%S", time.localtime())
- print "*",now,'--',message
+ now = time.strftime("%H:%M:%S", time.localtime())
+ print("*", now, '--', message)
-def pprint(message,spec,depth=2):
- now=time.strftime("%H:%M:%S", time.localtime())
- print ">",now,"--",message
- PrettyPrinter(indent=8,depth=depth).pprint(spec)
+def pprint(message, spec, depth=2):
+ now = time.strftime("%H:%M:%S", time.localtime())
+ print(">", now, "--", message)
+ PrettyPrinter(indent=8, depth=depth).pprint(spec)
-
-def system(command,background=False,silent=False):
- if options.dry_run:
- print 'dry_run:',command
+# set a default timeout to 15 minutes - this should be plenty even for installations
+# call with timeout=None if the intention really is to wait until full completion
+def system(command, background=False, silent=False, dry_run=None, timeout=15*60):
+ dry_run = dry_run if dry_run is not None else getattr(options, 'dry_run', False)
+ if dry_run:
+ print('dry_run:', command)
return 0
- if silent : command += "2> /dev/null"
- if background: command += " &"
+ if silent :
+ if command.find(';') >= 0:
+ command = "({}) 2> /dev/null".format(command)
+ else: command += " 2> /dev/null"
+ if background:
+ command += " &"
if silent:
- print '.',
+ print('.', end=' ')
sys.stdout.flush()
else:
- now=time.strftime("%H:%M:%S", time.localtime())
+ now = time.strftime("%H:%M:%S", time.localtime())
# don't show in summary
- print "->",now,'--',
+ print("->", now, '--', end=' ')
sys.stdout.flush()
- return os.system("set -x; " + command)
+ if not silent:
+ command = "set -x; " + command
+ try:
+ return subprocess.call(command, shell=True, timeout=timeout)
+ except subprocess.TimeoutExpired as e:
+ header("TIMEOUT when running command {}- {}".format(command, e))
+ return -1
### WARNING : this ALWAYS does its job, even in dry_run mode
def output_of (command):
- import commands
-# if options.dry_run:
-# print 'dry_run',command
-# return (0,'[[dry-run - fake output]]')
-# else:
- (code,string) = commands.getstatusoutput(command)
- return (code,string)
-
+ import subprocess
+ (code, string) = subprocess.getstatusoutput(command)
+ return (code, string)
# convenience: translating shell-like pattern into regexp
def match (string, pattern):
# tmp - there's probably much simpler
# rewrite * into .*, ? into .
- pattern=pattern.replace("*",".*")
- pattern=pattern.replace("?",".")
+ pattern = pattern.replace("*",".*")
+ pattern = pattern.replace("?",".")
return re.compile(pattern).match(string)
-def locate_hooks_scripts (message,path,extensions):
- print message,'searching',path,'for extensions',extensions
- scripts=[]
+def locate_hooks_scripts (message, path, extensions):
+ print(message, 'searching', path, 'for extensions', extensions)
+ scripts = []
for ext in extensions:
# skip helper programs
- scripts += glob.glob (path+'/[a-zA-Z]*.'+ext)
+ scripts += glob.glob (path+'/[a-zA-Z]*.' + ext)
return scripts
# quick & dirty - should probably use the parseroption object instead
# and move to TestMain as well
exclude_options_keys = [ 'ensure_value' , 'read_file', 'read_module' ]
-def show_options (message,options):
- now=time.strftime("%H:%M:%S", time.localtime())
- print ">",now,"--",message
+def show_options (message, options):
+ now = time.strftime("%H:%M:%S", time.localtime())
+ print(">", now, "--", message)
for k in dir(options):
- if k.find("_")==0: continue
- if k in exclude_options_keys: continue
- print " ",k,":",getattr(options,k)
+ if k.find("_") == 0:
+ continue
+ if k in exclude_options_keys:
+ continue
+ print(" ", k, ":", getattr(options, k))