1 # Copyright (C) 2006, Thomas Leonard
2 # See the README file for details, or visit http://0install.net.
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
]
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
)
30 elif main
.startswith('/'):
33 main
= os
.path
.join(os
.path
.dirname(root_impl
.main
), main
)
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)" %
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
))
46 print "Would execute:", prog_path
48 info("Executing: %s", prog_path
)
52 os
.execl(prog_path
, prog_path
, *prog_args
)
54 raise SafeException("Failed to run '%s': %s" % (prog_path
, str(ex
)))