=== chihchun_afk is now known as chihchun
morphisrobru: ping06:40
robrumorphis: hola06:40
morphisrobru: using 5.36.1 would be against what the core devs want06:40
morphisas that is touch the upstream version06:40
morphisso when I do that I can't use that silo anymore06:41
robrumorphis: when you changed it to 0ubuntu2, did you change anything else outside debian? As changes outside debian/ modify the orig.tar, and having different orig.tars is not allowed with different -0ubuntuX versions06:41
morphisno, I didn't06:42
morphisrobru: https://bazaar.launchpad.net/~morphis/bluez/vivid-5.36-upgrade/revision/10 is the only thing I did06:42
robrumorphis: oh, weird, I would have expected that to work as long as the orig.tar stayed the same there.06:42
morphisfrom https://code.launchpad.net/~morphis/bluez/vivid-5.36-upgrade/+merge/278302 rev 9 is what I uploaded first and 10 is the second06:43
robrumorphis: ok well I guess that PPA is burned, you should abandon the request then reassign the same request (silos are assigned at random so you should get a different one), then try rebuilding06:43
morphisrobru: however updating the MP would work then still, right?06:43
robrumorphis: yeah if you get a new PPA you get to start over with a new orig.tar so it should work. also change it back to 0ubuntu106:44
morphiseven if I updated the MP then to have 0ubuntu2 after I did some additional changes?06:45
robrumorphis: huh? if you start over in a new PPA you should use 0ubuntu1. Don't make too many mistakes though or you'll run out of PPAs06:46
robrumorphis: currently 10 available silos, so you get 10 tries to build a working package I guess.06:46
morphisrobru: hm, so basically everytime I change the MP I have to use a new silo, right?06:46
robrumorphis: that's what it sounds like. I don't understand why the PPA didn't accept the upload though, it should have if the orig.tar was the same06:47
robrumorphis: maybe poke a launchpad-y person about the upload failure06:47
morphisrobru: let me do that06:48
Mirvmorphis: it's useful to use the ~ character in version number for test builds (~ == lower than without), for example I always have 1.0-0ubuntu1~test1 etc06:50
Mirvif the build is not massively big one, it's pretty cheap then to do the final build when everything's confirmed06:51
Mirvbut it does not matter that much, mainly if it takes tens of tries to get it correct it'd be a bit funny to ship ubuntu23 or something :)06:51
mardyrobru: hi! Still there?06:54
morphisMirv: yeah that would be thing to do but lets say I hand this over to QA and then QA finds a bug which I fix then I have to get a new silo etc. to get a new package version and using ~test1 isn't an option for that06:54
robrumardy: yeah06:54
Mirvmorphis: sure06:54
mardyrobru: I saw your comment about https://code.launchpad.net/~online-accounts/signon-plugin-sasl/packaging/+merge/27456806:54
morphisMirv, robru: asked over in #launchpad about this06:54
mardyrobru: so, this is a completely new package, it's not in the archives06:55
robrumardy: yes06:55
mardyrobru: is the ci-train the correct way of landing it, or should we land it in some other way?06:55
robrumardy: you can use the train but there are some rough edges.06:55
mardyrobru: like MIR06:55
robrumardy: MIR is not a way of getting a package in the archive, it's a way of getting a universe package into main. totally different thing. you might also need that later06:56
mardyrobru: ah, ok, two different steps then06:56
robrumardy: if your plan is to ship this on desktops/servers then you'll want MIR for sure, if the plan is for touch then it's less important (ideally touch stuff would be MIR'd but much of it hasn't been)06:57
robrumardy: but yeah use the train first06:57
robrumardy: but the thing is the train cannot handle this package because *trunk* doesn't have a debian/changelog06:57
mardyrobru: ok, so if I merge the changes into trunk and then prepare an empty MP, the package should end up in the universe? or will there be some other step to be done?06:58
mardy(I mean, after the CI train lands it)06:58
robrumardy: yes, if you go through the train the very first upload will be in universe by default06:58
mardyrobru: excellent, thanks; we'll do it thiw way then06:58
robrumardy: well, that's not a train detail, first upload of anything is universe by default06:58
robrumardy: you're welcome06:58
=== robru is now known as robru_
=== robru changed the topic of #ubuntu-ci-eng to: Train trouble? ping trainguards | CI problems? ping cihelp | Train: http://bit.ly/1hGZsfS | QA Signoffs: http://bit.ly/1qMAKYd | Known Issues: -
robruSure is quiet08:27
jameshsil2100: you were trying to ping me late last night about mediascanner2?08:59
jameshsil2100: currently mediascanner2 trunk is configured for dual landings, so it won't be possible to do a vivid only landing.09:00
sil2100jamesh: hey! Yes, we would like to release it without a merge, just a no change rebuild by bumping the ubuntu version09:02
sil2100jamesh: you would then just overwrite that change with your next landing09:02
sil2100jamesh: would that be ok?09:02
jameshsil2100: would it be possible to do tvoss's landing in two silos though?  First build the vivid only bits in one silo, copy packages to a second where you do a vivid+xenial build?09:02
=== dpm is now known as dpm-afk
sil2100pstolowski: hey! Does the licensecheck breakage have a bug?09:31
sil2100pstolowski: the one from xenial09:32
pstolowskisil2100, probably not.. michi? ^09:33
michiNo bug that I know of. What’s the problem?09:34
michiAll I did was to turn off the licensecheck unity test when running on xenial.09:35
tvosssil2100, o/09:37
robruoh goodie09:41
sil2100michi: but the change mentioned that it had to be disabled because of some issues with licensecheck09:42
sil2100michi: what are those issues?09:42
sil2100tvoss: o/09:42
michisil2100, tvoss: I’m in two conversations simultaneiously...09:42
tvosssil2100, did you see my question for https://requests.ci-train.ubuntu.com/#/ticket/63509:42
michilicensecheck behaves differently on xenial.09:42
michiIt outputs a whole lot of crap it didn’t use to produce.09:42
michiAnd it fails on files it used to succeed on.09:43
michiSo, rather than fixing an SEP, I decided to turn off the unit test for the license preamble on xenial.09:43
michiI don’t see how that could break anything though.09:43
sil2100michi: I agree that turning it off right now is a good workaround, but would be nice if you could fill in a bug against licensecheck to mention that such issues exist09:44
michiYes, that’s still on my todo list.09:44
michiI haven’t forgotten, just haven’t managed to find the time yet.09:44
sil2100This way, when disabling licensecheck in another project, we can give a bug number in the comments that would make life easier for others to see if the licensecheck issues are fixed already or not09:45
michiSo, did I break something by doing that?09:45
sil2100No, but I would like to have a bug number before I publish pstolowski's unity-api silo ;)09:45
michiAh, I see :)09:46
michiIt’s sort of late here. Can I file a bug tomorrow?09:46
sil2100Since it's good practice to have each disablement documented with a bug09:46
michiYes, agree.09:46
michiIt’s just that, sometimes, it feel like pushing lots of **it uphill.09:46
michiSomeone gratuitously makes a bunch of changes that break our tests.09:47
michiServes us right for having tests in the first place :-(09:47
sil2100michi: sounds ok, I might fill in a 'dummy' bug for licensecheck to not block pstolowski - I would then send you the bug link for you to fill in all the nice details09:47
sil2100If that's fine with you09:47
michiOK, that sound good, thank you!09:47
michiI should get the bug notification email.09:47
michiJust in case, please add me explicitly to the subscription for the bug.09:48
michiI’ve had problems recently with notifications from launchpad.09:48
michiNew bugs appear without any email ever arriving...09:48
pstolowskisil2100, yes, you're absolutely right!09:48
robruwell, this is excelletn09:49
michirobru: What’s excellent?09:49
robrusil2100: I started migrating some silos to the new file format, but I'm getting permission denied errors when trying to copy. don't worry I'm working on it09:49
robrumichi ^09:49
mardytrainguards: I cannot understand what is wrong here: https://ci-train.ubuntu.com/job/ubuntu-landing-060-1-build/34/console09:51
sil2100mardy: hey!09:52
sil2100mardy: it looks like your debian/source/format file has 3.0 (native), while for the train packages (and train versioning) this should be quilt09:52
sil2100So, either change it to 3.0 (quilt) or 1.0 simply09:53
sil2100mardy: ...or even remove the source/format file completely09:54
robrumardy: your version number is goofed up somewhere10:04
robrumardy yeah I recommend removing source/format as per https://wiki.ubuntu.com/DailyRelease/InlinePackaging10:05
robruoh god10:05
sil2100tvoss: hey! What question? I think I might have missed it...10:06
tvosssil2100, I updated MPs for that request, but obsolete source packages still show up10:07
sil2100tvoss: let me take a look now10:14
sil2100tvoss: ah, yeah, in this case a trainguard needs to remove the old binaries - let me do that now10:15
sil2100tvoss: with next rebuild it should be good again10:16
sil2100pstolowski: hey! Could you modify your https://code.launchpad.net/~stolowski/unity-api/license-check/+merge/277544 MP and include the bug number LP: #1519292 in the comment of the temporary hack?10:25
ubot5Launchpad bug 1519292 in devscripts (Ubuntu) "licensecheck on xenial fails on files it used to succeed on" [Undecided,Incomplete] https://launchpad.net/bugs/151929210:25
sil2100pstolowski: thanks :)10:25
pstolowskisil2100, sure, doing10:25
pstolowskisil2100, pushed, shall i kick the build?10:27
jibeltrainguards: silo 57 shows this error: Uncaught exception: FileNotFoundError: [Errno 2] No such file or directory: '/var/lib/jenkins/silos/ubuntu/landing-057/xenial/content-hub/content-hub'10:31
jibelwhat is it?10:31
sil2100jibel: there's a transition ongoing in the train10:32
jibelsil2100, which means?10:33
Mirvjibel: paths are changing, but all should be fixable10:37
Mirvwell, it does not seem to fix by itself10:40
MirvI think I'll rather publish manually10:40
sil2100Mirv: robru is working on getting things fixed10:44
robruguys I am so sorry for botching this transition so badly10:44
Mirvsil2100: yeah I'm sure he knows about the issues so meanwhile copy-package is friend among else10:44
robruI thought I had the migration script tested quite well10:44
Mirvrobru: we manage :)10:45
=== _salem is now known as salem_
morphisrvr: ping11:20
robruok apologies again everybody11:22
robruI triggered a few rebuilds to fix the worst ones I botched. but most I was able to save11:22
=== salem_ is now known as _salem
=== dpm-afk is now known as dpm
robruMirv unfortunately i rebuilt silo 57 so you'll need to republish after it builds11:52
=== _salem is now known as salem_
tvosssil2100, https://requests.ci-train.ubuntu.com/#/ticket/635 is good to go from my pov12:04
=== xavigarcia is now known as xavigarcia_lunch
sil2100tvoss: will be publishing in a minute12:18
tvosssil2100, thank you12:18
tvossgreyback_, we can land to vivid and xenial again for platform api12:18
greyback_tvoss: sweet12:19
dbarth_quick heads up for QA: silo 60 has a proper test plan now; also silo 58 MP's are approved now, ie should be unblocked in Trello12:24
sil2100tvoss: eh, ok, had to rebuild platform-api in the silo again to make the train happy, no worries will publish instantly once it finishes12:25
jibeldbarth_, 58 unblocked and you can mark 60 ready for qa if it is12:25
Mirvrobru: oh no :( I wonder if QA will want to retest then.12:27
Mirvjibel: 057 was rebuilt, do you want to retest it?12:27
Mirvrobru: on the other hand, nice to use the train for publishing it12:28
jibelMirv, rebuilt with same MPs?12:30
robruMirv jibel: it would only need the quickest of smoketests12:30
robrujibel, yes12:31
jibelrobru, Mirv , k, I'll make sure it is still working12:31
jibelmoving back to ready for qa12:31
Mirvjibel: thanks12:36
jibelMirv, silo 57 has been published already?12:39
Mirvjibel: once, yes, manually, but robru rebuilt it after that12:42
Mirvjibel: so the merges wouldn't merge correct things anymore12:42
=== boiko_ is now known as boiko
boikoMirv: I am trying to install messaging-app-autopilot on the device, but it says some of the dependencies can't be installed, did something change wrt apt-get on the device?12:45
boikoMirv: for instance, there was a new address-book-app version available in the overlay ppa, but apt-get dist-upgrade won't pick it for upgrading12:45
Mirvboiko: no, there shouldn't be a problem installing messaging-app-autopilot. but if you're testing a silo you need to pin it higher than overlay12:46
Mirvboiko: https://wiki.ubuntu.com/LandingTeam/SiloTestingGuidelines#Install_silos_with_overlay_PPA_enabled12:46
boikoMirv: right, but citrain device-upgrade does that already, right?12:46
Mirvboiko: yes, it should do that, you can check by looking at the contents of /etc/apt/preferences.d12:47
boikoMirv: any idea why apt-get dist-upgrade is not picking up newer versions of some packages?12:47
jibelMirv, 57 is definitely fine12:51
Mirvjibel: thanks!12:52
MirvI'll wait for the delayed arm64 builds to finish, then it's again ready12:53
Mirvboiko: not really, but better double-check the contents of those pinning files and see that the silo pin number is higher than the overlay's12:53
jibelboiko, apt-cache policy <package> can give you a clue about the pin priority and why some versions are preferred12:54
=== pstolowski is now known as pstolowski|lunch
=== alan_g is now known as alan_g|lunch
tvosssil2100, thx13:03
boikojibel: right, I was using silo 52 (which only contains messaging-app), and it was not picking up a newer address-book-app (needed for the autopilot package), but now I am doing the opposite: installing first all autopilot packages, then running device-upgrade13:04
=== xavigarcia_lunch is now known as xavigarcia
abeatosil2100, hey, have you noticed that /etc/apt/sources.list.d/extra-ppas.list does not include a "deb-src" line?13:22
abeatosil2100, that creates confusion when doing build-deps for packages in the overlay13:22
abeatojhodapp, ^^13:22
jhodappsil2100, indeed, we reached an instance with media-hub where we added a build-dep, but each time you do an apt-get build-dep media-hub, this latest dep doesn't get installed because of what abeato mentioned13:25
Mirvtvoss: silo 21 has also code changes compared to vivid overlay: https://ci-train.ubuntu.com/job/ubuntu-landing-021-1-build/267/artifact/platform-api_vivid_content.diff13:45
Mirva couple of ? true : false + a couple of const additions13:46
=== alan_g|lunch is now known as alan_g
=== pstolowski|lunch is now known as pstolowski
=== chihchun is now known as chihchun_afk
dobeytrainguards: hi, can someone hit retry on https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/landing-015/+build/8337847 please?14:28
Mirvdobey: done14:29
dobeyMirv: thanks14:29
=== charles_ is now known as charles
tvossMirv, I'm confused :)15:33
dobeyMirv: still here?15:40
rvrrenatu: Mirv: Approving silo 3915:45
renaturvr, nice, thanks15:47
Saviqrobru, uh oh? https://requests.ci-train.ubuntu.com/#/ticket/69015:49
Saviqor maybe that error is just misleading...15:49
camako_fginther, any plans to convert 'wily' jobs for mir to 'xenial' in CI?16:39
fginthercamako_, There was no mass conversion of projects from wily to xenial for this cycle as it no longer makes sense for many projects. If you have projects that you would like to be updated to xenial, please just send cihelp a notification or email as you've done.17:21
fginthercamako_, is this for lp:mir only?17:22
fginthercamako_, I need to step out, but will follow up if necessary when I return17:22
camako_fginther, Thanks. I saw your email and made a request to the list. Yes this is for lp:mir.17:46
dobeytrainguards: hi, can we land silo 15 without waiting for a successful ppc64el build? it's phone only for now, and golang is still not nice on that arch17:49
robrudobey: fine by me but i can't publish, you'll need a core dev to copy the packages manually. Maybe sil210018:00
robrudobey, actually that'll just get stuck in proposed, you'll need a release team member to help you18:02
dobeyrobru: i guess we can get Mirv to do it in the morning, since he's the qt person? or it'll still need a release team member for some reason?18:06
dobeyi guess it'll just need someone to ack the NEWs?18:06
jibeland with these the queue is almost empty18:14
jibelthanks alesage rvr18:14
robrudobey, is this package never released before? If so is fine, if not you need release team to ack the arch regression18:14
alesagejibel but of course18:15
dobeyrobru: the qtpurchasing was only released in the stable-phone-ovleray ppa for vivid so far, not in the ubuntu archive18:16
robrudobey, silo 15 appears to be targeted at xenial, vivid has nothing to do with that18:20
robrudobey, indeed pay-service has been released in xenial and has packages built for ppc64el so this represents a regression and will need release team to ack, it's out of my hands18:24
robrudobey, at purchasing is fine to publish though18:25
dobeyright, i was just saying that qtpurchasing is new here, and onl exists in the overlay ppa for vivid. i wasn't saying this is meant to go into vivid18:25
robrudobey but your silo targets xenial?18:26
dobeyrobru: yes, this is to get the changes into xenial that we've already landed in vivid overlay18:26
dobeykenvandine: hey, ^^ can you do what is necessary to get silo 15 published to xenial? and i guess we can ping slangasek maybe to ack the 'regression' of ppc64el not building for pay-service there?18:28
kenvandinedobey, sure, but if you are getting an ack from slangasek might be best just to have him publish it18:30
* kenvandine doesn't want to get hunted down over that next week :)18:30
dobeytrue i guess18:30
dobeyslangasek: can you do that please? :)18:30
=== joc_ is now known as joc|away
robruSaviq, the "not in ppa" error? that means there was a local build that failed to upload, silo is in a bad state and needs rebuild18:42
=== plars is now known as plars-holiday
Saviqrobru, no, it was a File not found exception, with two qtmir-gles bits in its path18:56
Saviqrobru, I've seen it again when there were conflicts, it was complaining about a file not found .../qtmir-gles/qtmir-gles18:56
robruSaviq, I just pushed a fix for that in one spot, can you link me to the error? I didn't see it18:56
Saviqrobru, it's gone by now, it got cleared when another build job ran18:57
robruSaviq, yeah but which silo? i can dig up the log and confirm my fix in another silo also fixes this18:57
Saviqrobru, silo 518:57
Saviqreq 69018:57
Saviqrobru, at least the build job logs don't show that err18:58
robruSaviq, oh yeah, that's the same one I fixed. fix should hit production in 2018:58
robruSaviq in this case it came from the status updater job, if you click 'show audit log' you can scroll through and see the error and get a link to the log18:59
Saviqrobru, the build job finishes now as soon as the packages are uploaded, right? so it doesn't wait for the builds?18:59
robruSaviq, correct, the build job recently changed to not watch the PPA, diff immediately after uploads are successful. there's now a new job that watches the PPA and updates the status, it runs automatically every 10 minutes, forever (so basically now train is *always* watching18:59
robruSaviq, this change helps catch things like new commits on MPs or new uploads in the archive, etc. so problems are discovered sooner rather than being surprises at publish time.19:00
Saviqthat's nice also because now I don't need to cancel jobs in case I need to run the build jobs in quick succession (for different packages, when waiting for some changes)19:01
Saviqrobru, ack, perfect19:01
robruSaviq, oh cool, I hadn't even thought of that benefit, nice ;-)19:01
robruSaviq, only problem is that now the status job pings all status changes every 10 minutes, so if your build takes a long time you'll get pinged about it every 10 minutes. I should fix that to only ping if there's a failure or something19:02
Saviqrobru, I don't get pings from queuebot for some reason anyway (I mean I don't get highlights), so meh ;)19:04
dobeywhat's the best way to get QA to test a click package these days, since bileto doesn't have a way to make such things be "landed" when they're done?19:35
salem_rvr, hey, when you have some time, could you check if the following MR fixes the ringtone issue with your bluetooth speaker? https://code.launchpad.net/~tiagosh/telepathy-ofono/fix-1519007/+merge/27845119:36
salem_rvr, you just need to install the package that jenkins built and reboot.19:36
robrudobey, i believe QA likes to find them in bileto. marking non-silo things as 'landed' is on my todo list19:53
=== dpm is now known as dpm-afk
slangasekdobey: unless this regression in pay-service is a deliberate disabling of the package on this architecture, I would not sign off on this.  If it is a deliberate disabling, then someone needs to start at the top of the stack and disable packages for ppc64el first, otherwise you're just creating an uninstallable/unbuildable pile on ppc64el20:43
slangasekdobey: and has this ppc64el build failure been reported as a bug against binutils?20:47
=== salem_ is now known as _salem
slangasekdobey: actually, I guess this may be a golang issue rather than a binutils one;21:00
slangasekdobey: so mwhudson (and a bug against golang) would be a good idea here21:00
dobeyslangasek: yeah, i pinged mwhdson about it. it's a bug already reported/fixed upstream apparently. he's saying we should use gccgo on ppc64el, or not build at all there.21:01
dobeyslangasek: i'd more likely say that previous builds on ppc64el of pay-service were not intentional. :)21:01
slangasekdobey: unity8 and unity-scope-click both build-depend on libpay2-dev; you don't get to say that's "unintentional" without taking responsibility for unwinding it21:02
slangasekdobey: it looks like the go code is only in pay-service; does it make sense to build libpay2 on architectures that don't have pay-service? or should the reverse-dependencies have their libpay2-dev build-dep architecture-qualified?21:02
dobeyno, libpay2 is just a client lib to talk to pay-service21:03
slangasekand pay-service is always a local service?21:03
dobeyyes, pay-service is a dbus service which talks to the remote servers21:04
dobeyhmm, i'll make a quick branch to build with gccgo on ppc64el then21:05
dobeysince that's what mwhudson is saying to do21:05
slangasekdobey: ok. lxd should be a good example of this.  I think it's equally valid to drop the build-dep on ppc64el fwiw, but of course that means you get to make a unity8 landing your problem21:06
cyphermox^ wow, it now detects the state from the PPA build records? :)21:25
robrucyphermox: Big Train is always watching ;-)21:26
cyphermoxthat's pretty cool, less clickety-clicking.21:27
robrucyphermox, you still need to run the build job to generate the diff, but at least only once at the end instead of every upload21:28
slangasekdobey: fwiw a quick test with substituting gccgo in for golang got me a successful pay-service package build on ppc64el/xenial21:37
dobeyslangasek: yeah, it's already built in the silo21:38
dobeysomeone needs to hit retry on https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/landing-015/+build/8271662 now21:38
slangasekdobey: ok.  and btw, lintian points out a few problems with this package...21:38
slangasekE: pay-service: depends-on-essential-package-without-using-version depends: sysvinit-utils21:38
slangasekE: pay-service: depends-on-essential-package-without-using-version recommends: perl-base21:38
slangasekdobey: done21:38
dobeydepending on essential packages without a version requirement is an error?21:40
dobeyoh right, have to way for stuff to get fully published before rebuilding21:42
slangasekdobey: yes, it is; because the essential functionality is guaranteed to be present, but the package names may change, so a dependency is both unnecessary and potentially harmful to future upgrade calculation21:45
dobeyslangasek: how should one depend on a binary that's shipped in those packages then? i don't want stuff to stop working because the package name changed, and the binary we need is no longer in the essential packages21:47
slangasekdobey: we never remove binaries from Essential21:47
slangasekdobey: although - sysvinit-utils is not essential in Ubuntu, so that's a buggy lintian warning.  But perl will always be in essential21:48
dobeyslangasek: so drop the perl and ignore the sysvinit-utils lintian?21:56
robruOh god why22:03
robrukenvandine, do you know what caused that error? New one on me22:06
kenvandinei canceled a build22:06
josephtnuclearbob, jibel: are you guys still converned with bootspeed testing?22:07
kenvandinebecause i pushed a new revision22:07
robruSurprised to see oserror in python3 code22:07
kenvandinerobru, then i started another build quickly22:07
kenvandinei think it hadn't finished cleaning up from the previous job22:07
kenvandinei waited a minute and it worked22:07
robrukenvandine huh buy there a signal handler to exit cleanly when jobs are cancelled22:07
kenvandinei was just to fast :)22:08
robrukenvandine, really bizarre because the cleanup doesn't delete that dir, no idea why it would error like that22:10
kenvandineah... well i dunno then22:10
robruA mystery for the ages22:10
slangasekdobey: yeah - drop perl-base, ignore sysvinit-utils22:16
robrucyphermox, ^ 'Diff missing' implies 'Successfully built', just run the build job to make the diff when you're ready22:25
nuclearbobjosepht: it's on the list of things to get re-enabled this cycle so we can have good data for the lts23:26
dobeyslangasek: ok, i added an MP for dropping perl-base, and it's rebuilding now. will have to chase down reviews for the two new MPs in the morning though, since it's past my EOD and everyone else too that was working on these bits23:33
dobeyslangasek: thanks for the help23:33
dobeyand have a good evening :)23:34

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