/srv/irclogs.ubuntu.com/2005/09/14/#launchpad.txt

sabdflmpt: we definitely need a "highlighted box in the middle of the page"12:22
sabdflcould use portlet-style colours12:22
Nafallosabdfl: launchpad _will_ be open-source in the future, right? gajim upstream bugs me about it :-/.12:24
sabdflNafallo: yes, in time12:24
sabdflwe've released bits of it already12:24
sabdflsmall bits - libraries, and the calendar code12:25
Nafallo:-)12:25
mptsabdfl: .highlighted {background-color: #f7f9fa; border: 1px solid #8cacbb; padding: 0.5em;}12:25
Nafallosabdfl: thanx :-) he found this blog entry: http://azure.humbug.org.au/~aj/blog/2005/09/04#2005-09-04-launchpad-freeness12:25
Nafalloso I thought it was best to ask ;-)12:26
sabdflmpt: can i commit that?12:26
sabdflto launchpad.css?12:27
mptsure12:27
sabdflmpt: i'll go with dotted12:28
Burgundaviasabdfl, does launchpad have an easy way people can request apps to be packaged for a particular distro?12:29
mptnot dashed?12:29
=== mpt throttles kiko
sabdflBurgundavia: no, that's a great feature12:29
sabdflBurgundavia: if you do up a spec in wiki.launchpad.canonical.com we could discuss it at UBZ12:30
Burgundaviasabdfl, sure, will do after I push out the quicktour (which can now be seen here --> http://doc.ubuntu.com/gnome/quicktour/quicktour.html )12:30
=== Nafallo goes to look
Burgundaviathat version is old, but only a few minor cosmetic things have changed12:31
NafalloBurgundavia: you're not going to add screenshots first? ;-)12:31
NafalloBurgundavia: ah, :-)12:32
NafalloBurgundavia: like screenshots? ;-)12:32
BurgundaviaNafallo, no, I am going to ship it like that, so that users can simply imagine the great features12:32
NafalloBurgundavia: lol :-)12:32
NafalloBurgundavia: that's what I thought then ;-)12:33
BurgundaviaNafallo, I have to wait for art-freeze on the 29th to start doing screenshots12:33
Nafalloah12:33
=== Nafallo was right :-P
BurgundaviaNafallo, do use gaim?12:33
NafalloBurgundavia: gajim :-)12:33
Burgundaviagrr12:33
BurgundaviaI need a gaim user that connects to multiple different networks (aim, icq, etc.)12:34
Nafalloto bad I've converted my girlfriend then ;-)12:34
sabdflBurgundavia: looks awesome. why not borrow some of the ubuntu css?12:35
Burgundaviasabdfl, the top bar? I have considered it, not yet tried it out12:36
=== carlos -> bed
sabdflSteveA: do our cronscripts run as a user? can they?12:45
sabdfli have to touch an object, and it's giving me :12:45
sabdfl  File "/home/mark/projects/ubuntu/launchpad/lib/canonical/launchpad/subscribers/cve.py", line 8, in cve_modified12:45
sabdfl    cve.datemodified = UTC_NOW12:45
sabdflzope.security.interfaces.ForbiddenAttribute: ('datemodified', <Cve at 0x-579ab1b4>)12:45
sabdflgrief12:45
sabdflinteresting, because the code seems to be able to poke other values quite happily12:46
Nafallosabdfl: please... how do I get from here https://launchpad.net/distros/ubuntu/breezy/+sources/gajim/+pots/gajim/sv to the translation area? ;-)01:08
sabdflNafallo: add /+translate01:09
sabdflhttps://launchpad.net/distros/ubuntu/breezy/+sources/gajim/+pots/gajim/sv/+translate/+login01:09
sabdflthat's a bit of a brown paper bagger01:09
Nafallosabdfl: shouldn't that be a link in the portlet? :-)01:09
=== Lovechild [n=dnielsen@0x50c71cc7.adsl-fixed.tele.dk] has joined #launchpad
sabdflNafallo: yes, it should be01:10
Nafalloor what the "actions:"-thingie is called ;-)01:10
sabdfli'm guessing there's a fix on the way01:10
Nafallosabdfl: cool, thanx :-). I guess that would mean I don't have to file a bug about it? :-)01:11
sabdflNafallo: no, i think that one's already noted01:12
sabdfli may actually be responsible for that01:13
sabdfloops01:13
Nafallosabdfl: hehe :-)01:13
sabdflkiko: that's one for the 1.0 list01:13
Nafallosabdfl: feel free to patch it ;-)01:16
sabdflNafallo: i just did ;-)01:17
Nafallosabdfl: ROCK ON! :-D01:17
kikowow01:36
kikohmmm01:36
kikompt, so you're okay with the page titles I added?01:40
=== superted [n=superted@213.167.101.222] has joined #launchpad
mptkiko: In fresh RF the titles are already there and the pages work02:13
mptexcept that +gethelp links to +addticket, which is broken02:14
kikompt, must be the sab's interference02:14
mptProgrammingError: ERROR:  relation "ticket" does not exist  SELECT COUNT(*) FROM Ticket WHERE distribution = 1 AND sourcepackagename = 902:14
kikoargh02:14
kikompt, make schema02:15
mptok, that works too02:20
mptso I have nothing to do here, then02:20
kikompt, the pages are already done?02:20
kikowonderful02:20
mptwell, placeholders are there02:20
kikoany tweaking you'd like to do to them?02:20
mpt+translate is rather orange, but otherwise ok02:21
mptyeah, I've tweaked +gethelp02:21
kikomkay02:21
kikowell, thanks, then. this is actually worse than I had hoped for, because there's no way stuart's cherrypicking the fat patch all in02:21
kikoso I have no clue how I'm going to deal with this :-(02:21
mptIf we'd had the support thingy earlier, "Get Help Online..." could have directed straight to +support02:21
mptthough that's not a 100%-certain good idea, so perhaps it's good they are different URLs, to allow for redirecting or not based on later decisions02:23
mptThose URLs are going to have to live for years02:24
kikoyeah02:27
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [trivial]  adds status legend to distributon release translations page (bug 2138), and fixes customization link text (patch-2375: mpt@canonical.com)02:28
=== stub [n=stub@203-217-37-199.dyn.iinet.net.au] has joined #launchpad
jordifun, so tar.bz2 uploads break02:33
jordigood night mates02:34
Nafallojordi: night, and thanx for everything today :-)02:35
jordinp :)02:35
kikostub, so have a few moments to chat?03:39
stubkiko: sure03:53
kikostub, so couple of things03:53
kikobreezy release was on today03:53
kikoso tomorrow people might start hitting +gethelp and +translate03:53
kikothese pages are currently 500s03:53
=== niemeyer needs some sleep..
kikothankfully enough the sourcepackagenames exist now thanks to your good work03:54
niemeyerNight folks03:54
kikoniemeyer, sleep is for babies03:54
niemeyer:)03:54
stubnight03:54
kikostub, however, unless we fix the pagetitles, they will go on being 500s03:54
kikobreezy releasenoted launchpadintegration03:55
stubSo there is a patch to cherry pick to fix this?03:56
kikowell03:56
kikohere's the problem03:56
kikoI /have/ a patch which fixes this03:56
kikounfortunately mark landed a fix for the same problem in RF in his massive support-tracker branch03:57
kikoso much for keeping patches simple03:57
=== mpool [n=mbp@cor6-ppp610.for.dsl.connect.net.au] has left #launchpad []
stubSo we need to branch production--1.31, fix, and merge back into production--1.3103:57
stubOr I can just cherry pick your fix into production03:58
kikoI never landed it in RF because of mark's bonk.03:58
stubLanding to rocketfuel is nice, because it confirms that the code plays nice with head (cause the tests are run there), and when I cherry pick from there it confirms it runs nice with production too. But landing in rocketfuel is not necessary for production cherry picks.03:59
kikoI think the patch I landed added some failing tests to xx-notfound-traversals04:00
kikois that a big deal?04:00
kikostub, the patch basically adds pagetitles -- that's all that's broken there :-(04:01
stubYes - cherry picks will fail unless the tests pass04:01
kikostub, I'll mail you a diff; how about that?04:01
kiko:)04:01
stubSure04:02
stubIf I can remember how to apply a patch manually.04:02
kikopatch -p1 < patch04:02
kikosent04:04
kikostub, so on to the next set of problems04:05
kikostub, do you have an updated script from carlos?04:05
stubNo04:05
kikoreally?04:05
kikothat's a shame04:05
stubUnless he landed it in rocketfuel04:05
=== mpt [n=mpt@200-171-140-32.dsl.telesp.net.br] has joined #launchpad
kikosheesh.04:06
stubDoes that mean the last run failed and I can resync the staging database today?04:06
kikostub, well, it failed less horribly.04:06
stubNo diff from you yet btw...04:07
kikostub, so here, I actually have carlos' patch.04:07
kikogrumble grumble04:07
kikohttps://chinstrap.warthogs.hbd.com/~jamesh/pending-reviews/carlos.perello@canonical.com--2004/launchpad--devel--0/filtered-diff04:07
stubSo I should pull that branch and run the migration script against staging to see what happens04:08
kikostub, that in addition to RF should produce a beautiful database.04:09
kikowell04:09
kikoright, if you pick up the stuff carlos landed in RF as well.04:09
kikostub, so ready for part 3 in this drama?04:11
stubOk. I'll resync the staging database, update the code to rocketfuel trunk (with my config file fixes in pqm atm), merge in carlos' branch and run the migration script04:12
kikostub, cool. any idea on how long will it take?04:12
stubAbout two hours for staging updates to all happen (including the db sync), and another 20 odd hours for the migration script to run04:13
kiko20 hours depresses me04:13
kikoI was kinda hoping, you know04:13
kikoto generate some working language packs tomorrow04:14
kikoI should just accept the fact that we're not going to launch rosetta for the next 12 days, right?04:14
stubWhat? That someone pulled out some problematic database entries, added them into the sampledata so we wouldn't have to keep trial-an-error running against production data?04:14
kikohey04:15
kikocarlos has been adding tests04:15
stub;)04:15
kikothe issue is that there are lots of little corner cases!04:15
stubI'm hungy04:15
=== kiko throws stub an r
=== stub eats it
kikoai ai ai04:16
kikowell04:16
kikoI'll ask carlos to give me instructions on how to generate the language packs04:16
kikowho knows04:16
kikoI might convince our DBA to give me read-only access to staging04:16
stubYou got an account on macquarie or mawson?04:17
kikoI used to have one on mawson04:17
kikolet's see04:17
kikoPermission denied (publickey,keyboard-interactive).04:18
kikoI guess not anymore.04:18
stubI can give  you access if you get an account on a more-secure-than-chinstrap box04:18
kikoI'll work on that tomorrow. Does salgado have access?04:19
stubI think so04:20
stubNope...04:21
kikohmmm04:21
stubSame deal04:21
kikoI thought he had an account on one of those boxes04:21
kikookay, I'll ask elmo and stay up tomorrow.04:22
stubI'm checking. cprov has on mawson04:22
stubAs do you!04:22
stubUnless elmo closed accounts and left the home directories there04:23
kikoid kiko04:23
kikobut my password doesn't work, hmmm.04:23
stubYup04:23
kikowhee!04:23
kikoit worked04:23
stubyou are there.04:24
stubok... I'll open up readonly access for you.04:24
kikothanks04:24
=== kiko should probably generate an ssh key on chinstrap
stubYou type passwords?04:24
kikostub, does that make sense, generating a key and adding it to my authorized keys?04:24
kikonever04:24
kikobut I hadn't created keys on chinstrap, just that04:25
stubYou want a separate key for that account? 04:26
stub"psql -d launchpad_staging -H asuka.ubuntu.com -U ro" should now work for you04:26
kikostub, I don't want to go about copying private keys here and there04:26
stubWhy would you need to have any private keys on the servers?04:27
kikofor sshing from chinstrap to mawson?04:27
stubOh. I don't do that.04:27
elmoerr04:27
kikoyes elmo?04:27
kikois that frowned upon?04:28
elmoplease use the damn proxycommand trick04:28
kikoI use it04:28
kikoI was just fooled to sshing from chinstrap to mawson and considered the ssh key. but whatever..04:28
elmothen why you need to ssh from chinstrap to mawson?04:28
kikobecause I don't think too much about where I am sshing from04:28
kikoperhaps I need more sleep04:28
kikobut then again04:28
kikoso do you :-P04:28
kikostub, for the record, it's lowercase -h04:30
=== mp1 [n=mpt@200-171-140-32.dsl.telesp.net.br] has joined #launchpad
kikoand thanks04:31
stubkiko: If you had a private key on chinstrap that let kiko@chinstrap ssh to mawson without passwords or ssh-agent etc., you have just made mawson less secure than chinstrap (defeating the purpose of requiring you to have an account on a machine more secure than chinstrap.) Same think if you ever type your mawson password when logged into chinstrap.04:31
stub(not that ssh-agent is a particularly good idea to forward around either)04:32
stubDon't convert the attack trees into a mesh04:34
kikookay okay okay04:34
kikostub, ready for part 3 in the drama?04:36
stubYa know, you really don't need to raise the dramatic tension. Just spit it out ;)04:37
kikoI need to test the channel04:37
kikoso salgado has some shipitness to land tomorrow04:37
kikoit's not very difficult04:38
kikoI'm doing the review now04:38
kikohowever04:38
kikoit will land, say, tomorrow afternoon04:38
kikonow 04:38
kikothis doesn't need to go into production until tuesday/wednesday04:38
kikoso I was going to ask what you thought of this04:38
stubWe have landed worse ;)04:39
kikohow about cutting production like, say, saturday morning and delaying production rollout till wednesday 04:39
stubYup. Sounds good.04:39
kikoor whatever you feel comfortable with04:39
kikobecause otherwise it's going to be difficult to cherry-pick04:39
kikomark's landed the support tracker04:39
kikothat's going to be difficult 04:39
kikoI have a QA intern starting on monday04:40
kikoso I'll sic him on staging04:40
kikosee if he can find bustage in time to fix04:40
stubScore!04:40
=== stub high fives kiko
spivQ... A?04:41
kikowe try harder!04:41
spivWhat's that? ;)04:41
kikoquestions and answers04:41
kikohe asks questions, spiv answers "sorry, my bug"04:41
kikofor instance04:42
spivQ: "Why is it broken?" A: "It's software!"04:42
kikothere's this librarian issue04:42
stubTodays rollout was brought to you by the letters 'Q' and 'A'04:42
kikoI don't know if I've told you about it04:42
kikothere are lots of Qs in this issue04:42
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [trivial]  Staging and production config changes (patch-2376: stuart.bishop@canonical.com)04:42
kikoI don't imagine you'll have seen any As lying around? 04:42
stubI'm full of A04:43
spivNot yet, but I'll will be looking into today...04:43
stubOr I'm full of something, anyway04:43
kikooh so somebody fed you?04:43
spivBut in the mean time, I'm un-full of lunch.04:43
kikospiv, hooray for As04:43
kikolunch? is it that late already? my god04:43
stubDammit I still havn't had breakfast!04:43
stubtype faster kiko04:43
spivstub: Well, me either ;)04:44
stubI'm not really aware of the Librarian issue, but if spiv thinks he has a handle on it and will be working on it I probably don't need to ;)04:44
kikothat was all meant as just nastiness to master spiv04:45
kikoI know the issue is a lot trickier than the traceback suggests04:46
stubIs there a bug#?04:48
kikothat's a good question04:48
kikolet me see04:48
kikohttps://launchpad.net/malone/bugs/188704:49
=== stub kicks off the staging update
kikowho could have reported such bug?04:49
stubWhat is interesting is that http://librarian.launchpad.net/264524/264557/gl.po is actually there and downloadable from the librarian, so it is purely a client.py issue04:56
stubMaybe having difficulties downloading from the librarian (eg. when I forget to bounce it after an upgrade ;) ), but the exception being swallowed and converted to a LookupError04:57
spivstub: Well, it smells like a transaction issue.05:01
kikoto me the same05:01
stubspiv: Well, the librarian won't serve the file until the transaction that uploaded it has committed.05:02
stub(and possibly will need a small delay for the commit to propogate)05:02
spivTell me more about this "small delay".05:03
stubapart from that, I don't see a possible transaction issue in there.05:03
spivWell, just that the client is needing to access database rows that the server has added and committed..05:03
stubIf you say 'transaction.commit(); get_the_file_from_the_librarian()', there might be a race condition whilst PostgreSQL commits the transaction. If the librarian starts serving the file before that commit has finished, it will still see the old data in the table missing the newly added row.05:04
stub(But I'm guessing here)05:04
spivWell, the LookupError is due to a 404 on the server side.  I got it backwards; the server needs to see rows that the client inserted and committed.05:05
spivHmm.  I would have naively expected transaction.commit() to block until the commit was fully done and the changes visible to any new transaction.05:05
spivBut it would perhaps be interesting to see if immediately retrying would work around the problem.05:06
spivFood for thought... I should get some food for my stomach.05:07
=== robitaille [n=daniel@d154-5-117-228.bchsia.telus.net] has joined #launchpad
kiko-zzzmy god05:22
kiko-zzzneed to bed05:22
stubspiv: The Librarian connection will not see newly inserted rows if it is already inside a transaction because it is running in serializable transaction isolation level. eg. if Librarian thread had previously issued 'select' statements on the LibraryFileAlias it will not see newly inserted rows until the transaction is reset or the transaction isolation level changed.05:33
stubspiv: If we have the librarian issue con.set_isolation_level(0), it will even see uncommitted rows, which could greatly simplify our transactional semantics. As far as I can see, this will not adversely affect the librarian (as it never alters rows and new insertions will never conflict). 05:46
=== SteveA [n=steve@office.pov.lt] has joined #launchpad
spivstub: In theory, the librarian should be starting a transaction for each web request, and aborting it at the end of those requests.  Your set_isolation_level idea sounds good, though!06:01
=== stub considers upgrading to breezy
stubspiv: bugger. isolation level 0 is autocommit in psycopg, not read uncommitted (which PostgreSQL doesn't have :-( )06:37
spivAh, suck.06:37
stubspiv: set_isolation_level(1) might help in this case (read committed), which would avoid the need to reset the connection every request if for some reason it isn't being done. But it won't improve the Librarian client transactional semantics at all.06:39
spivI wonder if the client really is committing often enough.07:03
spivThe calls to the librarian and the calls to commit in po_export_queue.py are seperate enough that it's hard to tell.07:04
dilysMerge to rocketfuel@canonical.com/launchpad--production--1.31: [trivial]  Fix some page titles on production (patch-4: stuart.bishop@canonical.com)07:11
=== robertbb [n=robertbb@d154-20-129-24.bchsia.telus.net] has joined #launchpad
=== vinsci [n=nvinsci@dsl-sjkgw2jb1.dial.inet.fi] has left #launchpad ["Lmnar"]
=== niran [n=niran@sabin.Stanford.EDU] has joined #launchpad
spivstub: Good rant.08:02
stubDidn't get enough sleep last night08:03
stub;)08:04
spivClearly you should be sleep deprived more often ;)08:04
=== robitaille [n=robitail@d154-5-117-228.bchsia.telus.net] has joined #launchpad
=== dand [n=dand@gw.datagroup.ro] has joined #launchpad
=== carlos [n=carlos@243.Red-83-47-24.pooles.rima-tde.net] has joined #launchpad
carlosmorning09:10
spivcarlos: Morning.09:13
spivcarlos: can there be more than one pofile and one potemplate in a single export?09:14
carlosspiv, more than one pofile, yes. More than one potemplate no09:15
spivcarlos: Is it possible that the same pofile might be included in the same export multiple times?  If so, is it likely?09:20
=== spiv is finally understanding the po export code somewhat.
carlosspiv, no, it's not possible09:26
carlosspiv, the db model will not allow that09:26
spivThat's good news :)09:26
carlosspiv, in fact, I think kiko told me that the code is not able to handle that and if you request the pofile twice, you get a db error09:26
carlosspiv, hmm, well, we could export twice the same pofile but in different transactions09:27
carlosif different people ask for it09:27
carlosit will happen in the same export run, but different transactions09:27
spivWell the question I guess is will IPOExportRequestSet.popRequest return the same object multiple times in one invocation.09:28
spivAnd it seems the answer is no, which is good :)09:28
=== BjornT [n=bjorn@office.pov.lt] has joined #launchpad
carlosspiv, right, the answer is no09:29
carlosspiv, hmm, looking twice to the db model...09:30
carlosspiv, it's possible, but not usual09:30
spivHmm.09:30
spivSo, here's what made me ask the question:09:31
carlosspiv, if they request a pofile and later the same pofile as a .mo export09:31
spivtransaction.commit() happens between invocations of process_multi_object_request, which deals with multiple files.09:31
carlosspiv, hmm, forget that, the db model allows that, the code does not09:31
spiv(why the export code refers to "objects" instead of files I don't know)09:32
carlosspiv, no idea either, daf wrote that code09:32
carlosfrom what I see, yes, it should be 'files'09:32
jordihey09:42
=== superted [n=superted@213.167.101.222] has joined #launchpad
carlosjordi, hi09:47
carlosSteveA, hi, around?09:47
BjornTcarlos: SteveA should be around in 30 mins or so09:50
carlosBjornT, ok, thanks09:50
=== Seveas [n=seveas@ksl403-uva-132.wireless.uva.nl] has joined #launchpad
sabdflmoin moin10:02
Kinnison!niom niom :lfdbas10:08
lifelessmoin10:10
=== WaterSevenUb [n=WaterSev@195-23-220-223.net.novis.pt] has joined #launchpad
=== cprov [n=cprov@217.205.109.249] has joined #launchpad
SteveAhi10:29
SteveAi'm around10:29
SteveAcarlos: [omg10:29
SteveAum, 10:29
SteveAcarlos: ping10:29
SteveAsabdfl: scripts that use zcml generally run as a special user10:29
carlosSteveA, hi, did you see kiko's review ?10:29
SteveAthis user can read/write stuff that has a permission declared for it10:30
carlosSteveA, I have a question for you related to the review he did for one of my branches10:30
SteveAso in your case above, check that datemodified is in the interface, and is declared as a settable attribute.10:30
SteveAcarlos: i haven't read any email yet today.  kiko's review of what?10:30
carlosREVIEW: carlos.perello@canonical.com--2004/launchpad--devel--010:31
carlosSteveA, it's related to helpers.py10:31
carlosI need to know what should I do with some functions added there in that branch10:31
carlosSteveA, he asked me to check it with you10:32
lifelessjamesh: ping10:33
carlosso if you have time, I prefer to move it to the right place now instead of leaving it for another day (or we will forget it...)10:33
SteveAcarlos: okay, i'll look at it shortly.10:34
carlosSteveA, thank you10:35
SteveAso, it is about running "sanity_fixes" on a pot message set's data10:38
sabdflSteveA: the issue was a cut-and-paste readonly=True10:39
carlosSteveA, yeah10:39
SteveAsabdfl: okay, that makes sense.10:39
SteveAcarlos: so, can you make it a method on a pot msg set?10:39
sabdflSteveA: i have an issue, I'm trying to make a "removeform"10:39
sabdfland have been fudging it with an addform10:39
sabdflbut now that I'm trying to add events to the mix, it has all gone pear shaped10:40
=== mdke [n=matt@unaffiliated/mdke] has joined #launchpad
mdkehi all10:40
SteveAwhat's a typical url that this remove form will be at?10:40
sabdfl+unlinkbug10:40
SteveAon what?10:40
sabdflbasically, I want to render it like an add form10:40
mdkei heard the ubuntu members email addresses got set up, how do I activate mine? anyone know?10:40
mdkes/addresses/forwards10:41
SteveAi need to see the url, including its context object, to make sense of it10:41
sabdflbut instead of a def create() and def add(), I just want a def remove()10:41
SteveAwhat's the context object?10:41
sabdflin this case, it's a CVE10:42
sabdfland I want to link, and unlink, it from a bug10:42
sabdflso, i have a BugCve10:42
sabdfland the link form looks like an addform for a BugCve10:42
SteveAso, this unlinks a bug from the cve reference, but removing the BugCVE10:42
sabdflwith the CVE being a ContextWidget10:42
SteveAor perhaps altering the BugCVE10:42
sabdfland the bug being a bug number input widget10:42
carlosSteveA, hmm, could try to adapt it to use the 'self' argument yes, otherwise it will not make sense ther10:43
sabdflremoving the bugcve10:43
carlosthere10:43
sabdflthere's a similar pattern for subscriptions10:43
sabdfli've handled subscriptions by posting to the core ObjectView, and parsing the form in the __init__ of the object view10:43
SteveAcarlos: submission.pomsgset.potmsgset.apply_sanity_fixes(translation.translation)10:43
sabdflbut wanted to try something different for linking to bugs10:43
SteveAcan you use an edit form for this?10:44
SteveArather than an add form10:44
sabdflnot really, no10:44
sabdfli want to select something for removal10:44
sabdflthe problem at the moment is this10:44
sabdflwhen i remove the BugCve object, the addform createAndAdd method tries to adapt the return value of add() to an IBugCve10:45
sabdfland of course None won't adapt10:45
sabdfli was cheating, and returning the destroyed BugCve, but introducing events makes that trickery unworkable10:45
sabdfllet me see what I can do10:46
SteveAwhy do you specifically want to use an add form for removing something?10:47
carlosSteveA, sure10:47
sabdflSteveA: because there is no removeform10:49
sabdflit's a hack10:49
SteveAyou can completely override createAndAdd and make it do what you want.10:49
SteveAit sounds like a confusing hack, though.  seeing as this "let's link some content object to some other object, via a linking object, and have a ui on this" is a common pattern in launchpad...10:50
SteveAwe should have an admin-links kind of form that makes this non-hacky.10:51
BjornTKinnison: on PackageDBRework, in which section does BinaryPackageName belong?10:52
stubAn add form is just an edit form with create and some extra pain-in-the-bum zodb specific crack (must return an object implementing the interface, because it assumes that result will be stuffed in the ZODB somewere). Unless it has changed recently, edit form is more flexible (addForm extends editform I think)10:53
SteveAthe other thing about an add form is that it is meant for adding something that is not there already10:54
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [trivial]  remove unused, broken, code dealing with binary packages. remove BugFactory. (patch-2377: bjorn.tillenius@canonical.com)10:54
SteveAan edit form is about manipulating something that is already there10:54
SteveAa remove form, if it existed, would also be about manipulating something that is already there10:54
KinnisonBjornT: binarypackagename didn't change10:54
BjornTKinnison: well, it's broken (not the parts that malone uses, though), it references the BinaryPackage table10:55
sabdflSteveA: the problem is that i dont want to choose the thing to remove, BEFORE I display the form10:56
sabdflhere's the detail10:56
sabdfli'm viewing a CVE10:56
sabdflI want to go to CVE/+unlinkbug10:56
sabdflthere, I want to see a bug numer input widget10:56
sabdflwhen I post that form, if the bug number is one for which there is a bugcve on that cve, it should be deleted10:56
KinnisonBjornT: The sql object?10:56
sabdflthe addform is nice because it allows you to specify the details10:57
sabdflhence, input the bug number10:57
sabdflinstead of creating a new bugcve, though, i FIND the BugCve, and the destroy it10:57
sabdflbut, the addform then wants to go ahead and add something10:57
sabdfli just want to get rid of that part10:57
BjornTKinnison: yeah10:58
stubBecause you want to use addform built from the existing IBugCVE schema rather than create a schema to describe your form and use editform?10:58
KinnisonBjornT: make a new entry in the table, thanks for spotting it10:58
SteveAsabdfl: just override createAndAdd and make it do no creating and adding.10:58
stubMmm... that sounds familiar.10:59
SteveAhttp://faassen.n--tree.net/blog/view/weblog/2005/09/06/0  <-- faassen says to ignore browser:editform and browser:addform, and use zope.formlib.   we can experiment with this in a couple of weeks, when we get the latest zope3.11:00
sabdflstub: the editform wants to edit an object11:00
=== jinty [n=jinty@205.134.224.215] has joined #launchpad
SteveAthe editform wants to edit some data.  the data is defined by giving the editform a schema.  you can override EditForm.update() to do whatever you want when the form is updated.11:02
SteveAI mean EditView.update()11:03
SteveAit is possible to use EditView as the base class for your own view class, and make it a simple browser:page11:03
SteveAand not a browser:addform or browser:editform11:03
SteveAthat gives you a much simpler base to do customizations on11:04
SteveAEditView is in lib/zope/app/form/browser/editview.py11:04
=== mdke [n=matt@unaffiliated/mdke] has left #launchpad []
=== mdz [n=mdz@ca-studio-bsr1o-251.vnnyca.adelphia.net] has joined #launchpad
KinnisonSteveA: What is the officially accepted way of doing logical xnor in python?11:19
SteveAdon't mess with my head before i've had a cup of tea!11:20
Kinnisonddaa gave me ((bool) + (bool)) != 111:20
SteveAwe love punning11:21
Kinnisonwe do11:22
KinnisonI've commented the line as (bool) XNOR (bool)11:22
Kinnisonjust so we know what it's meant to be11:22
SteveA>>> def xnor(a, b):11:22
SteveA...     return (a and b) or (not a and not b)11:22
SteveA...11:22
SteveAclarity, please11:22
KinnisonHurrah for single-use clarity methods11:23
SteveAfor extra points, put the truth table in the docstring, as a doctest11:23
Kinnisonand for minus points, do it as a lambda?11:23
SteveAyes11:23
Kinnison:-(11:24
SteveAno docstring11:24
SteveAand, the confusing word "lambda"11:24
SteveAwhen it grows up, it'll be a sheepda11:24
=== Kinnison feels (left and right) or not (left or right) is a clearer xnor than yours
SteveAi just ripped it out of wikipedia11:25
Kinnisonheh11:25
KinnisonI just scribbled down a truth table11:25
SteveAaha11:26
SteveA(not a ^ b)11:26
SteveAhow about that?11:26
Kinnisonisn't ^ binary xor ?11:27
Kinnisonin which case we're back to punning11:27
Kinnison    if xnor(opts.generator is None, opts.intervention is None):11:27
Kinnisonthat's just dandy11:27
SteveA>>> True ^ False11:28
SteveATrue11:28
SteveAso, it does work boolean in a boolean context11:28
Kinnisonokay, since it returned a bool11:28
SteveAusing the xor function is nice and clear, though11:31
SteveAand i don't suppose speed matters at all here11:31
Kinnisongah11:32
Kinnisonit's too late11:32
Kinnison    if not ((opts.generator is None) ^  (opts.intervention is None)):11:32
Kinnisonand I'm not rewriting that line *AGAIN*11:32
SteveAokay11:32
=== BjornT [n=bjorn@office.pov.lt] has joined #launchpad
=== cprov [n=cprov@217.205.109.249] has joined #launchpad
KinnisonCan everyone please tell lifeless to get a better song?12:20
lifelessdum de dum, dum dum12:20
=== Kinnison 's brain dribbles out of his ears
lifelessdrib bib ble, drib le12:21
cprovSteveA: ping12:22
SteveAcprov: pong12:22
cprovSteveA:  could you do another quick-review for buildd ?12:22
SteveAok12:23
cprovSteveA: -> https://chinstrap.ubuntu.com/~dsilvers/paste/fileM8sw8a.html12:23
KinnisonIs there a cheap way to convert a dict of dicts into something with attributes instead of keys?12:26
carlosstub, are you running the migration script on staging already? or are you waiting for my merge?12:26
Kinnisonit appears you're not allowed to monkeypatch dict instances :-(12:27
stubcarlos: It is running now12:27
stub24.7005 done (985000 of 3987779). eta 12:26:46.29479412:28
SteveAKinnison: kind of12:28
carloscool12:28
carlosstub, thank you12:28
=== carlos -> out for a while
carlossee you later12:28
SteveAKinnison: why?  adding arbitrary attributes to things is generally a bad idea12:28
stubcarlos: Thank kiko - he told me about it ;)12:28
carlosstub, I know12:28
carlosbut I was not sure if you were waiting for me to merge my branch or not12:28
carlosand I had some problems adapting the test to the changes asked by kiko12:29
KinnisonSteveA: for code prettiness12:29
SteveAKinnison: yuck12:29
SteveAKinnison: arbitrary attribute access is very low-level in python 12:29
KinnisonSteveA: self.config.intervention.pretarup is prettier than self.config["intervention"] ["pretarup"] 12:29
carlosas you are running it already... I have some time to fix it before merging ;-)12:29
=== carlos -> out
=== Kinnison shrugs, I'll use ordinary dicts
SteveAif you really want to do it, write a wrapper class that implements getattr as a call to __getitem__12:30
SteveAbut, i think it is grim12:30
SteveAnow, if that's launchpad.conf you're talking about...12:30
Kinnisonit's not12:30
Kinnisonbut hey :-)12:30
SteveAcprov: reviewed, emailed.  approved with some comments.12:36
cprovSteveA: thank you12:36
ddaaKinnison: I just find "xnor(a, b)" to be more obscure than "bool(a) + bool(b) == 1"12:39
ddaa"bool(a) + bool(b) != 1" even...12:40
Kinnisonddaa: But you're not my reviewer :-)12:40
ddaaSteveA: can I be the reviewer of Kinnison's patch, please? :)12:40
=== _Rappy_ [n=hunt-pre@dsl-253-122.monet.no] has joined #launchpad
Kinnisonddaa: There's klingons on the starboard bow, starboard bow, starboard bow! There's klingons on the starboard bow! Scrape 'em off, jim!12:40
lifelessoneButNotBoth(a, b)12:40
=== Kinnison loves that noise
lifelessor if you extend objects... a.oneButNotBoth(b)12:41
SteveAddaa: dude, it's a pun.  puns are bad.12:41
SteveAlifeless: that's a nice function name, especially for those not familiar with the wealth of logical operators12:41
ddaa"when it grows up, it will be sheepda"... and you say puns are bad...12:41
lifelessSteveA: but nuns are good12:41
SteveAddaa: i'm not committing that one to code.12:41
=== Kinnison refers lifeless to http://www.nun.org.uk/
SteveAlifeless: it is a requirement for the job, i hear.12:41
ddaaSteveA: my argument was that the standard (not the common US one) logical diagram notation represents XOR as a box with "=1" inside it.12:42
lifelessddaa: common in Paris ?12:43
cprovSteveA: ->  Why is there a '-' in here? did you mean the UNKNOWN-SUM ?12:43
ddaalifeless: I said, "standard, not common"12:43
SteveAcprov: yes12:43
lifelessddaa: so your standard is uncommon ?12:43
Kinnisonlifeless: sorry, http://www.nun.org.uk/fetishworks.png12:43
=== camilotelles [n=Camilo@20132139198.user.veloxzone.com.br] has joined #launchpad
=== ddaa goes back at increasing launchpad value
Kinnisonlifeless: eitherOr is better than oneButNotBoth12:44
cprovSteveA: it's really not related with the patch, you know it, but I'll change, it's ok12:44
lifelessSteveA: alternatively, 'onlyOneOf(<list>)'12:44
lifelessKinnison: not for americans or other non english speakers12:45
SteveAcprov: great12:45
sivangsabdfl: ping, 'sup?12:46
sivangsabdfl: I just managed to set up my dialer net connection in breezy, so it seems that all is needed is the right PPTP server addressed and the nameservers per each ISP, what would you say of maybe adding to launchapd an interface in which ISPs can update their data, and then each lunchpad managed distribution can pull this data up into their respective netconnection pkgs..12:48
sivangcould be a nice feature for people in countires in which dialers are mandatory12:48
sivang(Like .IL for example)12:48
=== Lovechild [n=dnielsen@love-sources/Lovechild] has joined #launchpad
lifelessSteveA: ping12:52
SteveAhi12:52
lifelessthe pythno problem-files have precisely two revisions.12:52
lifelessone in 1998-08-18, Initial revision by jack.12:53
SteveAthese are the ones with the stupid filenames?12:53
lifelessand one to delete them in 1999-02-01 'removed old IDE stuff -- jvr' by just12:53
lifelessyes12:53
=== Keybuk [n=scott@syndicate.netsplit.com] has joined #launchpad
SteveAokay12:53
SteveAso, junk12:53
lifelessI'm inclined to just Filter them out and report that.12:53
lifelessdo yo uthink the python community will care ?12:54
SteveAno12:54
SteveAancient history12:54
lifelesscool12:54
SteveAand junk12:54
=== mdz [n=mdz@ca-studio-bsr1o-251.vnnyca.adelphia.net] has joined #launchpad
SteveAhardly even worth mentioning12:54
lifelessok.12:54
SteveAspiv: ping01:03
KinnisonI: Base system installed successfully.01:12
Kinnisonjust like me, it longs to be, debootstrapped01:12
Kinnison:-)01:12
=== mdke [n=matt@unaffiliated/mdke] has joined #launchpad
lifelessthis after you turn down a office whipping01:13
lifelesssuch _mixed_ signals01:13
=== Kinnison likes to keep you on your toes
lifelesspromises promises01:14
jordisabdfl: for Xfce, would it make sense to create a new translators group?01:15
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [trivial]  correct computation of month bounds when timezone is not UTC (patch-2378: james.henstridge@canonical.com)01:20
lifelessSteveA: how do I tell if a python string has non 7-bit ascii characters ?01:31
Kinnisonstr.encode("ascii") and trap the exception?01:31
lifelessthanks01:32
Kinnisonor, len([c for c in string if ord(c) > 127] )01:32
Kinnisonwhich may, or may not, be faster01:32
SteveAKinnison: bool, not len01:38
Kinnisonprollobolee01:38
=== Kinnison shrugs
Kinnison12:40 < mjg59> I like Tom Lord01:40
Kinnison12:40 < mjg59> He's charmingly mad01:40
=== Kinnison snorts
SteveAjamesh: ping01:42
jameshSteveA: yeah?01:46
SteveAdo you know the exact url that the "get help" app menu item will go to?01:46
SteveAoh, it's okay, i have it01:46
lifelessjamesh: has the lp gpg stuff hlanded yet ?01:47
jameshSteveA: sourcepackage-gethelp.pt is the page template01:47
lifelessjamesh: and what did you think of the pendingreviews work ?01:47
SteveAjamesh: yeah, i wanted to check that it would go do 'breezy' and not 'hoary'01:48
jordiis anyone feels like fixing a trivial bug, https://launchpad.net/malone/bugs/1857 :)01:48
jordiit's been bugging me for a while01:48
jameshlifeless: looks okay.  I'll merge it soon.01:49
lifelessjamesh: sweet01:49
lifelessjamesh: I'll feed you updates if there are bzr api changes (there will be)01:49
jameshSteveA: it uses the "lsb_release --codename" command to pick the distrorelease name01:49
jameshSteveA: so it does the right thing whichever release you are using01:50
jameshit'd potentially work for distros other than Ubuntu, provided lsb_release gives the right info01:50
=== cprov [n=cprov@217.205.109.249] has joined #launchpad
=== Seveas [n=seveas@ksl403-uva-132.wireless.uva.nl] has joined #launchpad
=== niemeyer [n=niemeyer@200.103.244.36] has joined #launchpad
=== salgado [n=salgado@200-171-140-32.dsl.telesp.net.br] has joined #launchpad
niemeyerGood morning!02:14
Keybukheyhey02:15
salgadoKinnison, around?02:33
Kinnisonsalgado: yo02:36
Kinnisonlifeless: mmm, napples02:36
salgadohi Kinnison. I forgot what we discussed about that columns that were missing notNulls... binarypackagerelease.{essential, architecturespecific} must have a notNull=True. is that right?02:37
Kinnisonyep, that's what we decided02:37
lifelessniemeyer: morning02:37
lifelessddaa: niemeyer is here, you should confirm dates02:38
lifelessddaa: love the siren02:38
lifelessddaa: I could do this all day02:38
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [trivial]  handle +translate and +gethelp pages of sourcepackages that do not exist in a particular distrorelease by displaying the comingsoon page instead of giving a 404. (patch-2379: steve.alexander@canonical.com)02:38
Kinnisonlifeless: There's klingons on the starboard bow, starboard bow, starboard bow! There's klingons on the starboard bow! Scrape 'em off, ddaa!02:39
Kinnisonddaa: http://10.90.90.199/Music/Misc/Star%20Trekkin&.mp302:40
Kinnisonlifeless: check out ddaa's facial expression02:41
niemeyerlifeless: Good morning02:43
lifelessniemeyer: how are you ? ready for the trip ?02:43
niemeyerlifeless: Do you have an idea about how much money do we need for one week in London?02:43
niemeyerlifeless: Almost ready02:44
lifelesswe have room and breakfast paid for02:44
lifelessyou'll need about 20 pounds for transport02:44
lifelessand there is an allowance fo 15pounds a day for lunch and dinner combined, but that is expensed so you get it back later02:44
lifelessso add that all up :)02:45
ddaaand about 50 pounds for the occasional extra (beer, more expensive food, etc.)02:45
ddaafood in london is insanely expensive, it's _very_ easy to overdue the dinner allowance02:45
ddaa* to overdo02:45
=== Seveas [n=seveas@ksl403-uva-132.wireless.uva.nl] has joined #launchpad
niemeyer200 pounds should probably make it then..02:46
ddaa100 should be more than enough02:47
ddaaniemeyer: I need to book my plane tickets. When are you flying to Montreal (so I'll try to book in the same plane, or as close as possible), and when and where would you like me to land in Brazil?02:48
lifelessyou should spend 1 week with niemeyer in brazil before heading to montreal02:49
=== niemeyer checks
niemeyerddaa:02:51
niemeyer> 25 OCT - GRU - EWR - 2210 - 0600 +102:51
niemeyer> 26 OCT - EWR - YUL - 0725 - 085002:51
niemeyerThat's the flight to Montreal02:51
=== ddaa got too used to direct flights...
ddaaniemeyer: you are taking leave days on 27, 28, 31 and 1st nov?02:53
ddaa(or maybe only the first three...)02:54
niemeyerddaa: Huh?02:55
ddaaYou are expected in Montreal on Nov. 1st02:55
niemeyerddaa: Ah, no, I'm going to be there for the two weeks.02:56
ddaaI'm was asking whether you took the days between your arrival and Nov. 1st as leave or if you plan to be working.02:56
ddaaThat's not what the wiki says...02:56
ddaaWhen you are going to be there and when you are required are two different things.02:57
ddaaSo, I want to know if the early time in Montreal will be a leave for you, or if it will be working time. So we can figure out when I should arrive.02:58
lifelessddaa: are you not going to brazil ?02:59
ddaaWhen I should I brazil, I mean.02:59
lifelessddaa: if you are going to brazil, all the matters is that you arrive on the 16th or so02:59
lifeless1 week before the date you leave.02:59
ddaaI'm moderately enthusiast at the perpective of extending the away time by two full weeks.03:00
ddaa* enthusiastic03:00
=== spiv [n=andrew@adsl-66-203.swiftdsl.com.au] has joined #launchpad
niemeyerddaa: Ok, I'll check that..03:01
ddaaso, if niemeyer does not take the time between his early arrival and the beginning of the LP team sprint as leave to enjoy the area, I'd rather try to use these days for the HCTLaunchpad sprint03:02
ddaaotherwise, I guess I will have to take these as leave as well.03:03
ddaaniemeyer: okay, tell me when you've decided whether you want to spend those early days in montreal on the sprint or on something else. I am already overdue for my plane bookings.03:06
niemeyerddaa: I'm not planning any leaves..03:06
lifelessah I see03:07
lifelessniemeyer: I think you booked slightly early :0). We're just updating things03:07
niemeyerlifeless: Understood.. that's the case indeed. Will check the flights again.03:11
spivSteveA: pong03:11
SteveAhi andrw03:12
SteveAi pinged you about an sqlobject issue, but i sent a mail to the list anyway.03:12
=== cprov [n=cprov@217.205.109.249] has joined #launchpad
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [r=stevea]  Fixing Buildd-Slave process termination workflow (patch-2380: celso.providelo@canonical.com)03:15
=== kiko-zzz [n=kiko@200-171-140-32.dsl.telesp.net.br] has joined #launchpad
SteveAkiko: ping03:22
kikocarlos, carlos, carlos 03:26
carloskiko, kiko, kiko03:29
carloskiko, I'm going to have lunch now03:29
carloswill talk when I'm back, ok?03:29
kikoone sec though03:30
kikocarlos, just confirm with me: stub's running the updated script, correct?03:30
carloskiko, right03:31
kikoand okay with the review I sent?03:31
kikostub granted me RO access to the database03:32
kikoso I can generate the new language packs IF you put up a wikipage explaining exactly how they are built03:32
SteveAmpt: ping03:36
mptSteveA: pong03:42
=== otep [n=otep@AP-203.167.31.177.sysads.com] has joined #launchpad
=== lamont [n=lamont@15.238.5.62] has joined #launchpad
=== bradb [n=bradb@modemcable033.209-70-69.mc.videotron.ca] has joined #launchpad
mptwoo, 17 conflicts03:50
jbaileyjordi: Around?03:52
Keybukniemeyer: about?03:58
niemeyerKeybuk: Pong04:00
sabdflcarlos: are you landing a fix for the pofile menus?04:01
carlossabdfl, I landed a fix for the upload/download last week, nothing more04:01
Keybukniemeyer: busy?04:01
sabdflcarlos: staging doesn't look right04:01
niemeyerKeybuk: Nothing that couldn't be interrupted04:02
Kinnisonciao dudes, lunchtastic04:02
KeybukI thought I might take half an hour to explain how Sourcerer works04:02
carlossabdfl, I know, I added the old action links. I don't know why the new layout is not working04:02
niemeyerKeybuk: Perfect!04:02
carlossabdfl, In fact I thought those new menu tabs were removed until mpt told me that it was a css change04:02
niemeyerKeybuk: I'm working on it, so it'll be great indeed.04:02
niemeyerKeybuk: Interrupt me whenever you want. ;))04:03
Keybukok04:03
Keybukso the basic class in Sourcerer is Inventory04:03
Keybukthink of it as simply a list of items that are sub-classes of InventoryItem04:03
Keybukthe job of sourcerer can be summed up as04:04
Keybuk1) turn a bunch of files on disk into an Inventory, and a set of matching directories of source04:04
carloskiko, the review is ok. The test is taking me much more time than the code changes.... it's not so easy to test those new methods as part of POTMsgSet...04:04
Keybuk2) match InventoryPatchItems to their parents; match them to their counterpart Manifest*Entry objects in the previous release and general clean-up04:05
Keybuk3) product a Manifest from the Inventory04:05
kikocarlos, well, as I said, you could just XXX it, and fix it later -- we don't want you to lose time over this04:05
kikothere are other battles to fight04:05
Keybukthe code for #2 and #3 are in the Inventory class, and InventoryItem classes04:05
carloskiko, it's done, is the test the only thing that gives me problems04:05
niemeyerKeybuk: Ok04:06
Keybukand are pretty much intended to be generic across the board.  Once you have an Inventory, you do the same job on it [ inv.priorManifest(old_manifest); inv.prepareImport(); new_manifest = inv.createManifest() ] 04:06
Keybukyou can see those calls in sourcerer.bubblewrap04:06
niemeyerKeybuk: Yes, I did that yesterday, and created a xml manifest using xmlfiles04:06
Keybukyup04:06
Keybukso if you look through Inventory, some of the noteworthy functions04:07
KeybukInventory.priorManifest, InventoryItem.matchingManifestEntry and InventoryItem.priorManifestEntry04:07
Keybukthese deal with matching up an InventoryItem to an equivalent ManifestEntry in the previous version04:08
Keybukit's pretty simple -- if it's the same type with roughly the same path, we assume it's the same04:08
niemeyerRight04:08
carloskiko, and anyway, the tests are working now...04:08
KeybukInventory.parentItems, Inventory.orphanItems, Inventory.matchOrphansToParents, Inventory.matchItems, Inventory.removeOrphans, InventoryItem.canBeParent, InventoryItem.isOrphan, InventoryItem.isParent, InventoryItem.tryParet04:09
Keybukthose all deal with matching patches up to their parent item04:10
Keybukbasically it's try every patch with every possible parent (where parents can include patches with known parents) until it applies without problem04:10
niemeyerThat's a tricky part04:10
Keybukyeah, basically you have04:10
Keybukparents: items that can be the parent to a patch.  This is "solid" things like a tar file, a zip file, a directory of source, etc.  something we don't need to build04:10
niemeyerKeybuk: What do you do with "unknown" cases?04:11
Keybukorphans: items that _need_ a parent.  This is just "patches" at the moment -- but later we might make changesets or xdeltas, etc.04:11
niemeyerOk04:11
=== bradb jumps on the double-digit conflict bandwagon
Keybuknow if you look at the parentItems function, it actually tries to order them intelligently using the "hints" for each item (more on these later)04:12
Keybukso basically it uses the "this is what patches will apply to" hint as the first one to try04:12
Keybukand we look through those lists through Inventory.matchItems04:12
Keybukwhich puts successful matches back onto the parents list for the next try04:12
Keybukrinse, repeat, until we have no more parents to try04:12
Keybukif we have orphans left over, we remove their inventory items -- we can't import them.  but by doing this we _don't_ remove the actual patch file later, which means that the patch is just imported in the parent as-is04:13
Keybukso instead of an empty "patches" directory with a branch for the patch file inside it04:13
Keybukyou see a "patches" directory with a checked in, version-controlled, patch file04:13
Keybukevery instance I've seen so far, it's been a patch that actually doesn't apply and is obsolete and left in the source because the maintainer didn't bother removing it04:14
niemeyerHumm..04:14
niemeyerOne case that comes into my mind is a -p0 patch adding a new file.04:14
Keybukyeah, those work for everything <g>  fortunately we default to applying it to the .diff.gz (in Debian's case) so the result is almost always right04:15
Keybukif we get it slightly wrong, it's ok -- the user can fix it up with hct later04:15
niemeyerUnderstood04:15
Keybukwe now have an Inventory with matched up patches and parents hopefully04:16
Keybukso we go and make sure that it exists on the disk in the right state -- that's the Inventory.placeInLibrary, Inventory.cleanLibrary, InventoryItem.placeInLibrary functions04:16
Keybukin effect, we have a directory for each InventoryItem which contains a clean copy of the source we want to import for it04:17
Keybuk(ie. with files-that-will-be-branches removed and stuff)04:17
Keybuk(note that Library in HCT terms doesn't refer to the Launchpad Librarian -- spiv stole my term)04:18
Keybuka Library (hct.util.library) is just a managed temp directory04:18
niemeyerYes.. it's a directory where files are expanded.04:18
niemeyerInteresting concept :)04:18
Keybukok, so the final thing we do is call Inventory.createManifest (which calls InventoryItem.createManifestEntry and InventoryItem.createBranch)04:19
niemeyerBut TempDir would be a better name, I think.. ;))04:19
Keybukthis creates a Manifest object and lots of Manifest*Entry objects in it that look and smell exactly like the Inventory ones04:19
Keybukbut also does the job of actually making the baz branches, doing the import, etc.04:19
Keybukthe end result is something we can use with HCT04:20
niemeyerCool04:20
Keybukso that's stages #2 and #3 of Sourcerer, we entirely skipped stage #104:20
Keybukwhich is perhaps the "interesting" bit04:20
niemeyerWho handles the actual import procedure? I mean, someone has to take care about moving the new files into the correct old files, and removing unexistent old files, right?04:21
niemeyerOr perhaps baz already has some smartness for that?04:21
Keybukmost of that is done by HCT -- at this point Sourcerer just acts like an HCT client and does "working_tree.importFrom(library_dir)"04:21
Keybukthat's hct.workingtree.WorkingTree.importFrom04:21
niemeyerOk04:21
Keybuk(hct has an equivalent to baz import)04:21
Keybukso, stage #104:22
Keybukturn a bunch of files on the disk into an Inventory04:22
niemeyerInspect!04:22
Keybukthis is partly specific to a source format, and partly generic base classes that can be overriden04:22
Keybukand yup, that's what Inspector is all about04:22
Keybukthe base class here is the Inspector04:23
Keybukthere are sub-classes to deal with particular file-types; TarInspector, ZipInspector, PatchInspector, etc.04:23
Keybukthe job of an inspector is to open up the file, get it onto disk if it can, go through the contents, identify any other special files within it, and instantiate a new Inspector for those04:23
Keybukpretty much, instantiating any Inspector sub-class does this04:24
Keybuknote that for a patch, we must _already_know_ at this point what its parent is and prune level -- so this is only really useful for things like the .diff.gz04:24
niemeyerKeybuk: It will inspect the patch itself, or the full tree with the patch applied?04:25
Keybukit inspects the patch itself04:25
Keybukthe full tree is useful if we find other things in it, only04:25
Keybukthe *Inspector classes are pretty trivial, and hopefully obvious in how they work04:26
Keybuktheir job is to create an Inventory of that file04:26
Keybukand they do this in partnership with another class, FileInventory04:26
niemeyerSo, they get a orig.tar.gz, and find the patches inside it. Is that the case?04:26
Keybukyup04:26
niemeyerOk.. it didn't sound obvious at first because rpms are a bit different in that sense.04:26
Keybukwhen an Inspector starts, it calls FileInventory.start(); for each "interesting file/dir/etc." it finds inside it, it calls FileInventory.append*(); and when done it calls FileInventory.finish()04:27
Keybukyou always have an Inspector/FileInventory pair04:27
niemeyerI don't think a Inspector would be needed for rpms, since the interesting content is always "outside".04:27
Keybukin fact, if you look at the inspect() example function at the bottom, it instantiates a FileInventory then the Inspector and couples them04:28
niemeyerWe just need one, perhaps, that will inspect SRPM files.04:28
Keybukright04:28
Keybukthe job of FileInventory is to decide whether what the Inspector has found it useful or not04:28
niemeyer... and store it, if it is.04:28
Keybukand to make InventoryItem objects for useful things, and ignore non-useful ones04:28
Keybukyup04:28
Keybukthere's stuff in there to turn a filename into something "Inventory-local"04:28
Keybukif you look at the bottom of debian.py, you'll see there's actually a FileInventory sub-class it uses which grabs out the top-level debian/ directory and turns it into the packaging item04:29
=== niemeyer checks
niemeyerNice!04:30
Keybuk(it's almost all doc-string, that class)04:30
Keybukso now we have a generic framework for inspecting any kind of file, and making a chain of InventoryItems out of it04:31
niemeyerKeybuk: Yes, very well documented.04:31
Keybukwe still need an uber-object to actually make a complete Inventory of the lot, as well as pick out the files to inspect04:31
Keybukthe simplest of those is upstream.py04:31
KeybukUpstreamInventory just picks the appropriate Inspector class, matches it with a FileInventory object it creates, and takes the items out of it it [ self.extend(contents) ] 04:32
Keybukso if you want a Manifest of any zip or tar file you have on disk; that's what you use04:33
carloskiko, ping04:33
Keybukthere's one little bit on the end of that, the branchPolicy() function -- this has the job of setting the name and hint for any interesting things in the inventory04:33
Keybukit always just sets the first item to ORIGINAL_SOURCE and suggests --release-- for the branch name04:34
niemeyerAhh, so that's what model.name is04:35
Keybukyeah, I'll get to models in about 10 minutes <g>04:35
niemeyer:)04:35
Keybukso, UpstreamInventory gives us the inventory of a simple one-file sourec04:35
KeybukDebianInventory (in debian.py) is along the same lines, but a bit more complex04:36
Keybukit possibly has to inspect two files (.orig.tar.gz and .diff.gz)04:36
Keybukand the branchPolicy function is actually quite involved04:36
Keybukwith various hints and names that can be assigned to different bits04:36
Keybukand even more wild, it actually reforms the Inventory sometimes04:37
Keybukif we were to leave the inventory as-is, we'd end up creating an .orig.tar.gz and a .diff.gz -- which while exactly what we saw, aren't the best form for distro people -- they expect an .orig.tar.gz and an unpacked directory04:37
Keybukso we mutate the inventory to turn the diff into an InventoryCopyItem instead, and rename/move all the children of that about04:38
niemeyerMakes a lot of sense04:38
Keybukon top of all that is bubblewrap04:38
Keybukit picks either UpstreamInventory or DebianInventory, runs the functions in the right order to make a Manfiest and saves it to the HCT URL given04:39
Keybukit takes away the sharp-edges04:39
niemeyer"Copy" is how the assembled tree will be generated out of the baz/bzr branch, right?04:39
Keybukright, a Manifest consisting entirely of ManifestCopyEntry objects is basically an arch config04:40
niemeyerInteresting04:40
bradbsabdfl: Just a note that because I've changed everything to be registered on IBugTask instead of IBug now, anything that you do that involves registering things against those interfaces or writing ZPT against those APIs as their context, or traverser code that traverses IBug or IBugTask will give me a lot of hard-to-resolve conflicts.04:40
Keybukok, so musings on how to do an SRPM importer with this model04:40
Keybukyou could create an SrpmInspector which knows how to unpack them, spread the contents on disk, and inherently cause those contents to be inspected (because that's implicit)04:41
Keybukand then an SprmInventory class which just instantiated an SprmInspector/FileInventory pair and applied branchPolicy afterwards04:41
Keybukmost of the code to do that can be c&p from the old rpm.py -- it just happens to predate this cute model of doing imports04:42
Keybuk(in particular rpm.py still contains its own "patch dating" code, before I ripped it off into the generic core)04:42
=== lifeless gets nervous at cute code
lifelesss/at/around04:42
Keybuklifeless: dude, you helped design it04:42
Keybukyou sat me down on your knee and taught me about programming patterns, and unit tests, and stuff04:42
lifelessKeybuk: run and hide, run and hide!04:42
KinnisonKeybuk: you sat on lifeless' knee?04:43
Keybukwaayyyyyyy back in August last year04:43
Kinnisonthat explains a lot04:43
lifelessKeybuk: I'm just teasing. Don't you get nervous around cute things ?04:43
Keybuklifeless: no, I get horny04:43
=== Kinnison nods
lifelessthey are not exclusive y'know :)04:43
Keybukniemeyer: anyway, dodging the peanuts from the gallery for a minute ...04:43
=== lifeless launches a lolly goblet
Keybukmost of the code in rpm.py can be thrown away in favour of the generic core -- and c&p to turn it into an SrpmInspector class instead04:44
Keybukor, if you prefer, you could just write the "unpack an srpm, spread it out and inspect the pieces" code in SrpmInventory itself04:44
niemeyerOk04:44
Keybuk(there's no DebianSourceInspector, for example)04:44
KeybukI'm not actually sure which would be easier04:45
niemeyerI'll figure it out :)04:45
KeybukI suspect SrpmInspector is easier, because you just have to write the "open an srpm", "list the contents of an srpm" and "put the contents on disk somewhere" functions04:45
Keybukthe Inspector stuff takes care of the rest for you04:45
niemeyerI was thinking about building an assembled tree which would match the format expected by rpmbuild (SOURCES/*, SPECS/*.spec, etc).04:45
Keybukyup04:46
niemeyerKeybuk: Is that what you had in mind?04:46
Keybukso Manifest output expectations04:46
Keybukdon't bother trying to replicate the two-level Debian format -- that's actually going away with W&P04:46
KeybukSOURCES/<tar file name>04:46
KeybukPATCHES/<patch name>04:46
niemeyerNice!04:46
KeybukSPECS/<spec name>   (btw... InventoryFileItem/ManifestFileItem is what you want for this)04:46
Keybukis one possibility04:47
Keybukthough, to be entirely honest, I'd actually suggest just doing:04:47
Keybuk<tar file name>04:47
Keybuk<patch name>04:47
Keybuk<spec name>04:47
Keybukit's up to you though, either way would work well04:47
Keybukmaking them match rpmbuild has plus points, so does making them flat04:48
Keybukyou can pick04:48
niemeyerAre you talking about the assembled tree or the branches?04:48
Keybukthe assembled tree looks like the "path" entry for each ManifestEntry04:48
KeybukI'm talking about the contents of the path field :)04:48
niemeyer:)04:48
Keybukok, so almost exactly 10 minutes later04:49
Keybuka quick recap on the fields of Manifest, I think you probably know all of these by now, but just making sure04:49
Keybukpath -- where it goes in the assembled tree04:49
KeybukDebian sources have an icky "source-1.0/debian/patches/01-fix-something.patch" format for this04:49
ddaaKeybuk: is any of your stuff using foreign keys to the changeset table?04:50
Keybukbut it means it gets assembled in the right format for dpkg-buildpackage04:50
Keybukddaa: yes, ManifestEntry04:50
mptSteveA: Should class SourcePackageFacets(StandardLaunchpadFacets): exist any more?04:50
SteveAmpt: ping again04:50
Keybukhint -- this is a ManifestEntryHint04:50
KeybukORIGINAL_SOURCE = reserved for the original, unmodified source tarball04:50
mpt(10:36:27) SteveA: mpt: ping04:50
mpt(10:42:31) mpt: SteveA: pong04:50
KeybukPATCH_BASE = default base for new patches (if the user doesn't specify one)04:50
Keybuk(give it to the major source tarball of the package)04:51
SteveAmpt: yep, just came back from lunch04:51
KeybukPACKAGING = for you, the spec item04:51
Keybukdirname -- this isn't anything to do with path; this is the directory name that gets encoded _inside_ the tarball, zip or patch04:51
jbaileyKeybuk: How does get_source notice that you've added something to hct?  Does it rely on a new version of get_source being added, or is it just waiting for your script to do the import?04:51
Keybuka Entry with path="foo/bar-1.0.tar.gz" and dirname="wibble-1.0/" would create foo/bar-1.0.tar.gz which when unpacked puts all the files under wibble-1.0/04:52
=== jinty [n=jinty@205.134.224.215] has joined #launchpad
mptSteveA: The reason I ask is that I found two copies of it in browser/sourcepackage.py, probably a bad merge04:52
ddaaKeybuk: is that precious data, or can you regenerate it?04:52
Keybukfor patches, this is also the major hint as to the -pX date04:52
Keybukddaa: precious04:52
SteveAalmost certainly a bad merge04:52
Keybukjbailey: grabs the list once a day04:53
niemeyerKeybuk: Gotcha04:53
Keybuk(and sourcerer uses the same list to do the imports)04:53
mptSteveA: So, should it exist at all, or not?04:53
Keybukniemeyer: finally there's branch and changeset (ooh look, two of the conversations just merged <g>)04:53
Keybukbranch is the arch branch we need to checkout04:53
SteveAmpt: i expect it should exist.04:53
Keybukand changeset is the actual changeset on that branch04:53
mptok04:53
Keybukbecause sources can share a branch, changeset is important -- it tells us whether to checkout --patch-1 or --patch-9 of the debian/ directory04:54
ddaaKeybuk: in production, all the ManifestEntry.changeset are NULL04:54
Keybukas well as /any/ other piece of the source04:54
jbaileyKeybuk: 'kay.  I'll be more patient then. =)04:54
Keybukddaa: there's no imports in production, so I'm rather surprised if there's any ManifestEntry records at all04:54
Nafallocarlos, jordi: seahorse is not translatable?04:54
lifelessallo allo allo04:55
lifelesswhats up ?04:55
Keybuklaunchpad_hct=# select count(*) from manifestentry;04:55
Keybuk  525004:55
Keybuklaunchpad_hct=# select count(*) from manifestentry where changeset=null;04:55
ddaawe would like to be able to DROP TABLE Changeset as part of the BranchDataStorage (because we are removing Changeset.branch and that would be annoying to convert)04:55
Keybuk     004:55
lifelesshang ong04:55
lifelessthis discussion, if its what I think it is is premature.04:55
lifelessddaa: in production, its safe to drop the changesets as tey are nmot referenced yet.04:56
Keybuksorry04:56
Keybuklaunchpad_hct=# select count(*) from manifestentry where changeset is null;04:56
Keybuk   11104:56
Keybuk<g>  me learns SQL again04:56
lifelessKeybuk: we'll be talking next weelk aboutthe impact on hct, you me mark neimeyer04:56
Keybuklifeless: that's cool04:56
KeybukI suspect it will be "replace changeset with revno" or something04:56
ddaalifeless: ack, but I wanted to check because "yet" tends to have very changing values.04:56
Keybukor "don't update casey to the latest db yet"04:56
lifelessKeybuk: right. that would be bad.04:56
Keybuk(back to the lecture)04:57
ddaaKeybuk: something like that, Changeset -> Revision and Changeset.branch -> RevisionNumber table04:57
Keybukniemeyer: so, that's ManifestEntry's properties ... ManiefstPatchEntry also has an extra "patch_on" field that tells us what the patch gets applied to; or should be diff'd from04:57
Keybukthat's actually a reference to the ManifestEntry object, rather than a number or anything04:57
Keybukin the database we use sequence numbers to replicate that04:58
Keybukddaa: works for me04:58
ddaalifeless: so, IIUC I should not DROP TABLE but DELETE everything.04:58
niemeyerKeybuk: Understood05:00
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: Change u'\u2022' with a space character automatically. r=kiko (patch-2381: carlos.perello@canonical.com)05:01
lifelessddaa: yes, DELETE FROM REVISION05:02
Keybukniemeyer: right, now if you look at InventoryItem you'll see it basically has the same properties05:06
Keybukbut with a few variations05:06
Keybukparent_item <~> patch_on  (actually ManifestEntry will probably become parent_item soon because of a bug I found :p)05:06
Keybukvirtual instead of branch/changeset -- at Inventory time, we don't yet have the branches; we just need to know whether or not we make branches05:07
Keybuka virtual item is one that we need to assemble, but doesn't actually have a branch of its own -- a typical example is an .orig.tar.gz that only contains other tarballs -- no point checking in something empty05:07
niemeyerHummm.. interesting. Wasn't aware about those.05:08
Keybukthere's also prefix, which is the common path of everything inside it -- this is used to generate dirname, and regenerate it if we change our minds later05:08
Keybukyeah05:08
Keybukvirtual items pretty much only show up in Debian05:08
Keybukyou can do tricks like this05:08
Keybukpath="foo.tar.gz", virtual=True05:09
Keybukpath="foo.tar.gz/other1.tar.gz", virtual=False05:09
Keybukpath="foo.tar.gz/other2.tar.gz", virtual=False05:09
Keybukother1 and other2 will be imported as branches05:09
Keybukhct assemble will create just a foo.tar.gz file05:09
Keybukwhich when unpacked gives you other1.tar.gz and other2.tar.gz files05:09
niemeyerOhh! Cool :)05:09
Keybukwhich when unpacked give you their respective branches05:09
Keybuk(the path of any entry/item can be relative to the path of another ... which means it gets assembled inside it)05:10
Keybukconsider05:10
Keybukfoo-1.0/debian/, virtual=False (--packaging--)05:10
Keybukfoo-1.0/debian/patches/01-something.patch, virtual=False05:10
Keybukfoo-1.0/debian/patches/02-something.patch, virtual=False05:10
=== cprov [n=cprov@217.205.109.249] has joined #launchpad
Keybukthe patches/01-something.patch and patches/02-something.patch are assembled inside the debian (packaging) directory before that is put in place05:11
Keybukthe debian/ (packaging) directory is itself relative to the foo-1.0/ branch05:11
kikocarlos, you are da man05:12
Keybukand there's one more property of InventoryItem  (and ManifestEntry too, but it's in one of my secret uncommitted directories right now)05:13
Keybukmode05:13
Keybukuh, model05:13
=== Keybuk learns to type
Keybukmodel is an instance of BranchModel (in hct.model)05:13
Keybukall InventoryItems have them05:13
Keybukso, to explain what they do, I'll explain why they exist05:13
cprovSteveA: ping ?05:14
KeybukI was having a hard time keeping track of whether to branch off the upstream import, the original tarball, the point in cvs we found the closest copy, etc.05:14
KeybukI had code that tried to assign a priority to each one, and only defer in cases of lower priority05:14
Keybukthen I tried to reorder the code to do things in priority order05:14
Keybukneither worked and confused the buggery out of me05:15
SteveAcprov: hello05:15
Keybukso I charted it all out on my whiteboard, and had a little table of "parent in the manifest", "entry from previous manifest", "upstream import we're based on", "point in cvs we found"05:15
Keybukand tried to work out the net effect05:15
Keybukand I realised, why not just have a class that encapsulated that table05:15
Keybukthen I could dump the entire logic into that class as one function05:16
Keybukthat's what BranchModel is05:16
Keybukas you set up an Inventory, you fill in the fields you know about05:16
cprovSteveA: aparently no sqlbase method (quote, quote_like, sqlvalues) is safe against escape chars ('\\'), is it right ?05:16
Keybuk.model.name you set to the --bit-- of the branch if you care what it should be.  (mostly you don't, because it's taken from the filename if missing -- but you might want to use --packaging-- for the spec branch)05:16
SteveAcprov: i don't know for sure.  but, probably not.05:16
Keybuk.model.parent you set to the .model of the parent item in the same Inventory (later Manifest)05:17
Keybukif priorManifest() is called, that sents .model.prior_entry to point to the previous ManifestEntry05:17
=== mdke_ [n=matt@81-178-149-216.dsl.pipex.com] has joined #launchpad
Keybukif findUpstream() [some shaky code I'm not entirely pleased with]  is called, that sets .model.based_on to the manifest entry of the upstream import05:17
Keybukand likewise findUpstream() might set .model.sync_with to the CVS point05:18
Keybukso it's an object that just keeps a record of all the interesting things05:18
Keybukthose are the "in" properties05:18
Keybukit also has a bunch of "out" propreties05:19
niemeyerRight, sounds reasonable05:19
Keybukthere's another class called Naming (in hct.naming) that works with it05:19
Keybukthis is icky, Naming is already gone and folded into BranchModel05:19
Keybukso pretend the functions you see there are in BranchModel05:19
=== mdke_ is now known as mdke
Keybukbasically there's a function to take the "in" properties, work out exactly what to do with each of them, and toss out a "Branch" object at the end of it05:20
KeybukNaming.newFromModel05:20
Keybukas well as set the "out" properties05:20
Keybukand then there's Model.create which takes the "out" properties and the branch object, and actually puts the branch together05:21
Keybukthere's workflow here05:21
=== depoll is now known as dePOLL
Keybukthe idea is that every time you want to make some changes to a manifest, you make a model, manipulate it, then save the model back to the manifest (thereby updating it)05:22
Keybuknext week at the sprint, I'll show you how things like "give the user local branches to commit to", "give the user a new patch branch", "merge two manifests", etc. all work with this Model API (and are all TRIVIAL! Muahahaha!)05:22
Keybukfor now, you just need to know that you fill in the .model.name property to the branch name if you care what it should be05:23
niemeyerOk :))05:23
niemeyerKeybuk: So, that was indeed a very nice overview of sourcerer. Thanks a lot!05:25
Keybuklast useful bits05:25
Keybuksourcerer/deb/ is the module that implements a pure-Python version of the bits of dpkg-source we needed05:25
Keybuksourcerer/sprm/ is the stuff jamesh wrote to do the same for src.rpm05:25
=== hannosch [i=hannosch@85.182.70.124] has joined #launchpad
niemeyerKeybuk: I've seen that.. Btw, Smart implements control-file parsing as well. :)05:26
Keybukand pretty much everything in both hct and sourcerer use hct.util05:26
Keybukwhich is Keybuk's library-o-happy-python-joy05:26
niemeyerKeybuk: I'm not yet sure about how important parsing the spec file really is.05:26
carloskiko, https://wiki.launchpad.canonical.com/LanguagePacksHowTo05:26
Keybukme neither05:26
Keybukso there you go, you now know more about sourcerer and hct than anyone else in the company05:27
niemeyerKeybuk: Talking the patch files should be just a matter of trying to create PatchFiles out of the contents and checking if it errors or not.05:27
Keybukyup, I should think so05:27
Keybuklet the generic code worry about matching them to their taralls05:28
niemeyerKeybuk: I don't think so.. :) But I'll do my best to learn and help you.05:28
Keybukhehe05:28
Keybukthom did make some rpm 4.4 packages before he left for greener pastures05:29
Keybukhttp://people.ubuntu.com/~thom/05:29
niemeyerhct.util has many nifty utilities..05:29
Keybukstill on there, if youw ant to play with them05:29
niemeyerWill certainly be useful05:30
=== \sh [n=sh@server3.servereyes.de] has joined #launchpad
jordiNafallo: if it's not in breezy and it hasn't been setup, maybe not.05:47
Nafallojordi: seahorse is in breezy, probably not the later though.05:48
jordiNafallo: in breezy main, or breezy universe?05:48
Nafallojordi: universe :-)05:48
jordiif it's universe, it's not automatically imported05:49
Nafallojordi: ah, so you have to kick it for me then? :-)05:49
jordihmm, the product doesn't even exist.05:49
Nafallonope, not as product, but the package should exist.05:50
Nafalloatleast in the archives :-P05:50
jordiI thought there was a product in launchpad for every package in ubuntu, even universe.05:51
jordibut apparently nto.05:52
SteveAkiko: ping05:52
kikoYES05:52
kikohow goes it SteveA?05:53
jordigreat05:54
jordimy checkout of seahorse was last updated in April 200305:54
jordicarlos: so when we create these kind of products and do the initial import of files, who is in charge of refreshing them?05:56
carlosjordi, who asked you to do the import05:57
carlosjordi, or the own translators05:57
carlosjordi, the idea is tha tusually, we only import products that upstream ask for them05:58
jordicarlos: what if Nafallo suddenly decides to go live in the jungle? Who takes care of "his" products?05:58
jordicarlos: that isn't what I was told05:58
carlosjordi, or people that will take care of those updates from time to time05:58
jordiI was told to import mostly everything that's requested.05:58
carlosjordi, well we don't reject anything, but it's good to ask them to get that compromise...05:59
=== cpro1 [n=cprov@217.205.109.249] has joined #launchpad
jordicarlos: Nafallo may agree to do that now, but he might go MIA in two weeks.05:59
jordicarlos: anyway, seahorse belongs to gnome cvs.05:59
jordiSo I guess it needs to be assigned to GNOME translators, which makes it not so useful to Nafallo.05:59
carlosjordi, I know, and we cannot do anything until we implement a way to import directly from upstream06:00
carlosjordi, right06:00
jordicarlos: yeah.06:00
jordiNafallo: are you a member of your lang's GNOME translation team?06:00
Nafallojordi: nope06:01
=== camilotelles [n=Camilo@20132139198.user.veloxzone.com.br] has joined #launchpad
Nafallojordi: and I'm not planning to be, since I only do rushs on translation from time to time and are mainly a packager kind of guy :-)06:01
jordiNafallo: then I guess it wouldn't be useful at all to add seahorse for you now.06:02
jordicarlos: do you agree with that?06:02
Nafallojordi: indeed, I'll have to use gtranslator and add an upstream wishlist bug or something instead :-P.06:03
jordinod06:03
carlosjordi, yeah, the only way to translate GNOME modules is using their teams06:04
jordiok.06:04
jordiNafallo: sorry. If you're really interested, you could talk to them about joining it.06:04
jordiit shouldn't be a problem06:04
jordiNafallo: what language is this?06:05
Nafallojordi: swedish06:09
jordioh06:10
jordiMENTHOS' II!06:10
Nafallojordi: seems translations exist in their cvs already, but it doesn't seem to be in breezy06:10
Nafalloatleast not up-to-date :-)06:10
Nafallohehe06:10
jordiNafallo: maybe translations were added after release, or the package is not up to date?06:11
Nafallojordi: the package is up-to-date with debian, but not with upstream indeed06:11
jordiI know who to kick :/06:12
Nafallohehe, we _are_ in UVF still ;-)06:12
jordiI pinged06:12
Nafallostill no updated swedish translations.06:14
jordiyou upgraded?06:14
NafalloI could do them "off rosetta" and add them to the package with my MOTU role ;-)06:14
Nafallohttp://sourceforge.net/mailarchive/forum.php?thread_id=7838669&forum_id=410206:14
Nafallojordi: I settle for improving the po manually and include it in breezy or something :-)06:17
dilysMerge to rocketfuel@canonical.com/sqlobject--test--0.6: Fix BoolValidator to not treat NULL values as False (backported from upstream's svn trunk). r=SteveA (patch-35: guilherme.salgado@canonical.com)06:21
jordiNafallo: good luck :)06:29
=== Seveas [n=seveas@seveas.demon.nl] has joined #launchpad
=== bradb & # lunch
sabdflmpt: ping07:16
SteveAsabdfl: he's away for a couple more hours.07:16
Keybukmeh @ not being able to write a comment when you fix a bug in Malone :-/07:24
sabdflSteveA: where is the bit that registers "addform"?07:24
kikoKeybuk, there's the whiteboard..07:24
SteveAsabdfl: do you mean, where is the thing that processes the browser:addform zcml?07:25
sabdflyes07:25
Keybukkiko: that isn't a comment that appears for anyone else though07:25
KeybukI generally like to close a bug with an explanation of /how/ I fixed it07:25
sabdflthere's an AddViewFactory, but what calls *that*07:25
sabdflalso, how hard would it be to have a /fmt:moin ?07:26
sabdfljust to render a text field as html, with moin rules07:26
SteveAthe bulk of it is in zope/app/form/browser/metaconfigure.py has the things that process that zcml directive07:26
=== cpro1 [n=cprov@217.205.109.249] has joined #launchpad
SteveAin launchpad, it is actually processed by something in launchpad/webapp, but all that does is support the facet=".." stuff we need for menus.07:27
SteveAif the moin formatting stuff has a reasonable API to call, it would be easy to have a /fmt:moin 07:27
sabdflSteveA: i've written a thing that looks similar to AddView, and i want to get it to handle <browser:form07:27
SteveAwe might need to think about cacheing its output though.07:27
SteveAsabdfl: the code you need is in metaconfigure.py07:29
SteveAyou can see examples of testing new zcml directives in launchpad/doc/zcmldirectives.txt07:29
SteveAon the other hand, if you want to pass it on to me, i can work on it on monday.07:30
SteveAmetaconfigure/EditFormDirective looks quite straightforward07:31
SteveAyou also need to write a schema for your directive.07:31
SteveAsee zope/app/form/browser/metadirectives.py07:31
SteveAyou also need to hook it up07:32
SteveAsee zope/app/form/browser/meta.zcml07:32
BjornTsabdfl, SteveA: browser:form already exists in zope 3.1, maybe we could simply backport that if it does what we want?07:32
SteveAwe hook up new directives in launchpad in webapp/meta.zcml 07:32
SteveAwe'll be moving to the new zope in under 2 weeks.07:32
SteveAhowever, i'd recommend against adding browser:form, because it is easier to just use your own base-class, and register it as a normal browser:page view.07:33
SteveAmuch less infrastructure to set up07:33
SteveAmuch less to test07:34
sabdflSteveA: can i get fields, and keyword_arguments, and schema, with a normal browser:page?07:44
SteveAno.  but, you can set them in your class in python code.07:45
=== bradb returns
SteveAzope3 is moving towards doing more of this "assembling a form" stuff in python code, and not in zcml.07:46
bradbsabdfl: did you get my note from before about conflicts?07:47
sabdflbradb: yes07:54
bradbok07:54
=== hannosch [i=hannosch@85.182.70.124] has left #launchpad []
=== niemeyer_ [n=niemeyer@200-193-158-174.ctame7006.dsl.brasiltelecom.net.br] has joined #launchpad
Kinnisonciao dudes08:15
\shjblack: ping 08:19
\shor at least some bzr/baz pros here? I need a short information about importing baz/bzr to svn08:20
\shand vice versa without losing the changelog history ;)08:21
jblackhmm? 08:23
jblackwhich one? 08:23
\shjblack: in common...any possibility? I'm trying to convince one upstream to use baz/bzr but they are using trac as basement for their development env...and this plays nicely with svn...so I want to import it to your bazaar server and provide some ubuntu specific patches (as I did now with lp integration) but need a possibility to import as well those changes automatically to svn...(best way without the diff thing)08:25
jblackLaunchpad can convert cvs/svn repoistories into bazaar archives. 08:26
jblackThere is a tool called tailor that can convert svn archives into bzr. There's also a tool to convert bazaar archives to bzr archives called baz2bzr08:26
\shbut baz2svn / bzr2svn is not invented? :)08:27
jblackTailor probably can.08:27
jblackI hear that tailor is a bit lossy on history though.08:28
\shso the best way is manual work...2 branches...one orig branch which is imported from svn and one working branch for ubuntu...diffing those two branches and repatch the svn head checkout08:29
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [trivial]  Add sbuild.conf to launchpad-buildd package, release v4 of package (patch-2382: daniel.silverstone@canonical.com)08:29
jblackThat should work, yes. 08:30
jblackCarrying code through two RCS systems bidirectionally is still not a very well explored area.08:31
jblackThere's been a few successes and a few failures, but I'm not aware of any clear set of rules that universally apply. 08:31
SteveAjamesh: ping?08:31
\shjblack: ok...but when I generate a changelog text from all commits to baz/bzr...generate a diff to the main svn export branch and patch it to a clean svn checkout..and provide the history of my baz/bzr commits into a single commit message to svn..this should work...*nodnod* yeah..lets try it08:33
cprovlifeless: can you get the builddUI.diff at http://10.90.90.200/~cprov/builddUI.diff and verify if it's ok ?08:34
mdkejordi, got those pots ready for you08:35
mdkejordi, emailing to r@u.c?08:35
cprovlifeless: for celso.providelo@canonical.com/launchpad--builddUI--0--patch-4308:37
kikosalgado, ping?08:40
salgadokiko, pong08:40
kikosalgado, so, can you ensure that08:41
kikoMissing: person_changetimezone08:41
kikoMissing: person_key08:41
kikoare both nuked from our tree in 10 minutes? kthxbye08:41
kikoMissing: poll_options08:41
kikothat's another one08:41
salgadothe first two ones don't exist anylonger08:41
salgadothe third one I just added the pagetitle08:41
kikosure08:42
kikonuke them away08:42
kikors=kiko08:42
salgadoI thought they were already nuked08:43
elmoerr, foaf searching's kind of painful08:43
kikosalgado, they are still in templates/08:44
elmois it unreasonable to expect searching for 'freese' to DTRT08:44
elmoi.e. find this guy: https://launchpad.net/people/bddebian08:44
salgadokiko, I just removed them. 08:44
kikothanks08:45
salgadoelmo, you did a search for 'freese' and got this guy as result?08:46
elmosalgado: no, if I search for freese I don't get him, if I search for defreese (his full surname) I do08:47
elmobut I'd like partial matches of surnames to be returned too08:48
salgadoelmo, the problem is in our full text indexes. look what it does for defreese:08:49
salgadolaunchpad_dev=# select ftq('defreese');08:49
salgado    ftq08:49
salgado-----------08:49
salgado 'defrees'08:49
salgado(1 row)08:49
kikoelmo, that's a fault of our FTI searches.08:49
salgadoso, if you search for defrees you won't get anything either08:50
=== Seveas` [n=seveas@seveas.demon.nl] has joined #launchpad
salgadobah, there must be something wrong08:50
\shsabdfl: ping can I talk to you for 5 mins?08:54
mdzkiko: how did your work on the landing pages go?08:56
Keybukrandomly, I keep meaning to mention to this to people08:57
Keybukhttps://chinstrap.ubuntu.com/~scott/keybuk-launchpad_1.2_all.deb08:57
Keybukdrags in the launchpad deps and sets up postgresql for you08:58
sabdfl\sh: sure, privmsg?08:58
sabdflmpt: ping08:58
\shsabdfl: yes08:58
kikomdz, it went well, no 404s any longer right?08:59
=== SnakeBite [n=SnakeBit@84.242.143.64] has joined #launchpad
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [r=stevea]  Fix buildduration IntervalCol value in builddmaster (patch-2383: celso.providelo@canonical.com)09:10
bradbsabdfl: Just so you know, I've got IBugTask.target returning the correct target in my branch now too (D, DR, DSP, DRSP, P).09:11
bradb(documented in bugtask.txt)09:11
bradbI created a DistroSourcePackage on this branch09:12
mdzkiko: no 404s, but the text still looks like an error09:12
kikomdz, hey, you said the least was a 200ok09:13
mdzkiko: indeed I did09:14
bradbmpt: In what kind of thing should I put the "This bug has *not yet been reported* ..." message? If you tell me what it should look like, I can possibly do the CSS.09:14
mdzstevea and I talked about the text; I guess I assumed that was trivial09:14
kikoit is actually trivial if not for rollout issues09:15
SteveAkiko took a different approach09:15
SteveAthe "coming soon" page is displayed if there is no such package in launchpad09:15
kikolifeless, ping?09:15
SteveAthe real "get help" page is displayed if there is a package09:16
SteveAso, you're seeing the "real" page09:16
lifelesspong09:16
kikolifeless, save me, privmsg09:16
kikoliiiifeless09:19
=== kiko nudges lifeless
Keybukniemeyer: where did you note down the breezy compilation failure for zope?09:26
=== Mez [n=Mez@cpc4-lich4-3-0-cust247.brhm.cable.ntl.com] has joined #launchpad
niemeyerKeybuk: I've sent the patch to the launchpad list.09:26
niemeyerKeybuk: Do you want it?09:26
Keybukah yes, that's where I saw it09:27
=== Keybuk was looking on the wiki
Keybuks'ok, found it09:27
carlosok dudes, time to leave09:29
carlossee you in a week or so09:29
sabdflW00T09:30
sabdfljust wrote a general form processor09:30
sabdflthank god09:31
sabdflno more faking addforms09:31
sabdflnosirree09:31
sabdflthose days are OVER09:31
sabdflkiko: do we have working langpacks?09:34
sabdflkiko: is mpt around?09:34
kikosabdfl, mpt should be arriving any minute now from classes09:35
kikoas for langpacks09:35
kikoall known whitespace issues have been fixed09:35
kikothis took us 3 iterations to get right09:35
kikothe migration script is running on staging and will be finished tonight09:36
=== dePOLL is now known as depoll
kikomost known export issues that were blockers are now fixed 09:36
kikoI'm generating a language pack based on carlos' branch 09:36
kikoand will compare against the official packs later to assert we've got most issues nailed down09:37
kikoI must say there are lots of little corner cases that will need to be shaked down over time09:37
kikoso "working langpack" is not a binary thing09:37
kikothe majority of files now does export successfully, however.09:37
sabdflwhat classes are mpt taking?09:38
salgado:q09:38
salgadodamn focus09:38
sabdflok, thanks for the status update09:38
kikosabdfl, it's thursday, just basic pt_BR classes09:39
kikohe more than replaces the time 09:39
sabdflkiko: k thanks09:43
sabdflbradb: any reason that malone email does not say who made the change?09:43
bradbsabdfl: It says it in the From: line.09:43
sabdfli'd like to make that more explicit09:43
bradbsabdfl: The plan was to change those headers anyway, so that explicitness could happen at the same time.09:44
bradb(as per what Keybuk suggested, etc.)09:44
sabdflseparate issue09:44
sabdflis it going to break a lot of tests?09:44
bradbsabdfl: If you change something in the body, it'll break quite a bit of bugnotification-email.txt.09:45
bradbShould be quick to fix. Other than that, I don't think much else should break from a change of the body content in the email.09:45
sabdflok09:46
sabdfli think i will just reformat that mail substantially, if i get the time09:46
bradbok09:47
Virtuall -         -     Software Freedom Day '05,         00:30 !!!09:48
Virtuall...sorry for that09:49
sabdflVirtuall: bez problem09:52
sabdflshto ti xotjish znaet?09:53
sabdflznaesh, perhaps09:53
Virtuall , ,    Ubuntu Team Latvia           .         .      09:54
Virtuallsabdfl,   ?09:55
Virtuall:)09:55
sabdflok, that's harder to translate09:55
sabdflall i got was ?????????????? ????????09:55
kikoI got some funky norwegian09:55
bradbsabdfl: also, just so you know, i'm changing all the bug actions portlet links to be +addfoo (unless you have any objections)10:04
sabdfl +addfoo?10:05
Virtuall:D10:05
Virtualldamnit :(10:05
sabdfl+addcve etc?10:05
sabdflsure10:05
Virtuallanyway, forget it :)10:05
bradbsabdfl: yeah10:05
sabdflbradb: do you know if the IBugAttachment schema will magically give me the upload-a-binary-object-fu?10:07
sabdflthe Object schema type is not one i've seen before10:07
bradbsabdfl: no idea. BjornT might know, but I guess he's not around10:08
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: r=bjornt various menus and facet-assignment fixes. (patch-2384: steve.alexander@canonical.com, mpt@canonical.com)10:09
SteveAan Object field type specifies an attribute that contains some object that provides the schema specified in the field10:10
SteveAso, you can use it to say that the attribute 'target' must be an IBugTarget10:10
SteveAfor example10:10
bradbah, nice10:10
=== Lovechild [n=dnielsen@0x50c71cc7.adsl-fixed.tele.dk] has joined #launchpad
=== rw` [n=user@200.128.80.250] has joined #launchpad
sabdflthat is nice10:13
SteveAif you want an "upload a file" widget10:14
bradbsabdfl: I think you might want a Bytes field, btw. But I'm only guessing from looking at IBugAttachmentAddForm10:14
SteveAyou'll need to use a Bytes field10:14
SteveAsabdfl: nice that you included a test of facets in xx-ticket-01-overview.txt10:16
sabdflbradb: yes, i found that too. thanks.10:20
sabdflSteveA: i have a nice simple "process a form" now10:21
SteveAcool10:21
sabdflall you do is declare the <browser:page with the view, inherit from FormView, tell it schema, _arguments and _keyword_arguments, and write the function that actually processes the results10:21
mdkejordi, here?10:22
lifelesskiko: about to leave here soon10:22
salgadokiko, lifeless, still mirroring10:23
kikolifeless, almost there10:24
kikothe base-0 mirror is big10:24
lifelessyou can mirror with --no-cachedrevs10:24
kikoah?10:25
kikosalgado?10:25
salgadois it worth stop the mirroring now to use --no-cachedrevs? the base-0 seems to be mirrored already10:26
lifelessif the base-0 is done, dont stop10:26
salgadookay, finished. guilherme.salgado@canonical.com/launchpad--production--1.3110:29
kikolifeless, DO IT10:31
sabdflSteveA: help10:35
lifelesshelp me rhonda, help help me rhonda10:35
sabdfli'm trying to use an editform, with a schema that is a subset of an IPerson10:35
sabdflsubset, in the sense that it has 3 things with the same names as things in IPerson10:36
sabdflbut they are different10:36
sabdflTypeError: ('Could not adapt', <Person at 0x-4a9afc34>, <InterfaceClass canonical.launchpad.browser.person.IPersonHomePageEditSchema>)10:36
lifelesshave you registered an adapter ? 10:36
sabdfldo i need to do something special to be able to do that?10:36
sabdfllifeless: where do i do that?10:36
lifelessyes, either the object needs to declare it implements the interface, or you need to write the code that uses an IPerson to implement an IPersonHomePageEditSchema, and then tell launchpad about that10:37
bradbsabdfl: If you override .create in your view, you can get around having to write an adapter10:37
lifelessso the first question is, does person actually implement IPersonHomePageEditSchema already ?10:37
sabdfllifeless: i think so, yes10:38
sabdfllifeless: in the sense that there are three things with the same name in IPerson10:38
sabdflin the one, they are Bytes10:38
sabdflinthe other, Object's10:38
lifelesssabdfl: in which case, I think the patah of least resistance (but maybe not good zope style - your reviewer will pick up this and check in more detail) is to add IPersonHomePageEditSchema to the interface list in Person10:39
lifelessi.e. implements(IPerson)10:39
bradb(s/create/createAndAdd/, that is)10:39
lifelessimplements(IPersonHomePageEditSchema)10:39
lifelessbradb: oh ?10:39
bradbthe base add views try to adapt the context class to the schema in createAndAdd10:40
lifelessah, so by overriding that you can choose the used schema ?10:40
lifelessseems like routing-around-dmg to me10:41
bradbright, even just overriding .create works for me10:42
bradb(I just did it for +addcve, so that I don't have to write an adapter from IBugTask to ICVERef.)10:42
bradbin sabdfl's case, this might be different though :/ I think the thing that is returned from .create has to provide the interface named in schema="..."10:43
bradbin my case i return an ICVERef from .create, so it provides the schema="...ICVERef" interface.10:44
lifelessbradb: so you did write an adapter;010:44
bradbwith a schema that was created to render one specific form them, you pretty much have to bend over10:44
bradblifeless: no10:44
=== eruin [n=eruin@unaffiliated/eruin] has joined #launchpad
bradbthe last line of my .create is:10:45
eruinre: why aren't there templates for, say, synaptic in rosetta? 10:45
bradb(well, lines):10:45
bradb        return getUtility(ICVERefSet).createCVERef(10:45
bradb            bug=bugtask.bug, cveref=form_values['cveref'] ,10:45
bradb            cvestate=form_values['cvestate'] ,10:45
bradb            title=form_values['title'] ,10:45
bradb            owner=getUtility(ILaunchBag).user)10:45
lifelessbradb: thats how I would have written the adapter ;010:45
bradbi.e. it's something that already provides the interface that was used as the schema="..." for my form10:45
sabdfleruin: good question, i don't know10:46
lifelessbradb: though it may not be easy withou tthe form state variables10:46
sabdflcarlos just left on holiday10:46
sabdflkiko: ?10:46
eruinI'd love to help translating it and others fully in time for breezy10:46
mdkewhat hours does jordi keep sabdfl do you know?10:47
mdkeinsert punctuation in that sentence as necessary10:47
eruinknowing how when a particular app isn't on rosetta is.. confusing at best ;)10:47
lifelessjordi - pretty normal east-spain hours10:48
lifeless(IIRC)10:48
lifelessjordi: ping ^^^10:48
mdkehe has a day job though right?10:48
mdkeanyhow is rosetta@ubuntu.com the correct address for him?10:49
mptsabdfl: pong10:51
mptbradb: <p> would do10:52
mpt<p>This bug is not recorded as occurring in {context}. ( Yes It Does )</p>10:52
mptor something like that10:52
bradbmpt: Hm, it doesn't seem to look ideal without some kind of emphasis (particularly if there's already other portal messages being shown above it.)10:53
mptbradb: Well, then we come back to my old <h2>Status in {context}</h2> and <h2>Status elsewhere</h2> idea10:54
bradbhm. ok, i'll let this one bake a bit longer. working on other things atm (+addfoo for all the bug-related object add pages)10:55
bradbI wonder if there'll be a Malone page test that I *won't* touch in this patch.10:56
dilysMerge to rocketfuel@canonical.com/launchpad--production--1.31: production cherrypick from salgado (patch-5: guilherme.salgado@canonical.com)10:57
kikosabdfl?10:57
kikowhat did I do now10:58
lifelesskiko is that better?10:58
=== BjornT [n=bjorn@82-135-221-189.ip.takas.lt] has joined #launchpad
bradbkiko: I think he might have been forwarding on this question to you, in carlos' absence: 16:45 < eruin> re: why aren't there templates for, say, synaptic in rosetta?10:59
kikolifeless, uhm, well, almost.11:00
lifelesskiko: I'm so out of it, its not funny.11:01
kikolifeless, I'll have stuart fix it, no worries.11:02
lifelesswhat needs doing now ?11:02
kikothanks.11:02
lifelessok. gnight11:02
kikojust too much going on at once11:02
lifelesssabdfl: gnight. see you monday.11:02
lifelesskiko: do you need me to roll it back ?11:02
=== cprov [n=cprov@217.205.109.249] has joined #launchpad
lifelesskiko: or is it an improvement as it stands ?11:02
kikolifeless, rolling it back will be ideal :-(11:03
lifelessdoing so now11:03
kikompt has a pair of pages which will save us till next week, and salgado/stuart can get it up11:03
lifelessdone11:04
=== lifeless crashes
asmodaikiko: oi!11:08
asmodaikiko: Tudo bem?11:08
kikoasmodai, t tudo daquele jeito11:15
asmodaikiko: :)11:15
asmodaiGood to see you alive and kicking ;)11:15
kikoasmodai, I'm kicking as hard as we can11:17
asmodaikiko: That much work?11:17
kikoi'd be lying if I said yes11:17
kikomore than that11:17
kikoTHAT MUCH11:18
asmodai:|11:18
asmodaiToo much?11:18
kikoperhaps :)11:18
asmodai*smiles*11:19
=== asmodai is about to get hired by a Dutch uni. Part of work will be pgsql/dspace hacking
Nafallojordi: ping launchpad-integration11:20
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: [trivial]  Fix missing pagetitles, improve our basic test coverage for those pages, and add utilities/check-templates.sh which verifies if all templates are registered and properly pagetitled. Only one page title missing, but that's Salgado's fault (patch-2385: christian.reis@canonical.com)11:29
bradbsabdfl, BjornT: so, just a heads up then (to hopefully avoid potential conflicts) that all the bug-related object add pages are now officially +addcve, +addattachment, +addurl and +addwatch on my branch11:33
sabdflbradb: eta to landing?11:33
bradband i blew way the factories for those things, using the equiv *Set now11:33
bradbsabdfl: another couple of days, probably11:33
bradbs/couple/few/ considering code review and such11:33
sabdflbradb: i'm starting to prefer a slightly different approach now11:36
sabdflwhere you have something that is always associated with something else11:36
sabdflinstead of a *Set, just put the add on the thing that its linked to11:36
sabdflso for example11:36
sabdflmy new subscription code does not have a TicketSubscriptionSet.new(ticket, person)11:37
sabdflit has Ticket.subscribe(person)11:37
sabdflmuch more natural11:37
bradbright11:37
bradbI'm probably best to save that refactoring for the firefighting-merge after this one lands. It will be a monster.11:39
bradb(or maybe even the merge after that)11:39
bradbI changed the bug page to highlight the current task too. I think it looks a heck of a lot better that way.11:42
niemeyersabdfl: Is the sprint happening at Fieldwave's office (Axiscross House)?11:46
sabdflniemeyer: yes11:47
sabdflbradb: i like the idea of highlighting the current task, if we know it11:47
bradbsabdfl: we *always* know it now :)11:48
bradbeven /malone/bugs/1 redirects to context. no escaping it!11:48
sabdflsounds good.  which context11:48
bradbsabdfl: the first one it finds. first == the bugtask with the smallest id11:49
sabdflbradb: ok11:49
=== cprov [n=cprov@217.205.109.249] has joined #launchpad
=== bradb fixed that goofy duplicate names bug in the maintainers portlet too
bradbno user deserves to see that11:58

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