from __future__ import print_function import os, sys from twisted.internet.defer import maybeDeferred from twisted.internet.task import react from ..errors import TransferError from ..timing import DebugTiming from .cli_args import parser def dispatch(args): # returns Deferred if args.func == "send/send": from . import cmd_send return cmd_send.send(args) if args.func == "receive/receive": _start = args.timing.add_event("import c_r_t") from . import cmd_receive args.timing.finish_event(_start) return cmd_receive.receive(args) raise ValueError("unknown args.func %s" % args.func) def run(reactor, argv, cwd, stdout, stderr, executable=None): """This is invoked by entry() below, and can also be invoked directly by tests. """ args = parser.parse_args(argv) if not getattr(args, "func", None): # So far this only works on py3. py2 exits with a really terse # "error: too few arguments" during parse_args(). parser.print_help() sys.exit(0) args.cwd = cwd args.stdout = stdout args.stderr = stderr args.timing = timing = DebugTiming() timing.add_event("command dispatch") d = maybeDeferred(dispatch, args) def _maybe_dump_timing(res): timing.add_event("exit") if args.dump_timing: timing.write(args.dump_timing, stderr) return res d.addBoth(_maybe_dump_timing) def _explain_error(f): f.trap(TransferError) print("ERROR:", f.value, file=stderr) raise SystemExit(1) d.addErrback(_explain_error) def _rc(rc): raise SystemExit(rc) d.addCallback(_rc) return d def entry(): """This is used by a setuptools entry_point. When invoked this way, setuptools has already put the installed package on sys.path .""" react(run, (sys.argv[1:], os.getcwd(), sys.stdout, sys.stderr, sys.argv[0])) if __name__ == "__main__": args = parser.parse_args() print(args)