diff options
Diffstat (limited to 'bin/sugar-launch')
-rw-r--r-- | bin/sugar-launch | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/bin/sugar-launch b/bin/sugar-launch new file mode 100644 index 0000000..7297a8e --- /dev/null +++ b/bin/sugar-launch @@ -0,0 +1,89 @@ +#!/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)) + |