/srv/irclogs.ubuntu.com/2009/12/04/#launchpad-dev.txt

=== Edwin-lunch is now known as EdwinGrubbs
wgrantSomething is broken.00:29
wgrantI appear deactivated.00:30
wgrantMaybe the email addresses have gone AWOL again.00:30
elmowgrant: err?00:33
wgrantelmo: All LP people appear to be deactivated at the moment.00:34
elmoyou mean we're in read-only mode?00:34
wgrantYes, but it doesn't normally go like this.00:35
elmooh, I see what you mean00:36
elmowow that's special00:36
elmoand not in a good way00:36
wgrantIt's not terribly surprising.00:37
elmoit's not?00:38
flacostewgrant: how do you see you are deactivated?00:38
elmoflacoste: you're in grey00:39
elmoand go to launchpad.net/~flacoste00:39
wgrantI'm grey, and my user page is blank.00:39
elmofor exampel00:39
wgrantAs is everyone else.00:39
flacostei see00:39
* thumper needs food badly00:41
flacostethis would point at the ValidPersonCache being screwed :-/00:41
mwhudsoni guess noone cares all that much right now, but 'make schema' seems screwed on devel :(00:42
wgrantmwhudson: What breaks? It worked for me yesterday.00:42
wgrantHm, although that might have been db-devel. I forget which ec2 demo -t uses.00:42
mwhudsonwgrant: comments.sql seems to contain comments for columns that have now been deleted00:43
mwhudsonlike build.estimated_build_duration00:43
mwhudson(it's possibly some local fuckup)00:43
* ajmitch tries on a clean devel branch00:43
wgrantmwhudson: I don't find it likely that columns have been deleted from devel lately.00:43
mwhudsonwgrant: you have a point there00:44
flacostemwhudson: that sounds like a build refactoring patch you and others have been working on00:44
ajmitchof course, getting "not a branch" from bzr when I try rocketfuel-get isn't helping00:44
mwhudsonflacoste: yes, but i don't get it00:45
mwhudsoni'll worry about it after the current chaos is over i guess00:45
flacosteajmitch: codehosting is down00:45
flacostefor the upgrade00:45
wgrantIs the upgrade working a little better this time?00:45
ajmitchflacoste: ok, I figured it was update-related, I was hoping it was 'normal' :)00:45
mwhudsonwgrant: a little00:46
* elmo snorts indescriminately in the background00:46
wgrantThe link in the read only notice points to blog.launchpad.net/maintenance, which only points to dev.launchpad.net/Maintenance, which points to identi.ca.01:23
wgrantI wonder if that could be done better.01:23
mwhudsonah well at least when launchpad is down i don't get so much mail01:29
thumpermwhudson: haha02:26
=== mbarnett changed the topic of #launchpad-dev to: This is Launchpad Development Channel | Week 4 of 3.1.11 | || Launchpad will be down/in read-only from 23:00 UTC until 05:00 UTC for a code update || PQM is closed; for RC only. salgado is this cycle's RM | I am Zero OOPS and So Can You! http://is.gd/4fkLl | https://dev.launchpad.net/ | Get the code: https://dev.launchpad.net/Getting | On-call review in #launchpad-reviews | Use http://paste.ubuntu.com/ for pastes | This channel is
=== stub1 is now known as stub
=== mbarnett changed the topic of #launchpad-dev to: This is Launchpad Development Channel | Week 4 of 3.1.11 | PQM is closed; for RC only. salgado is this cycle's RM | I am Zero OOPS and So Can You! http://is.gd/4fkLl | https://dev.launchpad.net/ | Get the code: https://dev.launchpad.net/Getting | On-call review in #launchpad-reviews | Use http://paste.ubuntu.com/ for pastes | This channel is
=== jelmer_ is now known as jelmer
wgrantgmb: While the staging import wasn't a terribly good test (we've reorganised milestones and such since staging last restored), please perform the import on production when you can.09:16
gmbwgrant: Will do, thanks.09:29
mrevellhey09:40
bigjoolsgmb: did you land this for jelmer? https://code.edge.launchpad.net/~jelmer/launchpad/bug390845/+merge/1492410:28
gmbbigjools: No; I lost track of that one and jelmer mentioned landing it himself the other day.10:35
bigjoolsok10:35
henningebigjools: are you already onto the branch to fix the translations uploads?10:53
bigjoolshenninge: I've not started it yet, but you can take over if you want? :)10:53
bigjoolsit's a one-liner10:53
henningebigjools: you were just going to add the permission for the translationgroup table, right?10:54
bigjoolsyep10:54
bigjoolsfor the queued user10:54
henningeI'll take it. It's my code that's failing ... ;)10:54
henningebigjools: btw, are the LCA-conf attendees all booked now?10:56
bigjoolshenninge: not at all10:56
henningebigjools: jeroen just replied from his vacation, thinking it's too late.10:57
bigjoolsah ok10:57
bigjoolshenninge: for going to the daily build sprint the week before as well?10:57
bigjoolsah I see his email, nm10:58
henningebigjools: AFAIK he was planning to go there10:58
henningebigjools: he just sent it, so he may be at a computer now ... ;)10:58
deryckMorning, all.10:59
bigjoolshowdy deryck10:59
=== matsubara-afk is now known as matsubara
=== adeuring1 is now known as adeuring
=== henninge is now known as henninge-lunch
bigjoolswgrant: fyi dogfood has the backported dpkg, when the DF buildd gets fixed up as well (Tuesday) we'll be able to do some testing13:22
=== mrevell is now known as mrevell-lunch
=== salgado-afk is now known as salgado
=== henninge-lunch is now known as henninge
bacmorning sinzui14:03
sinzuiYes it is14:03
bacsinzui: i thought about the snapshot problem some more and think we made things way too complicated14:04
bacwhat do you think about this instead?14:04
bachttp://pastebin.ubuntu.com/334532/14:04
=== mrevell-lunch is now known as mrevell
sinzuiI would worry about this approach14:06
bacsinzui: i realize we'd have to filter out form data that doesn't correspond to attributes on the object14:06
bacwhat is your concern?14:07
sinzuiThere are many views that update extra attributes to reconcile state. eg change A, B must be reset14:07
sinzuibac: consider that when you change the status of a bug, Lots of other things change too.14:07
sinzuiThis wont work with automated changes either. The janitor updates answer statues and send out an email that causes a change notification to go to all answer contacts14:11
bacsinzui: yeah, ok.14:11
bacsinzui: it just feels like we're doing too much work in the snapshot and tagging things to exclude is cumbersome.14:13
bacsinzui: but i see the other approach is incorrect14:13
sinzuibac: we really do not wan to exclude anything14:13
sinzuiwe are only excluding items that we learn as an after-thought, that we do not think users want to know about in emails.14:14
flacostemorning launchpadders14:15
bacmorning flacoste14:19
BjornT_gary_poster, salgado: do we have any documentation on how to update launchpad-developer-dependencies?14:51
gary_posterBjornT_: no we do not.  I have wanted that too, and I think I have been bitten by it enough to be able to write a start on the document.  We could then have salgado review (and maybe maxb too).  Do you need this now, or if I write this today would that be OK?14:52
salgadoBjornT_, I don't think so, but maybe maxb has written something14:52
maxbyes14:52
maxbdev.lp.net/LaunchpadPpa14:52
maxbBjornT_: ^14:52
gary_posterwow, thanks maxb!14:52
BjornT_maxb: thanks!14:54
BjornT_maxb: so, any documentation on how to add a new dependency, for someone who knows next to nothing about packaging? :)14:57
maxbEdit the debian/control file in a hopefully fairly obvious way14:58
maxbAnd definitely definitely take time to learn the "dch" tool for updating debian/changelog files14:59
BjornT_maxb: right. i figured out i had to change control, but i didn't know how to update the changelog14:59
BjornT_gary_poster, losas: btw, do you know which packages were installed in in the jscheck buildbot builder to make windmill tests runnable?15:01
gary_posterBjornT_: I do not.15:01
EdwinGrubbsthumper: ping15:06
EdwinGrubbs /nick Edwin-afk15:11
=== salgado is now known as salgado-lunch
henningebigjools: I am not getting anywhere with the test, though.15:36
henningebigjools: as in, I cannot reproduce it.15:36
henningeit = the error15:36
bigjoolshum15:37
bigjoolshenninge: you're calling spr.attachTranslationsFiles ?15:37
henningebigjools: now, one further down15:37
henningeTranslationImportqueue.addOrUpdateEntriesFromTarball15:38
bigjoolsdid you remove your "fix" from before and did a make schema?15:38
=== salgado-lunch is now known as salgado
henningebigjools: yes15:38
=== matsubara is now known as matsubara-lunch
bigjoolshenninge: as user queued?15:39
henningeyes15:39
bigjoolshenninge: is it reaching the code that accesses translationgroup?15:39
bigjoolsas per the stack trace15:40
henningebigjools: hm, need to check that ...15:40
henningebigjools: ah, prerequisite is an existing entry that is being updated15:42
* henninge updates test15:42
bigjoolsah15:42
bigjoolsexcellent, we found a buggy test :)15:42
sinzuibeuno: ping15:49
beunosinzui, pong15:51
sinzuibeuno: take a look at http://people.canonical.com/~curtis/linked-packages.png15:51
sinzuibeuno: I am struggling with a bug where users can create a packaging link between their project and a source package. The problem we have is that the package may only be a PPA, so it is not offically in ubuntu. We do not want to link to the ubuntu series in this case15:53
sinzuibeuno: I removed the link, and added a poor explanation that there is not official version15:53
beunosinzui, drop the series requirement and become a hero15:54
sinzuibeuno: that does not help15:54
bigjoolssinzui: sounds like the package vocab might be wrong when picking one?15:54
sinzuibeuno: We will let users link to the project, and we will select the default series.15:54
sinzuino15:54
bigjoolsit's done the other way around?15:55
sinzuibigjools: This is about the project, and it may link to fedora.15:55
sinzuibigjools: This picture is an extension of a branch I have that filters out the unversioned sps from lucid/+packaging15:56
bigjoolsso you need to check that the package is published in that distro before allowing the link15:56
sinzuibigjools: this picture does that15:56
sinzuibigjools: the issue is communication. Why is it not linked? Th answer is that there is no version in the official archive15:57
sinzuibigjools: since you are here, let's discuss a real example: https://edge.launchpad.net/gdp/+packages15:57
sinzuibigjools: Soyuz built those packages. I offer them in a PPA. It would be nice to tell the users it is in a PPA, not official ubuntu15:59
bigjoolssinzui: so you don't want to exclude packages only in PPAs?16:02
sinzuiBig there two pages for two perspectives16:03
sinzuibigjools: ^16:03
sinzuibigjools: https://edge.launchpad.net/ubuntu/lucid/+packaging16:04
sinzui^ This MUST only show what has a version. I do that in my branch by filtering out the packagings that have no version16:04
bigjoolstimeout ... :(16:05
bigjoolsouch16:05
sinzuibigjools: yep, it it loading all those bogus PPA packagings16:05
bigjoolssinzui: you need to join to a SPPH and Archive with the right purpose16:06
bigjoolssinzui: see Distribution.getCurrentSourceReleases for example16:07
sinzuibigjools: https://edge.launchpad.net/gdp/+packages16:07
sinzui^ shows where my project is package for all distributions. It just so happens that I only make ubuntu packages. Someone can make a fedora RPM and link it on launchpad.16:07
=== adeuring1 is now known as adeuring
bigjoolsand that page can see PPA packages too?16:08
sinzuibigjools: I think the error is in distroseries. Distroseries.packagings returns all packagings is disregard to SPPH16:08
bigjoolsyeah that looks horribly fuct16:09
bigjoolsit begs the question though16:10
sinzuibigjools: I would like to know how to see PPAs, or at least point the user how to find the PPA.16:10
bigjoolshow did a Packaging row get made for a package inly in a PPA?16:10
bigjoolsonly*16:10
sinzuiThat is very easy16:10
sinzuiI keep saying it too. anyone can create a link beween an project and an SP in ANY distribution because Launchpad wants to model everything16:11
bigjoolsok well you can fix that property easily16:11
sinzuibigjools: I do not think it is broken16:11
bigjoolsassuming you only want to return packages published in the same series in the main archive?16:11
bigjoolswhat do you want it to do?16:11
sinzuibigjools: yes, that is what my disrtoseries + packaging changes do...and our sample data is so bad it actually behaves like the bad data in production...easy to test \o/16:12
bigjoolsyou said " I think the error is in distroseries. Distroseries.packagings..."16:13
bigjoolsheh16:13
sinzuibigjools: yes, that is where I am fixing the issue16:13
=== beuno is now known as beuno-lunch
sinzuibut thera are  *two* perspectives. the lucid perspective is easy to fix16:13
bigjoolshow did you fix it?16:13
bigjoolsright, you want to see distro and PPA packages separately, or at least identify the difference?16:14
sinzuido not show unpublished source packages. I know that because the packagings has not currentrelease16:14
bigjoolsso you join to SPPH with status in (1,2)16:15
henningebigjools: interesting, I get more "perission denied" errors now ... translationgroup has not yet been among them.16:15
bigjools(pending, published)16:15
sinzuifor the project someone might has an archive with fedora, suse, and ubuntu pacckages, so users add a link. I believe you can see that same action on my gdp/+packages page.16:15
bigjoolshenninge: that is worrying, it sounds like the publisher can go bang any any minute16:16
sinzuibigjools: I will update the query16:16
=== adiroiba1 is now known as adiroiban
bigjoolssinzui: if you're filtering on published packages it will never show links to non-ubuntu distros16:17
sinzuibigjools: you are singlelu thinking of lucid, that is not an issue. it is easy to solve.16:18
sinzuibigjools: the issue is the project. you have its own list,16:18
sinzuibigjools: it has it's own list16:18
* bigjools is getting more confused16:19
bigjoolsall I am saying is that if you add the fix you just suggested, you won't see anything for Fedora etc16:19
bigjoolsbut I am not sure I really understand your problem now!16:19
sinzuibigjools: That is not so, because the fix for the distroseries -> packagings will not affect a project. You are, you need to remember that project -> series -> packagings is a legitmate relationship, We do not know what is in fedora, so we believe the user when he tells us that16:20
sinzuiIn the example we are talking about, I know the package is in a PPA, and i wonder if it is possible for me it identify that and link to the ppa's info instead of the distroseries's official SP.16:22
bigjoolsthe gdp example?16:22
sinzuiIt happens to be one that I know has package built in the last week16:22
bigjoolssee Archive.getPublishedSources()16:23
bigjoolsyou can't re-use it as it is, but you can adapt its query to check all PPAs to see where something is published16:24
sinzuithat may help16:24
bigjoolsactually16:24
bigjoolsnoodles775: which query is the PPA search using at the bottom of the DSP page?16:25
=== deryck is now known as deryck[lunch]
bigjoolssinzui: DSP.findRelatedArchives()16:28
noodles775Sorry, yes.16:29
henningebigjools: ok, now I did reproduce the error. Had the wrong line commented out in security.cfg ... :(16:29
sinzuithat look very helpful16:29
bigjoolsnoodles775: np I was being lazy :)16:29
bigjoolshenninge: !16:29
=== matsubara-lunch is now known as matsubara
=== beuno-lunch is now known as beuno
adiroibandanilo__: can you please take a look at bug 491454. If its valid, I would like to look at it durring this weekend17:18
mupBug #491454: Search English string on entire Project / DistroSeries <search> <Launchpad Translations:New> <https://launchpad.net/bugs/491454>17:18
=== deryck[lunch] is now known as deryck
danilosadiroiban, it's a valid use case, but it's harder than you might think: just a single series is probably much easier, but the main problem is dealing with performance17:36
adiroibandanilos: i think,a single series would solve 90% of ubuntu translation needs regarding searching for english strings17:38
adiroibandanilos: in most cases they know in what Ubuntu version they should look for a string17:38
adiroibanno need to have a search in all active series17:39
danilosadiroiban, I agree, it's still not trivial for performance reasons17:39
adiroibandanilos: ok. thanks!17:40
danilosadiroiban, in general, the only complication is figuring out right SQL; I do have a few ideas on how that would work, but basically, you'd have to test it with our data set (i.e. millions of rows in postgres)17:41
adiroibandanilos: or with my 5 years old computer17:42
danilosadiroiban, well, the other complication is how to come up with a good UI that will clearly explain that you are searching only through English and that it's impossible to search for non-English17:42
danilosadiroiban, believe me, it's not the same :)17:42
adiroibandanilos: you are saying it is very hard to reproduce the production installation on my computer?17:43
adiroibanor that it is not possible :)17:43
danilosadiroiban, yeah, it is... basically, the tests I did were on staging, which relatively closely resembles production databases, and I was able to get decent performance out of it17:44
adiroibandanilos: ok. np. I will look into other bugs17:44
danilosadiroiban, however, with postgres, it depends on a lot of other things as well, and ultimately, one can probably solve it with right partial indexes and full text search, but it's still requires a lot of testing to make sure it works17:45
danilosadiroiban, sure, thanks... I can probably be convinced to look into it myself, but as I said, it's mostly about coming up with queries and decent performance in actual circumstances :)17:47
=== gary_poster_ is now known as gary_poster
adiroibandanilos: ok. I only took a brief picture of rosetta db ... i don't know if msgstr table is partitioned based on langauage17:48
danilosadiroiban, it's not, and even if it was, you'd soon run into a postgres issue where it doesn't really choose optimal query plans even with partial indexes :)17:49
danilosadiroiban, i.e. it does a sequential scan of the entire table first anyway if you are using (I)LIKE for matching17:49
adiroibandanilos: i was hopping you can limit somehow the scan on only one table17:54
danilosadiroiban, yeah, but it's not partitioned, and that's what partial indexes should be for, but it doesn't really work like that with postgres and large tables17:55
adiroibandanilos: and partitioning  now would break any functionality  ?17:57
danilosadiroiban, no, if done properly, it's just a lot of work18:00
danilosadiroiban, one of the things is that there are many messages which are used in different languages (i.e. potranslation table contains only unique strings)18:01
adiroibanok. thanks.18:02
adiroibanI will leave it for the future...18:02
danilosadiroiban, if you want to take on that, I'd be happy to talk about it anytime and direct you exactly where to look18:03
adiroibandanilos: yep. I still need to read about postresq... but if partial index are not working18:04
adiroibani think that in the long term, partitioning is a must.. and I will try to look into it18:04
danilosadiroiban, oh, they are working, but not sufficiently well with like searches; it works better with FTS, but that increases the amount of data we store18:05
danilosadiroiban, oh, indeed, that was part of the initial plans for implementing search as well, and the bug you filed was supposed to be the very next step, but we just never got to it :)18:06
adiroibandanilos: thanks for all the details. I have to go now. cheers18:07
danilosadiroiban, cheers18:07
danilosadiroiban, btw, we should exchange our photos from UDS :)18:08
=== dobey_ is now known as dobey
sinzuibac: is pqm open?19:05
bacsinzui: not yet.  mbarnett is going to do it soon.19:06
sinzuibac: how did you manage this: https://edge.launchpad.net/launchpad-foundations/+milestone/3.1.1219:08
* sinzui has a lot of branches to land19:08
bacsinzui: lazr.lifecycle does not go through PQM19:10
bacsinzui: i merely pushed the fix up to the team branch19:10
sinzuibac: https://edge.launchpad.net/lazr.lifecycle is launchpad-foundations19:10
bacsinzui: i don't understand your point19:11
sinzuibac: change the project from launchpad-foundations to lazr.lifecycle19:11
bachttps://code.edge.launchpad.net/~lazr-developers/lazr.lifecycle/trunk19:11
bacah, i see19:11
sinzuiI was ever so hopeful I could land my branches19:12
sinzuibac: do we need that egg to to appear if rocketfuel before you can land the registry fix?19:13
bacsinzui: i will push download-cache (thanks for the reminder!) before landing the branch19:13
sinzuioh good, now i know the secret19:14
bacsinzui: doc/buildout.txt is helpful19:16
bacsinzui: even more so are the notes i took when gary_poster walked me through a change to lplib19:16
gary_posterimprovements to the shared instructions would be greatly appreciated.  What I wrote in doc/buildout.txt has made some happy; others, not so much.19:17
gary_posterMyabe there should be different instructions for different...uh, kinds of thinkers?  Something.19:17
bacsinzui, gary_poster: http://pastebin.ubuntu.com/334689/19:18
bacsweet and simple19:18
bacchopped from my history file, i think19:18
gary_posterbac: Cool, thanks.  Maybe I should muck with it and put it somewhere, like on the dev wiki.  That's good for local changes.  It doesn't Do The Right Thing for actually releasing a dist for others...but I honestly am not sure how to do that myself (I know how to use pypi, which is easy, but we have a launchpadlib script to release across pypi and launchpad, which didn't work last time I checked).19:22
gary_posterLeonard has some instructions for that on the wiki that I haven't tried lately (and things should be fixed now).19:22
gary_posterbac: I'll put it on the dev wiki today19:22
bacgary_poster: great, thanks19:22
bacgary_poster: who actually "releases" lazr packages?19:23
gary_posteranybody who has pypi privs to do so for the given package19:23
bacgary_poster: for instance, i made those changes to lazr.lifecycle sufficient enough to support LP19:23
bacbut i didn't create a release, do the pypi bits, etc19:23
bacshould i request a release be packaged up or just wait for someone to notice?19:24
bacor not worry since it is not a huge change19:24
gary_posterbac: in a perfect world, you would do it.  In that perfect world, you would have a PyPI account, and the tools would exist to make releasing that a single line command.  That perfect world *almost* exists except (1) I don't know if you have a PyPI command and (2) to my knowledge Leonard is the only one who has used the wonderful on-line command that does all the PyPI and Launchpad stuff, and I don't want to make you do it if19:26
gary_posterit works. So...19:26
gary_posterbac: send me an email :-/ <shrug> :-)19:26
bacok19:26
=== matsubara is now known as matsubara-afk
EdwinGrubbssinzui: I know we talked about bug 67909 a while back, but I can't remember the details. The dates on the series definitely look wrong.21:12
mupBug #67909: product release finder set all release dates to 23/10/2006 <prf> <Launchpad Registry:Triaged by edwin-grubbs> <https://launchpad.net/bugs/67909>21:12
sinzuiEdwinGrubbs: The finder is creating a milestone and a release and setting the value to something. The question really is "How do we know the true date that something was releases?" There is nothing in a file name that says that. We know "now'" is definitely wrong21:15
sinzuiEdwinGrubbs: I is may be possible to use the mod/create date fromt he remove file system. We need to change the finder rules to get a date with the listing. That is hard. doable, but always unreliable21:16
sinzuiEdwinGrubbs: We ultimately expect upstream adopters to fix this. They do not. They are happy to let the finder download 500 released for a single series.21:17
sinzuiEdwinGrubbs: Maybe the answer is to explore not having dates at all.21:18
EdwinGrubbssinzui: should I unassign myself from it? It doesn't sound like you really want me to work on it.21:19
sinzuikiko:  reopened it, you were still assigned21:20
sinzuiEdwinGrubbs: unassign your self. It is not important because it is not targeted to a milestone21:20
sinzuiEdwinGrubbs: since we cannot commit to fixing the issue, the bug is thus low21:21
EdwinGrubbsok, cool21:21
bacsalgado: will you update the topic here when PQM opens?21:42
salgadoyep21:42
bacthanks21:43
kikosinzui, so we can't use the file mod date from the listing? why? parsing unreliability?21:44
sinzuisalgado: I assume we are not doing a reroll.21:44
sinzuikiko: the listing is a HTML page that may be formatted in many ways. We can guess21:44
salgadosinzui, correct21:45
sinzuifab. time to release some projects21:45
kikosinzui, pity21:47
=== salgado changed the topic of #launchpad-dev to: This is Launchpad Development Channel | Week 4 of 3.1.11 | PQM is closed; for RC only | I am Zero OOPS and So Can You! http://is.gd/4fkLl | https://dev.launchpad.net/ | Get the code: https://dev.launchpad.net/Getting | On-call review in #launchpad-reviews | Use http://paste.ubuntu.com/ for pastes | This channel is
=== salgado is now known as salgado-afk
=== mbarnett changed the topic of #launchpad-dev to: This is Launchpad Development Channel | Week 4 of 3.1.11 | PQM is open for srs bsns | I am Zero OOPS and So Can You! http://is.gd/4fkLl | https://dev.launchpad.net/ | Get the code: https://dev.launchpad.net/Getting | On-call review in #launchpad-reviews | Use http://paste.ubuntu.com/ for pastes | This channel is
=== jelmer_ is now known as jelmer
adiroibanis there a config option in LP to enable listing in terminal of strom SQL queries?22:34
sinzuino, but I know you can enable postgress and or storm to log.22:37
sinzuiI do not know how to do that though22:37
adiroibanthanks. there are some tips here https://storm.canonical.com/Tutorial#Debugging ... I think I can use them and enable debugging22:39

Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!