/srv/irclogs.ubuntu.com/2004/12/13/#launchpad.txt

BradBsabdfl: Hm...I know we spent a while discussing this, so it might seem like a crazy idea, but I almost wonder if it's cheaper (less time, less cost) to simply forget about merging assignments into one table, leave them as is, and do bare SQL to speed up the bug listing when needed. That's really the one and only problematic screen by having them in two separate tables.12:13
sabdflthere is another big advantage to the consolidation12:13
sabdflwe can potentially allow people to refer directly to the id of the BugAssignment table12:13
sabdflupload package foo1.1.1-1 fixes assignment#313453212:13
BradBsabdfl: we can do that now12:13
sabdflno we can't12:13
BradBwe'd just combine bug id + ass id12:13
sabdflyuck12:13
BradB1-1212:13
BradB1-1312:13
BradBno?12:13
sabdfl3536563-34536563363212:13
sabdfl?12:13
BradBheh12:13
sabdflwill the second number refer to a packageassignment or productassignment?12:13
sabdflwhat if the numbers don't match?12:13
BradBsabdfl: er, yeah, hmph12:13
sabdfli.e.12:13
sabdflok12:14
BradBok, i'll keep paring down this pg_dump output12:14
sabdflso there is the idea of the "bug number" and the "work number"12:14
BradByeah12:14
sabdflit's not ideal, because people *will* get confused between them12:14
sabdfl"but i closed bug #23234234"12:14
sabdfl"no you didn't you closed the *assignment* #..."12:14
sabdflbut malone has that extra layer, not much we can do about it12:15
sabdfl*potentially* we could make the assignment #'s much more visible, so that they are the only numbers people think of12:15
BradByeah. but once we have the cross-distro patching, they'll love us.12:15
BradByeah12:15
sabdfla number then correclates to a specific piece of work for a specific bug12:15
sabdfland if you really want to refer to a bug, you can give it a name and use that12:16
sabdfli have a working patch for products-without-projects12:17
sabdfldaf: good work on the page-template-title test idea12:17
dafsabdfl: thanks!12:17
sabdflgood thnking: spot the systemic problem, add a verbose check for it, initially in bleat mode12:17
sabdflthank YOU!12:18
daf:)12:18
sabdflcarlos: i'm seeing the POExportTestCase failure here12:21
=== mdz [~mdz@69-167-148-207.vnnyca.adelphia.net] has joined #launchpad
carlossabdfl: as I said, ./test_on_merge.py canonical pass12:51
carlosthere should be something wrong with make check12:51
=== spiv [~andrew@adsl-66-203.swiftdsl.com.au] has joined #launchpad
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: add SQL patch to merge *BugAssignment tables into one BugAssignment table (patch-924)01:10
Kinnisong'night01:10
=== elmo_away is now known as elmo
=== stub [~stub@dsl-246.248.240.220.dsl.comindico.com.au] has joined #launchpad
dafspiv: ping01:48
carlosspiv: here is better01:48
carlos:-D01:48
=== daf workraves
spivcarlos: pong01:55
carlosspiv: we are having problems with initzopeless and cached values01:55
carloswe have a daemon script that runs outside launchpad01:55
carlosthat process a queue of po files to import01:56
carlosand when we add new files from launchpad to the queue, the daemon does not see them anymore01:56
carlos /s/anymore/ever/01:56
carlosSteveA suggested to use: sqlos.connection.connCache.clear()01:56
carlosafter the commit01:56
carlosbut it does not changes anything01:57
dafour importer calls calls initZopeless when it's instantiated01:57
dafand commits transactions as it goes01:57
dafcarlos: correct?01:57
carlosdaf: yes01:57
dafand the problem is fixed if it calls initZopeless for each transaction01:58
dafbut of course, that's not really a good solution (we don't think)01:58
spivdaf: No, I don't think so either :)01:58
dafam I right in thinking that initZopeless returns something called a transaction manager?01:58
spivcarlos: That specification of how to reproduce sounds remarkably close to something that could be turned into a test case... ;)01:59
carlosdaf: I think so, and we use it for the commits01:59
spivdaf: Yep.01:59
carlosspiv: excuse me?01:59
spivcarlos: What if you do a rollback immediately after a commit?02:00
dafcarlos: spiv wants you to write a test case for him :)02:00
spiv(As a dodgy way to try resync the connection to the database)02:00
carlosspiv: the connection is working02:00
carlosspiv: the postgres log shows new transactions02:00
carlosthe start and end with the commit02:01
carlosand I get data instead of an error02:01
dafare these transactions subtransactions?02:01
spivOh, I misread the description.02:01
carlosdaf: don't think so02:01
dafok02:01
carlosdaf: all them have a start and an end02:01
carlosbefore the other starts02:01
carlossure I could write a test case02:02
carlosspiv: where should It be stored?02:02
spivcarlos: The test case?02:02
carlosyes02:02
spivIf it depends on rosetta bits, initially I'd put it in rosetta, and aim to reduce it to something more minimal and move it to canonical.database later (when we know exactly what's going on).02:03
spiv(And obviously give it a comment saying so)02:03
carlosok02:03
=== carlos opens a bug report
carlosspiv: any suggestion to fix it? :-D02:04
dafin theory, the same problem will happen with any table, not just Rosetta-specific ones02:04
carlosOne thing I don't understand is that the Postgres log shows some queries02:05
carlosso it's not caching everything02:05
dafweird02:07
dafsome queries, but not all?02:07
spivcarlos: Not yet.  :/02:09
=== kiko_bz is now known as kiko
stubcarlos: I think you are seeing transaction isolation in action.02:10
spivOk, there's two possibilities:02:10
spiv 1. sqlobject is caching objects02:10
spiv 2. the transaction is isolated, as stub just said.02:10
stubcarlos: If you close and reopen your connecction, you should see the changes launchpad has made.02:10
spivI've been assuming 2 was likely, so I think we've been talking a cross-purposes slightly.02:10
stubcarlos: If you want to avoid this (there is no real overhead doing it, as psycopg caches connections I believe), you can explicitly set the isolation level.02:11
carlosDon't know if it's related...02:11
carlos2004-12-02 01:45:23 [19630]  LOG:  statement: BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE02:11
spivcarlos: just to confirm, you've seen launchpad commit its transaction?02:12
carlosspiv: yes02:12
dafcarlos: hmm, that looks suspicious to me :)02:12
stubThat is psycopg starting the transaction and setting the default isolation level, so it won't see any changes made to postgres until it is committed or rolledback02:12
carlosand launchpad sees the changes from the script without restarting 02:12
carlosstub: that's ok02:13
carlosbut it does not sees the changes after the commit02:13
dafstub: oh, so it shouldn't be causing this problem, then02:13
spivSo, hypothesis:02:13
carlosstatement: END02:14
stubit will if I open a psycopg connection, I won't see database changes until *my connection* has been committed or rolled back. 02:14
spivActually, hmm.02:14
dafstub: I know transactions are committed/rolled back -- I didn't know that connections are02:14
stubconnections get implicit transactions, as per the DB-API02:15
dafoh, I see02:16
dafbut we cache connections, don't we?02:16
stub(The implcit transaction is probably done when you execute the first bit of SQL on it, or when you create a curor. It isn't defined)02:16
dafso if you reuse an old connection, it might be in the middle of an old transaction that is hiding new data02:17
=== spiv hates the implicit-transactions aspect of DB-API
stubdaf: psycopg caches connections, but handles this stuff for you so you don't have to worry. If you have higher level caches, you end up with trouble (which is why we nuke the SQLOS connection cache every request)02:17
=== spiv sometimes even finds himself wishing he could use MS's ADODB API!
dafspiv: gosh -- it's that bad? :)02:18
carlosfrom the logs, seems like all queries are executed into postgres, so it should get fresh data...02:19
stubspiv: nobody has ever successfully provided a rational as to why it is bad to the DB-SIG, and it won't change unless somebody bothers to. I know I have no problem with it and think it is fine.02:19
spivstub: No-one has ever explained to me why it's good, either ;)02:20
stubspiv: Because requiring con.begin_transaction() would be a dead chicken02:21
kikoimplicitly-created transactions are convenient02:21
stubspiv: And not all database backends support the notion02:21
spivUnless you didn't want to run the statement in a transaction...02:21
stubspiv: Which is strongly discouraged by everyone except MySQL users02:22
spivHeh.  At the time I was an MS SQL Server user :P02:23
stub(Well.. actually it causes me some grief since I sometimes run wierd postgresql commands like 'create database' that can't be executed inside a transaction....)02:23
dilysNew Malone bug #113: "Write a test case for the cache problem with initzopeless", submitted by Carlos Perell Marn02:23
dilyshttps://dogfood.ubuntu.com/malone/bugs/11302:23
stubKiko: we were in the middle of a conversation when my ADSL dropped out.02:25
kikostub, oh. I thought you reckoned it wasn't a pleasant and just pulled the plug!02:25
stubkiko: You were bitchi^h^h^h^h^h^hdiscussing plpythonu usage02:25
kikoI assume too much, it appears.02:25
kikowell.02:26
kikohere's the issue02:26
carlosdaf: malone does not likes you, the person search does not see you...02:26
kikois the plpythonu cr^hode going as far as requiring zope and launchpad?02:26
kikoif so, I need to budget some hours for server work02:26
carlosstub: so, do you think that creating a new connection with initZopeLess is a good solution?02:27
stubNo. Anything I import will be dead simple, only requiring stuff like re02:27
kikostub, it would be nice if you could skip True/False for the time being, then. or give us a workaround02:27
kikoI know that sounds horrible. 02:28
stubcarlos: Sure. Connections are cheap for us.02:28
carlosspiv: test case filed in malone, will do it tomorrow02:28
carlosok02:28
carlosdaf: do you agree?02:28
spivcarlos: Thank you :)02:28
carloscould I commit that change?02:28
kikobut level with me -- I run a debian woody server. we have only one server with disks. 15ish people use it every day. I don't want to break people's work.02:28
dafcarlos: agree? what?02:28
stubkiko: No problem. I assume you need python2.1 compatibility for any plpythonu code until further notice?02:28
kikoright.02:28
carlosdaf: to use your workaround calling initZopeLess with every transaction02:29
kikoI can upgrade the server, but it's an effort that if avoided makes everybody happy02:29
kikoif you can do that, stub, well, I'm adding to that eternal debt i'm running with you02:29
kikonow02:30
kikostub, there's yet *another* matter 02:30
kikoit is now impossible to initialize a postgresql server remotely02:30
kikoit used to be possible using PG_HOST or -h02:31
kikobut now because you require some sql-fu for the fulltext indexing, I believe, it's no worky02:31
stubcarlos: It is because the system searches on 'words', and daf's name is dafydd in the database. We would need customize our stemmer to make the full text stuff match 'dafydd' if you query for 'daf'. 02:31
carlosbut it worked some days ago02:31
kikobut who would want to do that?!02:31
carlosand dafydd is not working02:32
carlosin the popup window02:32
stubkiko: ok. That was me being lazy - I had assumed developers were running with their databases on localhost.02:32
carlosthe form accepts it directly02:32
carlosbut the search popup fails to search "daf" or "dafydd"02:32
kikostub, I realize; we have an "office" setup here, which is ironically unusual here ;)02:32
stubcarlos: oh - the form also does a substring search on person.name, so that should work...02:32
stubKiko: I used to work in an office where we developed on our laptops with not a server in sight ;)02:33
kikothat's not real work!02:33
kikoyou need a coffee machine and a server room02:33
stubkiko: We had the coffee machine, and lack of server let us justify kick arse laptops :-)02:34
dafcarlos: oh, sure02:34
carlosdaf: thanks ;-)02:34
kikostub, I really appreciate any help you can provide to make my life easier.02:35
kikomaintaining this whole crapola is a serious effort!02:35
carlosgood night02:40
dilysMalone bug #77 fixed for product The Rosetta Translation Portal: Implement a potemplate form handler02:40
dilyshttps://dogfood.ubuntu.com/malone/bugs/7702:40
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: Fixed the cache problem with the import daemon as daf and stub suggested (patch-925)02:49
kikotime to run off02:53
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: Python 2.1 compatibility in plpythonu for Team Brazil's antique system (patch-926)02:54
=== spiv [~andrew@adsl-66-203.swiftdsl.com.au] has joined #launchpad
=== ChanServ [ChanServ@services.] has joined #launchpad
=== warthylog [~warthylog@port49.ds1-van.adsl.cybercity.dk] has joined #launchpad
=== Topic for #launchpad: lunchpad: home of the sandwich artists | fogo na bomba | "qorking along happily, with SteveA egging us on"
=== Topic (#launchpad): set by sabdfl at Tue Oct 19 11:05:38 2004
=== lifeless_ is now known as lifeless
=== ddaa [~ddaa@host217-37-231-28.in-addr.btopenworld.com] has joined #launchpad
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: relax source defaults and add tags and cscope to precious - closing #3112 (patch-7)10:17
ddaabob2: lifeless: so, what is going to be the name the new project to put all the little products in?10:17
stubspiv: ping10:18
=== lulu [~lu@host217-37-231-28.in-addr.btopenworld.com] has joined #launchpad
=== Kinnison [~dsilvers@host81-153-126-219.range81-153.btcentralplus.com] has joined #launchpad
KinnisonMorning10:34
spivstub: pong10:41
dafpsycopg.ProgrammingError: ERROR:  could not find tsearch config by locale10:42
daf:-/10:42
SteveAdaf: aha, same problem as Kinnison had10:43
dafdid Kinnison manage to fix it?10:43
SteveAyou're obviously using a deviant locale on your machine... maybe CY10:43
dafI tried changing that10:43
=== Kinnison did
=== Kinnison was magical
Kinnisonstub and I fixed it10:43
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Removing extraneous file-diffs command in help (patch-8)10:43
Kinnisonbut it did involve reinitialising the database from scratch10:43
dafperhaps I need to explicitly set the locale to C in the configuration file10:43
dafoh10:44
Kinnisondaf: It's not that easy :-)10:44
dafgrumble10:44
SteveAwow -- I'm not wearing my glasses and I read that as "ritualising the database"10:44
SteveAdead chickens anyone?10:44
Kinnisondaf: Do you have data you can't bear to lose or can you reinit your entire pg database?10:44
=== Kinnison wraps the rubber chicken around stevea's head
dafactually, no, resetting the DB is ok right now10:45
Kinnisonokay, is stub around, or shall I walk you through i?10:45
Kinnisons/i.$/it?/10:45
KinnisonSince I need to do it on my laptop too10:45
SteveAdude, don't rubber chicken me.  <span style="hale and pace">I am "the management".</span>10:45
KinnisonSteveA: Not even 'da management' can save you from the rubber chicken10:46
=== SteveA holds the chicken in the air and waits for the deckchair to arrive
=== Kinnison shoves it up stevea's nose
SteveAbetter stop there.  a bit cold to bury all my clothes.10:47
KinnisonHeh10:47
Kinnisonstub: ping?10:48
=== SteveA is now known as Keith
Keithhi, I'm keith10:48
=== Keith is now known as SteveA
Kinnisonstop pretending10:48
SteveAspiv: tell me about how the shipit demo is going10:49
spivSteveA: I sent a mail to the admins a while ago about getting apache to point to it, otherwise it should be ready.10:56
sabdflmorning all10:57
sabdflstub: have a patch for ya10:57
dafKinnison: what exactly did you do to fix your DB?10:57
stubYo10:58
Kinnisondaf: can you wait until I've finished this upgrade? Install postgresql-contrib for now if you haven't already and set up the search path as per stub's mail10:58
dafKinnison: done that10:59
sabdflanybody else seeing a test failure on POExportTestCase?10:59
Kinnisondaf: right. given that stub appears to not be around, here goes10:59
Kinnisondaf: stop postgresql10:59
dafok11:00
stubspiv: What do I pass to the authservers createUser method as the loginID? 11:00
Kinnisondaf: cd into /var/lib/postgres11:00
Kinnisondaf: mv data data.before-kinni-fucked-it-up11:00
SteveAspiv: can you cc me into the mail to admins next time?  that allows me to see that things have progressed, but are waiting for the admins to act, without needing to remember to ask you about it.11:00
=== daf senses magic
spivSteveA: Oops, yes, good idea.11:00
dafKinnison: ok11:01
Kinnisonsudo -u postgres initdb --locale=C --debian-conffile --encoding=UNICODE11:01
dafhrm: "sudo: initdb: command not found"11:01
Kinnisonsudo su - postgres11:02
spivstub: an email address.  I should rename that parameter I guess...11:02
Kinnisoninitdb --l......11:02
dafYou must identify the directory where the data for this database system11:02
dafwill reside.  Do this with either the invocation option -D or the11:02
dafenvironment variable PGDATA.11:02
Kinnisonadd -D /var/lib/postgres/data11:03
Kinnisonto the cmdline11:03
dafright11:03
=== Kinnison is about to try
daf/usr/lib/postgresql/bin/initdb: line 648: /etc/postgresql/6328: Permission denied11:03
daf:_/11:03
dafs/_/-/11:03
Kinnisonerm, blergh11:04
Kinnisonhold on, my upgrade has almost finished then I'll try11:04
=== daf can wait :)
stubdaf: Your -D option didn't take effect - it is trying to create the database in /etc/postgresql11:06
dafoh11:06
dafcurious11:06
dafit's having some effect, because it's no longer complaining about the missing option11:06
stubOh... hmm..11:06
KinnisonDo it again without the --debian-conffile option11:08
Kinnisonthen cd into /var/lib/postgres/data11:08
Kinnisonln -sf /etc/postgresql/postgresql.conf11:09
Kinnisonthen back as root, run /etc/init.d/postgresql start11:09
Kinnisonand then try a 'make' in database/schema11:09
Kinnisondaf: Oh yeah, su back to postgres and create yourself first11:11
dafyeah, just tripped over that :)11:11
Kinnison:)11:12
=== Kinnison wonders if 'make check' on batteries is such a good plan
=== Kinnison hunts around for a power socket
dafok, make -C database/schema:11:12
dafpsycopg.ProgrammingError: ERROR:  relation "pg_ts_cfg" does not exist11:12
KinnisonDid you make the symlink as I said? Did you update postgresql.conf as per stub's mail like I asked?11:16
dafthe symlink is there11:16
dafI modified postgresql.conf when I installed postgresql-contrib11:16
dafI just didn't realise at the time that I'd have to totally nuke all my postgres data11:17
Kinnisonyou wouldn't have if your system locale when postgres was installed had been 'C'11:17
dafI didn't know that it would be a problem when I installed it last year :-/11:18
stubI'd assumed all the Ubuntu and Debian installs would have had the C locale11:18
=== Kinnison grins
Kinnisonstub: poor assumption :-)11:18
dafperhaps the priority of that debconf question is lower now11:19
stubdaf: It seems to come up regularly on the mailing lists11:19
Kinnisondaf: psql -d launchpad_dev -c show\ search_path11:19
daf search_path  11:19
daf--------------11:19
daf $user,public11:19
KinnisonThe search path hasn't been updated11:20
dafbut my postgresql.conf says11:20
dafsearch_path = '$user,public,ts2'11:20
Kinnisonand /var/lib/postgres/data/postgresql.conf is a symlink to /etc/postgresql/postgresql.conf ?11:20
dafyes11:20
Kinnisonrestart postgres once more11:21
dafdone, search path is still the same11:21
=== Kinnison boggles
=== Kinnison did exactly as we just went through and it worked for him
stubAdd 'this is a syntax error' to your postgresql.conf11:22
stubAnd bounce11:22
stub(The postgresql server, not you)11:22
dafoop!11:22
dafs!11:22
Kinnisondaf: ?11:24
dafsymlinked into /var/lib/postgres rather than /var/lib/postgres/data11:25
dafthings seem fine now11:25
stubSo simple even a programmer can do it11:25
=== Kinnison grins stub
Kinnisonstub: See, I even remembered the process :0)11:26
dafthanks!11:26
sabdflso nobody else is seeing the test failure on POExportTestCase11:30
Kinnisonsabdfl: I'm just updating to check11:31
=== Kinnison waits for baz to merge 69 new patchlogs
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: use the current project tree archive by default in archive-mirror fixes bug #4115 (patch-9)11:34
=== kiko [~kiko@200-206-134-238.async.com.br] has joined #launchpad
kikostub, you are a riot11:40
Kinnisonas fast as baz can be, goddamn it takes ages to star-merge a week's changes11:41
kikowant a t-shirt?11:41
=== stub got a t-shirt last time
=== stub likes his t-shirt
kikothe new t-shirt should say MAKE BAZ FAST 11:44
kikobut I refrained from political issues this time around11:44
Kinnisonto be fair on baz, it is being squeeeeeeezed through a tiny tiny pipe right now thanks to Kamion chewwing all his available bandwidth11:44
kikocan't he ease up on the pr0n just for your star-merge?11:44
stubWhat do you think he is star merging?11:45
stubPreparing the artwork for the HumanNG theme ;)11:47
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: user creation and authentication tests (patch-928)11:49
SteveAum, i think you mean "testing the artwork for the HumanNG theme"11:51
kikohow would one test that artwork 8)11:53
sabdflKinnison: try star-merge -t for three-way merges, MUCH faster on my machine11:54
Kinnisonsabdfl: -t ?11:54
sabdflthree way merge11:54
KinnisonI was doing a fairly clean merge anyway I think, but I'll bear that in mind11:54
Kinnisonsabdfl: what was taking the time was downloading 69 changesets over a choked link11:54
sabdflah11:55
KinnisonIt only took ca. 30 seconds to star-merge once it had the patches11:55
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Quieter deltas (patch-10)11:58
KinnisonLibrarian meeting time?11:58
SteveAit is almost time for us to talk about the librarian11:58
kikoand I am here11:59
kikobut first, SteveA, debonzi and I have a question11:59
kikocan I steal a few minutes of your time11:59
=== Kinnison goes to make coffee first then
kikosay yes11:59
SteveAokay12:00
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: do not allow newlines in archive locations passed to make-archive and register-archive (bug #3590) (patch-11)12:00
sabdflhrmph12:01
dafwhy do I see:12:01
daf/home/daf/src/canonical/dists/launchpad/lib/canonical/database/sqlbase.py:90: UserWarning: Something tried to set a _connection.  Ignored.12:01
daf?12:01
daf(this is when using scripts which use initZopeless)12:01
sabdflwho changed the layout of the project / product search page?12:01
SteveAdaf: maybe you used initZopeless twice12:02
dafspiv: ?12:02
sabdfli've seen that too12:02
dafSteveA: don't think so12:02
SteveAdaf: can you reproduce it?12:02
dafit seems to happen every time I run such a script12:02
SteveAthat's great.  email me about it and I'll find out what is going on.12:02
SteveAkiko: what's the question?12:03
dafSteveA: what additional information can I give you?12:03
SteveAtell me exactly how to do what you did12:03
kikoSteveA, the question is in what cases are classmethods an acceptable way to obtain a collection of objects?12:03
spivdaf: It's a warning because I wasn't sure if it would happen, and if it did, I wasn't sure if it would necessarily be a real problem or not.  Probably making it a warning is too conservative, because it looks like it happens harmlessly inside SQLObject.12:03
kikoSteveA, I use the rule of thumb, if there's no container, a classmethod on the class itself is acceptable12:04
spivI might be able to detect a harmless occurance, actually, in which case I could suppress the spurious warnings.  Hmm...12:04
dafspiv: ah12:04
daf"LP_DBNAME=launchpad_dev python lib/canonical/rosetta/scripts/show-projects.py" is enough to replicate it here12:04
SteveAkiko: class methods are a pain in the arse for security.  I'd rather avoid them where possible.12:04
kikoSteveA, fair enough. How do I get a collection of sourcepackages? 12:05
spivYeah, virtually any script with initZopeless is.  I figured it was better to have the warning than not, at least initially :)12:05
SteveAthey make for confusing code, because you can get to them from an instance or from the class.12:05
SteveAkiko: write a SourcePackageSet class, I suggest.12:05
SteveAKinnison: please say when you have your coffee12:06
kikoand how do I get an instance of SourcePackageSet?12:06
KinnisonSteveA: the machine is gurgling enthusiastically12:06
kikoSteveA, if you can answer that then I think we are gold12:06
SteveAkiko: getUtility(ISourcePackageSet).  register it as a utility.12:07
SteveAor, from a script, directly import it and use it, seeing as scripts don't register utilities yet12:08
kikouse it how? sps = SourcePackageSet()12:08
kikosps.getPackages("XXX")12:08
SteveAthis way, collections of database things are a lot like other database things12:08
kikoor sps = SourcePackageSet("XXX")12:08
SteveAwe have the implementation class, and the interface12:08
kikosps.getPackages()12:08
SteveAsps = getUtility(ISourcePackageSet)12:09
SteveAsps.getPackage()12:09
SteveAsps.getPackagesMatching('foo')12:09
SteveAor whatever you need12:09
KinnisonSteveA: I now have coffee as black as night, as strong as a hero and as kick-arse-wakeup-goddamnit as a bunch of over-excited geeks at a free-hardware convention12:09
SteveAso, you're ready to talk librarian.12:10
SteveAlet's talk about the librarian.12:10
SteveAyesterday, we talked about thel librarian-wrapper thing12:10
SteveAfor making a bunch of files appear as a package layout for serving by apache12:11
SteveAit is not clear to everyone why such a wrapper is needed12:11
SteveAalso, we talked about how the librarian is to be deployed12:11
Kinnisonyou've conflated two concepts right there12:11
KinnisonThe wrapper is nothing to do with laying out packages12:11
Kinnison:-)12:11
SteveAwhether it serves the outside-world directly, or whether it is served via apache12:11
SteveAok, that's my inaccurate introduction done ;-)12:12
SteveAgo ahead, Kinnison12:12
KinnisonOkay, so cprov has been working on something called the librarian-wrapper which is to be used by lucille12:12
KinnisonIt's purpose is to provide a way to optimise disk-usage and network consumption for archives12:12
KinnisonBasically it's a local-cache of files uploaded to the librarian. Which can be blown away if needed12:12
KinnisonThe idea is that it should speed up publishing and provide us with a good basis for using hardlinks to optimise disk consumption when we have piles of derivative distributions12:13
spivWhy isn't it called librarian-cache then? <wink>12:13
KinnisonBecause the cache is only one bit of its functionality as far as lucille is concerned12:13
SteveAI don't understand "local-cache".  To understand this, I need to understand how this stuff is deployed.12:14
KinnisonI think that particular explanation will be best performed in a room with everyone present and a whiteboard12:14
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Quieter deltas (patch-12)12:14
Kinnisonit's very hard to draw diagrams and arrows on IRC12:14
kikoindeed12:15
kikoKinnison, just give us a use case for this demon12:15
=== spiv "me toos" Steve... librarian currently only stores a given file once, no manner how many times it's uploaded, so I don't quite understand the how it will optimise disk-usage.
Kinnisonspiv: you can't rsync the librarian12:15
kikowhy would you need to?12:16
Kinnisonbecause of archives12:16
spivOk.  Perhaps we should start by discussing archives?12:16
Kinnisonthe issue here is more that the launchpad team don't understand debian on-disk archives12:16
KinnisonGood plan12:16
kikogo12:16
Kinnisonelmo: stop me if I get any of this wrong12:16
=== kiko starts to worry
KinnisonThere are two major portions to each archive12:16
Kinnisonthe pool and the dists tree12:16
Kinnisonthe pool contains all the source packages and binary packages in the distributions12:17
Kinnisons/s$//12:17
Kinnisonthe dists tree contains the Packages/Sources/Release files for each distroarchrelease/distrorelease in the distribution12:17
KinnisonA single distribution is in a single archive12:17
Kinnisonso ubuntu has one dists/ tree and one pool/12:17
SteveAlet's give this discussion 10 more minutes.  if it isn't clear by then, we'll defer until we meet in person around a whiteboard.12:18
KinnisonAre you all reasonably happy about this so far?12:18
spivI think so.  Effectively, the dists tree has references to files in the pool?12:18
Kinnisonindeed12:19
kikoso far no news12:19
Kinnisonbut if two distroreleases contain the same package (version) then they both point at the same file in the pool12:19
KinnisonNow, in terms of mirroring etc, this is a very good situation12:19
KinnisonSo we want to present on-disk archives in this format for http, ftp, rsync access12:19
KinnisonThis is what all the lucille publishing stuff is for12:20
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Forgot to commit extra file-diffs in cmds.c before merging (patch-13)12:20
KinnisonNow. When we have 100 derivative distributions; all of which share most of the same stuff with ubuntu, you'd imagine that the simplest thing to do would be to give each one their own pool/ and dists/12:20
Kinnisonand that is exactly what we want to do12:21
SteveAso, you need something that takes information from the database, plus files from the librarian, and puts them out into files and directories ?12:21
KinnisonSteveA: yes. That's what canonical.lucille.Publisher does12:21
SteveAokay12:21
SteveAwhat part of this does librarian-wrapper do?12:21
=== silbs [~sbsm0084@host217-37-231-28.in-addr.btopenworld.com] has joined #launchpad
KinnisonSteveA: The librarian-wrapper's job is to make sure that when we publish ubuntu, kubuntu, gnubuntu, magix, wibblix and fooble-linux, they continue to share on-disk files which are identical.12:22
KinnisonThis is done by hardlinks12:22
=== Kinnison micro-workraves, brb in 20
KinnisonDo you see why this is needed?12:22
spivOk, I think I see.12:23
kikoI still don't get the "cache" part, but I think I'm close12:23
Kinnisonkiko: The cache works as follows12:23
spivIn theory, the librarian could be taught to serve files over http in the layout expected for this.  But that doesn't help with the requirements of serving ftp and rsync as well.12:23
Kinnisonkiko: I upload a foo 1.0-112:23
Kinnisonkiko: lucille uploads the files to the librarian12:24
Kinnisonkiko: it also caches a copy locally on the archive machine12:24
spivSo a cache of real files on disk makes sense, so we can use the usual (and well-tested) tools for those jobs.12:24
Kinnisonkiko: when it comes to publishing, it doesn't have to re-download the file from the librarian again12:24
Kinnisonkiko: and considering the size of archives, this is well worth it12:24
kikohmmm12:25
kikowould be nicer if the librarian offered a mountable filesystem UI12:25
kikoi.e. with real filesystem semantics12:25
SteveAI think I see.  it is a wapper that is used only by lucille's publisher, of the librarian's interface to our software.12:25
Kinnisonkiko: I don't think that's a viable target12:26
KinnisonSteveA: yes12:26
KinnisonSteveA: hence it's canonical.lucille.LibrarianWrapper12:26
kikoI'd have to ask why not12:26
Kinnisonkiko: when was the last time you wrote a filesystem?12:26
spivKinnison: There's actually a fairly nice python library to do that, I think.12:27
spivPossibly worth investigating.12:27
kikoKinnison,  http://www.freenet.org.nz/python/lufs-python/12:27
Kinnisonspiv: that exposes for rsync too?12:27
kikoit's not really that hard12:27
SteveAok, I'm happy that I understand what I need to understand right now.  The rest, we can leave until mataro.12:27
=== ddaa [~ddaa@host217-37-231-28.in-addr.btopenworld.com] has left #launchpad []
=== Kinnison nods SteveA
=== ddaa [~ddaa@host217-37-231-28.in-addr.btopenworld.com] has joined #launchpad
SteveAKinnison: can you write up a few notes from this to the lucille part of the wiki?12:27
KinnisonSteveA: I will do12:27
sabdflthanks Kinnison12:28
SteveAthe thing I missed yesterday was that this was a wrapper only for use by lucille12:28
kikoKinnison, also sort out that crazy mess that is the lucille part of the wiki? 8-)))12:28
Kinnisonkiko: crazy mess?12:28
=== kiko bats eyebrows at kinni
spivKinnison: I was referring to a library to write a filesystem in python -- it binds to user-space filesystem kernel module, iirc.  So it'd be a "real" filesystem, hence rsync would work.12:28
sabdflB-)12:28
=== Kinnison bats kiko
=== sabdfl wonders how to get the dark glasses too
spivWhether that sort of thing is mature enough to use for this, I don't know :)12:28
kikothat is one scary wikipage dude12:28
Kinnisonspiv: ergh12:28
kikoKinnison, it's the lufs-python thing I said, and it's damned cool12:29
kikoa guy wrote a gmail filesystem using it12:29
spivkiko: Have you used it?  I haven't had a chance to play with it yet.12:29
kikoyeah, it's pants12:29
KinnisonSteveA: actually; can I leave updating the wiki until we chat about this in mataro?12:29
SteveA B-)12:29
SteveA|3-)12:29
SteveA B-)12:29
SteveA12:29
spivkiko: Good pants or dirty smelly underpants? :)12:29
=== kiko senses Kinnison looked at the wiki page and said "oh-oh"
kikospiv, good smelly pants12:29
spivAwesome.12:29
kikoseriously12:30
kikogmailfs is bizarre crack, but it works12:30
SteveAKinnison: okay.  I'll write up the essentials of this meeting.12:30
spivI hoped it was, but it's one of those things that sounds too good to be true :)12:30
kikohttp://richard.jones.name/google-hacks/gmail-filesystem/gmail-filesystem.html12:30
kikoexcept it uses fuse, not lufs12:30
kikohttp://fuse.sourceforge.net/12:30
SteveAI support the lucille team keeping things simple, in the sense of making something complex out of simple well-known parts. 12:31
KinnisonSteveA: thanks dude.12:31
sabdflSteveA: are the lists still on rince?12:31
Kinnisonkiko: No, I thought about it and decided that the right idea was to wait until we could distill the information into something people would find useful to read12:31
SteveAThis may well be more resiliant than making one complex thing to do a complex job. 12:31
=== Kinnison glares at kiko
SteveAsabdfl: um... were last I used the admin interface to them.12:31
=== kiko pats Kinnison
kikoI only meant to tease my precioussss12:32
SteveAsabdfl: think we should move them onto a canonical machine?12:33
sabdflSteveA: at some time, yes12:33
=== Kinnison refuses to sniff kiko's ring
stubMeanies! Nobody pinged me :-(12:33
=== stub pouts
kikostub, dude, you made me wake up at 7am12:33
kikoI didn't mean it that way!12:35
=== kiko cringes
kikoah, well, time to do something productive12:35
=== kiko is now known as kiko_bz
=== stub [~stub@dsl-246.248.240.220.dsl.comindico.com.au] has joined #launchpad
Kinnisonstub: I take it my pinging you broke things?12:36
stubKinnison: You crashed gaim12:36
Kinnisonstub: r0xx0r12:36
Kinnisonstub: I was pinging you with http://users.pepperfish.net/dsilvers/mp-ping.wav12:36
kiko_bzevil12:37
stubre: librarian filesystems, the web server needs to remain lean and mean - I suspect any virtual filesystem stuff would be the real of other daemons (like this librarian-cache thingy in fact)12:37
=== cprov [~cprov@c9066416.virtua.com.br] has joined #launchpad
sabdflSteveA: we need a malone user mailing list12:39
SteveAKinnison: this is served with a content type of text/plain12:39
sabdflwhy not just use the existing private malone list, but make it open?12:39
KinnisonSteveA: it is? eww12:39
=== Kinnison goes to fix
sabdflalternatively, we could create a malone-users list12:40
sabdflas for rosetta12:40
SteveAwhen do we need this by?  we could create a new list, in the place where we want lists to live on a canonical server.12:40
sabdflno, let's leave the list admin and movement stuff to elmo et al12:41
sabdfli'll create a malone-users list in the current location12:41
SteveAby "we" I meant "ask elmo etc. to do it"12:41
KinnisonSteveA: updated to audio/x-wav12:42
=== Kinnison gets workraved
sabdflerk, it's not loving me12:43
Kinnisonwhat isn't?12:45
=== carlos [~carlos@69.Red-80-33-181.pooles.rima-tde.net] has joined #launchpad
carlosmorning12:47
=== salgado [~salgado@200-206-134-238.async.com.br] has joined #launchpad
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Fix #3555. (patch-14)01:29
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: allow test suites to synthesis a test uid, in case one is not set - bug #3107 (patch-15)01:42
=== lulu [~lu@host217-37-231-28.in-addr.btopenworld.com] has joined #launchpad
kiko_bzSteveA, stub?01:53
stubYo01:54
kiko_bzstub, salgado and I have a question about subscribers01:54
kiko_bzwe would consider using it for karma events01:54
kiko_bzbut there's something we are fuzzy about01:54
stubIts probably the best approach, but go on01:55
kiko_bzwe'd like each callsite that triggers a karma event specify an argument (how much karma to give)01:55
kiko_bzI'm not sure if that is possible01:55
stub( BradB did the event stuff for Malone emails, so probably knows more than me btw )01:55
kiko_bzor alternatively if we could use a mapping from event to karma points that would be used 01:56
stubIf I remember correctly, events are just objects that implement a particular interface - stick in data to your hearts content.01:56
stub(this is all from memory from a while ago). I think you just implement an IKarmaEvent inheriting from the relevant interfaces that defines whatever extra info you need. The code then publishes that event and zope shuffles it off to your subscriber.01:58
kiko_bzsalgado, sound doable?01:59
salgadoyep02:00
=== cprov [~cprov@c9066416.virtua.com.br] has joined #launchpad
stubBrad has created ISQLObjectModifiedEvent which should give you an example - grep should get you started if you just want to see the code.02:03
salgadostub, i've seen the code yesterday. it looks pretty simple to register new subscribers. 02:05
kiko_bzgoodie02:05
stubkiko_bz: That plpythonu code happier now? I haven't got a Python2.1/PostgreSQL server to test it on.02:08
salgadostub, another question... what do you think of distributing tsearch2.sql inside (maybe) database/schema?02:08
kiko_bzsalgado, check out stub's merge on anthem for us when you have a moment02:08
kiko_bzthanks stub02:08
salgadoI'll check02:08
stubsalgado: I believe tsearch2.sql creates a load of external C server side functions - won't work unless you have the library installed too, and in the location that tsearch2.sql says it is at.02:09
salgadostub, the problem is when we're creating the database remotely (via PGHOST), and don't have postgres-contrib installed. 02:12
salgadowe don't have it locally, but it's installed on the server02:12
salgadoso, we only need the tsearch2.sql file localy, cause we can't read it from the server02:12
stubok. So you copy tsearch2.sql from your server to the location that fti.py expects to find it. I wouldn't want to put it in database/schema because your tsearch2.sql may not be the same as other peoples.02:14
stubWhich reminds me of the other problem kiko mentioned - that I neglected to allow people to specify the port.02:15
stuberm - hostname02:15
=== stub checks
stubNope - it should allow specification of a remote host, but has not been tested.02:17
salgadoI think it's easyer if we just use PGHOST. is there any problem with this approach?02:17
stubThe script uses canonical.lp.dbhost and canonical.lp.dbname to connect to the database. canonical.lp.dbname uses LP_DBNAME and LP_DBHOST environment variables to override the default (which is what the makefile does)02:21
stub(Although I just noticed the makefile is only setting the LP_DBNAME environment variable to pass to fti.py - not the LP_DBHOST one. That should be a quick fix)02:22
stub'env LP_DBHOST=myserver make' should propogate it through right now and work02:24
=== cprov [~cprov@c9066416.virtua.com.br] has joined #launchpad
salgadostub, it should work when creating the database, but not when running lp. 02:25
salgadowhen running lp, we need to change package-includes/launchpad-configure-normal.zcml.02:26
salgadoif we use PGHOST, then we don't have to change anything else02:26
stubA better way is to create a file override-includes/+mydbsetup.zcml with all the configuration, which will override the defaults (using ZCML magic stuff designed for this)02:27
=== lulu [~lu@host217-37-231-28.in-addr.btopenworld.com] has joined #launchpad
stubSteveA wants us to break all this junk out into a single configuration file, which will make rollout to production servers simpler and safer.02:28
=== Kinnison [~dsilvers@host81-153-126-219.range81-153.btcentralplus.com] has joined #launchpad
Kinnisonre02:29
stubBut using the override-includes method works now, and you could add a new rule to the makefile so 'make async-run' or whatever copies that file into the directory and runs02:29
kiko_bzmake async-run is so sweet02:30
SteveAhttps://wiki.canonical.com/LaunchpadProcessConfig02:32
SteveAcan you take a look at that list, and add anything else which needs to be configured per-process ?02:32
SteveAthat is, configuration for running the server, not configuration of the software itself02:32
SteveAwhen it is implemented, that page will change to a guide on how to use this configuration02:33
stubmake async-run; run-async, run!02:33
SteveABradB: got a minute?02:47
SteveAKinnison: got a minute?02:48
Kinnisonyep02:48
SteveAI'm filling in the monthly report to the canonical directors02:48
SteveAwhat significant happened on lucille over the last month or so?02:48
KinnisonGosh02:49
KinnisonGive me a sec to summarise02:49
SteveAokay02:49
SteveAnot looking for much depth02:49
SteveAjust an idea of where we're at in the big picture of getting lucille integrated and deployed and used02:49
=== Kinnison nods
KinnisonMost of the side processes are done. I.E. the publishing stuff, the domination stuff. The database has been through loads of changes to bring it up to scratch02:50
KinnisonI've dedicated a hell of a lot of my time to getting gina working well too. Perhaps almost 50% of the last month of work for me02:50
KinnisonWe're aiming to have lucille tracking katie as well as we can by the end of es-conf02:51
KinnisonWhere 'We' is myself and cprov (and probably lamont for the buildd stuff)02:52
SteveAwhat does that give us?02:52
SteveAthis is basically lucille and katie running in parallel?02:52
=== cprov_ [~cprov@c9066416.virtua.com.br] has joined #launchpad
Kinnisonyes02:54
Kinnisonthere will be things we need to add to lucille and the most effective way to find them out is to try to get lucille to shadow katie02:55
SteveAwhat's a succinct definition of "publishing" and "domination" ?02:57
SteveAlucille is into P+D02:57
SteveA(I did just check the wiki pages)02:58
KinnisonThe ProjectGlossary carries short definitions of P & D02:58
KinnisonAre they insufficient?02:58
SteveAa bit technical.  seems to me that publishing is making a coherent set of packages available that an operating system can install.  02:59
SteveAdomination is clear02:59
KinnisonOkay, yes that's a reasonable less-technical summary of P03:00
KinnisonWill you drop it into the glossary?03:00
SteveAdone03:01
SteveAwill we be using lucille with the real live katie next month?03:01
Kinnisonlucille will be tracking katie03:01
SteveAwhen we do an actual deployment of soyuz to the golden servers / databases03:01
KinnisonI'm not sure03:02
KinnisonI imagine that can only be answered by sabdfl and only after we see where we are at the end of es-conf03:02
SteveAokay03:02
SteveAthanks Kinnison03:03
BradBmorning all03:25
sabdflSteveA: gina needs some tweaks so that it can run both debian and hoary simultaneously03:26
sabdflthen we can bring it up in production03:27
sabdfli hope during mataro03:27
sabdflcarlos: i am still eeing the poexport test failure, it's preventing a commit to rf for me03:27
=== lulu [~lu@host217-37-231-28.in-addr.btopenworld.com] has joined #launchpad
sabdflError in test testPoExportAdapter (canonical.rosetta.ftests.test_poexport.POExportTestCase)03:28
sabdflTraceback (most recent call last):03:28
sabdfl  File "/home/mark/projects/ubuntu/launchpad/lib/canonical/rosetta/ftests/test_poexport.py", line 156, in testPoExportAdapter03:28
sabdfl    project = Project.selectBy(name = 'gnome')[0] 03:28
sabdfl  File "../../lib/sqlobject/main.py", line 1238, in __getitem__03:28
sabdfl  File "../../lib/sqlobject/main.py", line 1242, in __iter__03:28
sabdfl  File "../../lib/sqlobject/dbconnection.py", line 520, in iterSelect03:28
sabdfl  File "../../lib/sqlobject/dbconnection.py", line 448, in __init__03:28
sabdfl  File "/home/mark/projects/ubuntu/launchpad/sourcecode/zope/src/zope/app/rdb/__init__.py", line 308, in cursor03:28
sabdfl    return ZopeCursor(self.conn.cursor(), self)03:28
sabdflInterfaceError: already closed03:28
sabdflany suggestions?03:28
SteveAdo you get the same error if you run just that test?03:28
sabdflspiv, carlos, SteveA, any pointers where i can look for a solution to this?03:28
SteveApython test.py -f canonical.rosetta.ftests03:28
SteveAif you get the same error, that's good because the test is isolated enough so that it fails when run on its own03:29
sabdflmark@hagrid:~/projects/ubuntu/launchpad$ PYTHONPATH=./lib/ python lib/canonical/rosetta/ftests/test_poexport.py03:30
sabdfl.03:30
sabdfl----------------------------------------------------------------------03:30
sabdflRan 1 test in 14.238s03:30
sabdflOK03:30
sabdflException exceptions.TypeError: <exceptions.TypeError instance at 0x4112736c> in <bound method Transaction.__del__ of <sqlobject.dbconnection.Transaction object at 0x41091b6c>> ignored03:30
SteveAif you do not, it means that some transaction context is not being cleaned up properly from a previous test03:30
SteveAthe __del__ thing isn't important.  just some bogosity in how sqlobject does something. 03:30
SteveAsabdfl: what do you run to get the problem?  just make check?03:31
carlossabdfl: if make check fails but test_on_merge.py works, don't worry, pqm will accept your commit03:33
carlosI think that it's a problem with other tests that are executed with make check but are not executed with test_on_merge.py03:33
SteveAthe problem is that you can't check things yourself properly before sending to pqm03:33
carlosSteveA: I do it with test_on_merge.py canonical03:34
SteveAif the problem doesn't occur for sabdfl for running 'python test_on_merge.py canonical', then that is interesting03:34
SteveAI'm getting rather cold at home, so I'm going to go and work from a cafe for a while, shortly.03:36
carlosSteveA: Do you have any priority task for Rosetta before Matar?03:38
carlosI'm going to work fixing the statistics so they are useful and also improving the import code to handle errors better03:38
carlosany other task I should look at as a priority?03:38
sabdflSteveA: i do get the problem with test_on_merge03:40
carlossabdfl: could you send me the output of test_on_merge.py canonical 2>&1 > test-log.txt?03:41
carlossabdfl: and disable the test (again)03:42
SteveAsabdfl: disable the test.  I think I'll have to add some extra checking to the test runner to detect what the problem is.03:44
=== salgado is now known as salgado-lunch
SteveAcarlos: you have the emails from daf.  He's been going through the workflow of "I'm demonstrating rosetta to an audience of thousands", which happens to be very similar to the workflow that a regular translator would use.03:45
SteveAgo through the same workflow, maybe with different pot / po files.03:45
SteveAcheck for links that appear, but don't actually work as advertised03:46
carlosyeah, my tasks are to improve that process03:46
SteveAcheck for confusing text or not enough text or too much text03:46
SteveAmake sure each page says clearly what it expects of the user, or what it is showing the user03:46
carlosok03:47
SteveAsabdfl: can I borrow you for a second, as a "regular launchpad programmer"?  Did you read my email about page titles?03:47
SteveAI want to know whether you find it better to include the page title as filling in a metal:fill-slot in each page,03:48
sabdflerm... i've just spent a bit of time adding them to malone pages... and no, not yet03:48
SteveAor if you'd rather use zcml in the browser:page directive to give them03:48
sabdflin some cases the title is easy, for example the addforms03:48
sabdfl"Add a New Product"03:48
sabdflbut even there, it would be nice sometimes to be able to customise the title03:49
SteveA  <page03:49
SteveA    for="canonical.launchpad.interfaces.IBug"03:49
SteveA    name="+frobnicate"03:49
SteveA    permission="launchpad.Edit"03:49
SteveA    template="../templates/bug-frobnicate.pt"03:49
SteveA    title="Frobnicate bug ${context/name}"03:49
SteveA    />03:49
sabdfl"Add a Project to the Mozilla Project"03:49
SteveAmy proposal is to allow simple tales string: expressions in a "title" attribute in your zcml03:49
sabdflok, if you can ${context/foo} then that might be fine03:49
SteveAso, this can be a plain string03:49
sabdflwhat about l10n03:50
SteveAI'm wondering more about whether zcml is the right place to put these things in03:50
SteveAwe can handle i18n in this case03:50
SteveAthat just becomes a standard thing to be replaced03:51
SteveApersonally, I don't mind using metal:this-and-that in pages03:51
SteveAbut I think it does complicate things a bit03:51
SteveAusing more than one slot all the time03:51
SteveAhmm... a page's title is somewhat like its name in a URL.  that is, you'd expect them to be related.03:57
=== SteveA goes out
sabdfldef ProductBugAssignmentFactory(context, **kw):04:08
sabdfl    return ProductBugAssignment(bug=context.context.bug, **kw)04:08
sabdflbradb: around?04:08
BradByes04:08
sabdflif you don't specify a class (viewclass) on an addform, how is the content_factory called?04:09
sabdfli'm trying to make sense of the above code and decide if I want to follow that patter or do something different04:09
BradBsabdfl: By the default AddView class04:09
sabdfland the default AddView passes the context like that?04:09
BradByes04:10
sabdflseems to me that a database-class Factory should not be aware of "context" issues04:11
BradBThere was a time at which I understood the context.context part...it's failing to come to mind at the moment. /me thinks.04:11
sabdflmalone/bugs/CONTEXT/productassignments/+new04:11
BradBsabdfl: The context could be something like a container though, I think, so that's why it should know.04:11
sabdflcontext.context.bug...04:11
sabdflseems to me i want to be able to use a ProductFactory to create a product with or without a project04:12
sabdflif i'm doing it in a project, then use it, if not, don't04:12
BradBoh! i think context is a view actually.04:12
sabdflcontext.context... would break under different usage patters04:12
sabdflit make the db stuff view-sensitive04:13
sabdflyuck... a context that is a view? that's nice and readable04:13
sabdflsounds like z3 breakage04:13
BradBthat's why it has a context attrib.04:13
=== BradB takes a quick look at AddView to be reminded of the details
sabdfli think addview / editview / form could be turned into something simpler and more generic04:14
BradBsabdfl: yep, i filed a bug on that a long time ago.04:14
BradBsabdfl: stevea's going to do something about it in mataro i think/hope04:15
BradBbecause until it's genericized, it's slowing us down.04:15
BradBwe want a browser:form directive, where you can provide a thing as input and then do something with the submitted values.04:16
BradByeah, the factory is bound to the view with self._factory(*args, **kw) in AddView.create, I believe.04:17
sabdflhmm... there must be a better way04:23
BradBsabdfl: Hm, skimming through Z3 sources, they seem to use classes as the content_factory04:23
sabdfli think i'm going to write a custom view, then call the factory directly04:24
BradBsabdfl: you can use keyword_arguments in your addform too04:25
BradBthe be explicit about what gets passed for the kw args to your factory04:26
BradBI'd prefer an approach that avoids writing code, so that we don't have to maintain it.04:26
=== salgado-lunch is now known as salgado
BradBsabdfl: Or you could write your own content_factory if you're creating the content in that much of a different way. Writing a new view is a fair bit of effort (relatively speaking, i.e. thinking of if we consistently added new views in this way, we'd have a ton of extra code to maintain.)04:27
sabdflthe existing machinery is fine if you are adding  or  editing a class that maps directly and exclusively to a table04:30
sabdfland if everything in that page can be made into a nice widget04:30
BradBsabdfl: BugFactory does something that doesn't map onto a table.04:30
sabdflwe stretch that with "owner" where we want a field to be derived from the request/principal info04:30
sabdflthen we stretch it really HARD when we want to add something and also touch a bunch of other tables04:31
sabdflBradB: to use BugFactory to "add a bug to an existing product"  I had to create a custom View class04:32
BradBsabdfl: Hitting the request directly in a content_factory is nasty. Hitting more than one table is fine though, I think. There's no explicit or implied relationship between content_factory and (only one) table.04:32
BradBsabdfl: at worst, you would have had to create a new content_factory.04:32
sabdflthat View class knows the principal, and knows the Product, so it can call the content fctory with the correct parameters04:32
sabdfli would prefer to have one factory and multiple views, than one view and multiple factories04:33
sabdfland if you think about it, that's what you've wanted too04:33
sabdflthat's why you kept urging me to make my code use the BugFactory, which i did04:33
sabdflthat way, all the notification logici is in one place04:33
sabdflbasically, the View is by definition sensitive to the specific setting of that request04:34
BradBIf you want something built in a different way, you send it to a different factory to be built.04:34
sabdflno you don't04:34
sabdflyou call the factory in a different way04:34
sabdflwhich means a custom view class04:34
BradBsabdfl: You can do that in ZCML though04:34
sabdflnot very well04:34
BradBsabdfl: no! you can do that in ZCML.04:34
sabdfldude, get context.context.bug OUT of a database factory class, then we can talk04:35
BradBsabdfl: you're doing the same type of thing though, but instead writing a whole new view to achieve that.04:36
BradBsabdfl: We need to get at a newly created bug's id somehow.04:36
BradBAnd that's not yet available in the request.04:36
sabdfl"a whole new view"04:37
sabdfla view should be as simple as:04:37
BradBsabdfl: a content_factory is a simple little function04:37
sabdflclass ProjectAddProductView(AddView):04:38
sabdfl   def addmethod(self, **kw):04:38
sabdfl        return factory(**kw)04:38
sabdflnothing more04:39
sabdflof course, you can add some other processing in the addmethof04:39
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: cmd-delta is much smarter/looser now. You can now pass ., revision, version or package (patch-16)04:39
sabdflto set things up right for the factory04:39
BradBsabdfl: okay, maybe i'm being retarded, but BugFactory doesn't do context.context.bug.04:40
sabdfl(15:08:29) sabdfl: def ProductBugAssignmentFactory(context, **kw):04:41
sabdfl(15:08:29) sabdfl:     return ProductBugAssignment(bug=context.context.bug, **kw)04:41
=== cprov_ [~cprov@c9066416.virtua.com.br] has joined #launchpad
BradBsabdfl: let's face it though, that 3 line class you show above reaks of boiler plate. surely there's a way to do it in zcml.04:43
BradBsabdfl: i dunno, we shouldn't spend too too much time on this. if you want to do it your way, go ahead. if i figure out a better way (i.e. no code), i'll fix it and tell you what i did.04:44
BradBs/reaks/reeks/04:45
BradBOverriding the constructors of the relevant content classes would also be a useful thing, and reduce the number of places to find out how a Foo is constructed to just one: Foo.__init__.04:49
BradB(override to perhaps take optional args and create other db objects closely related to the thing being created when it makes sense to do so: e.g. default Cc'er on a bug, spname/distro assignment, etc.)04:50
=== BradB has to step out for a bit to do some pre-Spain banking
=== BradB is now known as BradB|out
=== cprov_ [~cprov@c9066416.virtua.com.br] has joined #launchpad
dilysNew Malone bug #114: ""See the bugs assigned to you" doesn't work correctly", submitted by Andrew Bennetts05:03
dilyshttps://dogfood.ubuntu.com/malone/bugs/11405:03
dilysNew Malone bug #115: ""my todo list" page generates broken links to bugs", submitted by Andrew Bennetts05:08
dilyshttps://dogfood.ubuntu.com/malone/bugs/11505:08
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Copyright fix. (patch-17)05:12
=== Kinnison [~dsilvers@haddenham.pepperfish.net] has joined #launchpad
=== cprov_ [~cprov@200.99.130.18] has joined #launchpad
=== cprov_ [~cprov@c9066416.virtua.com.br] has joined #launchpad
=== cprov_ [~cprov@200.99.130.18] has joined #launchpad
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Really dont get pristines on get if specified (patch-18)06:32
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Handle register-archive with urls with % in them (patch-19)06:34
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: fix lock-revision to generate txn ids, and to work when passed a version - bug #3747 (patch-20)06:38
=== SteveA [~steve@adsl-213-190-44-43.takas.lt] has joined #launchpad
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: Fixed a print to stdout instead of stderr in make-archive (patch-21)06:51
sabdflBradB|out: yes, the three-liner was boilerplate, if that's all you are doing then you would use zcml07:10
sabdflbut if you want to fiddle with the form results, THEN call the factory, this is the way to do it07:11
=== BradB|out is now known as BradB
dilysMerge to thelove@canonical.com/bazaar--devo--1.1: cmd-apply-delta now smart enough to hunt out the tree root (patch-22)07:15
dilysMerge to rocketfuel@canonical.com/pyarch--production--1.5: fixes for baz format archives (patch-1)07:17
=== lulu [~lu@host217-37-231-28.in-addr.btopenworld.com] has left #launchpad []
salgadoBradB, we don't have a notify() for a comment added event, right?07:38
BradBsalgado: notify is always there, and yes, there's definitely one for a comment.07:47
BradBI'm adding a bunch more subscribers today for bug activity tracking.07:48
salgadoBradB, I don't see the registered subscriber ( notify_bug_comment_added) being called when a new comment is added. 07:50
BradBAh, I think it's because of Mark's refactoring of bug message.07:53
BradBit's registered like:07:53
BradB<subscriber07:53
BradB   for="canonical.launchpad.interfaces.IBugMessage07:53
BradB        zope.app.event.interfaces.IObjectCreatedEvent"07:53
BradB   factory="canonical.launchpad.mailnotification.notify_bug_comment_added" />07:53
BradBMaybe the thing that gets created is different now (and thus that subscription doesn't get notified.) I'm not sure of the details offhand though.07:53
BradBI have a feeling that if it were reg'd for IMessage it would work again.07:54
BradBsabdfl: Sound about right? :)07:54
=== BradB fixes it
BradBeh, it's not obvious though, hm, I'll wait07:56
=== silbs [~sbsm0084@host217-37-231-28.in-addr.btopenworld.com] has left #launchpad []
sabdflBradB: yes, i think that would be about right08:14
sabdfli'm not sure if the message on its own is enough though08:14
BradBNope, that's where the "not obvious though" part comes in.08:15
sabdflyou probably want to catch the BugMessage, so you can notify people of the creation of a specific message for a specififc bug08:15
BradBnotify() has to be called with the correct object08:15
sabdflstevea: am getting an odd permission problem traceback08:15
BradBIt must now be being called with an IMessage08:15
sabdflTypeError: ('Not enough context information to get parent', <canonical.launchpad.webapp.authentication.LaunchpadPrincipal object at 0x445bb4cc>)08:15
sabdflBradB: but creating the Message doesn't tell you what it's been created *for*08:16
sabdflit's the BugMessage that gives it context08:16
sabdflfor example, without the BugMessage, you would have no idea who to notify ;-)08:16
BradBsabdfl: that's why I'm saying it has to be called with the IBugMessage. Currently, it must be being called with an IMessage.08:17
BradB"it" being notify(), of course08:17
salgadoBradB, do you see any problems in passing the request to SQLObjectModifiedEvent?08:19
BradBsalgado: It's cleaner to avoid depending on it in the subscribers. Why do you want the request in a subscriber?08:21
salgadoBradB, I'm subscribing functions to assign karma for people that change bugassignments, and I want to know who changed it08:23
salgadocan I get this information from somewhere else?08:24
BradBsalgado: I think you should be able to create your own event type, IKarmaEvent, that stores the person who's earned the karma. Your subscriber would then subscribe to the object type, SQLObjectModifiedEvent and IKarmaEvent.08:26
=== Kinnison waves
sabdflcheers08:27
Kinnisonc'y'all tomorrow08:27
Kinnisonsabdfl: I took a chunk of this afternoon to do an emergency IP switch. I'll make it up by doing work while travelling to Mataro if that's okay with you08:28
BradBsalgado: Or IKarmaEarnedEvent, or whatever seems like a good name for it.08:28
=== carlos [~carlos@69.Red-80-33-181.pooles.rima-tde.net] has joined #launchpad
BradBI think I'll create a canonical.launchpad.subscribers hierarchy, because we're starting to accumlate subscribers and it'd be nice to be able to point a newbie to one place to find out everything they need to know about who's listening.08:31
BradBs/hierarchy/namespace/08:31
carloshi08:32
salgadoBradB, looks good, but I don't see how to store the logged in user in IKarmaWhateverEvent08:32
BradBsalgado: In the view, you'd grab it from the request.08:32
BradBsalgado: An event can be any Python object remember.08:32
salgadoBradB, ok, but then I'll have to change all callsites to notify() for my event?08:33
BradBsalgado: Anywhere that generates karma, yep.08:34
BradBsalgado: In doing so, you'll communicate a lot better to the maintainer of the code.08:34
BradBIf an event modifies an sqlobject and generates karma, I want to see notify(sqlobject_modified, karma_earned) in the code.08:35
salgadoBradB, good point. I'll do this08:38
BradBcool08:39
BradBI'm merging the namespace now, just so you have it.08:42
sabdflKinnison: not great, wrok-while-travel isn't optimal but if that's the best case situation then thanks for letting me know08:43
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: add a canonical.launchpad.subscribers Python package, in which everything that listens for event notifications should be put (patch-929)08:47
salgadoBradB, now that I looked closer to the problem, there's one thing I want to point out.09:32
salgadowhen you call notify(SomeEvent), you're not able to tell what will be the consequences of that event (as you don't know that the SQLObjectModifiedEvent will trigger a mail notification)09:33
salgadoto know what is triggered by any event, you must look to that event subscribers.09:34
BradBsalgado: Yeah, that's the point. :)09:34
salgadoand also, don't look sane to me having a KarmaEvent, cause the assignment of a Karma is the consequence of an event.09:35
BradBsalgado: when something modifies an sql object, an ISQLObjectModifiedEvent is generated. When something generates karma, an IKarmaEvent is generated.09:37
BradBnot all sqlobject mods gen karma, not all karma is tied to modifying an sql object09:37
salgadothe same is true for mail notification, and we don't have a IMailNotificationEvent, cause it's a consequence of the real event. you see my point?09:40
kiko_bzBradB, I'm not really in favor of having salgado mess with callsites to add karma09:41
kiko_bzwe already have the event system set up09:42
kiko_bzwhy not take advantage of it?09:42
BradBsalgado: Yeah, you could avoid it I guess.09:42
salgadocool!09:43
BradBsalgado: but then you return to the not-having-the-principal problem09:44
BradBMaybe you have to add a bit of fu to an ISQLObjectModifiedEvent.09:45
kiko_bzleave that to us! :)09:45
kiko_bzfu is my middle name09:45
kiko_bzkiko fu bar09:45
BradBkiko_bz: As long as you don't pass the request to the subscribers!09:45
kiko_bzwe'll see we'll see09:47
salgadoBradB, can you explain why storing the request in the event would be evil? SteveA, do you have an opinion?09:49
SteveAit depends09:50
sabdflSteveA: have you tried this permissions voodoo?09:52
SteveAon phone, brb09:53
sabdfli got a variety of colourful errors and then reverted to launchpad.AnyPerson (a.k.a. wikimode)09:53
BradBsalgado: I can't give you a specific reason off the top of my head, other than that coupling the request with that event type seems evil, when all you really want to store is the principal. (e.g. what if you then come along and write code in event handlers that starts pulling other things out of the request? and then other event handlers want those same values, but are getting called in places where they're gotten from somewhere 09:56
BradB/other/ than the request?)09:56
BradBIf you store exactly what you need as attributes of the event, that works everywhere, because I can read the Interface of that Event and know exactly what I have access to when it's fired off.09:57
salgadoBradB, what if I store only principal in the SQLObjectModifiedEvent?09:59
BradBsalgado: yeah, that was the "bit of fu" I mentioned earlier. :) that would be a reasonable thing to include with a modified event, I think.10:00
BradBSteveA: Has there ever been any discussion about how we could use the factory subdirective to help us survive mass-refactorings?10:01
SteveAright...10:03
SteveAstoring the request in an event is not really all that good, unless the event is a UI event10:03
SteveAstoring the principal, or the "current person" is a better idea10:03
SteveAas it is being specific, and giving just the information that is pertinent to the event10:04
SteveAotherwise, it becomes a bit like using a global all the time -- hard to see what's going on; what the interrelationships are10:04
BradB...and can't be (accurately) documented in an interface :)10:04
SteveApay attention to the semantics of events: there is no problems with making one event fire off another event 10:05
SteveAit is quite natural to have a FooAddedEvent, and have that (under certain circumstances) cause a KarmaReceivedEvent10:05
SteveAkeep the events semantically distinct10:05
BradBthat was my first suggestion :)10:05
SteveABradB: I've never particularly found a use for the factory subdirective.  I've found utilities more useful.  However, if you have some ideas about it, it's something we should talk about in spain.10:06
SteveAsabdfl: can I see more of the traceback, or get a patch that would reproduce it for me?10:07
SteveAI'm a bit confused by the part you pasted above, and I think I need a bit more context.10:07
sabdflSteveA: try refueling, and checking if you have checkPermission on database.Product10:07
sabdflthen try set the permission on the product/+edit page to launchpad.Edit10:08
sabdfland you'll see it10:08
sabdflthe problem is that it appears to think the connection is Anonymous10:08
SteveAokay.  refueling.10:08
BradBSteveA: In brief: if we provide factories with IDs, we can get at them via the zope api, instead of directly importing the content classes. Then when we shuffle the content classes around, creating objects doesn't break. But yeah, Spain perhaps.10:08
SteveABradB: I understand that, but I'm not sure the indirection is worth the effort.  definitely something to chat about in spain, though.10:09
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: projectless products and slicker project/product add/edit forms (patch-930)10:09
BradBok10:09
SteveAhowever... the factories can be made smart about events and permissions10:14
SteveAso, it might be a good trade-off10:14
SteveAneed to sketch it out better to see, though10:14
SteveAsabdfl: I did actually use the permissions stuff.  So, I'm surprised that this is giving an error.  Not sure what's different about this case yet.10:15
SteveA            if self.id == principal.id:10:16
SteveA                return True10:16
SteveA            else: return False10:16
SteveAevil syntax10:17
SteveAthe return should be indented on the line under the else:10:17
kiko_bzright10:18
SteveAsabdfl: I can see what is going on now.  I'm logged in, but I'm not the product's owner, so I don't have rights to edit the product.  So, the system is trying to prompt me for HTTP Basic Authentication, as I might have another login that would work in this case.  (This is the normal web behaviour).  However, prompting for basic auth is failing, because it only works in launchpad when you are anonymous.10:24
sabdflok10:24
SteveAThe reason it only works when you're anonymous is down to a slightly odd bogosity in the part of zope3 that is doing this.  Basically, I'll naed to make LaunchpadPrincipals conform to an undocumented API.10:25
SteveAI'll do this shortly, and then it will work as it should do.10:25
SteveAI'll also need to add this to my list of slightly-off things I need to chase up in zope3.10:26
SteveAwe'll need to consider how to present this when we do more advanced permissions stuff.10:28
SteveAit may be a reasonable assumption that each person has just one login to launchpad10:28
SteveAso, you're either logged in, or you're not.10:29
SteveAthere is no sense in which you'd want to log in as someone else to do a particular action.10:29
SteveAso, when you view the product page as anonymous, you should see an "[Log in to]  edit" link.  (the [Log in to]  might be an icon, indicating that this link may be available if you log in)10:30
SteveAwhen you view the product page logged in, but as someone who can't edit, there's no point offering them to edit it, or to log in to edit it.10:30
SteveAwhen you view the product page, and you are logged in as the right person to edit it, then you obviously want a link to edit it.10:31
sabdflwould it be possible to do a tal:condition="context/permission/Edit" ?10:32
BradBHow do I commit just one *new* file with baz? baz commit -s "blah" -- thefile gives me: make-changeset-files: file missing from ORIG tree (database/schema/pending/bradb-allow-bugactivity-nulls.sql)10:32
sabdflBradB: best ping lifeless on that10:33
BradBok10:33
salgadoBradB, I think it's commit -s "foo bar" -- file1 file210:33
salgadooops10:34
SteveAargh, ctags -R . doesn't work in the "launchpad" directory10:34
salgadodidn't read the whole line10:34
SteveAsabdfl: it will be possible to do basically that, yes10:34
sabdflBradB: did you baz add that file first?10:35
BradBsabdfl: yep:10:36
BradBbradb@oxygen:~/launchpad $ baz tree-lint10:36
BradBbradb@oxygen:~/launchpad $10:36
BradBit shows up A'd in baz changes10:37
BradBI've committed just one file or two before, but I don't remember if I've ever done that op with brand new files before.10:37
BradBand i don't think i've tried that op in anyway with baz10:37
salgadoBradB, this don't work for new files, it's in tla docs.10:38
BradBsalgado: I'm not using tla. :)10:38
salgadobut this is something baz inherited from tla 10:38
BradBsalgado: Where is it in the tla docs though? It's certainly well-hidden, wherever it is.10:39
salgadoBradB, http://www.gnu.org/software/gnu-arch/tutorial/selected-files-commits.html#Selected_Files_Commit10:39
SteveABradB: if this isn't fixed yet in baz, I'm pretty certain it is on the "to fix" list.  Don't know if there is a bug on it though.10:39
SteveAfwiw, both the bugs I submitted for baz were fixed today.  definitely more responsive than under the tla regime.10:40
SteveAyou can also type: baz archive-mirror  to mirror the current tree.10:41
SteveAsabdfl: fixed in my tree.  merge request sent to pqm 10:42
=== BradB does a little shifting around to brute force this
SteveAyou can also say "baz lint" now instead of "baz tree-lint"10:43
BradBSteveA: Yeah, I saw that. I didn't update though.10:44
BradBI'm really happy that the do proper unlocks on incorrect GPG p/w's now. :)10:45
BradBs,the do,they do,10:45
SteveAyeah, me too10:45
BradBI've got bash complete going, so there's no diff between baz tree-lint and baz lint :)10:45
salgadoI'm almost sure they removed tree-lint10:46
BradBYeah, I think so, but I'm just saying it doesn't really save me any typing.10:47
SteveAit is a small difference in how much I have to think about it 10:49
SteveAI want to lint.  So I needed to think "oh, that's tree-lint".  And backwards too, when reading a baz/tla command.10:49
SteveAoh, maybe I want sock-lint instead today10:50
SteveAhow many kinds of lint were planned for in tla?10:50
SteveAhey dilys?10:50
SteveAtalk to me dylis10:51
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: Fix bug in launchpad auth system where there would be an error if you're asked to re-authorize when you are logged in already.  Also, made product/+edit page require launchpad.Edit permission. (patch-931)10:51
SteveAthanks babe10:51
BradBheh10:51
SteveAok, must get some food now.  I'll check in a tales permission-checky-helper tomorrow.10:52
SteveAhmm.. should have included "sabdfl" in the message to pqm, so that mark's "kibo alarm" would sound.10:53
sabdflSteveA: thankee muchly10:54
sabdflso, now we need a good answer to the "launchpad.Admin" team10:54
sabdflbetter, clearly than my "hardcode a list in python somewhere" plan ;-)10:54
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: add a small db patch to allow nulls on oldvalue/newvalue for BugActivity since, logically, the old or newvalue of something that changed might be null (patch-932)10:57
carlossabdfl: should I move code as I update it from rosetta/browser.py to launchpad/browser/foo.py?10:58
sabdflcarlos: yes please!10:58
carlosyou asked me to wait for the zcml cleanup you were doing10:58
carlosok10:58
sabdflcarlos: zcml cleanup should all be committed now10:59
sabdflcheck out rosetta/*.zcml ;-)10:59
carlossabdfl: I know ;-)10:59
sabdflcarlos: i've got a db patch which allows a product to be free, and have no project11:00
sabdfli will setup rosetta so that rosetta/products/$Product.name/ goes straight to the product, if i haven't already done so11:00
carloshmm, that could break rosetta...11:00
sabdflyes, it will11:00
sabdfli will do a little testing but there isn't much sample data to work with in rosetta11:01
sabdflif i have a potemplate and a pofile handy, can i test out the new upload / import process?11:01
carlossabdfl: but we said that we could have two products with the same name, how will you handle it?11:01
carlossabdfl: sure11:01
carlossabdfl: daf did it already11:01
sabdflpending/mark-project-refactor.sql ;-)11:01
sabdflis it obvious how to do that?11:02
carlosand i'm improving the process now11:02
carlossabdfl: more or less11:02
carlosyou create a new project11:02
carlosthen a new product11:02
kiko_bzsabdfl, debonzi's almost got soyuz under control tonight but collapsed under load, will finish up tomorrow -- nice patch11:02
carlosthen you have a chance to create a template11:02
carlosand also a link to upload files11:02
kiko_bzsabdfl, and I just saw salgado's karma displayed on the person view, woot11:02
carlossabdfl: I could forward you all steps daf did 11:02
carlossabdfl: you have them in your inbox now11:03
sabdflnice!11:07
sabdflcongrats salgado11:07
carlosDid you saw the "funny" UI bug we have in our forms? every time you click over a button, the page content expands itself using the spare space11:14
carlosSteveA: ping?11:23
=== BradB is now known as BradB|brb
dilysMerge to rocketfuel@canonical.com/launchpad--devel--0: Subscribers for Bug events to do karma-gathering. (patch-933)11:38
carlosanyone knows how works the file upload feature in Zope3/launchpad?11:48
=== BradB|brb is now known as BradB
BradBcarlos: Are there places near BCN that I can pick up Cisco wireless cards?11:54
carlosBradB: I suppose it11:54
carlosBradB: http://informatica.elcorteingles.es or http://www.fnac.es11:54
carlosif you see it there, you will be able to buy it at Barcelona11:55
carloshmm11:55
sabdfllifeless: are you adding the products at the moment? someone is adding them without descriptions, please put good descriptions in, copy from their home pages if needed11:55
sabdflalso, need home pages :-)11:55
carlosI'm not sure if they have an english version... let me check it for you :-)11:55
sabdflcarlos: yes, that bug is driving me nuts11:55
carlossabdfl: I saw a way to expand it as much as I want without submit the form :-P11:56
carlosa kind of eastern egg :-)11:56
kiko_bzcarlos, visit www.lecto.com.br and type foobar into the text entry11:58
kiko_bz*that's* an easter egg :)11:58
sabdfllifeless: i'm not going to approve items like gstream and gst-plugins that have such terse summary and description. make them count!11:59
carloskiko_bz: X-)11:59
carlosBradB: don't see it there but I have seen cisco wireless card in Spain, so it should not be a problem12:00

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