New patches: [Individual tests run after all the setup layers are in place. nejucomo@gmail.com**20080129042511] { hunk ./contrib/fuse/runtests.py 18 +import traceback hunk ./contrib/fuse/runtests.py 259 - def run_test_layer(self): - raise NotImplementedError() - + def run_test_layer(self, mountpoint): + total = failures = 0 + for name in dir(self): + if name.startswith('test_'): + total += 1 + print '\n*** Running test #%d: %s' % (total, name) + try: + method = getattr(self, name) + method(mountpoint) + print 'Test succeeded.' + except: + print 'Test failed (details follow):' + traceback.print_exc() + failures += 1 + + print '\n*** Testing complete: %d failured out of %d.' % (failures, total) + + # Tests: + def test_foo(self, mountpoint): + raise NotImplementedError('No tests yet...') + } [tahoe_fuse.py: system test: Many changes to framework... nejucomo@gmail.com**20080129042719 The flow control has been de-obfuscated a bit. Some output changes. The test framework has quite a few race conditions, but it does a reasonable job of setting up and cleaning up. ] { hunk ./contrib/fuse/runtests.py 57 + # These members represent configuration: + self.fullcleanup = False # FIXME: Make this a commandline option. + + # These members represent test state: hunk ./contrib/fuse/runtests.py 62 - self.introbase = None - self.mountpoint = None - - # We keep track of multiple clients for a full-fledged grid in - # clientsinfo (see SystemTest.ClientInfo). + self.testroot = None hunk ./contrib/fuse/runtests.py 64 - # self.clientsinfo[0] is the client to which we attach fuse and - # make webapi calls (see SystemTest.get_interface_client). - - self.clientsinfo = [] + # This test state is specific to the first client: + self.port = None + self.clientbase = None hunk ./contrib/fuse/runtests.py 73 - def run(self): - print 'Running System Test.' + def run(self, fullcleanup = False): + ''' + If full_cleanup, delete all temporary state. + Else: If there is an error do not delete basedirs. + + Set to False if you wish to analyze a failure. + ''' + self.fullcleanup = fullcleanup + print '\n*** Setting up system test.' hunk ./contrib/fuse/runtests.py 88 - print 'System Test complete.' + print '\n*** System Test complete.' hunk ./contrib/fuse/runtests.py 106 - self.create_introducer_layer() - - def create_introducer_layer(self): - print 'Creating introducer.' - self.introbase = tempfile.mkdtemp(prefix='tahoe_fuse_test_', - suffix='_introducer') - try: - output = self.run_tahoe('create-introducer', '--basedir', self.introbase) - - pat = r'^introducer created in (.*?)\n\s*$' - self.check_tahoe_output(output, pat, self.introbase) + self.create_testroot_layer() hunk ./contrib/fuse/runtests.py 108 + def create_testroot_layer(self): + print 'Creating test base directory.' + self.testroot = tempfile.mkdtemp(prefix='tahoe_fuse_test_') + try: hunk ./contrib/fuse/runtests.py 113 - hunk ./contrib/fuse/runtests.py 114 - print 'Removing introducer directory.' - self.cleanup_dir(self.introbase) - + if self.fullcleanup: + print 'Cleaning up test root directory.' + try: + shutil.rmtree(self.testroot) + except Exception, e: + print 'Exception removing test root directory: %r' % (self.testroot, ) + print 'Ignoring cleanup exception: %r' % (e,) + else: + print 'Leaving test root directory: %r' % (self.testroot, ) + + hunk ./contrib/fuse/runtests.py 127 - # NOTE: We assume if tahoe exist with non-zero status, no separate + introbase = os.path.join(self.testroot, 'introducer') + + # NOTE: We assume if tahoe exits with non-zero status, no separate hunk ./contrib/fuse/runtests.py 131 - output = self.run_tahoe('start', '--basedir', self.introbase) + createoutput = self.run_tahoe('create-introducer', '--basedir', introbase) + + pat = r'^introducer created in (.*?)\n\s*$' + self.check_tahoe_output(createoutput, pat, introbase) + + startoutput = self.run_tahoe('start', '--basedir', introbase) hunk ./contrib/fuse/runtests.py 139 - self.check_tahoe_output(output, pat, self.introbase) + self.check_tahoe_output(startoutput, pat, introbase) hunk ./contrib/fuse/runtests.py 141 - self.create_clients_layer() + self.launch_clients_layer(introbase) hunk ./contrib/fuse/runtests.py 145 - try: - output = self.run_tahoe('stop', '--basedir', self.introbase) - except Exception, e: - print 'Failed to stop introducer node. Output:' - print output - print 'Ignoring cleanup exception: %r' % (e,) + self.stop_node(introbase) hunk ./contrib/fuse/runtests.py 148 - def create_clients_layer(self, clientnum = 0): - if clientnum == self.TotalClientsNeeded: - self.launch_clients_layer() + def launch_clients_layer(self, introbase, clientnum = 1): + if clientnum > self.TotalClientsNeeded: + self.create_test_dirnode_layer() hunk ./contrib/fuse/runtests.py 153 - tmpl = 'Creating client %d of %d.' - print tmpl % (clientnum + 1, + tmpl = 'Launching client %d of %d.' + print tmpl % (clientnum, hunk ./contrib/fuse/runtests.py 157 - assert len(self.clientsinfo) == clientnum, `clientnum` + base = os.path.join(self.testroot, 'client_%d' % (clientnum,)) hunk ./contrib/fuse/runtests.py 159 - client = self.ClientInfo(clientnum) - self.clientsinfo.append(client) + output = self.run_tahoe('create-client', '--basedir', base) + pat = r'^client created in (.*?)\n' + pat += r' please copy introducer.furl into the directory\s*$' + self.check_tahoe_output(output, pat, base) hunk ./contrib/fuse/runtests.py 164 - try: - output = self.run_tahoe('create-client', '--basedir', client.base) - pat = r'^client created in (.*?)\n' - pat += r' please copy introducer.furl into the directory\s*$' - self.check_tahoe_output(output, pat, client.base) + if clientnum == 1: + # The first client is special: + self.clientbase = base + self.port = random.randrange(1024, 2**15) hunk ./contrib/fuse/runtests.py 169 - client.port = random.randrange(1024, 2**15) - - f = open(os.path.join(client.base, 'webport'), 'w') - f.write('tcp:%d:interface=127.0.0.1\n' % client.port) + f = open(os.path.join(base, 'webport'), 'w') + f.write('tcp:%d:interface=127.0.0.1\n' % self.port) hunk ./contrib/fuse/runtests.py 173 - introfurl = os.path.join(self.introbase, 'introducer.furl') - - # FIXME: Is there a better way to handle this race condition? - self.polling_operation(lambda : os.path.isfile(introfurl)) - shutil.copy(introfurl, client.base) - - self.create_clients_layer(clientnum+1) - - finally: - print 'Removing client %d base directory.' % (clientnum+1,) - self.cleanup_dir(client.base) - - def launch_clients_layer(self, clientnum = 0): - if clientnum == self.TotalClientsNeeded: - self.create_test_dirnode_layer() - return - - tmpl = 'Launching client %d of %d.' - print tmpl % (clientnum + 1, - self.TotalClientsNeeded) + introfurl = os.path.join(introbase, 'introducer.furl') hunk ./contrib/fuse/runtests.py 175 - client = self.clientsinfo[clientnum] + # FIXME: Is there a better way to handle this race condition? + self.polling_operation(lambda : os.path.isfile(introfurl)) + shutil.copy(introfurl, base) hunk ./contrib/fuse/runtests.py 181 - output = self.run_tahoe('start', '--basedir', client.base) + startoutput = self.run_tahoe('start', '--basedir', base) hunk ./contrib/fuse/runtests.py 184 - self.check_tahoe_output(output, pat, client.base) + self.check_tahoe_output(startoutput, pat, base) hunk ./contrib/fuse/runtests.py 186 - self.launch_clients_layer(clientnum+1) + self.launch_clients_layer(introbase, clientnum+1) hunk ./contrib/fuse/runtests.py 189 - print 'Stopping client node %d.' % (clientnum+1,) - try: - output = self.run_tahoe('stop', '--basedir', client.base) - except Exception, e: - print 'Failed to stop client node. Output:' - print output - print 'Ignoring cleanup exception: %r' % (e,) + print 'Stopping client node %d.' % (clientnum,) + self.stop_node(base) hunk ./contrib/fuse/runtests.py 194 - client = self.get_interface_client() hunk ./contrib/fuse/runtests.py 195 - targeturl = 'http://127.0.0.1:%d/uri?t=mkdir' % (client.port,) + targeturl = 'http://127.0.0.1:%d/uri?t=mkdir' % (self.port,) hunk ./contrib/fuse/runtests.py 198 - conn = httplib.HTTPConnection('127.0.0.1', client.port) + conn = httplib.HTTPConnection('127.0.0.1', self.port) hunk ./contrib/fuse/runtests.py 211 - f = open(os.path.join(client.base, 'private', 'root_dir.cap'), 'w') + f = open(os.path.join(self.clientbase, 'private', 'root_dir.cap'), 'w') hunk ./contrib/fuse/runtests.py 219 - client = self.get_interface_client() hunk ./contrib/fuse/runtests.py 220 - self.mountpoint = tempfile.mkdtemp(prefix='tahoe_fuse_mp_') + mp = os.path.join(self.testroot, 'mointpoint') + thispath = os.path.abspath(sys.argv[0]) + thisdir = os.path.dirname(thispath) + fusescript = os.path.join(thisdir, 'tahoe_fuse.py') hunk ./contrib/fuse/runtests.py 225 - thispath = os.path.abspath(sys.argv[0]) - thisdir = os.path.dirname(thispath) - fusescript = os.path.join(thisdir, 'tahoe_fuse.py') - try: - proc = subprocess.Popen([fusescript, - self.mountpoint, - '-f', - '--basedir', client.base]) - # FIXME: Verify the mount somehow? + proc = subprocess.Popen([fusescript, + mp, + '-f', + '--basedir', self.clientbase]) + # FIXME: Verify the mount somehow? hunk ./contrib/fuse/runtests.py 231 - self.run_test_layer() + self.run_test_layer(mp) hunk ./contrib/fuse/runtests.py 233 - finally: - if proc.poll() is None: - print 'Killing fuse interface.' - os.kill(proc.pid, signal.SIGTERM) - print 'Waiting for the fuse interface to exit.' - proc.wait() hunk ./contrib/fuse/runtests.py 234 - self.cleanup_dir(self.mountpoint) + print '\n*** Cleaning up system test' + + if proc.poll() is None: + print 'Killing fuse interface.' + os.kill(proc.pid, signal.SIGTERM) + print 'Waiting for the fuse interface to exit.' + proc.wait() hunk ./contrib/fuse/runtests.py 295 - def cleanup_dir(self, path): + def stop_node(self, basedir): hunk ./contrib/fuse/runtests.py 297 - shutil.rmtree(path) + self.run_tahoe('stop', '--basedir', basedir) hunk ./contrib/fuse/runtests.py 299 - print 'Exception removing test directory: %r' % (path,) - print 'Ignoring cleanup exception: %r' % (e,) + print 'Failed to stop tahoe node.' + print 'Ignoring cleanup exception:' + # Indent the exception description: + desc = str(e).rstrip() + print ' ' + desc.replace('\n', '\n ') hunk ./contrib/fuse/runtests.py 324 - tmpl = '(Polling took over %.2f seconds.)' - print tmpl % (totaltime,) + #tmpl = '(Polling took over %.2f seconds.)' + #print tmpl % (totaltime,) hunk ./contrib/fuse/runtests.py 343 - def get_interface_client(self): - return self.clientsinfo[0] - - # ClientInfo: - class ClientInfo (object): - def __init__(self, clientnum): - self.num = clientnum - self.base = tempfile.mkdtemp(prefix='tahoe_fuse_test_client', - suffix='_%d' % clientnum) - self.port = None - hunk ./contrib/fuse/runtests.py 349 - msg = 'SystemTest.SetupFailure - A test environment could not be created:\n' + msg = 'SystemTest.SetupFailure - The test framework encountered an error:\n' } [tahoe_fuse.py: system test: setup: fixed a bug in which the mointpoint was not created before mounting. nejucomo@gmail.com**20080129043913] { hunk ./contrib/fuse/runtests.py 220 - mp = os.path.join(self.testroot, 'mointpoint') + mp = os.path.join(self.testroot, 'mountpoint') + os.mkdir(mp) + } [tahoe_fuse.py: system test: setup: lexically sort test names, create a TestFailure class, implement an empty directory listing test. nejucomo@gmail.com**20080129044047] { hunk ./contrib/fuse/runtests.py 246 - for name in dir(self): + for name in sorted(dir(self)): hunk ./contrib/fuse/runtests.py 262 - def test_foo(self, mountpoint): - raise NotImplementedError('No tests yet...') + def test_00_empty_directory_listing(self, mountpoint): + listing = os.listdir(mountpoint) + if listing: + raise self.TestFailure('Expected empty directory, found: %r' % (listing,)) hunk ./contrib/fuse/runtests.py 347 + hunk ./contrib/fuse/runtests.py 350 - pass + def __init__(self, tmpl, *args): + msg = self.Prefix + (tmpl % args) + Exception.__init__(self, msg) hunk ./contrib/fuse/runtests.py 355 - def __init__(self, tmpl, *args): - msg = 'SystemTest.SetupFailure - The test framework encountered an error:\n' - msg += tmpl % args - SystemTest.Failure.__init__(self, msg) + Prefix = 'Setup Failure - The test framework encountered an error:\n' hunk ./contrib/fuse/runtests.py 357 + class TestFailure (Failure): + Prefix = 'TestFailure: ' + } [tahoe_fuse.py: system test: Distinguish between TestFailures and unexpected exceptions during testing (and fix a typo). nejucomo@gmail.com**20080129044228] { hunk ./contrib/fuse/runtests.py 254 - except: - print 'Test failed (details follow):' - traceback.print_exc() + except self.TestFailure, f: + print f hunk ./contrib/fuse/runtests.py 257 + except: + print 'Error in test code... Cleaning up.' + raise + + print '\n*** Testing complete: %d failed out of %d.' % (failures, total) hunk ./contrib/fuse/runtests.py 263 - print '\n*** Testing complete: %d failured out of %d.' % (failures, total) } Context: [tahoe_fuse: cmdline args & system test: Allow nonstandard client basedirs to be specified and update the system tests to use this feature... nejucomo@gmail.com**20080121025627 The commandline option handling of the version of python-fuse I use is arcane. This is an ugly hack. ] [tahoe_fuse: rename decorators for clarity. nejucomo@gmail.com**20080121022657] [Small log output change. nejucomo@gmail.com**20080121021853] [tahoe_fuse: system test: webapi connection: bug fix and small log output change. nejucomo@gmail.com**20080121021031] [tahoe_fuse: system test: Add FIXME comments. nejucomo@gmail.com**20080121020619] [tahoe_fuse: system test: Manage multiple clients for test grid... System test setup is almost complete. nejucomo@gmail.com**20080121020220 This is a little convoluted because of the "layer" design, but it appears to function correctly and do properly ordered cleanup. Before system test setup is complete, tahoe_fuse.py needs to be modified to allow arbitrary client base directories. ] [doc: architecture.txt: start updating architecture.txt zooko@zooko.com**20080121235303 I chose to remove mention of non-convergent encoding, not because I dislike non-convergent encoding, but because that option isn't currently expressed in the API and in order to shorten architecture.txt. I renamed "URI" to "Capability". I did some editing, including updating a few places that treated all capabilities as CHK-capabilities and that mentioned that distributed SSKs were not yet implemented. ] [docs: architecture.txt: reflow to 77 cols zooko@zooko.com**20080121232628 Experiment showed that reflowing to 77 cols changed the fewest lines. ] [doc: fix typos and otherwise edit about.html zooko@zooko.com**20080121215443] [offloaded: reinstate fix for windows tests robk-tahoe@allmydata.com**20080121212515 in a discussion the other day, brian had asked me to try removing this fix, since it leads to double-closing the reader. since on my windows box, the test failures I'd experienced were related to the ConnectionLost exception problem, and this close didn't see to make a difference to test results, I agreed. turns out that the buildbot's environment does fail without this fix, even with the exception fix, as I'd kind of expected. it makes sense, because the reader (specifically the file handle) must be closed before it can be unlinked. at any rate, I'm reinstating this, in order to fix the windows build ] [doc: add an overview to about.html zooko@zooko.com**20080121211925 Hopefully this overview has the right combination of generality and precision to satisfy The Norm Hardy Request: http://allmydata.org/pipermail/tahoe-dev/2007-November/000222.html ] [offloaded: close reader before removing its file robk-tahoe@allmydata.com*-20080117233628 unlinking a file before closing it is not portable. it works on unix, but fails since an open file holds a lock on windows. this closes the reader before trying to unlink the encoding file within the CHKUploadHelper. ] [tahoe_fuse: system test: Attempt to create a dirnode to place in /private/root_dir.cap, but this fails because the network is too small... nejucomo@gmail.com**20080121004747 This patch also factors out the "polling_operation" pattern. ] [tahoe_fuse: system test: Launch the fuse interface. nejucomo@gmail.com**20080120235551] [tahoe_fuse: system test: factor out some cleanup code. nejucomo@gmail.com**20080120235448] [tahoe_fuse: system test: Copy the introducer.furl with a possible race condition due to timeout. nejucomo@gmail.com**20080120230944] [A start at adding a system test for tahoe_fuse. Incomplete... nejucomo@gmail.com**20080120225456] [offloaded: fix failure in unit test on windows robk-tahoe@allmydata.com**20080118025729 in trying to test my fix for the failure of the offloaded unit test on windows (by closing the reader before unlinking the encoding file - which, perhaps disturbingly doesn't actually make a difference in my windows environment) I was unable too because the unit test failed every time with a connection lost error. after much more time than I'd like to admit it took, I eventually managed to track that down to a part of the unit test which is supposed to be be dropping a connection. it looks like the exceptions that get thrown on unix, or at least all the specific environments brian tested in, for that dropped connection are different from what is thrown on my box (which is running py2.4 and twisted 2.4.0, for reference) adding ConnectionLost to the list of expected exceptions makes the test pass. though curiously still my test logs a NotEnoughWritersError error, and I'm not currently able to fathom why that exception isn't leading to any overall failure of the unit test itself. for general interest, a large part of the time spent trying to track this down was lost to the state of logging. I added a whole bunch of logging to try and track down where the tests were failing, but then spent a bunch of time searching in vain for that log output. as far as I can tell at this point the unit tests are themselves logging to foolscap's log module, but that isn't being directed anywhere, so all the test's logging is being black holed. ] [offloaded: close reader before removing its file robk-tahoe@allmydata.com**20080117233628 unlinking a file before closing it is not portable. it works on unix, but fails since an open file holds a lock on windows. this closes the reader before trying to unlink the encoding file within the CHKUploadHelper. ] [offloaded: close the local filehandle after encoding is done, otherwise windows fails warner@lothar.com**20080117075233] [offloaded: update unit tests: assert that interrupt/resume works, and that the helper deletes tempfiles warner@lothar.com**20080117071810] [upload.py: make it easier to have an IUploadable that overrides encoding parameters: just set an attribute instead of subclassing warner@lothar.com**20080117071742] [offloaded: upload.py: handle forward skips, to allow resumed uploads to send less than all the data. We still read all the data (to hash it, 'paranoid mode'), but we don't send it over the wire warner@lothar.com**20080117071656] [offloaded.py: delete encoding tempfile when upload is complete warner@lothar.com**20080117071554] [offloaded.py: when resuming, append new data to incoming file, rather than overwrite it. warner@lothar.com**20080117071532] [offloaded.py: remove dead/redundant code warner@lothar.com**20080117071445] [offloaded: improve logging across the board warner@lothar.com**20080117071135] [megapatch: overhaul encoding_parameters handling: now it comes from the Uploadable, or the Client. Removed options= too. Also move helper towards resumability. warner@lothar.com**20080116090335] [node.py: when calling os.abort(), announce it to stdout as well as the log warner@lothar.com**20080116090132] [Remove a redundant assertion for clarity. nejucomo@gmail.com**20080119062032] [Change stdout to rudimentary file-based logging. nejucomo@gmail.com**20080119061854] [Rename the unittest script for tahoe-fuse. nejucomo@gmail.com**20080119061612] [Wouldn't it be nice to reuse the allmydata library? nejucomo@gmail.com**20080113034126] [Support url-encoding in caps. nejucomo@gmail.com**20080113034107] [Make my contrib/README look like the allmydata.org version. nejucomo@gmail.com**20080113030013] [The start of unit tests for tahoe_fuse.py. nejucomo@gmail.com**20080113015603] [Formatting changes and a few FIXMEs for tahoe_fuse.py nejucomo@gmail.com**20080113015538] [Remove redundant docs from tahoe_fuse.py docstrings which are in the README. Add implementation-specific notes in the doc strings. nejucomo@gmail.com**20080113015433] [Change the name of tahoe_fuse.py to something importable. nejucomo@gmail.com**20080113005053] [A patch to make tahoe-fuse.py work with 0.7.0 plus a howto README. nejucomo@gmail.com**20080112230639] [Use "my_vdrive.uri" for the root. The old "fuse-bookmarks.uri" served exactly the same purpose. nejucomo@gmail.com**20071120200001] [Add extensions/README and more doc strings to the fuse extension. nejucomo@gmail.com**20071120195842] [simplify buildbot upload of windows installer robk-tahoe@allmydata.com**20080117022930 since the installer upload got more complex (needing to chmod files before rsyncing) I promoted it to a makefile target, simplifying the buildbot steps involved ] [add winfuse plugin to installer robk-tahoe@allmydata.com**20080117011535 this adds the latest build of mike's winfuse plugins, now also running as a windows service (and using the node.url, private/root_dir.cap files from the noderoot specified by the registry) into the install process. ] [setup: add darcsver-1.0.1.tar to misc/dependencies/ zooko@zooko.com**20080116200826] [cli scripts: remove the for-educational-purposes standalone clauses. Closes #261. warner@lothar.com**20080116060851] [more minor build tweaks for windows robk-tahoe@allmydata.com**20080115233806 tweaking version number display, and fixing a couple of small bugs ] [tweak py2exe setup.py to link in xmlplus iff present robk-tahoe@allmydata.com**20080115225941 so in the build slave's environment, everything builds and runs fine without '_xmlplus'. In my existing local environment everything builds and runs only if I tell py2exe to explicitly link in '_xmlplus'. the _xmlplus module, tested for by the python standard library, comes from PyXML ( http://pyxml.sf.net ) a project which is no longer maintained and, for instance, hasn't released a build for windows past python 2.4 hence something about the way nevow and the std lib import xml dependencies causes build environment incompatabilities between my box (which is running py24 currently) and the buildslave (which is on py25, and doesn't have PyXML) (if I remove _xmlplus from my environment, then a different set of nevow/xml import problems emerge, which do not occur in the buildslave's py25 env) this change tests the environment the build is happening in, and if the _xmlplus package is importable, then py2exe is directed to link it into the build. otherwise the package is left out. as far as I comprehend the issue this should make both of these environments work. if other people have problems around this issue, obviously I'm interested in learning more. ] [offloaded: cleanup to handle multiple simultaneous uploaders gracefully warner@allmydata.com**20080115042003] [encode: actually define the UploadAborted exception warner@allmydata.com**20080115032702] [test_storage: fix pyflakes warnings warner@allmydata.com**20080115032648] [test_system: fix pyflakes warnings warner@allmydata.com**20080115032628] [offloaded: improve logging, pass through options, get ready for testing interrupted uploads. test_system: add (disabled) interrupted-upload test warner@allmydata.com**20080115032426] [upload: add Encoder.abort(), to abandon the upload in progress. Add some debug hooks to enable unit tests. warner@allmydata.com**20080115032255] [upload: improve logging warner@allmydata.com**20080115031920] [upload: pass options through to the encoder warner@allmydata.com**20080115031732] [logging: enable flogging in more places, replace Node.log with flogging warner@allmydata.com**20080115031658] [tests: put back skipped and todo tests zooko@zooko.com**20080115030241 closes #258 -- "put back skipped and todo tests" ] [testutil.py: hush the new (more strict) pyflakes warner@allmydata.com**20080115002755] [iputil.py: hush the new (more strict) pyflakes warner@allmydata.com**20080115002743] [Makefile: move use of 'cygpath' into win32-conditionalized section warner@allmydata.com**20080115002236] [windows installer build refinements robk-tahoe@allmydata.com**20080114235354 this resolves problems of py2exe's modulefinder collection of sources from .zipped egg files, not by using easy_install to reach the --always-unzip option, but rather with a small tool which unpacks any zipped egg files found in misc/dependencies. this fixes the py2exe build given rollback of the easy_install stuff which had broken the unix builds. misc/hatch-eggs.py performs the honours. this also includes a misc/sub-ver.py tool which substitutes elements of the verion number for the current code base (by importing allmydata.__version__ hence make-version should be run first, and the python path carefully managed) into template files using python's string interpolation of named args from a dict as the templating syntax. i.e. %(major)d %(minor)d %(point)d %(nano)d each expand to the individual components of the version number as codified by the pyutil.version_class.Version class. there is also a %(build)s tag which expands to the string form of the whole version number. This tool is used to interpolate the automatically generated version information into the innosetup source file in a form consistent with innosetup/windows' restrictions ] [add windows installer target to build robk-tahoe@allmydata.com**20080112024121 add 'windows-installer' target to top level makefile to build a windows setup.exe package using innosetup. this assumes innosetup 5 is installed in program files as normal. this doesn't include any logic to manage version numbers at this point, it's just a simple experiment to test out building an installer as yet. ] [add confwiz to py2exe build robk-tahoe@allmydata.com**20080112004227 including setting up the windows xp look and feel stuff. ] [implement a very simple, wxpython based, config wizard robk-tahoe@allmydata.com**20080112015315 This implements a very small app using a wx ui to log a user in. it takes a username and password, and submits them to a backend on the web site (currently the allmydata test net webserver) to authenticate them. It returns the 'root_cap' uri of the user's virtual drive. Also the introducer.furl is retrieved. These are then written into the default noderoot basedir in their usual files (private/root_dir.cap and introducer.furl) a button is provided which will direct the user to the web site in the event that they need to register in order to have an account to use. once the user is successfully authenticated and the files are written, then on win32 the tahoe service will be started. ] [added is_uri() function to allmydata.uri robk-tahoe@allmydata.com**20080111024342] [added a small script as a stub for a config wizard robk-tahoe@allmydata.com**20080111023718 this doesn't implement any config wizard ui, but does a simple http fetch of root_cap and introducer.furl from a php backend stub. ] [remove wait_for_numpeers and the when_enough_peers call in mutable.Publish warner@allmydata.com**20080114205559] [test_GET_DIRURL_large: reduce from 400 to 200 children: the test fails to Brian Warner **20080115043141 fail anyways, and 200 ought to be enough to trigger the problem, so 400 is overkill, and just wastes CPU. ] ['tahoe dump-cap': accept http:// -prefixed URLs too warner@allmydata.com**20080114201227] [add 'tahoe dump-cap' command, to show storage index, lease secrets, etc warner@allmydata.com**20080114194325] [storage: improve logging a bit warner@allmydata.com**20080114175858] [setup: fix name of setup script again zooko@zooko.com**20080112004603] [setup: fix name of setup script zooko@zooko.com**20080112004448] [setup: switch back from using "misc/dependencies/setup.py easy_install --always-unzip misc/dependencies" to using "misc/dependencies/setup.py install" zooko@zooko.com**20080112004043 because I don't fully understand the former, I suspect it of being implicated in the current buildslave redness, and we require --always-unzip solely for py2exe. ] [setup: if the build fails, make returns a failure exit code zooko@zooko.com**20080111204331] [tests: increase the timeout on a test which failed on the overloaded virtual buildslaves zooko@zooko.com**20080111202754] [offloaded: add a system test, make it pass. files are now being uploaded through the helper. warner@lothar.com**20080111114255] [offloaded.py: hush pyflakes warner@lothar.com**20080111110514] [offloaded: more test coverage on client side, change interfaces a bit warner@lothar.com**20080111105337] [docs/mutable-DSA.txt: update mutable.txt to reflect our proposed DSA-based mutable file scheme (#217) warner@lothar.com**20080111103058] [test_mutable.py: accomodate changes to mutable.py logging warner@allmydata.com**20080111041834] [mutable.py: log more information during publish, specifically the sharemap, and the reason for an UncoordinatedWriteError warner@allmydata.com**20080111041623] [Makefile: add new misc/dependencies/ litter to the 'clean' target warner@allmydata.com**20080111022444] [.darcs-boringfile: update to match misc/dependencies setup.py changes warner@allmydata.com**20080111022110] [build-deps-setup.py: import twisted early, to make setuptools on dapper use the right version warner@allmydata.com**20080111021502] [fix dumb typo in tahoe run robk-tahoe@allmydata.com**20080111021400] [change default node-directory on windows to do registry lookup, not ~/.tahoe robk-tahoe@allmydata.com**20080111013218] [move registry module into allmydata.windows package robk-tahoe@allmydata.com**20080111010323] [remove some vestigial cruft from tahoesvc robk-tahoe@allmydata.com**20080110215204] [add files from allmydata/web to py2exe distribution robk-tahoe@allmydata.com**20080110213446 when building the py2exe package, glob src/allmydata/web/* into web/ within the dist ] [fix a couple of typos in tahoesvc startup robk-tahoe@allmydata.com**20080110213031] [fix nevow build prob for py2exe robk-tahoe@allmydata.com**20080110212619 nevow attempts to use pkg_resources to find the formless css file upon import, if pkg_resources is available. unfortunately using pkg_resources to find files is not supported if the files are being loaded from a zip archive (i.e. only source and egg), and further py2exe uses a zip bundle for all the code and dependent libraries. hence having both pkg_resources and nevow built into an exe causes nevow to explode upon import. this tells py2exe not to link pkg_resources into the target, so that this behaviour isn't stimulated. the side effect being that pkg_resources isn't available. ] [added tweaked sibpath implementation robk-tahoe@allmydata.com**20080110212341 use of twisted.python.util.sibpath to find files relative to modules doesn't work when those modules are bundled into a library by py2exe. this provides an alternative implementation (in allmydata.util.sibpath) which checks for the existence of the file, and if it is not found, attempts to find it relative to sys.executable instead. ] [resolve makefile conflicts robk-tahoe@allmydata.com**20080110032115 and surpress echo of echoes ] [add 'run' command to tahoe robk-tahoe@allmydata.com**20080110015412 adds a 'run' commands to bin/tahoe / tahoe.exe it loads a client node into the tahoe process itself, running in the base dir specified by --basedir/-C and defaulting to the current working dir. it runs synchronously, and the tahoe process blocks until the reactor is stopped. ] [add build dependencies to support py2exe's modulefinder robk-tahoe@allmydata.com**20080110012538 adds windows/depends.py as a container for modules which are needed at runtime but which py2exe's modulefinder dependency analysis fails to find as requisites. ] [added a 'repl' command to tahoe.exe robk-tahoe@allmydata.com**20080110011952 this is probably not of very high utility in the unix case of bin/tahoe but is useful when working with native builds, e.g. py2exe's tahoe.exe, to examine and debug the runtime environment, linking problems etc. ] [add windows-exe target to makefile robk-tahoe@allmydata.com**20080110010628] [tweaks to build process to support py2exe robk-tahoe@allmydata.com**20080110010253 py2exe is unable to handle .eggs which are packaged as zip files in preference it will pull in other versions of libraries if they can be found in the environment. this changes causes .eggs to be built as .egg directories, which py2exe can handle. ] [first stab at windows build details. robk-tahoe@allmydata.com**20080110010156 there are many and various fiddly details that were involved in this process on mountain view. This is a stripped down version of the build process used there. there's hence a good chance that one or two necessary details got stripped down through the cracks. this provides a py2exe setup.py to build a tahoe.exe and a tahoesvc.exe the former is equivalent to bin/tahoe, but without the start/stop commands. the latter is a windows service that instantiates a client whose basedir is found in the registry. ] [tweak running to make node start/stop code optional robk-tahoe@allmydata.com**20080109015118 add a 'install_node_control' flag to runner.run(), default True this enables the start/stop node commands which are not too useful on windows ] [docs: mention some tips of how to resolve a certain dependency on Dapper zooko@zooko.com**20080110213238] [docs: start updating install-details.html to reflect current auto-dependency and setuptools requirements, and to be better written zooko@zooko.com**20080110200337] [setup: require setuptools >= v0.6c6 on all platforms zooko@zooko.com**20080110200213 Technically, we could get away with v0.6c5 or v0.6c4 on non-cygwin platforms, but if someone currently doesn't have setuptools >= v0.6c6 installed then our setup process will just use our bundled setuptools v0.6c7 anyway, so it will still work, and this makes the setup.py and the accompanying documentation simpler. ] [setup: remove hard import of ez_setup -- we can proceed even if ez_setup can't be imported zooko@zooko.com**20080110200152] [setup: shebang usr bin env python zooko@zooko.com**20080110200131] [setup: remove the hack to determine if we can avoid the explicit setuptools-managed dependency on nevow (which was useful for building on dapper) zooko@zooko.com**20080110195800 For simplicity, and to avoid weird failure modes that result from importing nevow during the build process, we now simply require nevow >= 0.6.0. We currently bundle in misc/dependencies nevow v0.9.18, which will not work on Dapper, since it requires Twisted >= 2.4.0, and Dapper comes with Twisted 2.2.0. Dapper users can (a) install a newer Twisted, (b) install nevow 0.6.0 in egg form so that setuptools can tell that it is installed (without importing it), (c) beg us to start shipping nevow 0.6.0 instead of nevow 0.9.18 in our bundle. ] [setup: update the version numbers of packages that we require, add zope.interface to our requirements, make nevow >= 0.6.0 always be a requirement zooko@zooko.com**20080110195639] [docs: add require version numbers of deps to install.html, move pywin32 from install.html to install-details.html, change ref to install-details.html in install.html zooko@zooko.com**20080110193530] [offloaded: move interfaces to interfaces.py, start implementing backend warner@allmydata.com**20080110032547] [upload.py: start removing wait_for_numpeers code warner@allmydata.com**20080110032518] [offloaded: basic test for client-side of AssistedUploader warner@allmydata.com**20080110022550] [offloaded: create a Helper if 'run_helper' is non-empty warner@allmydata.com**20080110022505] [test_system: slight refactoring to eventually make it easier to configure some nodes with the output of others warner@allmydata.com**20080110022354] [Makefile: pyflakes: the newest pyflakes is more picky, more verbose, and prints the same message multiple times warner@allmydata.com**20080110022312] [offloaded: more code, fix pyflakes problems, change IEncryptedUploader a bit warner@allmydata.com**20080109235847] [offloaded: early code: most of client-side, defined the RemoteInterfaces warner@allmydata.com**20080109031854] [check_speed.py: re-enable 100x200B and 1x100MB CHK tests warner@allmydata.com**20080109025948] [docs/mutable-DSA.svg: fix background color, resolution for export-to-png warner@allmydata.com**20080109021104] [docs/mutable-DSA.svg: add a picture of the upcoming DSA-based mutable file structure warner@allmydata.com**20080109020852] [User friendly error messages, and updates to use new URI formats. nejucomo@gmail.com**20080108182121 ] [TAG allmydata-tahoe-0.7.0 zooko@zooko.com**20080108184749] Patch bundle hash: e9c2e634d26bb08932d90cc3cb31960905ba5bc7