#!/usr/bin/env python # Copyright (C) 2007, Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os import sys import dbus from optparse import OptionParser from sugar.activity import activityfactory from sugar.bundle.activitybundle import ActivityBundle usage = "usage: %prog [options] activity" parser = OptionParser(usage) parser.add_option("-d", "--debug", action="store_true", dest="debug", help="launch activity inside gdb") (options, args) = parser.parse_args() if len(args) == 0: print 'You need to specify the activity bundle_id.' sys.exit(1) bus = dbus.SessionBus() proxy = bus.get_object('org.laptop.Shell', '/org/laptop/Shell') path = dbus.Interface(proxy, 'org.laptop.Shell').GetBundlePath(args[0]) if not path: print 'Cannot find %s bundle.' % args[0] sys.exit(1) activity = ActivityBundle(path) cmd_args = activityfactory.get_command(activity) def _which(exec_file): if 'PATH' in os.environ: envpath = os.environ['PATH'] else: return None for path in envpath.split(os.pathsep): fullname = os.path.join(path, exec_file) if os.path.exists(fullname): return fullname return None def _get_interpreter(exec_file): if os.path.exists(exec_file): abs_path = exec_file else: abs_path = _which(exec_file) if not abs_path: return exec_file f = open(abs_path) line = f.readline(100) if line.startswith('#!'): cmds = line[2:].strip().split(' ') cmds.append(abs_path) if '/usr/bin/env' in cmds: cmds.remove('/usr/bin/env') return cmds return exec_file if options.debug: act_args = cmd_args cmd_args = ['gdb', '--args'] cmd_args.extend(_get_interpreter(act_args.pop(0))) cmd_args.extend(act_args) os.chdir(str(activity.get_path())) os.execvpe(cmd_args[0], cmd_args, activityfactory.get_environment(activity))