diff options
author | Steven Knight <knight@baldmt.com> | 2008-08-26 14:52:53 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2008-08-26 14:52:53 (GMT) |
commit | a3a04788066947886a1e95000f0460bc1887f19f (patch) | |
tree | b4fdae8927b33494fe6b1a7b26af504acfe4425f /bin/Command.py | |
parent | 0535d0884dba8278368208c7ac2028ffff39d01a (diff) | |
download | SCons-a3a04788066947886a1e95000f0460bc1887f19f.zip SCons-a3a04788066947886a1e95000f0460bc1887f19f.tar.gz SCons-a3a04788066947886a1e95000f0460bc1887f19f.tar.bz2 |
Add a script for creating a standard SCons development system on
Ubuntu Hardy. Rewrite subsidiary scripts for install Python and
SCons versions in Python (from shell).
Diffstat (limited to 'bin/Command.py')
-rw-r--r-- | bin/Command.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/bin/Command.py b/bin/Command.py new file mode 100644 index 0000000..ebdf589 --- /dev/null +++ b/bin/Command.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python +# +# XXX Python script template +# +# XXX Describe what the script does here. +# + +import getopt +import os +import sys + +class Usage(Exception): + def __init__(self, msg): + self.msg = msg + +class CommandRunner: + """ + Representation of a command to be executed. + """ + + def __init__(self, dictionary={}): + self.subst_dictionary(dictionary) + + def subst_dictionary(self, dictionary): + self._subst_dictionary = dictionary + + def subst(self, string, dictionary=None): + """ + Substitutes (via the format operator) the values in the specified + dictionary into the specified command. + + The command can be an (action, string) tuple. In all cases, we + perform substitution on strings and don't worry if something isn't + a string. (It's probably a Python function to be executed.) + """ + if dictionary is None: + dictionary = self._subst_dictionary + if dictionary: + try: + string = string % dictionary + except TypeError: + pass + return string + + def do_display(self, string): + if type(string) == type(()): + func = string[0] + args = string[1:] + s = '%s(%s)' % (func.__name__, ', '.join(map(repr, args))) + else: + s = self.subst(string) + if not s.endswith('\n'): + s += '\n' + sys.stdout.write(s) + sys.stdout.flush() + + def do_not_display(self, string): + pass + + def do_execute(self, command): + if type(command) == type(()): + func = command[0] + args = command[1:] + return func(*args) + else: + return os.system(self.subst(command)) + + def do_not_execute(self, command): + pass + + display = do_display + execute = do_execute + + def run(self, command, display=None): + """ + Runs this command, displaying it first. + + The actual display() and execute() methods we call may be + overridden if we're printing but not executing, or vice versa. + """ + if display is None: + display = command + self.display(display) + return self.execute(command) + +def main(argv=None): + if argv is None: + argv = sys.argv + + short_options = 'hnq' + long_options = ['help', 'no-exec', 'quiet'] + + helpstr = """\ +Usage: script-template.py [-hnq] + + -h, --help Print this help and exit + -n, --no-exec No execute, just print the command line + -q, --quiet Quiet, don't print the command line +""" + + try: + try: + opts, args = getopt.getopt(argv[1:], short_options, long_options) + except getopt.error, msg: + raise Usage(msg) + + for o, a in opts: + if o in ('-h', '--help'): + print helpstr + sys.exit(0) + elif o in ('-n', '--no-exec'): + Command.execute = Command.do_not_execute + elif o in ('-q', '--quiet'): + Command.display = Command.do_not_display + except Usage, err: + sys.stderr.write(err.msg) + sys.stderr.write('use -h to get help') + return 2 + + commands = [ + ] + + for command in [ Command(c) for c in commands ]: + status = command.run(command) + if status: + sys.exit(status) + +if __name__ == "__main__": + sys.exit(main()) |