/srv/irclogs.ubuntu.com/2010/12/18/#ubuntu-devel.txt

keesisn't apport supposed to be enabled in natty?00:37
crimsunAFAIK, yes00:48
barryjames_w: i just pushed another branch (test-fixes) which fixes all the tests for me.  there might be some conflict between that and the envar branch, but if you review then separately, and approve them, i'll resolve any conflicts and merge them to trunk.01:05
james_wbarry, this feels wrong to me somewhat. Shouldn't we just change things such that install installs the backends too?01:15
james_wbarry, the __file__ stuff was to support running uninstalled, but that's now not possible, correct?01:15
james_wah "develop" is possible01:16
james_wbarry, reviewed, thanks01:28
achianghm, how do i update the sources.list inside of a pbuilder?01:50
DasEiI've got Aurorax on my back in #ubuntu who seems to be up in writing a devicedriver as novice, , wee just installed build-essential and he seems concerned, I'll send him over, couldn't tell him he need more experience02:11
DasEiseems either I've been pulled forward, or trolled, nvm, quite now :)02:17
=== fenris is now known as Guest14513
=== hanska is now known as dapal
mdzbdrung: bug 637020 looks pretty straightforward; ubuntu-iso is a trivial wrapper around isoinfo and doesn't attempt to parse any command line options10:58
ubottuLaunchpad bug 637020 in ubuntu-dev-tools (Ubuntu) "ubuntu-iso crashed with isoinfo in extract()" [Undecided,Confirmed] https://launchpad.net/bugs/63702010:58
mdzit should just exit nonzero rather than crash10:59
mdza --help option could be added, but it would be minimal (there is already a man page which explains the lack of options)11:00
bdrungmdz: just exit nonzero or should it print an error message? if yes, what should it print?11:28
mdzbdrung: currently it raises an exception with the error output from isoinfo. I think it should just print that to stderr (or let isoinfo do it if it will behave), and exit nonzero, instead of raising an exception11:31
mdzshould be a two-liner, replace the "raise Exception, stderr" with "sys.stderr.write(stderr)\nsys.exit(pipe.returncode)"11:33
bdrungmdz: done11:59
mdzbdrung: awesome, thanks!11:59
bdrungmdz: trivial :)12:00
mdzif I have some time I'll add a simple option parser which responds to --help12:00
mdzit's not implausible that one day it will grow more functionality12:00
mdzit would be nice to be able to extract the filesystem manifest, for example12:00
bdrungmdz: optparse is your friend - look at sponsor-patch for example12:01
mdzbdrung: yeah, it should be simple enough. I'm just trying to spend my weekend responding to all of the person emails I haven't replied to during the week ;-)12:04
cjwatsonmdz: sounds thrilling ...12:10
* cjwatson has an exciting weekend of housework lined up, and so far today has been procrastinating it by cleaning house in the archive instead12:10
=== bilalakhtar_ is now known as cdbs
=== almaisan-away is now known as al-maisan
=== al-maisan is now known as almaisan-away
ari-tczewdoes anybody know why pbuilder-dist doesn't work longer with ~/pbuilder?15:05
tumbleweedari-tczew: do you have the latest version? (You're not running into the sudo -E issue?)15:06
=== schmidtm_ is now known as schmidtm
=== johanbr_ is now known as johanbr
ebroderbdrung: I'll check out those bugs17:14
bdrungebroder: i am on bug #69189317:14
ebroderbdrung: Though I'm not sure I think it's a good idea to have a -y option17:14
ubottuLaunchpad bug 691893 in ubuntu-dev-tools (Ubuntu) "[backportpackage] global name 'opts' is not defined" [Undecided,New] https://launchpad.net/bugs/69189317:14
bdrungebroder: i am not sure about the other bug reports.17:15
bdrungebroder: what sponsor-patch does: it ask to confirm the upload if the upload target is "ubuntu"17:15
bdrungotherwise it doesn't ask17:15
ebroderbdrung: Hmm, ok17:15
bdrungebroder: i think we don't need to ask if we build the package before uploading17:16
ebroderbdrung: I also think I'm going to add a -S/--suffix option for the version number suffix (after the ~maverick1 bit or whatever), so you can do ~ppa2 uploads17:18
bdrungebroder: good idea17:18
ebroderBecause right now I have a backport in a PPA that I want to submit a rebuild for17:18
ebroderbdrung: For bug #691897, the .orig.tar.gz has to be in the destination release already, right? Is there any way I can test for that?17:21
ubottuLaunchpad bug 691897 in ubuntu-dev-tools (Ubuntu) "[backportpackage] add diff option" [Undecided,New] https://launchpad.net/bugs/69189717:21
ebroderLike, PPAs won't pull the orig source from other pockets in the PPA or something, right?17:22
bdrungebroder: look at sponsor-patch17:22
bdrungebroder: yes17:22
ebroderbdrung: Oh, really? Huh17:22
ebroderbdrung: Right, sponsor-patch does the standard check - does the last changelog version and this one have the same version, but I can't do that with backportpackage, because the last changelog entry was from a different release than the one I'm about to upload to17:23
ebroder*same upstream version component17:24
bdrungebroder: ok, you have to look at the dsc file and check if these files are available in launchpad17:25
bdrungebroder: make this check reusable by sponsor-patch17:26
ebroderbdrung: Sure17:27
ebroderbdrung: Do you mind if I push a fix for the bug in 691862 comment 8 (the "global name opts is not defined") directly back to lp:ubuntu-dev-tools, since the fix is simple and obvious?17:30
bdrungebroder: i wouldn't mind, but i have already pushed the fix :P17:31
ebroderbdrung: Oh, good. Thanks17:31
bdrungebroder: should i release the current state of u-d-t?17:32
ebroderbdrung: If you don't mind holding up until tomorrow, I was planning to spend a few hours today working through my todo list17:33
bdrungebroder: ok, i'll wait then17:33
ebroderbdrung: To deal with bug #691896, I'm thinking of changing that to erroring out "if not opts.workdir and not opts.upload". If you're uploading, it doesn't matter that workdir isn't set and it's going to delete the workdir when it's done. If you've set workdir, then you're not going to lose your build products17:36
ubottuLaunchpad bug 691896 in ubuntu-dev-tools (Ubuntu) "[backportpackage] only gen packages" [Undecided,New] https://launchpad.net/bugs/69189617:36
ebroderbdrung: This will also solve the issue that right now if you run with -b and not -u or -w, you never get a chance to see the results of the build17:36
ebroder(which ari-tczew complained about last weekend)17:36
bdrungebroder: yes, good idea17:37
ari-tczewebroder: last weekend? huh, time is hurry up17:39
ebroderI'm pretty sure that was when you last tested it17:39
ari-tczewI don't doubt it, just afraid how quickly is time. (:17:41
ebroderbdrung: Does it seem reasonable to change the arguments to -u -U ppa:broder/ppa instead of just -u ppa:broder/ppa? That way BACKPORTPACKAGE_UPLOAD -> -U argument, and setting BACKPORTPACKAGE_UPLOAD doesn't force you to always upload when you run backportpackage17:42
bdrungebroder: you want "-u" for upload and "-U" for upload target?17:43
ebroderbdrung: Yes17:44
bdrungebroder: and --update?17:44
ebroderbdrung: Oh, whoops. Too many 'u' options17:44
ebroderHow about -u for upload and -t for upload target?17:45
bdrungebroder: better :)17:45
bdrungebroder: i have a better idea.17:45
bdrung"-u foobar" for uploading to foobar. "-u" for uploading to BACKPORTPACKAGE_UPLOAD17:46
ebroderbdrung: Can't do that with optparse17:46
ebroderbdrung: (And rightfully so, because short options with optional arguments theoretically can't be parsed consistently. If I pass -u -s, is that -u=-s or two different options?)17:47
bdrungit should be consistent with sponsor-patch17:48
ebroderbdrung: So I guess -u for the target and...something else for "upload to BACKPORTPACKAGE_UPLOAD"?17:52
bdrungebroder: what speaks against always uploading to BACKPORTPACKAGE_UPLOAD?17:53
ari-tczewtumbleweed: I have latest pbuilder. I don't know about sudo -E issue.17:54
ebroderbdrung: The logic is that the "upload to BACKPORTPACKAGE_UPLOAD" option is actually a "go and *do* the upload" option, and gets set automatically if you specify a target on the command line17:55
bdrungebroder: i don't get it.17:57
ebroderbdrung: There's --upload-target and --do-upload. If you just say --do-upload it uploads to BACKPORTPACKAGE_UPLOAD. If you say --upload-target it sets --do-upload automatically17:57
bdrungebroder: is there a usecase for not uploading the package if BACKPORTPACKAGE_UPLOAD is set?17:59
ebroderbdrung: If I do a local build?17:59
bdrungebroder: ok18:00
bdrungebroder: what about a negative option. "-d, --dry-run" for not doing an upload18:00
ebroderbdrung: Maybe18:02
bdrungebroder: what do you think if i would change the question from "Do you want to upload this to ppa:bdrung/backports? [Y/n]" to "Do you want to upload adblock-plus 1.3.2-1~maverick1~ppa1 to ppa:bdrung/backports [Y|n]?"?18:05
ebroderThat's fine, although I was going to drop the prompt if the upload target isn't ubuntu18:06
bdrungebroder: or do you prefer "Do you want to upload adblock-plus_1.3.2-1~maverick1~ppa1_source.changes to ppa:bdrung/backports [Y|n]?"?18:07
bdrungebroder: but having the prompt is nice (to check if the backported version is the right one and the target is correct)18:08
ebroderbdrung: Ok, I guess I can do a -y option instead18:08
ebroderAnyway, I have no preference for the form of the prompt18:08
bdrungebroder: and the -y options should have no affect if you upload to ubuntu18:09
bdrungebroder: pushed r84518:22
bdrungebroder: shouldn't "Please check the package in file://%s carefully" be before the upload?18:29
ebroderIt is, isn't it?18:30
bdrungebroder: nope. it's before building the package18:30
bdrungebroder: idea: change "Please check the package in file://%s carefully! Do you want to upload <package> <version> to %s" to "Please check <package> <version> in file://%s carefully! Do you want to upload the package to %s"18:31
ebroderbdrung: Yes, that's fine18:32
bdrungebroder: pushed18:37
=== yofel_ is now known as yofel
tumbleweedari-tczew: I was asking about th elatest ubuntu-dev-tools18:42
tumbleweedari-tczew: the issue I'm talking about is that sudo used to allow environment through, but recently changed behavior, so -E had to be added in pbuilder-dist18:42
ari-tczewtumbleweed: ubuntu-dev-tools also up-to-dated18:47
tumbleweedari-tczew: so what actually is the problem?18:47
ari-tczewtumbleweed: pbuilder-dist doesn't look for base in ~/pbuilder18:49
ari-tczewthis is my problem18:49
ari-tczewI'm asking whether is there a known problem? if not, probably I have to report a bug18:50
tumbleweedI suspect the problem is with yoru local configuration, but if you can't find it, please report a bug, yes18:51
ari-tczewtumbleweed: I didn't change anything.18:52
ari-tczewanyway, where can I fix config?18:52
tumbleweedI mean .pbuilderrc18:53
tumbleweedoh, and check the permissions of ~/pbuilder18:53
ScottKtumbleweed:  If sudo stopped letting the environment through, that would explain exactly the result that ari-tczew is seeing.19:14
tumbleweedScottK: that should have been dealt with in the last u-d-t upload19:14
ScottKOK19:14
tumbleweedScottK: btw, the postgrey issue is that the DD can't seem to get his orig.tar.gz to match the one in th edebian archive, so his uploads get rejected. Prodded him.19:15
ScottKtumbleweed: OK.  This looks like something then that we ought to just fix in Natty so we can SRU Lucid/Maverick ASAP.19:15
ScottKAs is it's breaking uprades from Hardy.19:16
tumbleweedaah, right. shall I do it?19:16
tumbleweedebroder: backportpackage isn't listed in debian/copyright19:28
ari-tczewtumbleweed: ok, what have I to do to get pbuilder working?19:29
tumbleweedari-tczew: are you on maverick?19:29
ari-tczewtumbleweed: nope, natty19:29
tumbleweedari-tczew: please pastebin output, .pbuilderrc, and ls -l ~/pbuilder19:30
bdrungtumbleweed: are you volunteering to update and convert d/copyright to DEP-5? ;)19:30
ScottKtumbleweed: Yes.  Please do it (postgrey).19:30
tumbleweedbdrung: I just considered doing that :P19:31
ari-tczewtumbleweed: http://paste.ubuntu.com/545367/19:31
tumbleweedbut backportpackage doesn't contain a copyright notice, only a GPL-219:31
ari-tczewtumbleweed: http://paste.ubuntu.com/545369/19:32
bdrungebroder: do you allow later versions of GPL?19:32
tumbleweedari-tczew: that .pbuildrrc is (hopefully) redundant, if you use pbuilder-dist19:33
ari-tczewtumbleweed: yes, I prefer to use pbuilder-dist. what's next?19:33
tumbleweedari-tczew: the actual errors you are seeing19:34
ari-tczewtumbleweed: sorry, probably I'm blind19:35
ari-tczew(dunno what's wrong, I didn't change anything)19:35
tumbleweedI hate those bugs19:35
bdrungtumbleweed: pbuilder-dist shouldn't be negatively impacted by an pbuilderrc config19:36
bdrunginstead everything should be passed as command line parameter to pbuilder19:36
tumbleweedbdrung: no, it shouldn't, the command line options should trump the config file19:36
* bdrung nods19:37
bdrungtherefore ari-tczew's problem should be considered as bug19:37
ari-tczewbdrung, tumbleweed: so, until problem is not fixed, can't I use pbuilder?19:38
ari-tczewso merges have to wait longer19:38
tumbleweedari-tczew: please file a bug, and include the command you are running and output19:39
bdrungari-tczew: doesn't moving (or deleting) your pbuilder config file help?19:39
ari-tczewbdrung: .pbuilderrc?19:40
bdrungari-tczew: yes19:40
ari-tczewbdrung: the same error19:41
bdrungari-tczew: then the problem is independent from the pbuilder config file.19:41
bdrungari-tczew: file a bug!19:41
ari-tczewbdrung: target?19:41
tumbleweedari-tczew: ubuntu-dev-tools in ubuntu19:41
ari-tczewbdrung, tumbleweed: what a specific number! bug 69199919:45
ubottuLaunchpad bug 691999 in ubuntu-dev-tools (Ubuntu) "[pbuilder-dist] Does not work on natty" [Undecided,New] https://launchpad.net/bugs/69199919:45
tumbleweedari-tczew: run it without sudo :)19:45
bdrungari-tczew: does it work without sudo?19:45
ari-tczewtumbleweed, bdrung: hmm... working. trying to build a package19:47
ari-tczewI gave you a output command! ;)19:47
ari-tczewah, not, sorry :P19:47
tumbleweedno that's a definite usability bug that should be fixed19:48
ari-tczewplease don't hang dogs on me, I always have these aliases with sudo19:48
ebroderbdrung: I'd prefer to leave backportpackage GPLv2, not v2+19:55
tumbleweedebroder: noted, I'll do a dep5ification (bug 692003)19:57
ubottuLaunchpad bug 692003 in ubuntu-dev-tools (Ubuntu) "DEP5 copyright file" [Wishlist,In progress] https://launchpad.net/bugs/69200319:57
TheLEHey I'm having a bit of an issue. Every time I create an About Dialog (built from GLADE->GtkBuilder) from an event on my main window I also get another instance of my main window for no reason.19:59
TheLEit originates from the gtk_builder_add_from_file(..) function call inside of my About Dialog (the one responsible for retrieving the dialog's UI from the XML file20:01
TheLEis there a restriction on the number of times that I can call this function during execution? or after the gtk_main() function has been called?20:02
ebroderTheLE: This channel is more for development of Ubuntu itself than development of apps on Ubuntu. You might have better luck in #ubuntu-app-devel20:03
TheLEebroder: thanks20:03
ebrodertumbleweed: What did I do wrong in backportpackage's header? Oh, I guess I forgot a copyright statement?20:08
tumbleweedyes20:09
ebrodertumbleweed: Ok, I'll add one in my next MP20:09
bdrungebroder: what do you have against v2+?20:38
ebroderbdrung: I'm not wild about v3. And regardless of what v3 itself says, I don't like the idea of giving another organization the ability to change the rules of my code20:39
bdrungebroder: then "v2 or v3" would be fine?20:39
ebroderbdrung: Yeah, I'd be OK with that20:40
ebroderbdrung: I can upgrade it to 2 or 3, but for what it's worth that'd be a new license for dev-tools (right now there's v2, v3, v2+, v3+, but no v2orv3)20:41
bdrungebroder: what a mess with v2, v3, v2+, v3+20:44
bdrunglet's move to ISC ;)20:44
tumbleweedindeed, it's make the dep5 task rather nasty20:45
tumbleweedI'll have to work out who has touched each file20:46
ebroderI respect the need for open-source licenses, but I tend to find everything about licensing annoying20:46
bdrungebroder: that's why i prefer ISC - it's simple, short and isn't versioned20:46
bdrungand it's compatible to everything20:47
ebroderbdrung: Yeah, I license a lot of things MIT because I can fit it all on a screen20:47
bdrungebroder: ISC is a little bit shorter than MIT20:47
ebroderbdrung: Ugh, I'm trying to code up the heuristic for whether to use -sa or -sd. It looks like it's going to be complicated20:54
ebroderI guess I need to sort the files in the source package into .dsc, debian diff, orig files20:55
ebroderAnd I need to deal with source format 3 which can have multiple orig files, and they're not always .orig.tar.gz anymore20:55
ebroderOn the plus side, there will probably be several useful library functions for ubuntutools that fall out of this20:55
bdrungebroder: look at my download logic21:02
ebroderbdrung: Where?21:02
bdrungmom21:03
ebroderbdrung: Where do I find the source for mom?21:03
bdrungmom = give me a moment21:04
ebroderAh, ok21:04
bdrungebroder: it's in syncpackage21:05
bdrungline 24221:05
bdrungebroder: you might want do use dsc_getfiles(dscurl)21:06
bdrungebroder: 'if answer != "yes":' -> 'if answer == "no":'21:10
ebroderbdrung: Ok, sure21:11
bdrungebroder: you shouldn't mention features implemented in the not yet released backportpackage21:12
ebroderbdrung: I was mostly doing it for the LP closers. Should I drop the closers entirely?21:12
bdrungebroder: yes (just bzr ci --fixes lp:123456) and i'll close the bugs manually once merged21:13
ebroderOk21:13
ebroderbdrung: Since the --fixes is already in the branch history, I don't actually need to do anything, right? Just drop the changelog entries?21:14
bdrungyes21:14
bdrung(if you used debcommit)21:14
ebroderbdrung: Fixed21:14
bdrungis that philosophical? "You say goodbye, and I say hello."21:16
ebroderbdrung: Beatles reference :)21:16
ebroderbdrung: http://www.youtube.com/watch?v=Qf2S7kKLtEQ21:17
* bdrung is already watching on youtube.21:17
bdrungebroder: is your branch ready for the merge?21:19
ebroderbdrung: Sure21:19
bdrungebroder: merged and pushed21:25
ebroderbdrung: Cool, thanks21:25
bdrungebroder: is there anything left that you want to do?21:25
ebroderbdrung: Not particularly urgently. If you want to release, that's OK with me21:25
ebroderbdrung: Though I can't promise I won't have new features for you by tomorrow21:25
=== sanchaz is now known as sanchaz-away
bdrungebroder: i vote for "release early, release often"21:27
ebroderSo let's say I have an empty PPA. I create a new Debian revision of a package currently in the Ubuntu archive, and I build my source package with debuild -sd. Will soyuz copy the orig.tar.gz from the archive to my PPA, or will it error out?21:27
ebroderbdrung: Works for me21:27
bdrungebroder: it will error out21:27
ebroderbdrung: Cool. That makes the -sa/-sd detection much simpler21:27
bdrungebroder: yes, if target = ubuntu ==> check if it's in the official archive21:28
bdrungif target = ppa: check if in specific ppa21:28
ebroderbdrung: I was going to get an lplib object for the archive and then I can use the same code21:28
bdrungebroder: what should the lplib object do?21:29
ebroderbdrung: Something roughly like http://pastebin.com/ALGi0DtX21:34
bdrungebroder: "orig = set(['all', 'orig', 'files']"?21:35
ebroderbdrung: It's pseudocode21:35
ebroderbdrung: ...but it's Python, so it's almost-functional pseudocode :-P21:35
bdrungebroder: what should that do?21:36
ebroderbdrung: It will get the list of every source file currently in the archive for the source package "whatever"21:36
bdrungorig = get_orig_files_from_dsc(dsc_filename)21:36
ebroderYeah, basically21:37
bdrungebroder: i think it should work that way. go ahead :)21:37
ebroderbdrung: Here's what it actually looks like: http://pastebin.com/D4GZQdm821:39
bdrungtumbleweed: how long will it take for you to fix bug #692003? should i wait for it or should i upload 0.108?21:39
ubottuLaunchpad bug 692003 in ubuntu-dev-tools (Ubuntu) "DEP5 copyright file" [Wishlist,In progress] https://launchpad.net/bugs/69200321:40
tumbleweedbdrung: hoping to finish it tonight. I went down the rabbithole of scripting licensecheck + bzr output > dep521:42
bdrungebroder: great. can we have an object that have a function for that? one object for the ubuntu archive and one for each ppa?21:42
ebroderbdrung: Yeah, that's what I'm planning to do21:42
ebroderbdrung: But don't block the release for it - I'm not sure I'll finish it today21:42
bdrungtumbleweed: tonight in which timezone?21:43
tumbleweedsame as you, GMT+221:43
bdrungtumbleweed: ok, i will do the release before i go to bed. either you make it or it will end up in the next release.21:44
tumbleweedfine with me21:44
bdrungebroder: "Package failed to build; aborting" is a bad error message.21:45
bdrungebroder: should the sentences ends with fullstops or exclamation marks?21:45
ebroderbdrung: I have no preference; whichever you prefer21:45
=== sam---___---- is now known as sam-_-
bdrungebroder: please review r85122:08
ebroderbdrung: ACK22:09
bdrungebroder: and r85222:10
bdrungebroder: re r851: do you have a better idea for having a common error message in builder.py?22:11
ebroderbdrung: ACK r85222:11
ebroderbdrung: I think what you did is fine22:11
bdrungtumbleweed: re bug #691999: i think you should abort instead of just printing a warning. running pbuilder-dist as root will create files owned by root in your home directory.22:14
ubottuLaunchpad bug 691999 in ubuntu-dev-tools (Ubuntu) "[pbuilder-dist] Shouldn't be run with sudo" [Wishlist,Fix committed] https://launchpad.net/bugs/69199922:14
tumbleweedbdrung: no it won't create them in your home directory, it'll use /root/pbuilder22:16
tumbleweedthat's why I went for a warning, it is valid to run it as root, just probably not what you want22:17
bdrungtumbleweed: nope. "sudo pbuilder-dist natty update" will create a ~/pbuilder directory owned by root22:18
ebrodertumbleweed: sudo doesn't change $HOME unless you pass -H22:18
ebroderMaybe error out if os.stat(os.environ['HOME']).st_uid != os.getuid() ?22:18
tumbleweederr, http://paste.ubuntu.com/545401/22:19
tumbleweedaah, depends on whether or not you have env_reset22:20
mawstSo what's the deal, why is gstreamer fscking retarded, choking etc all the time on common formats (xvid, mkv) but xine works flawlessly with them, and now there's no option to usethe xine backend on totem?23:03
bdrungtumbleweed: status?23:23
tumbleweedbdrung: almost there23:26
bdrungtumbleweed: did you implement the "os.stat(os.environ['HOME']).st_uid != os.getuid()" check?23:27
tumbleweederr no, I'll do that and make it fail if true, otherwise just warn23:28
bdrungtumbleweed: no, it's the other way around23:29
bdrungups23:29
tumbleweedyeah, that's what I mean :)23:29
bdrungif unequal, fail. if equal, warn23:29
bdrungi oversaw the '!='23:29
bdrungtumbleweed: look at your commit message :D23:40
tumbleweedgrr, one sec23:42
bdrungtumbleweed: your commit message is still broken. :D use '' insead of "" if you don't want $HOME replaced.23:44
tumbleweedhehe23:44
bdrungtumbleweed: debian/copyright isn't DEP-523:51
tumbleweedbdrung: yeah, something got mixed up due to my branch juggling (that's why I screwed up changeleg entries too)23:52
bdrungtumbleweed: and long indentation is preferred (look at the dep5 examples)23:52
tumbleweedbdrung: I can't find my final version, it got lost in the juggling, if you still want to upload tonight, don't wait for it23:55
bdrungtumbleweed: ok, i will release the current version. let's get the copyright update into the next upload (probably this year).23:56
* tumbleweed curses himself for trying to work fast on more than one thing23:59

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