Clarified copyrights.
[zeroinstall.git] / zeroinstall / injector / run.py
blob697d0f3e6aab65dd1a9053b91fa188d1a571b480
1 # Copyright (C) 2006, Thomas Leonard
2 # See the README file for details, or visit http://0install.net.
4 import os, sys
5 from logging import debug, info
7 from model import Interface, SafeException, EnvironmentBinding
9 def do_env_binding(binding, path):
10 os.environ[binding.name] = binding.get_value(path,
11 os.environ.get(binding.name, None))
12 info("%s=%s", binding.name, os.environ[binding.name])
14 def execute(policy, prog_args, dry_run = False, main = None):
15 iface = policy.get_interface(policy.root)
17 for needed_iface in policy.implementation:
18 impl = policy.implementation[needed_iface]
19 assert impl
20 for dep in impl.dependencies.values():
21 dep_iface = policy.get_interface(dep.interface)
22 for b in dep.bindings:
23 if isinstance(b, EnvironmentBinding):
24 dep_impl = policy.get_implementation(dep_iface)
25 do_env_binding(b, policy.get_implementation_path(dep_impl))
27 root_impl = policy.get_implementation(iface)
28 if main is None:
29 main = root_impl.main
30 elif main.startswith('/'):
31 main = main[1:]
32 elif root_impl.main:
33 main = os.path.join(os.path.dirname(root_impl.main), main)
35 if main is None:
36 raise SafeException("Implementation '%s' cannot be executed directly; it is just a library "
37 "to be used by other programs (or missing 'main' attribute)" %
38 root_impl)
40 prog_path = os.path.join(policy.get_implementation_path(root_impl), main)
41 if not os.path.exists(prog_path):
42 raise SafeException("File '%s' does not exist.\n"
43 "(implementation '%s' + program '%s')" %
44 (prog_path, policy.implementation[iface].id, main))
45 if dry_run:
46 print "Would execute:", prog_path
47 else:
48 info("Executing: %s", prog_path)
49 sys.stdout.flush()
50 sys.stderr.flush()
51 try:
52 os.execl(prog_path, prog_path, *prog_args)
53 except OSError, ex:
54 raise SafeException("Failed to run '%s': %s" % (prog_path, str(ex)))