Merge lp://staging/~xaav/loggerhead/export-tarball into lp://staging/loggerhead
- export-tarball
- Merge into trunk-rich
Status: | Merged |
---|---|
Merged at revision: | 461 |
Proposed branch: | lp://staging/~xaav/loggerhead/export-tarball |
Merge into: | lp://staging/loggerhead |
Diff against target: |
359 lines (+131/-14) 12 files modified
.bzrignore (+2/-0) loggerhead/apps/branch.py (+4/-2) loggerhead/config.py (+3/-0) loggerhead/controllers/__init__.py (+1/-1) loggerhead/controllers/download_ui.py (+39/-8) loggerhead/controllers/revision_ui.py (+2/-0) loggerhead/exporter.py (+46/-0) loggerhead/history.py (+5/-1) loggerhead/templates/menu.pt (+4/-0) loggerhead/templates/revision.pt (+4/-1) loggerhead/tests/test_controllers.py (+20/-0) loggerhead/tests/test_simple.py (+1/-1) |
To merge this branch: | bzr merge lp://staging/~xaav/loggerhead/export-tarball |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Gavin Panella (community) | Abstain | ||
John A Meinel | Needs Information | ||
Ian Booth (community) | code* | Approve | |
Martin Pool | Approve | ||
Robert Collins | Pending | ||
Vincent Ladeuil | Pending | ||
Martin Albisetti | Pending | ||
Review via email: mp+66408@code.staging.launchpad.net |
This proposal supersedes a proposal from 2011-06-08.
Commit message
Description of the change
This branch **may** accomplish exporting the tarball using chunked transfer encoding. The code all looks to be correct, but I have not tested it, so I would like your opinion.
Thanks!
Martin Pool (mbp) wrote : Posted in a previous version of this proposal | # |
Robert Collins (lifeless) wrote : Posted in a previous version of this proposal | # |
This looks very interesting.
Three isues:
1)
+class TarExporterFile
+
+ def __init__(self):
+ self._buffer = ''
+
+ def write(self, str):
+ self._buffer += str
+
+ def get_buffer(self):
+ buffer = self._buffer
+ self._buffer = ''
+ return buffer
This is going to be somewhat inefficient. Try this:
+class TarExporterFile
+
+ def __init__(self):
+ self._buffer = []
+
+ def write(self, str):
+ self._buffer.
+
+ def get_buffer(self):
+ try:
+ return ''.join(
+ finally:
+ self._buffer = []
2) There are no tests for this. the test suite is still pretty new, but its a good idea to test things - in particular in cases like this we need to be fairly confident it will be incremental and not block on the export - I can imagine the wsgi layer buffering everything, for instance. [in fact, I'll lay odds it will unless we fix a few things].
3) The export function is a copy-paste-tweak of the core from bzrlib. This will lead to bugs as that code base evolves - we should instead get a supported function in bzrlib lib that we can import and use.
I'm putting this back to WIP - but its a great start. Please keep at it and just shout if you need pointers.
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
> 3) The export function is a copy-paste-tweak of the core from bzrlib. This will lead to bugs as
> that code base evolves - we should instead get a supported function in bzrlib lib that we can
> import and use.
Well, there is only one problem with that. According to the WSGI spec, you must return an iterable that will export the blocks. If I were to call the provided function, it would be impossible to break the response into pieces because the provided function would export it all at once. I know that it is a copy and paste tweak, but there is really no way I can inject the 'yield' keyword into the provided function. If you have another suggestion, I would be glad to hear it.
Issue number one I will be glad to fix.
Regarding issue number two, I have not written tests before but I will try my best.
Robert Collins (lifeless) wrote : Posted in a previous version of this proposal | # |
On Wed, Jun 1, 2011 at 9:46 AM, Geoff <email address hidden> wrote:
>> 3) The export function is a copy-paste-tweak of the core from bzrlib. This will lead to bugs as
>> that code base evolves - we should instead get a supported function in bzrlib lib that we can
>> import and use.
>
> Well, there is only one problem with that. According to the WSGI spec, you must return an iterable that will export the blocks. If I were to call the provided function, it would be impossible to break the response into pieces because the provided function would export it all at once. I know that it is a copy and paste tweak, but there is really no way I can inject the 'yield' keyword into the provided function. If you have another suggestion, I would be glad to hear it.
Extract the function in bzrlib into two parts - a generator (what you
have here) and a consumer than consumes it all triggering the writes.
Then we can reuse the generator.
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
> On Wed, Jun 1, 2011 at 9:46 AM, Geoff <email address hidden> wrote:
> >> 3) The export function is a copy-paste-tweak of the core from bzrlib. This
> will lead to bugs as
> >> that code base evolves - we should instead get a supported function in
> bzrlib lib that we can
> >> import and use.
> >
> > Well, there is only one problem with that. According to the WSGI spec, you
> must return an iterable that will export the blocks. If I were to call the
> provided function, it would be impossible to break the response into pieces
> because the provided function would export it all at once. I know that it is a
> copy and paste tweak, but there is really no way I can inject the 'yield'
> keyword into the provided function. If you have another suggestion, I would be
> glad to hear it.
>
> Extract the function in bzrlib into two parts - a generator (what you
> have here) and a consumer than consumes it all triggering the writes.
>
> Then we can reuse the generator.
Okay, I see what you mean.
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
See Bug #791005 for further information on this.
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
Okay, I think this should work, but I haven't tested it yet.
Martin Pool (mbp) wrote : Posted in a previous version of this proposal | # |
Thanks, xaav.
When you say "haven't tested" do you mean just "not written any tests", or "not even been able to run it"?
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
I haven't written any tests (Sorry, I'll do this ASAP.)
I also have not been able to run it because I'm lazy and it requires too much work to get loggerhead running on W1nd0w$.
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
Okay, I've added a simple tarfile test. However, I am not able to run the test to I would appreciate if someone would do that for me and/or try to download a tarball from their browser.
Gavin Panella (allenap) wrote : Posted in a previous version of this proposal | # |
Once I'd set up a virtualenv with the right prerequisites, I got the
following error when running the test suite:
{{{
Traceback (most recent call last):
...
File ".../loggerhead
from loggerhead.
File ".../loggerhead
from loggerhead.
File ".../loggerhead
from loggerhead.exporter import export_tarball
ImportError: cannot import name export_tarball
}}}
After fixing that I got the following error from
TestDownloadTar
{{{
Traceback (most recent call last):
File "/usr/lib/
return fn(*args, **kwargs)
File "/usr/lib/
return self._get_
File ".../loggerhead
app = self.setUpLogge
File ".../loggerhead
branch_app = BranchWSGIApp(
AttributeError: 'TestDownloadTa
}}}
Obviously this needs some work.
We've been talking about taking more of a "patch pilot" approach in
Launchpad. That seems to mean that one of the core team - fwiw, I
would be happy to do it - would actively help getting this landed,
rather than just reviewing it. Would you like that, or would you
prefer to iterate on your own?
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
Sorry, I had been gone. I will be sure and look into this right away!
On Thu, Jun 16, 2011 at 8:56 AM, Gavin Panella
<email address hidden>wrote:
> Review: Needs Fixing
> Once I'd set up a virtualenv with the right prerequisites, I got the
> following error when running the test suite:
>
> {{{
> Traceback (most recent call last):
> ...
> File ".../loggerhead
> from loggerhead.
> File ".../loggerhead
> from loggerhead.
> DownloadTarballUI
> File ".../loggerhead
> from loggerhead.exporter import export_tarball
> ImportError: cannot import name export_tarball
> }}}
>
> After fixing that I got the following error from
> TestDownloadTar
>
> {{{
> Traceback (most recent call last):
> File "/usr/lib/
> _run_user
> return fn(*args, **kwargs)
> File "/usr/lib/
> in _run_test_method
> return self._get_
> File ".../loggerhead
> test_download_
> app = self.setUpLogge
> File ".../loggerhead
> branch_app = BranchWSGIApp(
> AttributeError: 'TestDownloadTa
> }}}
>
> Obviously this needs some work.
>
> We've been talking about taking more of a "patch pilot" approach in
> Launchpad. That seems to mean that one of the core team - fwiw, I
> would be happy to do it - would actively help getting this landed,
> rather than just reviewing it. Would you like that, or would you
> prefer to iterate on your own?
>
> --
> https:/
> You are the owner of lp:~xaav/loggerhead/export-tarball.
>
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
We've been talking about taking more of a "patch pilot" approach in
Launchpad. That seems to mean that one of the core team - fwiw, I
would be happy to do it - would actively help getting this landed,
rather than just reviewing it. Would you like that, or would you
prefer to iterate on your own?
That would be great! Any help would be greatly appreciated.
xaav (xaav) wrote : Posted in a previous version of this proposal | # |
Okay, I've fixed some stuff (the tests are still broken), but here is what I'm getting:
Traceback (most recent call last):
File "C:\Python27\
ine 1068, in process_
self.
File "C:\Python27\
self.
File "C:\Python27\
self.handle()
File "C:\Python27\
ine 442, in handle
BaseHTTPReq
File "C:\Python27\
self.
File "C:\Python27\
ine 437, in handle_one_request
self.
File "C:\Python27\
ine 289, in wsgi_execute
for chunk in result:
File "C:\Users\
xport_archive
for _ in get_export_
File "C:\Python27\
port_generator
root = get_root_name(dest)
File "C:\Python27\
ot_name
dest = os.path.
File "C:\Python27\
return split(p)[1]
File "C:\Python27\
d, p = splitdrive(p)
File "C:\Python27\
if p[1:2] == ':':
TypeError: 'NoneType' object is not subscriptable
Any help would be appreciated.
Gavin Panella (allenap) wrote : Posted in a previous version of this proposal | # |
Cool. I am busy this week, but I might get to it. If not, next week for sure.
Vincent Ladeuil (vila) wrote : Posted in a previous version of this proposal | # |
Hi,
I almost got the test running with some additional fixes
(available at lp:~vila/loggerhead/export-tarball) only to run
into a bug in bzr itself (I think you should be able to fix that
one ;).
Note that your code requires bzr >= 2.4 (launchpad only runs
2.3.3 so far) so we'll need some support from the lp guys to
deploy a more recent version there.
Summary of my fixes:
- you need to create a branch (with some content even) before
being able to call
app = self.setUpLogge
So I've added a setUp method for your class to do that. You
probably want to add *more* tests to check that you get a valid
tarball with the expected content (which an empty branch
doesn't allow ;).
- you're calling get_export_
the code in bzrlib defaults to dest to set root. This raises an
interesing point: which root should be used here (i.e. what do
we want to prefix all the paths in the archive
with). <project>-<branch nick>-<revno> may be nice (but ask
others for feedback too).
- you used '.tar.gz' for the format but bzr expects either 'tgz'
OR a dest file name to deduce the format from the file
suffix. I just used 'tgz' there.
With these fixes in place we get:
=======
ERROR: bzrlib.
-------
_StringException: Text attachment: log
------------
0.622 creating repository in file://
0.624 creating branch <bzrlib.
0.631 trying to create missing lock '/tmp/testbzr-
0.631 opening working tree '/tmp/testbzr-
0.642 export version <InventoryRevis
0.649 opening working tree '/tmp/testbzr-
------------
Text attachment: traceback
------------
Traceback (most recent call last):
File "/usr/lib/
return fn(*args, **kwargs)
File "/usr/lib/
return self._get_
File "/home/
res = app.get('/tarball')
File "/usr/lib/
return self.do_
File "/usr/lib/
**req.environ)
File "/usr/lib/
Gavin Panella (allenap) wrote : | # |
Hi,
Please can you resolve the conflicts?
Text conflict in loggerhead/
Text conflict in loggerhead/
Text conflict in loggerhead/
Gavin.
xaav (xaav) wrote : | # |
Okay.
- 451. By xaav <email address hidden>
-
Merged lp:loggerhead
- 452. By xaav <email address hidden>
-
Fixed extension issue
xaav (xaav) wrote : | # |
Is there any reason this is being held up? It worked fine for me.
Martin Pool (mbp) wrote : | # |
[fix] It looks like you want tarballs disabled by default (which I agree with), so it seems a bit strange to me that the keyword arguments default to true.
[fix] You seem to be giving people uncompressed tarballs? .tgz is probably better. The default value to export_archive is unnecessary and probably just a distraction if it's called from only one place that does specify the value.
Were you able to get the tests to run and pass?
Aside from that it looks good to me.
xaav (xaav) wrote : | # |
> [fix] You seem to be giving people uncompressed tarballs? .tgz is probably better. The default value to export_archive is unnecessary and probably just a distraction if it's called from only one place that does specify the value.
.tgz tarballs are not possible due to a bug in bzr. It is not within the scope of this patch to fix that bug.
> Were you able to get the tests to run and pass?
Yes. Everything passes.
> [fix] It looks like you want tarballs disabled by default (which I agree with), so it seems a bit strange to me that the keyword arguments default to true.
What line are you referring to?
Martin Pool (mbp) wrote : | # |
> .tgz tarballs are not possible due to a bug in bzr. It is not within the scope of this patch to fix that bug.
So, when we fix that bug, we'll change this to send tgz instead?
Could you tell me the bug number? Perhaps it would be worth
mentioning this in a comment
>
>
>> Were you able to get the tests to run and pass?
>
> Yes. Everything passes.
Great!
>
>> [fix] It looks like you want tarballs disabled by default (which I agree with), so it seems a bit strange to me that the keyword arguments default to true.
>
> What line are you referring to?
>
@@ -49,7 +49,7 @@
def __init__(self, branch, friendly_name=None, config={},
- served_
+ served_
xaav (xaav) wrote : | # |
> Could you tell me the bug number? Perhaps it would be worth mentioning this in a comment.
I really don't know if the bug has been reported. All I know is if it is changed to .tar.gz, a 500 internal server error occurs and the traceback goes right into bzrlib.
I'm not the only one with the problem, vila encountered the same problem. For more information, see his comment.
xaav (xaav) wrote : | # |
>
>> [fix] It looks like you want tarballs disabled by default (which I agree with), so it seems a bit strange to me that the keyword arguments default to true.
>
> What line are you referring to?
>
@@ -49,7 +49,7 @@
def __init__(self, branch, friendly_name=None, config={},
- served_
+ served_
Fixed.
Martin Pool (mbp) wrote : | # |
Oh I see. That looks pretty trivial; I'll see about fixing it.
Martin Pool (mbp) wrote : | # |
[fix] You'll need to also remove this line:
from bzrlib.
from history.py since it's not used and doesn't exist.
I fixed the unbound local warning here: https:/
When I run the tests for this (with those two fixes) I get a failure in your new test_download_
303 See Other
The resource has been moved to /;
you should be redirected automatically.
which makes it look like it's not actually matching the URL. Do you see this too?
Martin Pool (mbp) wrote : | # |
I'd really like to see this landed and live, so if you want any help just ask, here or on #bzr irc.
xaav (xaav) wrote : | # |
> When I run the tests for this (with those two fixes) I get a failure in your new test_download_
This is probably due to revision 455. I'll see what I can do.
xaav (xaav) wrote : | # |
Try now.
Martin Pool (mbp) wrote : | # |
I get the same failure. You don't?
Martin Pool (mbp) wrote : | # |
However, changing it to just `res.body` fixes it, and then everything passes. I'll also add some checks that the response has the right status code and headers, and I'll see if we can change it to get a tgz now my fix has landed.
xaav (xaav) wrote : | # |
> and I'll see if we can change it to get a tgz now my fix has landed.
This is bleeding-edge code, so you'll need to get lp to upgrade their bzr version.
Martin Pool (mbp) wrote : | # |
On 11 July 2011 13:34, Xaav <email address hidden> wrote:
>> and I'll see if we can change it to get a tgz now my fix has landed.
>
> This is bleeding-edge code, so you'll need to get lp to upgrade their bzr version.
I think this is ok; landing a new bazaar at the same time as a new bzr
is no harder.
I'm going to switch it to sending tgz, and test it a bit
interactively, and I think then we'll be good to go.
xaav (xaav) wrote : | # |
I reverted the change in 455, because I couldn't download tarballs via a web browser.
Martin Pool (mbp) wrote : | # |
> I reverted the change in 455, because I couldn't download tarballs via a web
> browser.
Right, specifically turning it back on by default. I think that's fine.
I'm just testing it interactively in a browser and it does seem to work ok, which is great.
[fix] There is one bug which is that the tarball link always gets you the tarball from the current version of the branch, even if you're looking at an older version, which I think people would find confusing. Could you try to fix that?
My small changes are in lp:~mbp/loggerhead/export-tarball
xaav (xaav) wrote : | # |
BTW, that link is broken.
xaav (xaav) wrote : | # |
> [fix] There is one bug which is that the tarball link always gets you the tarball from the current version of the branch, even if you're looking at an older version, which I think people would find confusing. Could you try to fix that?
This is really a UI problem. Following the link /tarball/12 downloads revision 12, but I can't access the revision number from menu.pt, and I'm not that familiar w/ TAL.
Martin Pool (mbp) wrote : | # |
Sorry for the delay - that looks good to me.
Martin Pool (mbp) : | # |
Ian Booth (wallyworld) wrote : | # |
Given the number of eyeballs that have already seen this mp, it looks ok to me apart from some small lint issues. I can fix those and then land this mp.
xaav (xaav) wrote : | # |
Is this merged? If so, should the bug be closed?
Martin Pool (mbp) wrote : | # |
Hi xaav, it's not merged yet.
I spoke to Ian, and our plan is:
* we will get a final review, maybe from John
* Ian will test it out locally and if that's ok he will merge it in
to loggerhead trunk and shepherd deployment on lp
John A Meinel (jameinel) wrote : | # |
[info] You are already exposing information "can_export" into the menu.pt. Why not just expose the revision number there instead. So "exported_
[needsinfo] This defaults to always offering download links. Which means that if this rolls out on Launchpad, we will be letting people download via tarball. It hasn't been clear to me if this was specifically approved for Launchpad. As such *I* would tend to change:
25 def __init__(self, branch, friendly_name=None, config={},
26 graph_cache=None, branch_link=None, is_root=False,
27 - served_
28 + served_
To "export_
[needsinfo] This does all the exporting as raw '.tar' files. Without a way to configure it. One idea would be to change the 'export_tarballs' flag. Instead of being a boolean, it could be "tarball_
I'm certainly open to discussion on these points, but I do think we should have answers for them before we land this.
Gavin Panella (allenap) : | # |
Robert Collins (lifeless) wrote : | # |
FWIW the default being on is fine - we can override when we upgrade
LP's revno. The format should default to something sensible like
tar.gz I think.
Martin Pool (mbp) wrote : | # |
So the main remaining point then seems to be it might be nice to
compress them by default. But even there, it's pretty marginal
benefit.
And then it just needs someone to shepherd this through landing and deployment.
Anything else?
Martin
Robert Collins (lifeless) wrote : | # |
Nothing else from me.
Martin Pool (mbp) wrote : | # |
I will see about turning on compression, testing it, and landing it.
Thanks very much, that'd be a really useful feature to have. Thanks
also for making it optional, because probably some installations would
not want it on.
This looks broadly reasonable -- I'm not deeply familiar with
loggerhead -- but I am very curious why you apparently reimplemented
the export-to-tarball feature. I'd rather reuse the bzr code and if
necessary change it to let it be reused here.
When you say "not tested" do you mean you haven't even run it, or only
that you didn't add automatic tests?