]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - bin/tahoe-script.template
1a227319d5809c7c669d25733f6940879a50693e
[tahoe-lafs/tahoe-lafs.git] / bin / tahoe-script.template
1 #!/bin/false # You must specify a python interpreter.
2 u"Tahoe-LAFS does not run under Python 3. Please use a version of Python between 2.4.4 and 2.7.x inclusive."
3
4 import errno, sys, os, subprocess
5
6 where = os.path.realpath(sys.argv[0])
7 base = os.path.dirname(os.path.dirname(where))
8
9 if sys.platform == "win32":
10     perhaps_installed_tahoe = os.path.join(os.path.dirname(sys.executable), 'Scripts', 'tahoe.pyscript')
11 else:
12     perhaps_installed_tahoe = "/usr/bin/tahoe"
13
14 whoami = '''\
15 I am a "bin%stahoe" executable who is only for the convenience of running
16 Tahoe from its source distribution -- I work only when invoked as the "tahoe"
17 script that lives in the "bin/" subdirectory of a Tahoe source code
18 distribution, and only if you have already run "make".
19 ''' % (os.path.sep,)
20
21 # look for Tahoe.home .
22 homemarker = os.path.join(base, "Tahoe.home")
23 if not os.path.exists(homemarker):
24     print whoami
25     print '''\
26 I just tried to run and found that I am not living in such a directory, so I
27 am stopping now. To run Tahoe after it has been is installed, please execute
28 my brother, who gets installed into the appropriate place for executables
29 when you run "make install" (perhaps as "%s").
30 ''' % (perhaps_installed_tahoe,)
31     sys.exit(1)
32
33 # we've found our home. Put the tahoe support/lib etc. in our PYTHONPATH.
34 if sys.platform == "win32":
35     supportdir = os.path.join(base, "support", "Lib", "site-packages")
36 else:
37     supportdir = os.path.join(base, "support",
38                               "lib",
39                               "python%d.%d" % sys.version_info[:2],
40                               "site-packages")
41
42 # update PYTHONPATH so that child processes (like twistd) will use this too
43 pp = os.environ.get("PYTHONPATH")
44 if pp:
45     pp = os.pathsep.join([supportdir] + pp.split(os.pathsep))
46 else:
47     pp = supportdir
48 os.environ["PYTHONPATH"] = pp
49
50 # find commandline args and the location of the tahoe executable.
51 if sys.platform == "win32":
52     import re
53     from ctypes import WINFUNCTYPE, POINTER, byref, c_wchar_p, c_int, windll
54
55     GetCommandLineW = WINFUNCTYPE(c_wchar_p)(("GetCommandLineW", windll.kernel32))
56     CommandLineToArgvW = WINFUNCTYPE(POINTER(c_wchar_p), c_wchar_p, POINTER(c_int)) \
57                             (("CommandLineToArgvW", windll.shell32))
58
59     argc = c_int(0)
60     argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc))
61
62     # See src/allmydata/scripts/runner.py for the corresponding unmangler.
63     # Note that this doesn't escape \x7F. If it did, test_unicode_arguments_and_output
64     # in test_runner.py wouldn't work.
65     def mangle(s):
66         return str(re.sub(ur'[^\x20-\x7F]', lambda m: u'\x7F%x;' % (ord(m.group(0)),), s))
67
68     argv = [mangle(argv_unicode[i]) for i in xrange(1, argc.value)]
69
70     # Skip option arguments to the Python interpreter.
71     while len(argv) > 0:
72         arg = argv[0]
73         if not arg.startswith(u"-") or arg == u"-":
74             break
75         argv = argv[1:]
76         if arg == u'-m' or arg == u'-c':
77             break
78
79     script = os.path.join(base, "support", "Scripts", "tahoe.pyscript")
80
81     # On Windows, the script is not directly executable and must be run via python.
82     args = [sys.executable, script] + argv[1:]
83 else:
84     script = os.path.join(base, "support", "bin", "tahoe")
85
86     # On non-Windows, invoke the script directly, so that 'top' for example shows 'tahoe'.
87     args = [script] + sys.argv[1:]
88
89 try:
90     res = subprocess.call(args, env=os.environ)
91 except (OSError, IOError), le:
92     if le.args[0] == errno.ENOENT:
93         print whoami
94         print '''\
95 I just tried to run and could not find my brother at
96 "%s". To run Tahoe when it is installed, please execute my
97 brother, who gets installed into the appropriate place for executables
98 when you run "make install" (perhaps as "%s").
99 ''' % (script, perhaps_installed_tahoe)
100         raise
101 except Exception, le:
102     print whoami
103     print '''\
104 I just tried to invoke my brother at "%s"
105 and got an exception.
106 ''' % (script,)
107     raise
108 else:
109     sys.exit(res)
110