Moved non-gui parts to their own dir.
[zeroinstall.git] / injector / run.py
blob606f7a97a6d029c2b1ca92419f4a6d4a2b411ad5
1 import os, sys
3 from policy import policy
4 from model import *
6 def do_env_binding(binding, iface):
7 impl = get_impl(iface)
8 extra = os.path.join(impl.path, binding.insert)
9 if binding.name in os.environ:
10 os.environ[binding.name] = extra + ':' + os.environ[binding.name]
11 else:
12 os.environ[binding.name] = extra
14 def execute(iface, prog, prog_args):
15 def setup_bindings(i):
16 impl = get_impl(i)
17 for dep in impl.dependencies.values():
18 dep_iface = dep.get_interface()
19 for b in dep.bindings:
20 if isinstance(b, EnvironmentBinding):
21 do_env_binding(b, dep_iface)
22 setup_bindings(dep_iface)
23 setup_bindings(iface)
25 prog_path = os.path.join(policy.implementation[iface].path, prog)
26 if not os.path.exists(prog_path):
27 print "'%s' does not exist." % prog_path
28 print "(implementation '%s' + program '%s')" % (policy.implementation[iface].path, prog)
29 sys.exit(1)
30 os.execl(prog_path, prog_path, *prog_args)
32 def get_impl(interface):
33 try:
34 return policy.implementation[interface]
35 except KeyError:
36 if not interface.name:
37 raise SafeException("We don't have enough information to "
38 "run this program yet. "
39 "Need to download:\n%s" % interface.uri)
40 if interface.implementations:
41 offline = ""
42 if policy.network_use == network_offline:
43 offline = "\nThis may be because 'Network Use' is set to Off-line."
44 raise SafeException("No usable implementation found for '%s'.%s" %
45 (interface.name, offline))