+### WARNING : this ALWAYS does its job, even in dry_run mode
+def output_of (command):
+ import commands
+ (code,string) = commands.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("?",".")
+ return re.compile(pattern).match(string)
+
+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)
+ 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):