From 8587c63bdc291faf08d54128970905db37188fb2 Mon Sep 17 00:00:00 2001
From: david-sarah <david-sarah@jacaranda.org>
Date: Fri, 21 Jan 2011 00:04:29 -0800
Subject: [PATCH] Make bb-freeze (and probably other static packaging tools)
 work. This updates various places where we assumed that the tahoe process was
 executed via the Python interpreter. It also allows tests to recursively
 invoke the same tahoe.exe, rather than bin/tahoe. refs #585

---
 src/allmydata/test/test_runner.py | 33 +++++++++++++++++++++----------
 src/allmydata/test/test_system.py |  2 +-
 static/tahoe.py                   | 27 +++++++++++++++++++++++++
 3 files changed, 51 insertions(+), 11 deletions(-)
 create mode 100644 static/tahoe.py

diff --git a/src/allmydata/test/test_runner.py b/src/allmydata/test/test_runner.py
index 86d31f50..a7babdc2 100644
--- a/src/allmydata/test/test_runner.py
+++ b/src/allmydata/test/test_runner.py
@@ -31,13 +31,18 @@ def get_root_from_file(src):
 srcfile = allmydata.__file__
 rootdir = get_root_from_file(srcfile)
 
-bintahoe = os.path.join(rootdir, 'bin', 'tahoe')
-if sys.platform == "win32":
-    bintahoe += ".pyscript"
-    if not os.path.exists(bintahoe):
-       alt_bintahoe = os.path.join(rootdir, 'Scripts', 'tahoe.pyscript')
-       if os.path.exists(alt_bintahoe):
-           bintahoe = alt_bintahoe
+if hasattr(sys, 'frozen'):
+    bintahoe = os.path.join(rootdir, 'tahoe')
+    if sys.platform == "win32" and os.path.exists(bintahoe + '.exe'):
+        bintahoe += '.exe'
+else:
+    bintahoe = os.path.join(rootdir, 'bin', 'tahoe')
+    if sys.platform == "win32":
+        bintahoe += '.pyscript'
+        if not os.path.exists(bintahoe):
+            alt_bintahoe = os.path.join(rootdir, 'Scripts', 'tahoe.pyscript')
+            if os.path.exists(alt_bintahoe):
+                bintahoe = alt_bintahoe
 
 
 class RunBinTahoeMixin:
@@ -53,7 +58,14 @@ class RunBinTahoeMixin:
 
     def run_bintahoe(self, args, stdin=None, python_options=[], env=None):
         self.skip_if_cannot_run_bintahoe()
-        command = [sys.executable] + python_options + [bintahoe] + args
+
+        if hasattr(sys, 'frozen'):
+            if python_options:
+                raise unittest.SkipTest("This test doesn't apply to frozen builds.")
+            command = [bintahoe] + args
+        else:
+            command = [sys.executable] + python_options + [bintahoe] + args
+
         if stdin is None:
             stdin_stream = None
         else:
@@ -69,6 +81,9 @@ class RunBinTahoeMixin:
 class BinTahoe(common_util.SignalMixin, unittest.TestCase, RunBinTahoeMixin):
     def _check_right_code(self, file_to_check):
         root_to_check = get_root_from_file(file_to_check)
+        if os.path.basename(root_to_check) == 'dist':
+            root_to_check = os.path.dirname(root_to_check)
+
         cwd = os.path.normcase(os.path.realpath("."))
         root_from_cwd = os.path.dirname(cwd)
         if os.path.basename(root_from_cwd) == 'src':
@@ -172,8 +187,6 @@ class BinTahoe(common_util.SignalMixin, unittest.TestCase, RunBinTahoeMixin):
         return d
 
     def test_run_with_python_options(self):
-        self.skip_if_cannot_run_bintahoe()
-
         # -t is a harmless option that warns about tabs.
         d = self.run_bintahoe(["--version"], python_options=["-t"])
         def _cb(res):
diff --git a/src/allmydata/test/test_system.py b/src/allmydata/test/test_system.py
index ed615981..bf6af094 100644
--- a/src/allmydata/test/test_system.py
+++ b/src/allmydata/test/test_system.py
@@ -30,7 +30,7 @@ from twisted.web.error import Error
 
 from allmydata.test.common import SystemTestMixin
 
-# TODO: move these to common or common_util
+# TODO: move this to common or common_util
 from allmydata.test.test_runner import RunBinTahoeMixin
 
 LARGE_DATA = """
diff --git a/static/tahoe.py b/static/tahoe.py
new file mode 100644
index 00000000..e22f2534
--- /dev/null
+++ b/static/tahoe.py
@@ -0,0 +1,27 @@
+
+# This checks that we can import the right versions of all dependencies.
+# Import this first to suppress deprecation warnings.
+import allmydata
+
+# nevow requires all these for its voodoo module import time adaptor registrations
+from nevow import accessors, appserver, static, rend, url, util, query, i18n, flat
+from nevow import guard, stan, testutil, context
+from nevow.flat import flatmdom, flatstan, twist
+from formless import webform, processors, annotate, iformless
+from decimal import Decimal
+from xml.dom import minidom
+
+import allmydata.web
+
+import mock
+
+# junk to appease pyflakes's outrage
+[
+    accessors, appserver, static, rend, url, util, query, i18n, flat, guard, stan, testutil,
+    context, flatmdom, flatstan, twist, webform, processors, annotate, iformless, Decimal,
+    minidom, allmydata, mock,
+]
+
+from allmydata.scripts import runner
+
+runner.run()
\ No newline at end of file
-- 
2.45.2