[05:58] morning all [05:59] can someone please tell me how to get the last 200 meg of an upload to ubuntuone to update or sync with the folder on my desktop [06:28] if i right click the file on my destop syncronise is greyed out so cannot sync it. please help [06:32] ubuntuone seems to be syncing to my pc but not from my pc back [06:33] im a newbie and still learning so please try help me === JanC_ is now known as JanC [11:25] good morning! [12:03] mandel, hi, could you review this one? https://code.launchpad.net/~diegosarmentero/ubuntuone-client/menu/+merge/118117 === yofel_ is now known as yofel [12:40] gatox: mandel is on vacation! [12:40] gatox: and good morning btw :-) [12:40] alecu, ahhhh i forgoy about that..... and good morning to you sir! [12:47] good morning! [12:49] ralsina, hi [13:01] alecu: what do you think about bug #1033488 beyond "please don't do that!" ? [13:01] Launchpad bug 1033488 in ubuntuone-client (Ubuntu) "UbuntuOne fails to synchronise folder when invalid symlink with same name as cloud folder is present" [Undecided,New] https://launchpad.net/bugs/1033488 [13:02] alecu: also, another twist of the SSL bug in comment in bug #1031009 [13:02] Launchpad bug 1031009 in Ubuntu One Client "Cannot auth, register, reset password" [Undecided,New] https://launchpad.net/bugs/1031009 [13:03] ralsina: I think we should treat 1033488 as a feature request... SD should handle this cases in a gentler way... [13:03] ralsina: also, that's something we could figure out in the control panel [13:03] alecu: hmmmm yes, some sort of warning about that being unsyncable [13:03] ralsina: if the u1cp finds a symlink it should warn, in a similar way to when if finds a folder there [13:04] right [13:04] alecu: we have the same problem if it's a file or a library, IIRC [13:04] exactly [13:04] and it looks easy enough to do [13:04] since we already have a test there [13:05] ralsina: it's nice that we discussed about this. I saw the bug earlier and had no clue on if we wanted to solve it... [13:05] ralsina: since I was thinking about it from the perspective of SD [13:06] from SD it's not solvable, I think [13:06] it's just a conflict [13:06] which needs handling though [13:07] ralsina: right. But should SD show a notification, or an error in our menu for this case? [13:07] no, because it's a "it shouldn't happen" [13:07] ralsina: this happens when creating a UDF, so it's not right to rename the symlink or... [13:07] alecu: if u1cp doesn't let you set it to sync, it should never go far enough that SD sees it [13:08] ralsina: right, and if the user is playing with u1sdtool, let him figure that out... [13:08] ralsina: hmmm [13:08] ralsina: even u1sdtool could figure out if there's a symlink there and warn in that case. [13:08] alecu: yes [13:09] alecu: there is a "check if this is a valid UDF" method u1sdtol and u1cp should use [13:09] alecu: so, it's a fix in sd, I think [13:10] ralsina: awesome. [13:10] hmmm... there's sand under my desk! [13:11] alecu: on u1cp it's ackend.validate_path_for_folder [13:11] either amelia played here on friday after kinder.... or one of my vm sandboxes is leaking. [13:12] alecu: which calls something in sd :-) [13:14] alecu: it should already fail if it's a symlink [13:14] alecu: :-( [13:14] alecu: ubuntuone/syncdaemon/volume_manager.py in validate_path [13:15] ralsina: in validate_path_for_folder ? [13:15] alecu: yes, sorry [13:16] Ohhhh I know [13:16] It's not when CREATING the folder, it's when setting it to sync [13:16] ralsina: but this is not "create udf", this is "subscribe udf" [13:16] right [13:16] so, we just need to validate the path when subscribing [13:16] so, it's _subscribe_volume [13:16] piece of cake [13:17] we should do the check in _create_volume_dir, and fail if it's a link [13:17] alecu: cool, I'll give it a shot [13:23] alecu, ping.... do you have a minute? i'm kind of stuck with a test [13:26] gatox: sure [13:26] alecu, i'm working on this branch: https://code.launchpad.net/~diegosarmentero/ubuntuone-client/ipcmenu [13:26] and when i run: u1trial -t test_sync_menu tests/platform/ipc/test_external_interface.py [13:27] it fails in tests/platform/ipc/test_linux.py line 181 [13:27] and i'm not following very well all the black magic that is there :P [13:30] gatox: how are you running the tests? [13:30] alecu, u1trial -t test_sync_menu tests/platform/ipc/test_external_interface.py [13:34] it seems that the fakedobject is not being called, so it doesn't register the info in _called.... but i'm not quite sure from where it should be called [13:39] gatox: the difference I see is in ubuntuone/platform/ipc/linux.py [13:39] gatox: in sync_menu() [13:39] gatox: sync_menu there builds the status array, and returns it [13:40] alecu, ohhhhhh right [13:40] alecu, stupid mistake for testing stuff [13:40] gatox: but the other methods (for example, waiting_content) call self.service.status.... [13:40] alecu, thx... i was fighting so long with that, that i couldn't see it [13:41] gatox: so, I think the patching is done there, no? [13:41] gatox: no problem! [13:57] alecu, also when you have some time, a small review please: https://code.launchpad.net/~diegosarmentero/ubuntuone-client/menu/+merge/118117 [14:03] gatox: "class FixedQueue(Queue.Queue, object):" [14:03] gatox: why do you inherit from object? [14:03] alecu, ahhhhh yes, we discuss that on pyar.... the thing is: === teknico_ is now known as teknico [14:04] alecu, Queue.Queue is an old-style object, so i can't use super... but if i inherit from object, i can't use super without any problems.... and is nicer than Queue.Queue.whatever() [14:04] sorry...... if i inherit from object too, i CAN use super [14:04] gatox: is there a restriction on why to use Queue? [14:05] alecu, sorry.. didn't understand that [14:06] gatox: I mean... do we need to use Queue.Queue for some reason, or a different struct can work too? [14:06] and by "struct" I really meant data type. [14:07] alecu, i can use a different data type... i used Queue because it seems that the obvious choice.... i need a queue... but with the restriction i implement there [14:07] * alecu looks for the collections module [14:08] gatox: for instance, collections.deque [14:08] alecu: when you have 2' I think I ran into a larger problem :-/ [14:09] alecu, yap [14:09] hi people, happy monday [14:09] hi mmcc! [14:09] alecu, deque it is [14:09] mmcc, hi [14:09] gatox: wait! let's give this a minute thought [14:10] gatox: deque is an option, Queue is an option, list is another, still. [14:10] alecu, it makes sense, and the doc says that it does what i need [14:10] alecu: subscribe_volume pushes errors back through IPC but all that arrives at the other side is "IPCError()" [14:10] alecu, i only need to use the proper append and popleft in the right places [14:10] alecu: which makes error messages impossible. We never noticed because the only possible failure is "UDF desn't exist" which just doesn't happen IRL [14:10] ralsina: so we don't know the exact reason for it, right? [14:11] alecu, i prefer deque rather than list [14:11] alecu: exactly [14:11] mmcc: good morning. And a late Happy Birthday btw! [14:11] mmcc, hey! happy birthday! :D [14:12] alecu: and the solution looks a heck of a lot more complicated (to my little twisted) than just checking for a symlink on u1cp's side [14:12] alecu, so.... do you agree on deque? [14:12] thanks guys :) === teknico_ is now known as teknico [14:12] mmcc: didn't know, so happy birthday from me too [14:13] thanks ralsina - yeah I don't usually make a big deal out of it anymore. Mostly just an excuse to overeat :) [14:13] mmcc, i share that feeling :P [14:15] gatox: oh, deque has a maxlen [14:15] alecu, right [14:15] Once a bounded length deque is full, when new items are added, a corresponding number of items are discarded from the opposite end. [14:15] awesome! [14:16] alecu, just what i needed.... [14:16] gatox: so, there you go. That sounds like the best [14:16] alecu: that's why it's a deque ;-) [14:16] ralsina: nahhh [14:17] ralsina: it was a deque (in 2.4) before having the maxlen (added in 2.6) [14:17] interesting [14:17] I had never seen a deque with infinite size [14:17] * ralsina goes read Knuth volume 1 again [14:20] probably "unbounded" in this context in fact means "until your swap explodes" [14:22] alecu: so, for that symlink bug, I have a 2-line solution in u1cp on one hand, and no idea how to fix it on sd on the other ;-) [14:25] alecu, branch updated: https://code.launchpad.net/~diegosarmentero/ubuntuone-client/menu/+merge/118117 [14:28] ralsina: btw: this looks like something we should recommending for users running u1 on xp: http://www.microsoft.com/en-us/download/details.aspx?id=29434 [14:28] *should be [14:28] alecu: that should be autoinstalled [14:29] alecu: the only ones who don't have that are those who have not validated their copy [14:29] alecu: and those are avoiding updates intentionally if you know what I mean [14:29] lol [14:30] ralsina: or not connected to the internet. [14:30] ralsina: and those are not our users either :-) [14:30] alecu: and in that case, they are not using u1 to their fullet extent ;-) [14:41] alecu: so, would it be very awful of me to just check for the symlink on u1cp instead of tweaking all the way up and down our IPC(s) how to pass an error? [14:43] ralsina: I guess not. But what about other similar errors? [14:44] alecu: AFAIK there are no other similar errors [14:44] ralsina: like, a file named like the folder... or a folder already existing... [14:44] alecu: you are right [14:44] alecu: I had a moment of weakness [14:45] alecu: but there is already a check for merging, isn't there? [14:45] ralsina: yes, for merging folders there is, you are right. [14:45] ralsina: but wait, I'm not saying that the doing the ipc dance is the right route [14:45] but how does that even work? [14:46] the check for merging there is u1cp-side [14:46] sigh [14:46] and on _creating_ a UD is sd-side [14:46] UDF* [14:47] ralsina: or here [14:48] ralsina: so, if the user decides to merge, SD goes ahead and merges, right? [14:48] rye: we have a similar error but not on that function, that sounds like a bug [14:48] alecu: yes [14:48] ralsina: okay [14:54] alecu: easier solution, use validate_path_for_folder also on subscription [14:54] alecu: and i it fails with "is nested" go ahead anyway ;-) [15:01] me [15:03] me [15:03] ralsina, alecu thisfred mmcc dobey [15:03] me [15:03] no notes yet [15:03] me [15:03] me [15:03] * mmcc writes [15:04] alecu? [15:05] me [15:05] * alecu writes notes! [15:05] gatox: go [15:05] DONE: [15:05] Propose and fix u1-client menu branch. Finishing ipc part of the implementation to propose today. [15:05] TODO: [15:05] Move on to u1-cp menu implementation. [15:05] BLOCKED: [15:05] No [15:05] briancurtin, go [15:05] DONE: installer with PyQt 4.9.4 [15:05] TODO: make installer identifiable as 3.0.2b or something, fix SyncTimestampChecker [15:05] NEXT: ralsina (or thisfred if notes aren't ready) [15:05] DONE: twisted contract negotiation, but it's stuck because of a typo (in the date sigh) reviews, team call, 1-1s canonicaladmin cleanup random minor things TODO: fix a bug or two, fix that contract problem, bug triaging, misc BLOCKED no NEXT thisfred [15:05] DONE: cosas background sync TODO: cosas background sync BLOCKED: no NEXT: mmcc [15:05] dobey is on holiday [15:06] DONE: first-run code, forgetting something [15:06] TODO: propose first-run code, fix u1cp test.bat to ignore darwin, [15:06] BLCK: none [15:06] NEXT: none? [15:07] mmcc: alecu [15:07] DONE: a bunch of mumbles, some reviews, debugging of bug #1031197 [15:07] TODO: fix said bug [15:07] BLOCKED: no [15:07] Launchpad bug 1031197 in ubuntuone-client (Ubuntu) "DownloadFinished signal triggers when file has not yet completed writing" [Undecided,Confirmed] https://launchpad.net/bugs/1031197 [15:07] NEXT: None [15:07] Comments? [15:07] No comments [15:07] did we come to a consensus on what the new 3.0.2 release will be named? is 3.0.2b it? [15:08] this is the one with the new PyQt [15:08] alecu, gatox, are there any further branches pending for the macfsevents part of u1-client? [15:08] briancurtin: no consensus. I don't quite care about naming ;-) [15:08] briancurtin: 3.0.2b looks good to me [15:08] mmcc: I think only a fixup branch for the tests, that's bouncing in tarmac [15:08] 3.0.2-1 i what it would be calledin ubuntu, IIRC [15:08] mmcc: https://code.launchpad.net/~diegosarmentero/ubuntuone-client/darwin-tests-refactoring/+merge/113289 [15:09] mmcc, ohh i need to fix the refactoring tests one..... it has some issues when trying to land..... doing that right now [15:10] ok, thanks. What are we going to do with the code from macfsevents? Right now it's in gatox's lp +junk, right? [15:13] alecu, ^ [15:14] gatox: do I have to answer that? :-) [15:14] alecu, i don't know.... maybe :P [15:14] mmcc: we should first try to get those fixes upstream [15:14] what we should do we that?? [15:14] fork it, or propose the changes to the author [15:15] gatox: first we should try proposing [15:15] gatox: do you have the url of your junk branch? [15:15] gatox: where is the upstream hosted? [15:15] alecu, lp:~diegosarmentero/+junk/python-macfsevents [15:15] mmcc, don't know.... need to check [15:15] mmcc: http://pypi.python.org/pypi/MacFSEvents/ [15:16] mmcc: I'm not sure if there's even a repo for it. [15:16] alecu, i'll email the author to ask where the repo is [15:17] the repo is not listed anywhere [15:17] not even in the code [15:17] gatox: perhaps it's https://github.com/malthe/macfsevents ? [15:18] alecu, yeah, I just found that too :) [15:18] seems like it [15:18] alecu, ok, i'll fork that one, and propose the changes [15:18] gatox: so, how intrusive or specific is your code? [15:20] alecu, is not a big change.... but it changes the way it works, in the sense that i think for some reason the lib works first adding the folders, and then starting the observer [15:21] but that is not what we need [15:35] * gatox lunch! === gatox is now known as gatox_lunch [15:46] brb [15:54] briancurtin: is there any peculiarity about window's is_dr? [15:54] briancurtin: I meant isdir()? [15:55] briancurtin: as in, it returns true for links or libraries or other evil stuff [15:55] ralsina: for os.path.isdir? if so, none that i'm familiar with off the top of my head. i'll take a look [15:55] briancurtin: thanks [16:00] ralsina: it returns false for symlinks and hardlinks. i'm not sure how you isdir a library - as far as i know that's just a GUI thing in explorer that aggregates multiple directories (e.g., "Documents" library pulls your user's documents and public all-user documents) [16:00] briancurtin: cool then [16:00] ralsina: but the C:\Users\brian\Documents folder and/or library returns True on isdir, which would be correct [16:01] briancurtin: ok, not doing a platform-specific isdir then :-) [16:30] ralsina, all: my spouse has skipped work today because she's feeling ill. I might be away for some time at times while tending her, so ping me or sms me if I'm needed. [16:30] alecu: ack [16:31] gargl are the u1-client tests slow or are they very very very slow? [16:33] alecu, ralsina: http://ubuntuone.com/7O01iFMjvTQSFWtZIKdcaI is a 3.0.2 installer now set with "3.0.2b" as the version reported in the SD log, plus PyQt 4.9.4 [16:34] briancurtin: awesome [16:34] im working on a way to automate that version updating for the log. i just set it manually in clientdefs.py for now [16:34] briancurtin: did you also raise the build number for the auto updater? [16:34] ralsina: ah, crap i didn't change that. i will update the build number for autoupdate, but will leave it identified as 3.0.2 for anything else [16:34] briancurtin: cool, thanks [16:35] briancurtin: it shouldn't really matter really, but just to be neat :-) === gatox_lunch is now known as gatox [16:57] ralsina: the link i sent now has an updated installer with the right build number and such. when alecu is available and can confirm that the PyQt/Qt pairing does what we need, i'll send it off for signing [16:57] briancurtin: awesome [17:06] mandel, ralsina https://code.launchpad.net/~thisfred/u1db/cosas-bg-sync/+merge/118398 [17:06] not very big or complicated [17:07] thisfred: I'll do it, mandel is off [17:07] thanks! [17:07] it's qt and twisted [17:07] but not a lot of either [17:10] thisfred: all you use twisted for is to use a callLater? [17:10] thisfred: or was it in use before already? [17:10] ralsina, well I used deferreds already [17:10] not the reactor though [17:10] thisfred: because now you are adding a dependency on qt4reactor which is unmaintained [17:11] ralsina, so I should look at the qt way of scheduling? [17:11] thisfred: 'fraid so [17:11] np, will do [17:11] QTimer.singleshot(timeout, callable) [17:11] correct case as needed [17:11] thisfred: let me get you a tip though [17:12] thisfred: http://lateral.netmanagers.com.ar/tr/es/weblog/posts/BB974.html [17:12] thx [17:12] tipping is encouraged ;) [17:12] Or, if you prefer english: http://lateral.netmanagers.com.ar/weblog/posts/BB974.html [17:12] yay, I get to use my level 11 spanish skill [17:14] is level 11 the one where you get the magic spanish wand? [17:14] It's where you learn the "mañana" spell :P [17:15] and "tengo una bomba" [17:15] I kid you not [17:15] why would you teach anyone that [17:15] hahaha [17:16] let me show you a good reason... [17:17] thisfred: http://tinyurl.com/cr7klus [17:17] ralsina, ooooh [17:18] the english translation was definitely the one you wouldn't want to use out loud in public though [17:18] ralsina, now I wonder if that is derived from a Berliner (the pastry, obviously not the name) or if it's just coevolution to fill a similar niche :) [17:20] thisfred: Berliners are called Berlinesas [17:20] thisfred: these are more like profiteroles [17:20] although Berlinesas are da bomb [17:20] also, they are known are friar's balls (pun very very intended) [17:21] Can I get a simple review https://code.launchpad.net/~ralsina/ubuntuone-client/verify-harder/+merge/118399 ? [17:21] well repay in kind [17:21] * ralsina will someday write his monography about the origin of pastry names in argentina [17:22] they mostly have anti-clerical anti-militaristic anti-police names because the bakery union was formed by italian anarchists [17:22] from the pun very intended dept: http://www.twitpic.com/6hmjct [17:23] mmcc, have you tried their schweddy balls? :) [17:23] hahahahaha [17:23] thisfred: you know, I haven't… [17:23] also, the "polite" name for friar balls is "nun sighs" [17:23] I also like clusterfluff [17:24] which is hardly an improvement, if you ask me [17:24] mmcc, it's actually pretty good [17:24] ralsina: that's hilarious [17:24] but I think it's already out of rotation [17:24] mmcc: the name for a small ham&cheese sandwich is "little kid" [17:25] thisfred: yeah I think it was a special edition. [17:25] * ralsina looks for the south park chef balls song [17:25] ok, too much. u1cp [17:25] * ralsina tries to look serious [17:26] ralsina, that branch sets my spidey sense atingle. I may be misunderstanding, but it seems a bit yagni, to have the same platform independent implementation called from platform specific functions? [17:27] thisfred: could just use os.path.isdir in os_helper [17:27] or why does it even need to be in os_helper, if it works everywhere? [17:27] thisfred: what I don't want is to use it in our code and then have to search for it when we inevitably find out it's not all that crossplatorm ;-) [17:27] it's meant to be [17:27] thisfred: been there, had to change that ;-) [17:28] thisfred: so is everything in os_helper [17:28] * briancurtin lunch [17:28] It's very defensive [17:28] thisfred: also, the windows_path decorator protects us against calling it with the wrong kind of thing [17:29] as in, it makes all your code hard to read, for the dubious benefit of being able to fix it in one place. [17:29] ralsina, why would we do that? :) [17:29] thisfred: because once is_dir exists we will use it somewhere without looking [17:29] thisfred: but yes, it's fairly paranoid [17:30] thisfred: I can dial it down [17:30] ralsina, then just fire the people who do :D [17:30] jk [17:30] I'll remove the per-platform implementation [17:30] anyhow, it's a matter of taste, but I'd prefer that yeah [17:30] at least until we find out that it doesn't work everywhere [17:32] oh, wait, we are using isdir everywhere. [17:32] what's one more spot in the leopard [17:33] thisfred: re-running tests and will ping you when the branch is updated [17:33] cool [17:46] I am going to have lunch while tests run. That can't be right. [17:46] ralsina, when you get [17:46] back I pushed my fixes [17:46] thisfred: looking now [17:47] not I keep a reference to the qtimer to be able to stop it [17:47] note [17:47] not because of gc [17:48] hmmmm [17:48] makes sense [17:49] thisfred: but singleShot doesn't return a timer [17:49] thisfred: you will have to instantiate a QTimer and call instance.singleShot [17:50] ah [17:50] fixing [17:50] ralsina: when you get back from lunch, https://code.launchpad.net/~mikemc/ubuntuone-control-panel/fix-1024623-install-confs/+merge/118404 [17:51] mmcc: looking [17:51] * briancurtin back [17:51] damn launchpad branch-scanning delay :-( [17:52] ralsina: with that branch, Double-clicking on "UbuntuOne.app" works without tossing up error boxes. (Assuming you have SSO creds already) [17:52] whoohoo [17:52] ralsina, pushed again [17:53] thisfred: looking [17:54] mmcc: looks good to me, get a second review from alecu though [17:56] thisfred: you could create the QTimer on __init__ and keep it, just start/stop it as needed [17:56] thisfred: it's not as if it's expensive to have one. But that's a nitpick [17:57] thisfred: so +1 [17:57] ralsina, sorry, didn't read the whole conversation..... but if you are using something that extends from qobject, you can just use the startTimer method without the qtimer [17:57] gatox: really? Didn't know that one :-) [17:58] ralsina, I'll change that, seems tidier. [17:58] thisfred: "tengo una bomba" reminds me of: http://media.nowpublic.net/images//39/2/392ad9a1977af8f4df757c0778beb126.jpg [17:58] ralsina, every qobject has a startTimer(int interval), and that calls the timerEvent(event) from the qobject [17:58] gatox: but you can have stacked calls with that [17:59] gatox: which is a very very bad thing to have [17:59] or rather something I really dislike ;-) [17:59] well...... i didn't say it was perfect jeje [17:59] hehe [18:00] thisfred: I think having a single timer is nicer [18:00] and more explicit (you would still need to have something holding the int that is the timer reference anyway) [18:01] ralsina, so if I have a single timer object, will t.singleShot(TIMEOUT, foo) ... t.stop() ... t.singleShot(TIMEOUT, foo) just work, or do I need to do more resetting than that? [18:01] thisfred: just that [18:01] kcool [18:01] thisfred: oh, wait [18:01] thisfred: let me check the docs ;-) [18:02] thisfred: the docs are inconclusive but I bet it does stop it ;-) [18:02] will test :) [18:03] sadly it's not something that can be tested in the python prompt since it needs an event loop running [18:04] ok, now really lunch because u1-client tests are still running :-( [18:06] hmm, stop does not actually seem to stop anymore [18:07] I might as well not use the singleshot, since I keep the timer around anyway [18:08] ralsina, back! [18:08] ralsina, i don't know if you read my sms..... maybe i get back before you read it jeje [18:10] ralsina, going back to multiple singleshots, since that seems to behave more predictably [18:14] ralsina, actually no. stop seems to have no effect on singleShots. Or more likely: I'm doing it wrong [18:15] thouf [18:17] though I don't see how. ralsina: pushed a version with a 10 sync period, and a debug print that shows stop() is called. It does not stop the singleShot though. To test: PYTHONPATH=. cosas/ui.py and then open File/Sync, and then activate and deactivate the checkbox... [18:17] hmmm [18:17] I think I know [18:17] maybe [18:18] nope, no idea [18:25] thisfred: (and ralsina ) - ui.py will pull in twisted anyway from ubuntuone.platform.credentials [18:26] but I guess not reactor… just deferred, so that won't pull in qt4reactor? [18:28] well, nothing in platform/credentials should import reactor, but how does a twisted deferred work without a reactor? [18:29] mmcc: the deferreds do not depend at all on the reactor [18:29] mmcc: the deferred is just an object that has a list of callbacks and a list of errbacks attached. [18:30] mmcc: and it calls one or the other when the deferred's callback or errback method is called. [18:31] mmcc: so, a deferred is just a way to encapsulate a series of callbacks. I tend to explain it as a kind of control structure. [18:32] mmcc: the other stuff in the defer module do not depend on the reactor either (for instance, the inlineCallbacks decorator). [18:32] mmcc: that is why we can use the defer module with other main loops, like the qt main loop or the gobject one, without using the twisted reactor. [18:33] alecu: ok, I follow that. still a little fuzzy on how defer interacts with a main loop, but I can go look [18:34] mmcc: a defer does not interact directly with a main loop. [18:34] also thisfred - does your code work if you use setSingleShot and start instead of just singleShot? [18:34] thisfred: (from http://qt-project.org/forums/viewthread/4852) [18:35] mmcc: you may use the deferred's callback or errback method as a callback function for a given main loop. But the deferred module does not need to depend on any given main loop. [18:37] mmcc: also: the twisted.python.defer module is very well commented and pretty understandable if you want to understand how it works. [18:37] alecu: ok, thanks [18:38] mmcc, that may work. Then I need to hook up the event handler some other way though, I think [18:38] since start doesn't take a callback [18:40] thisfred, yeah it looks like you need to do the PyQt equivalent of connect(), which I don't know :) [18:41] mmcc, connect, so that's simple enough [18:41] the thing that I don't know is, is how this affects setting the timer in the timeout itself. One way to find out :) [18:42] maybe this is just [18:42] a case where we actually don't want a singleshot at all [18:49] mmcc, that fixed it, thx. pushed new version, for the curious [18:50] thisfred: great! [18:57] ralsina: I've been testing the latest installer that briancurtin built, and I've found some issue with the proxy credentials. [18:58] ralsina: it seems that if the user types the credentials wrong, then those are saved to the windows keyring and are retried forever. [18:59] ralsina: everything else I tried seems to be working ok, though. For instance, I can login and sync successfully with the right proxy credentials. [19:00] but if I get them wrong, then the only solution is to manually stop evey process and remove the creds from "Credentials Manager" [19:00] alecu, when you get a chance, could you look at this mp: https://code.launchpad.net/~mikemc/ubuntuone-control-panel/fix-1024623-install-confs/+merge/118404 (it already has tests) [19:05] briancurtin2: [15:57] ralsina: I've been testing the latest installer that briancurtin built, and I've found some issue with the proxy credentials. [19:05] [15:58] ralsina: it seems that if the user types the credentials wrong, then those are saved to the windows keyring and are retried forever. [19:05] [15:59] ralsina: everything else I tried seems to be working ok, though. For instance, I can login and sync successfully with the right proxy credentials. [19:05] alecu: is that new? [19:06] mmcc: I have that tab opened, didn't get to it yet, sorry :P [19:06] alecu, no worries [19:07] briancurtin2: I think mandel mentioned something similar while working on it. I don't recall if it was with pyqt 4.9 or 4.8. [19:07] anyone: how do I poke tarmac to pick up an approved branch? I approved too many at once last week, and now this one is still stuck at "Approved": https://code.launchpad.net/~mikemc/ubuntuone-windows-installer/fix-1032290/+merge/117960 [19:11] mmcc: try moving it to "needs review" and back. [19:11] ok, it's kinder time. TTYAL [19:12] alecu: that looks like something we may have had since ever [19:12] thanks & bye alecu [19:19] thisfred: re-review of https://code.launchpad.net/~ralsina/ubuntuone-client/verify-harder/+merge/118399 please? [19:19] ralsina, on it [19:19] mine is fixed and pushed too [19:23] ralsina, +n for n > 0 [19:24] interesting error loading the SSL certs for me - http://paste.ubuntu.com/1133087/ [19:25] taken from how we load them in storageprotocol's context.py [19:25] which is where I first saw the error [19:26] mmcc, does getIssuer maybe return a special object instead of raising exceptions when something goes wrong? [19:28] oh wow, that's twisted itself erroring right? [19:28] thisfred: yes… it's erring in __repr__ [19:30] mmcc, so it's probably never been tested in the console [19:30] well, I just looked and we never use the actual twisted Certificate, we use the .original… looking now to see where that gets set [19:31] ok, no errors unless I try to print the Certificate. uh, hooray? [19:36] mmcc: yike [19:36] s [19:36] mmcc: that sounds like "it totally fails, but if you don't look the issuer seems valid" [19:37] ralsina: if you print the Certificate.original, the underlying X509 object seems fine (to me) [19:37] and that's what our code actually uses… [19:37] mmcc: ok then :-) [19:39] hrm, although - what kind of object does verify_server_hostname get passed as 'cert'… [19:39] (I'm looking) [19:44] ok, it's expecting the 'original' object. weird that twisted's twisted.internet.ssl.CertificateOptions class doesn't accept twisted.internet.ssl.Certificate objects for its 'caCerts' constructor argument… [19:45] no wonder Certificate() isn't well tested [19:50] mmcc: that's one way to put it [19:50] mmcc: twisted is a maze of twisted little passages, some alike, some different. [19:51] ralsina: so I'm learning. Its quirks are not endearing [19:55] i need some fresh air. brb - quick walk around the neighborhood [19:58] lunchtime now [20:02] Sabemos dónde vive su familia. [20:02] another interesting choice of phrase to teach new speakers [20:02] could it be we don't have tarmac running for u1-client? [20:03] thisfred: are you following a "Spanish for criminals" course? [20:03] I think I may inadvertently be [20:03] thisfred: because if those quotes are real, I am sure you can become semi-famouse by submitting it to gawker or something [20:04] ralsina, they are. I am of course cherry picking out of hundreds of phrases, but still [20:05] briancurtin, thisfred: small review? https://code.launchpad.net/~ralsina/ubuntuone-control-panel/check_subscribe_errors/+merge/118420 [20:06] check [20:06] "¡Yo soy el ratón más rápido de todo Mexico!" [20:06] ralsina, could you also lift the needs fixing from mine, if you feel it's ok now? :) [20:06] speedy gonzalez? [20:07] gatox: yep :-) [20:07] thisfred: looking! [20:07] ok..... eod here!! see you tomorrow!! byeeeeeee [20:07] ralsina, de este lado del Río Grande [20:08] bye gatox! [20:08] por lo menos [20:08] thisfred: you're getting good at this! [20:08] gracias :) [20:08] * ralsina considers meetings in spanish starting this thursday [20:09] ralsina, and then in Dutch the week after? :P [20:09] thisfred: your branch is a bit confusing [20:09] thisfred: you are using start() which makes it a recurring timer [20:09] ralsina, it is a recurring timer now [20:09] thisfred: and you are doing it on every lap [20:09] I stop it in the signal handler [20:10] oh, right! [20:10] +1 then :-) [20:10] ralsina, the singleshot one didn't really listen to stop() [20:10] much like my dog [20:10] thisfred: pity [20:11] ralsina, well, we were mildly abusing the single shot to get around issues where the actual call would be so slow that the timer would trigger again, etc. [20:12] thisfred: yes [20:12] thisfred: timers are surprisingly easy to get a bit wrong [20:12] if you stop the timer as the first thing in the handler, I don't think you need to worry about that, so the workaround is no longer necessary [20:12] but yeah [20:13] 1 hour until the USA men's basketball team starts beating the .ar one [20:13] * ralsina is so not jinxing it [20:14] ralsina, I would say "folder X already exists *on* your device" [20:14] thisfred: I really need to get copy approval for this [20:15] but yes "on" sounds better. [20:17] prepositions are tricky :) [20:17] subtly different in every language [20:18] I can still say all the spanish prepositions (useless thing we learn in school) [20:18] a ante bajo cabe con contra de dede en entre hasta hacia para por según sin so sobre tras [20:18] I can do the german ones that take the 3rd case [20:19] aus bei mit nach zeit von zu \ bis durch für gegen ohne um entlang [20:19] OMG there is a different "non traditional list" that adds durante, mediante vía! [20:20] mediante is so totally an adverb, you silly royal spanish academy! [20:20] *fist to the sky* [20:20] heh [20:26] ugh, crazy bad headache coming [20:30] * briancurtin back, doing ralsina's review [20:30] thanks briancurtin! [20:30] briancurtin: just don't set it to approved :-) [20:30] was just reading that, slapping my hand to not set it yet [20:31] hahaha [20:32] if i set it, you can call the police...they are down the street arresting a house full of people [20:32] was a pleasant end to my walk [20:33] briancurtin: whoa [20:34] Los individuos viven aquí [20:35] lol! [20:35] thisfred: "hay unos individuos sospechosos cerca de la casa de brian, oficial!" [20:36] heh [20:36] mmcc: that ssl issue looks like the twisted repr code is expecting the commonName to be always present on the certificate, but it surely is not. [20:40] but surely the attribute should be there? [20:41] otherwise it's pretty unpythonic. (shock! horror!) [20:42] is that repr our code or is it in twisted? [20:42] it's in twisted [20:43] it looked like [20:43] thisfred: those attributes show up on OpenSSL objects when the corresponding fields in the certificate are present. [20:44] thisfred, ralsina: it's twisted code [20:44] alecu, that's what I mean by unpythonic :P [20:44] alecu: then that looks like a bug [20:44] having a repr that fails is just yucky [20:44] properties should not magically appear [20:44] right and right [20:45] so, mmcc you get to file a twisted upstream bug ;-) [20:45] the thing is that *our* certificate is pretty weird in not including a Common Name field. [20:46] but that's a case that twisted should handle more gracefully [20:46] I am going to EOD a bit early today because my head is exploding [20:46] either that, or not allow it [20:47] will be back late, mail me for reviews [20:47] thisfred: certs without common name are valid AFAIK, just weird [20:47] right [20:47] so twisted is wrong [20:48] but it would be better if it refused them, instead of failing in some specific cases, because now I don't trust that it actually doesn't do the wrong thing elsewhere [20:48] although reading ssl.com it seems that it can't be empty. Would have to read the RFC and won't [20:48] http://info.ssl.com/Article.aspx?id=10048 [20:49] regardless, there is a bug in twisted: it allows a case that it can't properly handle [20:50] and googling for "missing certificate CN" gives me a ton of results on CNN about obama's birth certificate [20:51] HAHA [20:51] the UN really should take away our rights to be a country for a few decades [20:52] certificates without commonName (which is the hostname that the certificate is valid for) use a different field so they can hold a list of hostnames, and this usually replaces commonNames. [20:52] boolean trap [20:52] so it's ok for a cert to have an empty or non existing commonName [20:52] achievement unlocked [20:53] so, the only thing we should fix is twisted trying to repr them. [20:53] http://ariya.ofilabs.com/2011/08/hall-of-api-shame-boolean-trap.html [20:54] well, not exactly, but [20:54] close. [20:54] nullean trap [20:57] haha now with bootstrap all sites look the same: compare ariya's site to http://nikola.ralsina.com.ar [20:59] :) [21:11] ralsina: if you have a symlink pointing to a folder, then os.path.isdir returns True [21:12] ralsina: that may break some of the newer branches, won't it? [21:12] alecu: we test for symlinks first [21:13] oh, right! [21:13] really off to see olympic basketball now. Have fun1 [21:13] ! [21:37] ralsina: when you get back: the isdir issue affects the control-panel branch; I've added some comments to it now. [21:38] ralsina: thanks [21:39] ralsina: I'll fix them tonight [21:39] Hi guys, sorry I missed the discussion above - all the certificates have a commonName field, which you can get to using the .original property of twisted.internet.ssl.Certificate, which gives you a X509 object that behaves correctly: http://paste.ubuntu.com/1133292/ [21:42] the twisted code that *should* wrap .original is not obviously broken, how much time should I spend on this? [21:42] I mean, it's broken, it's just not obvious how [21:49] OK, that paste was broken too. It looks like our go_daddy_class_2 cert has no commonName: http://paste.ubuntu.com/1133308/ [21:49] mmcc: exactly [21:52] mmcc: our certificate has the domain name in the field named "Certificate Subject Alt Name", instead of having it in the Common Name. [21:52] mmcc: so: I would suggest filling a bug in twisted, and not using repr for the time being. [21:53] mmcc: and I think we should not worry anymore about this [21:59] alecu: done. we don't actually use their repr - I ran into this while debugging [22:00] mmcc: right [22:10] mmcc: I'm reviewing fix-1024623-install-confs [22:11] mmcc: I can't find run-mac-tests.sh [22:11] alecu: ok, I'm around if you have comments [22:11] mmcc: should I be running run-tests.sh ? [22:11] alecu: yes [22:11] as it should be [22:12] oh, ok. I see that it's using the devtools from the eggs, so I probably have something broken there. [22:14] mmcc: I might have something broken... have you seen an error like this? http://pastebin.ubuntu.com/1133346/ [22:15] alecu: no, that's not familiar… let me look [22:18] oh, it seems that u1trial considers "test_windows.py, test_linux" to be ONE module name. [22:18] alecu, I'm puzzled. it looks like it's setting IGNORE_FILES correctly but then that's getting interpreted as one module name [22:18] right [22:19] maybe add a set echo to the script to see what's going on? do you have a dev-tools that parses arguments differently or something? [22:20] checking now to see if mine is out of date [22:20] mmcc: probably! I think that dobey did some changes to the way dev-tools parsed the cmdline args [22:20] I bet you have rev 77. I don't have it :) [22:21] mmcc: 77 it is! [22:21] hrm, but I just updated to 77 and my control panel tests are still working [22:22] I just did "bzr switch -r 76", and I got a bzr stacktrace. [22:22] arg [22:22] And now every bzr command that touches the disk dies with the same backtrace. [22:22] awesome! [22:38] any good strategies for testing things that are set at import level? move them into a function? I'm looking at ubuntuone-storage-protocol/ubuntuone/storageprotocol/context.py -- where it sets ssl_cert_location at the top of the file [22:43] mmcc: I don't know what's a good global strategy, but for specifically this, it makes a lot of sense to move that to a function or three [22:45] mmcc: and also, we should probably be saving (in a singleton, or something similar) the value returned by get_certificates()... [22:45] hmmm... [22:45] well, it's not so expensive anyway. [22:45] alecu: agreed (on moving to function). already started doing that. I'll add tests for the windows part too. [22:46] yeah, I'm not sure it's called that often [22:46] how many times do we create an ssl context? [22:46] the thing is that the 3 ssl certificates are loaded every time a "webclient" is created in SD. [22:47] that happens only when getting the list of published files, or publishing a new file, or some other thing I can't remember right now, but that is done as often. [22:47] so yes, this won't be a speed issue anytime soon. [22:49] ok [23:12] ok, have to go - I'll be back later to clean that up