'tahoe debug trial' command #1296

Closed
opened 2011-01-07 09:33:17 +00:00 by daira · 45 comments

If there were a tahoe debug trial command, which runs Twisted Trial with a default testsuite of allmydata.test, that would have the following advantages:

  • it would be guaranteed that the test suite run in this way would import the same code as the bin/tahoe command. Currently, setup.py trial and bin/tahoe set up sys.path in different ways, which can result in not testing the same code that would be executed [*]

  • it would be possible to run tests on executables created by bb-freeze, py2exe, etc. (#585)

  • the hack in source:setup.py#L54 to set *requires* could be removed. Perhaps setuptools_trial would not be needed at all.

[*] The specific case in #1258 results in bin/tahoe running the "wrong" code while setup.py trial runs the "right" code, but that appears to be just a coincidence of the ordering of *requires* lists.

If there were a `tahoe debug trial` command, which runs Twisted Trial with a default testsuite of `allmydata.test`, that would have the following advantages: * it would be guaranteed that the test suite run in this way would import the same code as the `bin/tahoe` command. Currently, `setup.py trial` and `bin/tahoe` set up `sys.path` in different ways, which can result in not testing the same code that would be executed [*] * it would be possible to run tests on executables created by bb-freeze, py2exe, etc. (#585) * the hack in source:setup.py#L54 to set `*requires*` could be removed. Perhaps setuptools_trial would not be needed at all. [*] The specific case in #1258 results in `bin/tahoe` running the "wrong" code while `setup.py trial` runs the "right" code, but that appears to be just a coincidence of the ordering of `*requires*` lists.
daira added the
c/code-frontend-cli
p/major
t/defect
v/1.8.1
labels 2011-01-07 09:33:17 +00:00
daira added this to the 1.8.2 milestone 2011-01-07 09:33:17 +00:00
Author

Attachment tahoe-debug-trial.darcs.patch (13310 bytes) added

src/allmydata/scripts/debug.py: add 'tahoe debug trial' command. refs #1296

**Attachment** tahoe-debug-trial.darcs.patch (13310 bytes) added src/allmydata/scripts/debug.py: add 'tahoe debug trial' command. refs #1296
daira self-assigned this 2011-01-07 10:29:04 +00:00
Author

Attachment test-tahoe-debug-trial.darcs.patch (25660 bytes) added

Tests for 'tahoe debug trial'. refs #1296 (includes some dependency patches)

**Attachment** test-tahoe-debug-trial.darcs.patch (25660 bytes) added Tests for 'tahoe debug trial'. refs #1296 (includes some dependency patches)
Author

Attachment setup-use-tahoe-debug-trial.darcs.patch (27391 bytes) added

Change 'setup.py test' and 'setup.py trial' to use 'bin/tahoe debug trial'. Remove setuptools_trial which is no longer used. Remove a no-longer necessary hack from setup.py. refs #1296

**Attachment** setup-use-tahoe-debug-trial.darcs.patch (27391 bytes) added Change 'setup.py test' and 'setup.py trial' to use 'bin/tahoe debug trial'. Remove setuptools_trial which is no longer used. Remove a no-longer necessary hack from setup.py. refs #1296
daira removed their assignment 2011-01-08 12:52:19 +00:00
Author

Please look only at attachment:combined-debug-trial.darcs.patch and disregard the others.

Please look only at [attachment:combined-debug-trial.darcs.patch](/tahoe-lafs/trac/attachments/000078ac-64c8-4e95-2453-4ebba5c202f4) and disregard the others.
Author

Attachment combined-debug-trial.darcs.patch (37151 bytes) added

Combined changes to support 'tahoe debug trial'. This version is better-factored into patches and less dependent on Twisted Trial implementation details. It should also be correctly recorded relative to trunk.

**Attachment** combined-debug-trial.darcs.patch (37151 bytes) added Combined changes to support 'tahoe debug trial'. This version is better-factored into patches and less dependent on Twisted Trial implementation details. It should also be correctly recorded relative to trunk.
Author

In [4922/ticket1306]:

src/allmydata/scripts/debug.py: add 'tahoe debug trial' command. refs #1296
In [4922/ticket1306]: ``` src/allmydata/scripts/debug.py: add 'tahoe debug trial' command. refs #1296 ```
Author

In [4923/ticket1306]:

Tests for 'tahoe debug trial'. refs #1296
In [4923/ticket1306]: ``` Tests for 'tahoe debug trial'. refs #1296 ```
Author

In [4932/ticket1306]:

Since 'tahoe debug trial' requires mock, add it as an unconditional dependency for now. refs #1296
In [4932/ticket1306]: ``` Since 'tahoe debug trial' requires mock, add it as an unconditional dependency for now. refs #1296 ```
Author

In [4933/ticket1306]:

setup.py: fix a bug in passing --reporter= argument to trial. refs #1296
In [4933/ticket1306]: ``` setup.py: fix a bug in passing --reporter= argument to trial. refs #1296 ```
Author

Needs rebasing for trunk.

Needs rebasing for trunk.
daira self-assigned this 2011-01-17 07:27:17 +00:00

A preliminary review pass looks good. I definitely prefer the
sys.argv=['trial'..] and twisted_trial.run() approach: it
feels like that should be reliable. I think I'd rather get the extra
arguments from parseArgs() instead of sys.argv[3:] though,
as the latter feels fragile. Something like:

   def parseArgs(self, *args):
       self.trial_args = args
...
def trial(config):
    sys.argv = ['trial'] + list(config.trial_args)
    # This does not return
    twisted_trial.run(); sys.exit(0)

(and the sys.exit(0) is for paranoia, to avoid surprises if we're wrong. it's on the same line as twisted_trial.run() keep the code-coverage numbers good. It might be appropriate to raise an exception or do an assert or something there instead.)

I think trial runs just fine without the 'allmydata' or
'allmydata.test' hint: when run without arguments, it scans
recursively below the current directory for test files. If an argument
is necessary, I'd lean towards using 'allmydata' rather than the
more-specific 'allmydata.test', as we may want to put tests
elsewhere at some point (my #466 signed-introducer work creates
allmydata.util.ecdsa.test, for example).

I'd make the help synopsis say "run Tahoe test suite (using Trial)",
since users probably care slightly more about what the command does than
which particular test framework is involved, and unless you already known Trial,
you won't be able to figure out what the command does without a hint.

I'm a little wary of introducing bin/tahoe.pyscript in places we
don't need it, especially in the Makefile. I'd be happier if there were
some clean way to make TAHOE=bin/tahoe on non-windows. But I know
I'm in the minority when it comes to the Makefile, so I'm only a -0 on
that.

I'll have to do some comparison testing to see whether I'm happy with
changing make quicktest to use the new scheme. It feels like
mapping that to 'tahoe debug trial' ought to be slightly faster (one
fewer subprocess?).

The other Makefile changes (turning $(PYTHON) bin/tahoe stop into
$(TAHOE) stop are probably good ones, but maybe they ought to go
into a separate patch, since they don't touch tahoe debug trial
directly. (not a separate ticket, just a separate patch, so future code archaeologists have an easier time following the history)

A preliminary review pass looks good. I definitely prefer the `sys.argv=['trial'..]` and `twisted_trial.run()` approach: it feels like that should be reliable. I think I'd rather get the extra arguments from `parseArgs()` instead of `sys.argv[3:]` though, as the latter feels fragile. Something like: ``` def parseArgs(self, *args): self.trial_args = args ... def trial(config): sys.argv = ['trial'] + list(config.trial_args) # This does not return twisted_trial.run(); sys.exit(0) ``` (and the `sys.exit(0)` is for paranoia, to avoid surprises if we're wrong. it's on the same line as twisted_trial.run() keep the code-coverage numbers good. It might be appropriate to raise an exception or do an assert or something there instead.) I think trial runs just fine without the `'allmydata'` or `'allmydata.test'` hint: when run without arguments, it scans recursively below the current directory for test files. If an argument *is* necessary, I'd lean towards using `'allmydata'` rather than the more-specific `'allmydata.test'`, as we may want to put tests elsewhere at some point (my #466 signed-introducer work creates `allmydata.util.ecdsa.test`, for example). I'd make the help synopsis say "run Tahoe test suite (using Trial)", since users probably care slightly more about what the command does than which particular test framework is involved, and unless you already known Trial, you won't be able to figure out what the command does without a hint. I'm a little wary of introducing `bin/tahoe.pyscript` in places we don't need it, especially in the Makefile. I'd be happier if there were some clean way to make `TAHOE=bin/tahoe` on non-windows. But I know I'm in the minority when it comes to the Makefile, so I'm only a -0 on that. I'll have to do some comparison testing to see whether I'm happy with changing `make quicktest` to use the new scheme. It feels like mapping that to 'tahoe debug trial' ought to be slightly faster (one fewer subprocess?). The other Makefile changes (turning `$(PYTHON) bin/tahoe stop` into `$(TAHOE) stop` are probably good ones, but maybe they ought to go into a separate patch, since they don't touch `tahoe debug trial` directly. (not a separate ticket, just a separate patch, so future code archaeologists have an easier time following the history)
Author

Thanks for the review.

Replying to warner:

A preliminary review pass looks good. I definitely prefer the
sys.argv=['trial'..] and twisted_trial.run() approach: it
feels like that should be reliable. I think I'd rather get the extra
arguments from parseArgs() instead of sys.argv[3:] though,
as the latter feels fragile. Something like:

   def parseArgs(self, *args):
       self.trial_args = args
...
def trial(config):
    sys.argv = ['trial'] + list(config.trial_args)
    # This does not return
    twisted_trial.run(); sys.exit(0)

That wouldn't include option arguments (and there is no documented way to get the list of option arguments from an Options object). Would sys.argv['debug', 'trial']len(['tahoe',):] be more self-documenting?

(and the sys.exit(0) is for paranoia, to avoid surprises if we're wrong.

source:src/allmydata/runner.py run() would exit anyway if trial(config) were to return.

I think trial runs just fine without the 'allmydata' or
'allmydata.test' hint: when run without arguments, it scans
recursively below the current directory for test files.

That would incorrectly catch the source:src/buildtest module, which is intended only to be run from source:misc/build_helpers/test-with-fake-dists.py.

If an argument is necessary, I'd lean towards using 'allmydata'
rather than the more-specific 'allmydata.test', as we may want
to put tests elsewhere at some point (my #466 signed-introducer work
creates allmydata.util.ecdsa.test, for example).

Hmm, the existing tests of allmydata.util are in allmydata.test.test_util. We can always change this when/if we decide to put tests outside allmydata.test.

I'd make the help synopsis say "run Tahoe test suite (using Trial)",
since users probably care slightly more about what the command does than
which particular test framework is involved, and unless you already known Trial,
you won't be able to figure out what the command does without a hint.

It's not specific to running the Tahoe test suite, that's just the default. Remember that end-users are told to use python setup.py test (or can use python setup.py trial to avoid a build), which then invokes bin/tahoe debug trial. Invoking it directly is a debugging operation, so the description needs to be oriented to debugging (for which it does matter that you're using Twisted Trial, and that the reason for using this rather than the trial script is that the imports are different).

I'll change it to "Run tests using Twisted Trial with correct imports."

I'm a little wary of introducing bin/tahoe.pyscript in places we
don't need it, especially in the Makefile.

OK, I'll change this. (Note that bin/tahoe and bin/tahoe.pyscript are identical files on all platforms now; see the last change in [4924/ticket1306].)

I'll have to do some comparison testing to see whether I'm happy with
changing make quicktest to use the new scheme. It feels like
mapping that to 'tahoe debug trial' ought to be slightly faster (one
fewer subprocess?).

There isn't one fewer subprocess, since bin/tahoe creates a subprocess (but that's an implementation detail that might change; for example bin/tahoe could use os.execve on Unix, or it could munge sys.path directly rather than using PYTHONPATH).

The main point of this ticket is that we should only have one way to set up the imports, that is used both for running bin/tahoe normally and for running tests. The other code that was duplicating this set-up (source:misc/build_helpers/run-with-pythonpath.py and source:setup.py RunWithPythonPath), can now be deleted.

The other Makefile changes (turning $(PYTHON) bin/tahoe stop into
$(TAHOE) stop are probably good ones, but maybe they ought to go
into a separate patch, since they don't touch tahoe debug trial
directly. (not a separate ticket, just a separate patch, so future code archaeologists have an easier time following the history)

They were in a separate changeset ([4927/ticket1306]), and will be on trunk.

Thanks for the review. Replying to [warner](/tahoe-lafs/trac/issues/1296#issuecomment-382857): > A preliminary review pass looks good. I definitely prefer the > `sys.argv=['trial'..]` and `twisted_trial.run()` approach: it > feels like that should be reliable. I think I'd rather get the extra > arguments from `parseArgs()` instead of `sys.argv[3:]` though, > as the latter feels fragile. Something like: > > ``` > def parseArgs(self, *args): > self.trial_args = args > ... > def trial(config): > sys.argv = ['trial'] + list(config.trial_args) > # This does not return > twisted_trial.run(); sys.exit(0) > ``` That wouldn't include option arguments (and there is no documented way to get the list of option arguments from an Options object). Would `sys.argv['debug', 'trial']len(['tahoe',):]` be more self-documenting? > (and the `sys.exit(0)` is for paranoia, to avoid surprises if we're wrong. source:src/allmydata/runner.py `run()` would exit anyway if `trial(config)` were to return. > I think trial runs just fine without the `'allmydata'` or > `'allmydata.test'` hint: when run without arguments, it scans > recursively below the current directory for test files. That would incorrectly catch the source:src/buildtest module, which is intended only to be run from source:misc/build_helpers/test-with-fake-dists.py. > If an argument *is* necessary, I'd lean towards using `'allmydata'` > rather than the more-specific `'allmydata.test'`, as we may want > to put tests elsewhere at some point (my #466 signed-introducer work > creates `allmydata.util.ecdsa.test`, for example). Hmm, the existing tests of `allmydata.util` are in `allmydata.test.test_util`. We can always change this when/if we decide to put tests outside `allmydata.test`. > I'd make the help synopsis say "run Tahoe test suite (using Trial)", > since users probably care slightly more about what the command does than > which particular test framework is involved, and unless you already known Trial, > you won't be able to figure out what the command does without a hint. It's not specific to running the Tahoe test suite, that's just the default. Remember that end-users are told to use `python setup.py test` (or can use `python setup.py trial` to avoid a build), which then invokes `bin/tahoe debug trial`. Invoking it directly is a debugging operation, so the description needs to be oriented to debugging (for which it does matter that you're using Twisted Trial, and that the reason for using this rather than the `trial` script is that the imports are different). I'll change it to "Run tests using Twisted Trial with correct imports." > I'm a little wary of introducing `bin/tahoe.pyscript` in places we > don't need it, especially in the Makefile. OK, I'll change this. (Note that `bin/tahoe` and `bin/tahoe.pyscript` are identical files on all platforms now; see the last change in [4924/ticket1306].) > I'll have to do some comparison testing to see whether I'm happy with > changing `make quicktest` to use the new scheme. It feels like > mapping that to 'tahoe debug trial' ought to be slightly faster (one > fewer subprocess?). There isn't one fewer subprocess, since `bin/tahoe` creates a subprocess (but that's an implementation detail that might change; for example `bin/tahoe` could use `os.execve` on Unix, or it could munge `sys.path` directly rather than using PYTHONPATH). The main point of this ticket is that we should only have one way to set up the imports, that is used both for running `bin/tahoe` normally and for running tests. The other code that was duplicating this set-up (source:misc/build_helpers/run-with-pythonpath.py and source:setup.py `RunWithPythonPath`), can now be deleted. > The other Makefile changes (turning `$(PYTHON) bin/tahoe stop` into > `$(TAHOE) stop` are probably good ones, but maybe they ought to go > into a separate patch, since they don't touch `tahoe debug trial` > directly. (not a separate ticket, just a separate patch, so future code archaeologists have an easier time following the history) They were in a separate changeset ([4927/ticket1306]), and will be on trunk.
Author

Replying to [davidsarah]comment:10:

Replying to warner:

The other Makefile changes (turning $(PYTHON) bin/tahoe stop into
$(TAHOE) stop are probably good ones, but maybe they ought to go
into a separate patch, since they don't touch tahoe debug trial
directly. (not a separate ticket, just a separate patch, so future code archaeologists have an easier time following the history)

They were in a separate changeset ([4927/ticket1306]), and will be on trunk.

Sorry, I misread your comment. Yes, I'll separate out those changes.

Replying to [davidsarah]comment:10: > Replying to [warner](/tahoe-lafs/trac/issues/1296#issuecomment-382857): > > The other Makefile changes (turning `$(PYTHON) bin/tahoe stop` into > > `$(TAHOE) stop` are probably good ones, but maybe they ought to go > > into a separate patch, since they don't touch `tahoe debug trial` > > directly. (not a separate ticket, just a separate patch, so future code archaeologists have an easier time following the history) > > They were in a separate changeset ([4927/ticket1306]), and will be on trunk. Sorry, I misread your comment. Yes, I'll separate out those changes.
Author

Replying to warner:

A preliminary review pass looks good. I definitely prefer the
sys.argv=['trial'..] and twisted_trial.run() approach: it
feels like that should be reliable. I think I'd rather get the extra
arguments from parseArgs() instead of sys.argv[3:] though,
as the latter feels fragile. Something like:

   def parseArgs(self, *args):
       self.trial_args = args
...
def trial(config):
    sys.argv = ['trial'] + list(config.trial_args)
    # This does not return
    twisted_trial.run(); sys.exit(0)

Your feeling was right; sys.argv[3:] is fragile. In particular it breaks when there are options to tahoe, for example:

bin/tahoe --quiet debug trial allmydata.test.test_base62

will pass "trial allmydata.test.test_base62", to Trial, causing it to attempt to run a non-existent testsuite called "trial", in addition to test_base62. I'll find a more robust solution.

Replying to [warner](/tahoe-lafs/trac/issues/1296#issuecomment-382857): > A preliminary review pass looks good. I definitely prefer the > `sys.argv=['trial'..]` and `twisted_trial.run()` approach: it > feels like that should be reliable. I think I'd rather get the extra > arguments from `parseArgs()` instead of `sys.argv[3:]` though, > as the latter feels fragile. Something like: > > ``` > def parseArgs(self, *args): > self.trial_args = args > ... > def trial(config): > sys.argv = ['trial'] + list(config.trial_args) > # This does not return > twisted_trial.run(); sys.exit(0) > ``` Your feeling was right; `sys.argv[3:]` is fragile. In particular it breaks when there are options to tahoe, for example: ``` bin/tahoe --quiet debug trial allmydata.test.test_base62 ``` will pass "`trial allmydata.test.test_base62`", to Trial, causing it to attempt to run a non-existent testsuite called "trial", in addition to test_base62. I'll find a more robust solution.

Take a look at the internals of usage.Options: I think there's a method to override that will do what you want. In particular, if the 'tahoe debug trial' command doesn't take any options of it's own, I think parseArgs would just give you everything.

Take a look at the internals of `usage.Options`: I think there's a method to override that will do what you want. In particular, if the 'tahoe debug trial' command doesn't take any options of it's own, I think `parseArgs` would just give you everything.

The following appears to work great, at least for things like "tahoe debug trial", "tahoe debug trial allmydata.test.test_foo", and "tahoe debug trial --random-option random-argument". It depends upon the fact that TrialOptions doesn't actually take any options or arguments: everything gets passed through to trial.run():


class TrialOptions(twisted_trial.Options):
    def getSynopsis(self):
        return "Usage: tahoe debug trial [options] [[file|package|module|TestCase|testmethod]...]"

    def parseOptions(self, options):
        self.options = options

    def getUsage(self, width=None):
        t = twisted_trial.Options.getUsage(self, width)
        t += """
The 'tahoe debug trial' command uses the correct imports for this instance of
Tahoe-LAFS. The default test suite is 'allmydata.test'.
"""
        return t


def trial(config):
    sys.argv = ['trial'] + list(config.options)
    if not config.options:
        sys.argv += ['allmydata.test']

    # This does not return.
    twisted_trial.run()
The following appears to work great, at least for things like "`tahoe debug trial`", "`tahoe debug trial allmydata.test.test_foo`", and "`tahoe debug trial --random-option random-argument`". It depends upon the fact that `TrialOptions` doesn't actually take any options or arguments: everything gets passed through to `trial.run()`: ``` class TrialOptions(twisted_trial.Options): def getSynopsis(self): return "Usage: tahoe debug trial [options] [[file|package|module|TestCase|testmethod]...]" def parseOptions(self, options): self.options = options def getUsage(self, width=None): t = twisted_trial.Options.getUsage(self, width) t += """ The 'tahoe debug trial' command uses the correct imports for this instance of Tahoe-LAFS. The default test suite is 'allmydata.test'. """ return t def trial(config): sys.argv = ['trial'] + list(config.options) if not config.options: sys.argv += ['allmydata.test'] # This does not return. twisted_trial.run() ```
Author

Removing setuptools_trial would have a side-effect described in [this comment]source:setup.py@4940#L143:

# Nevow requires Twisted to setup, but doesn't declare that requirement in a
# way that enables setuptools to satisfy that requirement before Nevow's
# setup.py tried to "import twisted". Fortunately we require setuptools_trial
# to setup and setuptools_trial requires Twisted to install, so hopefully
# everything will work out until the Nevow issue is fixed:
# http://divmod.org/trac/ticket/2629 setuptools_trial is needed if you want
# "./setup.py trial" or "./setup.py test" to execute the tests (and in order
# to make sure Twisted is installed early enough -- see the paragraph above).
# http://pypi.python.org/pypi/setuptools_trial
setup_requires.extend(['setuptools_trial >= 0.5'])

(google cache of the related bug http://divmod.org/trac/ticket/2527 while divmod.org is down)

source:src/allmydata/test/test_nevow.py says that Nevow v0.9.33 fixed that bug. For references, all of the working buildbots have Nevow v0.10.0 except for 'Arthur lenny', which has v0.9.31.

I propose to bump the Nevow version requirement from >= 0.6.0 to >= 0.9.33. Any objection? (In the case of Ubuntu for example, 0.10.0 was packaged for Ubuntu Lucid in April 2010.)

Removing setuptools_trial would have a side-effect described in [this comment]source:setup.py@4940#L143: ``` # Nevow requires Twisted to setup, but doesn't declare that requirement in a # way that enables setuptools to satisfy that requirement before Nevow's # setup.py tried to "import twisted". Fortunately we require setuptools_trial # to setup and setuptools_trial requires Twisted to install, so hopefully # everything will work out until the Nevow issue is fixed: # http://divmod.org/trac/ticket/2629 setuptools_trial is needed if you want # "./setup.py trial" or "./setup.py test" to execute the tests (and in order # to make sure Twisted is installed early enough -- see the paragraph above). # http://pypi.python.org/pypi/setuptools_trial setup_requires.extend(['setuptools_trial >= 0.5']) ``` ([google cache](https://webcache.googleusercontent.com/search?q=cache:divmod.org/trac/ticket/2527) of the related bug <http://divmod.org/trac/ticket/2527> while divmod.org is down) source:src/allmydata/test/test_nevow.py says that Nevow v0.9.33 fixed that bug. For references, all of the working buildbots have Nevow v0.10.0 except for 'Arthur lenny', which has v0.9.31. I propose to bump the Nevow version requirement from >= 0.6.0 to >= 0.9.33. Any objection? (In the case of Ubuntu for example, 0.10.0 was packaged for Ubuntu Lucid in April 2010.)

Replying to davidsarah:

source:src/allmydata/test/test_nevow.py says that Nevow v0.9.33 fixed that bug. For references, all of the working buildbots have Nevow v0.10.0 except for 'Arthur lenny', which has v0.9.31.

I propose to bump the Nevow version requirement from >= 0.6.0 to >= 0.9.33. Any objection?

Does this mean we'd be requiring a version of Nevow newer than what Lenny packages?

http://packages.debian.org/search?keywords=nevow&searchon=names&suite=all&section=all

Hm, yeah, Lenny has 0.9.31-3. Oh, you know what -- removing the setup-time dependency on setuptools_trial doesn't actually eliminate the setup-time dependency on Twisted, does it? We should probably replace the setup_requires.extend(['setuptools_trial >= 0.5']) with setup_requires.append('Twisted >= 2.4.0'). Maybe that will mean we don't need the newer version of Nevow.

I hope the Arthur lenny buildbot will tell us.

Replying to [davidsarah](/tahoe-lafs/trac/issues/1296#issuecomment-382863): > source:src/allmydata/test/test_nevow.py says that Nevow v0.9.33 fixed that bug. For references, all of the working buildbots have Nevow v0.10.0 except for 'Arthur lenny', which has v0.9.31. > > I propose to bump the Nevow version requirement from >= 0.6.0 to >= 0.9.33. Any objection? Does this mean we'd be requiring a version of Nevow newer than what Lenny packages? <http://packages.debian.org/search?keywords=nevow&searchon=names&suite=all&section=all> Hm, yeah, Lenny has `0.9.31-3`. Oh, you know what -- removing the setup-time dependency on `setuptools_trial` doesn't actually eliminate the setup-time dependency on `Twisted`, does it? We should probably replace the `setup_requires.extend(['setuptools_trial >= 0.5'])` with `setup_requires.append('Twisted >= 2.4.0')`. Maybe that will mean we don't need the newer version of `Nevow`. I hope the Arthur lenny buildbot will tell us.
Author

Replying to [zooko]comment:16:

Replying to davidsarah:

source:src/allmydata/test/test_nevow.py says that Nevow v0.9.33 fixed that bug. For references, all of the working buildbots have Nevow v0.10.0 except for 'Arthur lenny', which has v0.9.31.

I propose to bump the Nevow version requirement from >= 0.6.0 to >= 0.9.33. Any objection?

Does this mean we'd be requiring a version of Nevow newer than what Lenny packages?

Yes.

We should probably replace the setup_requires.extend(['setuptools_trial >= 0.5']) with setup_requires.append('Twisted >= 2.4.0'). Maybe that will mean we don't need the newer version of Nevow.

That sounds as though it might work, but I'll try just removing the setuptools_trial dependency first, and see if Arthur lenny breaks.

Replying to [zooko]comment:16: > Replying to [davidsarah](/tahoe-lafs/trac/issues/1296#issuecomment-382863): > > > source:src/allmydata/test/test_nevow.py says that Nevow v0.9.33 fixed that bug. For references, all of the working buildbots have Nevow v0.10.0 except for 'Arthur lenny', which has v0.9.31. > > > > I propose to bump the Nevow version requirement from >= 0.6.0 to >= 0.9.33. Any objection? > > Does this mean we'd be requiring a version of Nevow newer than what Lenny packages? Yes. > We should probably replace the `setup_requires.extend(['setuptools_trial >= 0.5'])` with `setup_requires.append('Twisted >= 2.4.0')`. Maybe that will mean we don't need the newer version of `Nevow`. That sounds as though it might work, but I'll try just removing the setuptools_trial dependency first, and see if Arthur lenny breaks.

I'm curious to see what happens with the Arthur lenny buildslave. But, even if it works then it is working by accident, if we don't explicitly specify that Twisted is a setup-time requirement of Tahoe-LAFS (for trial).

I'm curious to see what happens with the Arthur lenny buildslave. But, even if it works then it is working by accident, if we don't explicitly specify that `Twisted` is a setup-time requirement of Tahoe-LAFS (for `trial`).
Author

Attachment code-docs-test-1296.darcs.patch (25100 bytes) added

Code, documentation and test changes, rebased for trunk. Does not include removal of setuptools_trial or changes to 'setup.py trial'

**Attachment** code-docs-test-1296.darcs.patch (25100 bytes) added Code, documentation and test changes, rebased for trunk. Does not include removal of setuptools_trial or changes to 'setup.py trial'

my review:

  • please add trailing newlines to docs/frontends/CLI.rst andsrc/allmydata/test/trialtest.py
  • SystemTest.test_debug_trial fails on my system (with twisted-10.2). I suspect that trial's output has changed in 10.2, you may need to be less strict in matching the output:
56:warner@Cookies% trial --version
Twisted version: 10.2.0
57:warner@Cookies% ./bin/tahoe debug trial allmydata.test.trialtest
allmydata.test.trialtest
  Failure
    test_deferred_error ...                                             [ERROR]
    test_error ...                                                      [ERROR]
    test_fail ...                                                        [FAIL]
  Success
    test_skip ...                                                     [SKIPPED]
    test_succeed ...                                                       [OK]
    test_todo ...                                                        [TODO]

===============================================================================
[SKIPPED]
skip

allmydata.test.trialtest.Success.test_skip
===============================================================================
[TODO]
Reason: 'never mind'
Traceback (most recent call last):
  File "/Users/warner2/stuff/tahoe/trunk/src/allmydata/test/trialtest.py", line 18, in test_todo
    self.fail('umm')
twisted.trial.unittest.FailTest: umm

allmydata.test.trialtest.Success.test_todo
===============================================================================
[FAIL]
Traceback (most recent call last):
  File "/Users/warner2/stuff/tahoe/trunk/src/allmydata/test/trialtest.py", line 24, in test_fail
    self.fail('fail')
twisted.trial.unittest.FailTest: fail

allmydata.test.trialtest.Failure.test_fail
===============================================================================
[ERROR]
Traceback (most recent call last):
Failure: exceptions.AssertionError: screech

allmydata.test.trialtest.Failure.test_deferred_error
===============================================================================
[ERROR]
Traceback (most recent call last):
  File "/Users/warner2/stuff/tahoe/trunk/src/allmydata/test/trialtest.py", line 27, in test_error
    raise AssertionError('clang')
exceptions.AssertionError: clang

allmydata.test.trialtest.Failure.test_error
-------------------------------------------------------------------------------
Ran 6 tests in 0.034s

FAILED (skips=1, expectedFailures=1, failures=1, errors=2, successes=1)
58:warner@Cookies% 

Apart from that, it looks awesome. If you can confirm a trial-10.2 fix (you might want to check older versions of Twisted too, back to whatever minimum we support), go ahead and land it.

my review: * please add trailing newlines to `docs/frontends/CLI.rst` and`src/allmydata/test/trialtest.py` * `SystemTest.test_debug_trial` fails on my system (with twisted-10.2). I suspect that trial's output has changed in 10.2, you may need to be less strict in matching the output: ``` 56:warner@Cookies% trial --version Twisted version: 10.2.0 57:warner@Cookies% ./bin/tahoe debug trial allmydata.test.trialtest allmydata.test.trialtest Failure test_deferred_error ... [ERROR] test_error ... [ERROR] test_fail ... [FAIL] Success test_skip ... [SKIPPED] test_succeed ... [OK] test_todo ... [TODO] =============================================================================== [SKIPPED] skip allmydata.test.trialtest.Success.test_skip =============================================================================== [TODO] Reason: 'never mind' Traceback (most recent call last): File "/Users/warner2/stuff/tahoe/trunk/src/allmydata/test/trialtest.py", line 18, in test_todo self.fail('umm') twisted.trial.unittest.FailTest: umm allmydata.test.trialtest.Success.test_todo =============================================================================== [FAIL] Traceback (most recent call last): File "/Users/warner2/stuff/tahoe/trunk/src/allmydata/test/trialtest.py", line 24, in test_fail self.fail('fail') twisted.trial.unittest.FailTest: fail allmydata.test.trialtest.Failure.test_fail =============================================================================== [ERROR] Traceback (most recent call last): Failure: exceptions.AssertionError: screech allmydata.test.trialtest.Failure.test_deferred_error =============================================================================== [ERROR] Traceback (most recent call last): File "/Users/warner2/stuff/tahoe/trunk/src/allmydata/test/trialtest.py", line 27, in test_error raise AssertionError('clang') exceptions.AssertionError: clang allmydata.test.trialtest.Failure.test_error ------------------------------------------------------------------------------- Ran 6 tests in 0.034s FAILED (skips=1, expectedFailures=1, failures=1, errors=2, successes=1) 58:warner@Cookies% ``` Apart from that, it looks awesome. If you can confirm a trial-10.2 fix (you might want to check older versions of Twisted too, back to whatever minimum we support), go ahead and land it.
Author

In changeset:7a887871b06af4a6:

src/allmydata/scripts/debug.py: add 'tahoe debug trial' command (rebased for trunk). refs #1296
In changeset:7a887871b06af4a6: ``` src/allmydata/scripts/debug.py: add 'tahoe debug trial' command (rebased for trunk). refs #1296 ```
Author

In changeset:420aadd95efc176e:

Make 'mock' a run-time rather than setup-time dependency. This is necessary in order for 'tahoe debug trial' to work. refs #1296
In changeset:420aadd95efc176e: ``` Make 'mock' a run-time rather than setup-time dependency. This is necessary in order for 'tahoe debug trial' to work. refs #1296 ```
Author

In changeset:bbc1f56981e7aebf:

Documentation for 'tahoe debug trial' (rebased for trunk). refs #1296
In changeset:bbc1f56981e7aebf: ``` Documentation for 'tahoe debug trial' (rebased for trunk). refs #1296 ```
Author

In changeset:0d6df9c9fc97f756:

Tests for 'tahoe debug trial' (rebased and fixed to work with Twisted 10.2). refs #1296
In changeset:0d6df9c9fc97f756: ``` Tests for 'tahoe debug trial' (rebased and fixed to work with Twisted 10.2). refs #1296 ```
Author

In changeset:1819c25c888ac3e6:

Add src/allmydata/test/trialtest.py needed by tests for 'tahoe debug trial'. refs #1296
In changeset:1819c25c888ac3e6: ``` Add src/allmydata/test/trialtest.py needed by tests for 'tahoe debug trial'. refs #1296 ```
Author

Replying to zooko:

I'm curious to see what happens with the Arthur lenny buildslave. But, even if it works then it is working by accident, if we don't explicitly specify that Twisted is a setup-time requirement of Tahoe-LAFS (for trial).

Given that Arthur lenny has Twisted 8.1.0 installed, it would have worked by accident.

Replying to [zooko](/tahoe-lafs/trac/issues/1296#issuecomment-382866): > I'm curious to see what happens with the Arthur lenny buildslave. But, even if it works then it is working by accident, if we don't explicitly specify that `Twisted` is a setup-time requirement of Tahoe-LAFS (for `trial`). Given that Arthur lenny [has Twisted 8.1.0 installed](http://tahoe-lafs.org/buildbot/builders/Arthur%20lenny%20c7%2032bit/builds/656/steps/show-tool-versions/logs/stdio), it would have worked by accident.
Author

In changeset:8f0af33ba6cf4f4a:

src/allmydata/test/test_cli.py: add test for 'tahoe debug trial' options help. refs #1296
In changeset:8f0af33ba6cf4f4a: ``` src/allmydata/test/test_cli.py: add test for 'tahoe debug trial' options help. refs #1296 ```
Author

In changeset:7e413d4fa45932a8:

Change 'setup.py trial' and 'setup.py test' to use 'bin/tahoe debug trial'. refs #1296
In changeset:7e413d4fa45932a8: ``` Change 'setup.py trial' and 'setup.py test' to use 'bin/tahoe debug trial'. refs #1296 ```
Author

In changeset:5a7c99d29d85f32d:

Change misc/build_helpers/test-with-fake-pkg to use 'setup.py trial'. refs #1296
In changeset:5a7c99d29d85f32d: ``` Change misc/build_helpers/test-with-fake-pkg to use 'setup.py trial'. refs #1296 ```

I've reviewed changeset:5a7c99d29d85f32d/trunk and it looks good to me.

I've reviewed changeset:5a7c99d29d85f32d/trunk and it looks good to me.
Author

In changeset:74b1eec1d661a508:

trivial: add comment in scripts/debug.py about trial option parsing. refs #1296
In changeset:74b1eec1d661a508: ``` trivial: add comment in scripts/debug.py about trial option parsing. refs #1296 ```

Re: changeset:7e413d4fa45932a8/trunk, [this comment]source:trunk/setup.py@4950#L138 doesn't mention the other reason that we setup-require Twisted which is that we want to ensure that trial is available at test time. Oh, maybe that is best expressed [tests_require]source:trunk/setup.py@4950#L164 instead. (But tests_require will probably not be auto-satisfied when you run python setup.py trial the way they would be if you ran python setup.py test.) In any case we should probably specify a build-time or test-time requirement on Twisted.

Other than that, +1 on changeset:7e413d4fa45932a8/trunk!

Re: changeset:7e413d4fa45932a8/trunk, [this comment]source:trunk/setup.py@4950#L138 doesn't mention the other reason that we setup-require `Twisted` which is that we want to ensure that `trial` is available at test time. Oh, maybe that is best expressed [tests_require]source:trunk/setup.py@4950#L164 instead. (But `tests_require` will probably not be auto-satisfied when you run `python setup.py trial` the way they would be if you ran `python setup.py test`.) In any case we should probably specify a build-time or test-time requirement on `Twisted`. Other than that, +1 on changeset:7e413d4fa45932a8/trunk!

+1 changeset:8f0af33ba6cf4f4a/trunk.

+1 changeset:8f0af33ba6cf4f4a/trunk.
Author

Replying to zooko:

Re: changeset:7e413d4fa45932a8/trunk, [this comment]source:trunk/setup.py@4950#L138 doesn't mention the other reason that we setup-require Twisted which is that we want to ensure that trial is available at test time.

Actually trial will be available when we run tests because Twisted is a run-time dependency, and bin/tahoe debug trial is a run-time thing from setuptools' point of view (because it's in a separate process that is started by a support script).

From setuptools' point of view, we now don't do anything at test time, other than invoke the Trial command in source:setup.py.

Replying to [zooko](/tahoe-lafs/trac/issues/1296#issuecomment-382879): > Re: changeset:7e413d4fa45932a8/trunk, [this comment]source:trunk/setup.py@4950#L138 doesn't mention the other reason that we setup-require `Twisted` which is that we want to ensure that `trial` is available at test time. Actually `trial` will be available when we run tests because `Twisted` is a run-time dependency, and `bin/tahoe debug trial` is a run-time thing from setuptools' point of view (because it's in a separate process that is started by a support script). From setuptools' point of view, we now don't do anything at test time, other than invoke the Trial command in source:setup.py.
Author

In changeset:a9fc4668c0e0032c:

docs/frontends/CLI.rst, src/allmydata/test/trialtest.py: add trailing newlines. refs #1296
In changeset:a9fc4668c0e0032c: ``` docs/frontends/CLI.rst, src/allmydata/test/trialtest.py: add trailing newlines. refs #1296 ```
Author

In changeset:9ea323db4ccbc778:

Makefile: consistently use 'tahoe debug trial' to run tests. refs #1296
In changeset:9ea323db4ccbc778: ``` Makefile: consistently use 'tahoe debug trial' to run tests. refs #1296 ```
Author

In changeset:d4969259c68bbe77:

Makefile: consistently use TAHOE macro to run bin/tahoe. Use '$(TAHOE) debug repl' instead of $(RUNPP) -p. refs #1296
In changeset:d4969259c68bbe77: ``` Makefile: consistently use TAHOE macro to run bin/tahoe. Use '$(TAHOE) debug repl' instead of $(RUNPP) -p. refs #1296 ```

So what's left on this ticket? docs-needed? Shall we close the ticket?

So what's left on this ticket? `docs-needed`? Shall we close the ticket?
Author

news-needed, and that's it. Docs were in changeset:bbc1f56981e7aebf (and bin/tahoe debug trial --help prints all the options).

`news-needed`, and that's it. Docs were in changeset:bbc1f56981e7aebf (and `bin/tahoe debug trial --help` prints all the options).

I'll do a scan of version-control history to generate NEWS for 1.8.2, rather than rely upon news-needed tags. Closing this one out.

I'll do a scan of version-control history to generate NEWS for 1.8.2, rather than rely upon `news-needed` tags. Closing this one out.
warner added the
r/fixed
label 2011-01-21 17:08:48 +00:00

The Ubuntu packagers of Tahoe-LAFS didn't notice this change from test-time dep to run-time dep and so Tahoe-LAFS in Natty doesn't declare a dep on python-mock and therefore won't run unless you manually install mock:

https://bugs.launchpad.net/tahoe-lafs/+bug/782379

The Ubuntu packagers of Tahoe-LAFS didn't notice this change from test-time dep to run-time dep and so Tahoe-LAFS in Natty doesn't declare a dep on python-mock and therefore won't run unless you manually install mock: <https://bugs.launchpad.net/tahoe-lafs/+bug/782379>
Author

Replying to zooko:

The Ubuntu packagers of Tahoe-LAFS didn't notice this change from test-time dep ...

The NEWS for 1.8.2 did note this change. Is there any way we should be making such changes more obvious to packagers?

Replying to [zooko](/tahoe-lafs/trac/issues/1296#issuecomment-382890): > The Ubuntu packagers of Tahoe-LAFS didn't notice this change from test-time dep ... [The NEWS for 1.8.2](http://tahoe-lafs.org/trac/tahoe-lafs/changeset/4992) did note this change. Is there any way we should be making such changes more obvious to packagers?

What would be awesome is if packagers had an automated test bot which would alert them automatically if they made a mistake like this. The NixOS project is the only packaging project I know of that has this:

http://hydra.nixos.org/job/nixpkgs/trunk/tahoelafs

But aside from encouraging packagers to get automated continuous integration, I don't think there's much more we can do, so let's leave this ticket closed.

What would be awesome is if packagers had an automated test bot which would alert them automatically if they made a mistake like this. The NixOS project is the only packaging project I know of that has this: <http://hydra.nixos.org/job/nixpkgs/trunk/tahoelafs> But aside from encouraging packagers to get automated continuous integration, I don't think there's much more we can do, so let's leave this ticket closed.
Sign in to join this conversation.
No labels
c/code
c/code-dirnodes
c/code-encoding
c/code-frontend
c/code-frontend-cli
c/code-frontend-ftp-sftp
c/code-frontend-magic-folder
c/code-frontend-web
c/code-mutable
c/code-network
c/code-nodeadmin
c/code-peerselection
c/code-storage
c/contrib
c/dev-infrastructure
c/docs
c/operational
c/packaging
c/unknown
c/website
kw:2pc
kw:410
kw:9p
kw:ActivePerl
kw:AttributeError
kw:DataUnavailable
kw:DeadReferenceError
kw:DoS
kw:FileZilla
kw:GetLastError
kw:IFinishableConsumer
kw:K
kw:LeastAuthority
kw:Makefile
kw:RIStorageServer
kw:StringIO
kw:UncoordinatedWriteError
kw:about
kw:access
kw:access-control
kw:accessibility
kw:accounting
kw:accounting-crawler
kw:add-only
kw:aes
kw:aesthetics
kw:alias
kw:aliases
kw:aliens
kw:allmydata
kw:amazon
kw:ambient
kw:annotations
kw:anonymity
kw:anonymous
kw:anti-censorship
kw:api_auth_token
kw:appearance
kw:appname
kw:apport
kw:archive
kw:archlinux
kw:argparse
kw:arm
kw:assertion
kw:attachment
kw:auth
kw:authentication
kw:automation
kw:avahi
kw:availability
kw:aws
kw:azure
kw:backend
kw:backoff
kw:backup
kw:backupdb
kw:backward-compatibility
kw:bandwidth
kw:basedir
kw:bayes
kw:bbfreeze
kw:beta
kw:binaries
kw:binutils
kw:bitcoin
kw:bitrot
kw:blacklist
kw:blocker
kw:blocks-cloud-deployment
kw:blocks-cloud-merge
kw:blocks-magic-folder-merge
kw:blocks-merge
kw:blocks-raic
kw:blocks-release
kw:blog
kw:bom
kw:bonjour
kw:branch
kw:branding
kw:breadcrumbs
kw:brians-opinion-needed
kw:browser
kw:bsd
kw:build
kw:build-helpers
kw:buildbot
kw:builders
kw:buildslave
kw:buildslaves
kw:cache
kw:cap
kw:capleak
kw:captcha
kw:cast
kw:centos
kw:cffi
kw:chacha
kw:charset
kw:check
kw:checker
kw:chroot
kw:ci
kw:clean
kw:cleanup
kw:cli
kw:cloud
kw:cloud-backend
kw:cmdline
kw:code
kw:code-checks
kw:coding-standards
kw:coding-tools
kw:coding_tools
kw:collection
kw:compatibility
kw:completion
kw:compression
kw:confidentiality
kw:config
kw:configuration
kw:configuration.txt
kw:conflict
kw:connection
kw:connectivity
kw:consistency
kw:content
kw:control
kw:control.furl
kw:convergence
kw:coordination
kw:copyright
kw:corruption
kw:cors
kw:cost
kw:coverage
kw:coveralls
kw:coveralls.io
kw:cpu-watcher
kw:cpyext
kw:crash
kw:crawler
kw:crawlers
kw:create-container
kw:cruft
kw:crypto
kw:cryptography
kw:cryptography-lib
kw:cryptopp
kw:csp
kw:curl
kw:cutoff-date
kw:cycle
kw:cygwin
kw:d3
kw:daemon
kw:darcs
kw:darcsver
kw:database
kw:dataloss
kw:db
kw:dead-code
kw:deb
kw:debian
kw:debug
kw:deep-check
kw:defaults
kw:deferred
kw:delete
kw:deletion
kw:denial-of-service
kw:dependency
kw:deployment
kw:deprecation
kw:desert-island
kw:desert-island-build
kw:design
kw:design-review-needed
kw:detection
kw:dev-infrastructure
kw:devpay
kw:directory
kw:directory-page
kw:dirnode
kw:dirnodes
kw:disconnect
kw:discovery
kw:disk
kw:disk-backend
kw:distribute
kw:distutils
kw:dns
kw:do_http
kw:doc-needed
kw:docker
kw:docs
kw:docs-needed
kw:dokan
kw:dos
kw:download
kw:downloader
kw:dragonfly
kw:drop-upload
kw:duplicity
kw:dusty
kw:earth-dragon
kw:easy
kw:ec2
kw:ecdsa
kw:ed25519
kw:egg-needed
kw:eggs
kw:eliot
kw:email
kw:empty
kw:encoding
kw:endpoint
kw:enterprise
kw:enum34
kw:environment
kw:erasure
kw:erasure-coding
kw:error
kw:escaping
kw:etag
kw:etch
kw:evangelism
kw:eventual
kw:example
kw:excess-authority
kw:exec
kw:exocet
kw:expiration
kw:extensibility
kw:extension
kw:failure
kw:fedora
kw:ffp
kw:fhs
kw:figleaf
kw:file
kw:file-descriptor
kw:filename
kw:filesystem
kw:fileutil
kw:fips
kw:firewall
kw:first
kw:floatingpoint
kw:flog
kw:foolscap
kw:forward-compatibility
kw:forward-secrecy
kw:forwarding
kw:free
kw:freebsd
kw:frontend
kw:fsevents
kw:ftp
kw:ftpd
kw:full
kw:furl
kw:fuse
kw:garbage
kw:garbage-collection
kw:gateway
kw:gatherer
kw:gc
kw:gcc
kw:gentoo
kw:get
kw:git
kw:git-annex
kw:github
kw:glacier
kw:globalcaps
kw:glossary
kw:google-cloud-storage
kw:google-drive-backend
kw:gossip
kw:governance
kw:grid
kw:grid-manager
kw:gridid
kw:gridsync
kw:grsec
kw:gsoc
kw:gvfs
kw:hackfest
kw:hacktahoe
kw:hang
kw:hardlink
kw:heartbleed
kw:heisenbug
kw:help
kw:helper
kw:hint
kw:hooks
kw:how
kw:how-to
kw:howto
kw:hp
kw:hp-cloud
kw:html
kw:http
kw:https
kw:i18n
kw:i2p
kw:i2p-collab
kw:illustration
kw:image
kw:immutable
kw:impressions
kw:incentives
kw:incident
kw:init
kw:inlineCallbacks
kw:inotify
kw:install
kw:installer
kw:integration
kw:integration-test
kw:integrity
kw:interactive
kw:interface
kw:interfaces
kw:interoperability
kw:interstellar-exploration
kw:introducer
kw:introduction
kw:iphone
kw:ipkg
kw:iputil
kw:ipv6
kw:irc
kw:jail
kw:javascript
kw:joke
kw:jquery
kw:json
kw:jsui
kw:junk
kw:key-value-store
kw:kfreebsd
kw:known-issue
kw:konqueror
kw:kpreid
kw:kvm
kw:l10n
kw:lae
kw:large
kw:latency
kw:leak
kw:leasedb
kw:leases
kw:libgmp
kw:license
kw:licenss
kw:linecount
kw:link
kw:linux
kw:lit
kw:localhost
kw:location
kw:locking
kw:logging
kw:logo
kw:loopback
kw:lucid
kw:mac
kw:macintosh
kw:magic-folder
kw:manhole
kw:manifest
kw:manual-test-needed
kw:map
kw:mapupdate
kw:max_space
kw:mdmf
kw:memcheck
kw:memory
kw:memory-leak
kw:mesh
kw:metadata
kw:meter
kw:migration
kw:mime
kw:mingw
kw:minimal
kw:misc
kw:miscapture
kw:mlp
kw:mock
kw:more-info-needed
kw:mountain-lion
kw:move
kw:multi-users
kw:multiple
kw:multiuser-gateway
kw:munin
kw:music
kw:mutability
kw:mutable
kw:mystery
kw:names
kw:naming
kw:nas
kw:navigation
kw:needs-review
kw:needs-spawn
kw:netbsd
kw:network
kw:nevow
kw:new-user
kw:newcaps
kw:news
kw:news-done
kw:news-needed
kw:newsletter
kw:newurls
kw:nfc
kw:nginx
kw:nixos
kw:no-clobber
kw:node
kw:node-url
kw:notification
kw:notifyOnDisconnect
kw:nsa310
kw:nsa320
kw:nsa325
kw:numpy
kw:objects
kw:old
kw:openbsd
kw:openitp-packaging
kw:openssl
kw:openstack
kw:opensuse
kw:operation-helpers
kw:operational
kw:operations
kw:ophandle
kw:ophandles
kw:ops
kw:optimization
kw:optional
kw:options
kw:organization
kw:os
kw:os.abort
kw:ostrom
kw:osx
kw:osxfuse
kw:otf-magic-folder-objective1
kw:otf-magic-folder-objective2
kw:otf-magic-folder-objective3
kw:otf-magic-folder-objective4
kw:otf-magic-folder-objective5
kw:otf-magic-folder-objective6
kw:p2p
kw:packaging
kw:partial
kw:password
kw:path
kw:paths
kw:pause
kw:peer-selection
kw:performance
kw:permalink
kw:permissions
kw:persistence
kw:phone
kw:pickle
kw:pip
kw:pipermail
kw:pkg_resources
kw:placement
kw:planning
kw:policy
kw:port
kw:portability
kw:portal
kw:posthook
kw:pratchett
kw:preformance
kw:preservation
kw:privacy
kw:process
kw:profile
kw:profiling
kw:progress
kw:proxy
kw:publish
kw:pyOpenSSL
kw:pyasn1
kw:pycparser
kw:pycrypto
kw:pycrypto-lib
kw:pycryptopp
kw:pyfilesystem
kw:pyflakes
kw:pylint
kw:pypi
kw:pypy
kw:pysqlite
kw:python
kw:python3
kw:pythonpath
kw:pyutil
kw:pywin32
kw:quickstart
kw:quiet
kw:quotas
kw:quoting
kw:raic
kw:rainhill
kw:random
kw:random-access
kw:range
kw:raspberry-pi
kw:reactor
kw:readonly
kw:rebalancing
kw:recovery
kw:recursive
kw:redhat
kw:redirect
kw:redressing
kw:refactor
kw:referer
kw:referrer
kw:regression
kw:rekey
kw:relay
kw:release
kw:release-blocker
kw:reliability
kw:relnotes
kw:remote
kw:removable
kw:removable-disk
kw:rename
kw:renew
kw:repair
kw:replace
kw:report
kw:repository
kw:research
kw:reserved_space
kw:response-needed
kw:response-time
kw:restore
kw:retrieve
kw:retry
kw:review
kw:review-needed
kw:reviewed
kw:revocation
kw:roadmap
kw:rollback
kw:rpm
kw:rsa
kw:rss
kw:rst
kw:rsync
kw:rusty
kw:s3
kw:s3-backend
kw:s3-frontend
kw:s4
kw:same-origin
kw:sandbox
kw:scalability
kw:scaling
kw:scheduling
kw:schema
kw:scheme
kw:scp
kw:scripts
kw:sdist
kw:sdmf
kw:security
kw:self-contained
kw:server
kw:servermap
kw:servers-of-happiness
kw:service
kw:setup
kw:setup.py
kw:setup_requires
kw:setuptools
kw:setuptools_darcs
kw:sftp
kw:shared
kw:shareset
kw:shell
kw:signals
kw:simultaneous
kw:six
kw:size
kw:slackware
kw:slashes
kw:smb
kw:sneakernet
kw:snowleopard
kw:socket
kw:solaris
kw:space
kw:space-efficiency
kw:spam
kw:spec
kw:speed
kw:sqlite
kw:ssh
kw:ssh-keygen
kw:sshfs
kw:ssl
kw:stability
kw:standards
kw:start
kw:startup
kw:static
kw:static-analysis
kw:statistics
kw:stats
kw:stats_gatherer
kw:status
kw:stdeb
kw:storage
kw:streaming
kw:strports
kw:style
kw:stylesheet
kw:subprocess
kw:sumo
kw:survey
kw:svg
kw:symlink
kw:synchronous
kw:tac
kw:tahoe-*
kw:tahoe-add-alias
kw:tahoe-admin
kw:tahoe-archive
kw:tahoe-backup
kw:tahoe-check
kw:tahoe-cp
kw:tahoe-create-alias
kw:tahoe-create-introducer
kw:tahoe-debug
kw:tahoe-deep-check
kw:tahoe-deepcheck
kw:tahoe-lafs-trac-stream
kw:tahoe-list-aliases
kw:tahoe-ls
kw:tahoe-magic-folder
kw:tahoe-manifest
kw:tahoe-mkdir
kw:tahoe-mount
kw:tahoe-mv
kw:tahoe-put
kw:tahoe-restart
kw:tahoe-rm
kw:tahoe-run
kw:tahoe-start
kw:tahoe-stats
kw:tahoe-unlink
kw:tahoe-webopen
kw:tahoe.css
kw:tahoe_files
kw:tahoewapi
kw:tarball
kw:tarballs
kw:tempfile
kw:templates
kw:terminology
kw:test
kw:test-and-set
kw:test-from-egg
kw:test-needed
kw:testgrid
kw:testing
kw:tests
kw:throttling
kw:ticket999-s3-backend
kw:tiddly
kw:time
kw:timeout
kw:timing
kw:to
kw:to-be-closed-on-2011-08-01
kw:tor
kw:tor-protocol
kw:torsocks
kw:tox
kw:trac
kw:transparency
kw:travis
kw:travis-ci
kw:trial
kw:trickle
kw:trivial
kw:truckee
kw:tub
kw:tub.location
kw:twine
kw:twistd
kw:twistd.log
kw:twisted
kw:twisted-14
kw:twisted-trial
kw:twitter
kw:twn
kw:txaws
kw:type
kw:typeerror
kw:ubuntu
kw:ucwe
kw:ueb
kw:ui
kw:unclean
kw:uncoordinated-writes
kw:undeletable
kw:unfinished-business
kw:unhandled-error
kw:unhappy
kw:unicode
kw:unit
kw:unix
kw:unlink
kw:update
kw:upgrade
kw:upload
kw:upload-helper
kw:uri
kw:url
kw:usability
kw:use-case
kw:utf-8
kw:util
kw:uwsgi
kw:ux
kw:validation
kw:variables
kw:vdrive
kw:verify
kw:verlib
kw:version
kw:versioning
kw:versions
kw:video
kw:virtualbox
kw:virtualenv
kw:vista
kw:visualization
kw:visualizer
kw:vm
kw:volunteergrid2
kw:volunteers
kw:vpn
kw:wapi
kw:warners-opinion-needed
kw:warning
kw:weapi
kw:web
kw:web.port
kw:webapi
kw:webdav
kw:webdrive
kw:webport
kw:websec
kw:website
kw:websocket
kw:welcome
kw:welcome-page
kw:welcomepage
kw:wiki
kw:win32
kw:win64
kw:windows
kw:windows-related
kw:winscp
kw:workaround
kw:world-domination
kw:wrapper
kw:write-enabler
kw:wui
kw:x86
kw:x86-64
kw:xhtml
kw:xml
kw:xss
kw:zbase32
kw:zetuptoolz
kw:zfec
kw:zookos-opinion-needed
kw:zope
kw:zope.interface
p/blocker
p/critical
p/major
p/minor
p/normal
p/supercritical
p/trivial
r/cannot reproduce
r/duplicate
r/fixed
r/invalid
r/somebody else's problem
r/was already fixed
r/wontfix
r/worksforme
t/defect
t/enhancement
t/task
v/0.2.0
v/0.3.0
v/0.4.0
v/0.5.0
v/0.5.1
v/0.6.0
v/0.6.1
v/0.7.0
v/0.8.0
v/0.9.0
v/1.0.0
v/1.1.0
v/1.10.0
v/1.10.1
v/1.10.2
v/1.10a2
v/1.11.0
v/1.12.0
v/1.12.1
v/1.13.0
v/1.14.0
v/1.15.0
v/1.15.1
v/1.2.0
v/1.3.0
v/1.4.1
v/1.5.0
v/1.6.0
v/1.6.1
v/1.7.0
v/1.7.1
v/1.7β
v/1.8.0
v/1.8.1
v/1.8.2
v/1.8.3
v/1.8β
v/1.9.0
v/1.9.0-s3branch
v/1.9.0a1
v/1.9.0a2
v/1.9.0b1
v/1.9.1
v/1.9.2
v/1.9.2a1
v/cloud-branch
v/unknown
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: tahoe-lafs/trac#1296
No description provided.