openstackgerrit | Ian Wienand proposed zuul/zuul-jobs master: validate-zone-db : add job and make more generic https://review.opendev.org/661138 | 00:01 |
---|---|---|
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: trigger: add job filter event https://review.opendev.org/639905 | 00:20 |
openstackgerrit | Ian Wienand proposed openstack-infra/zone-zuul-ci.org master: Add zone-check job https://review.opendev.org/660967 | 00:44 |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: trigger: add job filter event https://review.opendev.org/639905 | 01:11 |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: webtrigger: add initial driver and event https://review.opendev.org/555153 | 01:11 |
*** swest has quit IRC | 01:33 | |
*** swest has joined #zuul | 01:49 | |
*** yolanda has quit IRC | 01:51 | |
*** yolanda has joined #zuul | 01:54 | |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: webtrigger: add web route and rpclistener https://review.opendev.org/554839 | 01:59 |
*** altlogbot_0 has quit IRC | 02:12 | |
*** altlogbot_2 has joined #zuul | 02:14 | |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: web: add build button to trigger job https://review.opendev.org/635716 | 03:05 |
*** bhavikdbavishi has joined #zuul | 03:46 | |
openstackgerrit | Merged zuul/zuul master: ansible-config: pin ara to <1.0.0 https://review.opendev.org/660859 | 03:48 |
*** jesusaur has quit IRC | 03:54 | |
*** jesusaur has joined #zuul | 03:59 | |
*** bhavikdbavishi1 has joined #zuul | 04:00 | |
*** bhavikdbavishi has quit IRC | 04:01 | |
*** bhavikdbavishi1 is now known as bhavikdbavishi | 04:01 | |
*** bjackman has joined #zuul | 04:05 | |
*** bhavikdbavishi has quit IRC | 04:22 | |
*** bhavikdbavishi has joined #zuul | 04:23 | |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: amqp: add basic trigger https://review.opendev.org/637458 | 04:27 |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: amqp: add message informations to the job variables https://review.opendev.org/637666 | 04:27 |
*** bhavikdbavishi has quit IRC | 04:30 | |
*** bhavikdbavishi has joined #zuul | 04:31 | |
*** bhavikdbavishi has quit IRC | 04:31 | |
*** swest has quit IRC | 04:34 | |
*** raukadah is now known as chandankumar | 04:59 | |
*** pcaruana has joined #zuul | 05:08 | |
*** pcaruana has quit IRC | 05:16 | |
*** pcaruana has joined #zuul | 05:17 | |
bjackman | Did something unusual happen in the zuul-jobs repo? My scheduler is having a tenant reconfiguration event party | 05:18 |
bjackman | Submitting tenant reconfiguration event for bwt-sw-tenant due to event <GitTriggerEvent ref-updated zuul-jobs ref:refs/changes/05/504605/3 oldrev:0000000000000000000000000000000000000000 newrev:fe6526ac9 | 05:19 |
bjackman | 97ff71913dbf4f2a3dd36ac6b2fb1b6> | 05:19 |
bjackman | Seems to be doing this for every change in zuul-jobs | 05:19 |
bjackman | It's only connected via the git driver | 05:19 |
bjackman | baseurl=https://git.zuul-ci.org/ | 05:20 |
tristanC | bjackman: git driver does emit ref-updated even when new changes land in repo | 05:23 |
*** swest has joined #zuul | 05:25 | |
bjackman | OK, any idea why it would seem to have suddenly spotted every change? | 05:25 |
tristanC | bjackman: it fetch new changes periodically, every 2 hours iirc | 05:26 |
bjackman | I see - it's been unresponsive for a pretty long time processing all the changes | 05:26 |
bjackman | tristanC, last night, it said " zuul.connection.git.watcher: Walk through projects refs for connection: zuul-ci.org" | 05:29 |
bjackman | zuul.connection.git.watcher: Read refs {'refs/heads/master': '9515883f88e1e779ec4c733fa01a1791fda352c3'} for project zuul-jobs | 05:29 |
bjackman | Then 2hrs later, | 05:29 |
bjackman | zuul.connection.git.watcher: Walk through projects refs for connection: zuul-ci.org | 05:29 |
*** swest has quit IRC | 05:30 | |
bjackman | zuul.connection.git.watcher: Read refs {'refs/changes/00/494700/1': '01db060617a375affc93fd1262a2facc1d9e9c72', 'refs/changes/00/494700/2': ..... EXTREMELY LONG LINE | 05:30 |
bjackman | That was 90 minutes ago and it's still processing all the ref-udpated events | 05:30 |
tristanC | perhaps gitea is being slow at serving the refs? | 05:33 |
bjackman | Well, yesterday there was only 1 ref | 05:33 |
bjackman | tristanC, so it does seem something changed in the repo | 05:34 |
tristanC | bjackman: oh indeed, it seems to be because of: https://review.opendev.org/#/c/661008/ | 05:34 |
tristanC | previously, gerrit ref wasn't pushed to gitea | 05:35 |
bjackman | OK | 05:35 |
bjackman | "The current version wil now skip performing expensive operations on unknown refs" | 05:35 |
bjackman | Does not seem to be true for my "current version" | 05:35 |
bjackman | tristanC, Should I update Zuul? | 05:36 |
tristanC | bjackman: i think this refered to the webservice, not zuul git client :) | 05:36 |
bjackman | tristanC, Oh I see | 05:36 |
tristanC | bjackman: let see, perhaps we can add a "--head" to the ls-remote action | 05:39 |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: git: only list head references https://review.opendev.org/661185 | 05:42 |
tristanC | bjackman: ^ might reduce the load | 05:43 |
bjackman | tristanC, ah yeah seems like a good idea. | 05:44 |
bjackman | I've just counted the refs and events processed so far, seems at this rate my Zuul will be back to processing jobs in another 45 minutes or so | 05:44 |
bjackman | So no disaster | 05:44 |
*** hashar has joined #zuul | 06:19 | |
AJaeger | bjackman, tristanC, see discussion from last night on #openstack-infra: We now mirror refs/changes and refs/notes to gitea. What you see looks like an unwanted site effect ;( | 06:20 |
AJaeger | But with the git mirrors before using gitea (1month+ ago), we synced those already... | 06:21 |
tristanC | AJaeger: perhaps gitea is slower than cgit to serve those refs? | 06:27 |
AJaeger | tristanC: maybe? ;) We just synced those last night (finished 3 hours ago), so there might be backlog from some systems as well... | 06:28 |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: git: only list head references https://review.opendev.org/661185 | 06:48 |
*** yolanda has quit IRC | 06:49 | |
*** yolanda has joined #zuul | 06:49 | |
openstackgerrit | Merged zuul/nodepool master: Use py3 pathlib in DibImageFile https://review.opendev.org/660191 | 06:56 |
daniel2 | SpamapS: FreeBSD isnt like it used to be, it can do a lot of things that used to be Linux only in the past. | 07:07 |
SpamapS | tristanC: nobody should have been pulling from cgit anyway IIRC. | 07:08 |
SpamapS | daniel2:I am sure it's possible, but I have doubts that it uses the same low level commands. | 07:08 |
daniel2 | SpamapS: Well I will find out :) | 07:08 |
SpamapS | Indeed. | 07:08 |
SpamapS | daniel2:If you need any insight, I re-wrote a lot of the old diskimage-builder block device handling. It looks like it just got moved in to python. | 07:09 |
daniel2 | SpamapS: Im gonna take it one leg at a time. First step is to setup a jail and see what happens if I just try and use it normally, and then start hacking away at the problems | 07:10 |
daniel2 | SpamapS: I was talking to the FreeBSD CI Team, and honestly they like the idea of testing this out and think something like this would help the CI infrastructure. | 07:11 |
daniel2 | SpamapS: If you notice my cloak, I've been doing ports for awhile :P | 07:11 |
SpamapS | daniel2:werd! | 07:12 |
daniel2 | Honestly though, this channel has been a great help over the months for me, bunch of lovely folks here | 07:13 |
SpamapS | daniel2: dib was made to be simple, so I hope it's pretty straight forward. | 07:13 |
openstackgerrit | Tristan Cacqueray proposed zuul/zuul master: git: only list heads and tags references https://review.opendev.org/661185 | 07:31 |
*** mnaser has quit IRC | 07:35 | |
*** tima has quit IRC | 07:36 | |
*** ofosos has quit IRC | 07:42 | |
*** tima has joined #zuul | 07:43 | |
*** mnaser has joined #zuul | 07:43 | |
*** jpena|off is now known as jpena | 07:50 | |
*** gtema has joined #zuul | 08:00 | |
*** clayg has quit IRC | 08:01 | |
*** clayg has joined #zuul | 08:01 | |
*** mnaser has quit IRC | 08:02 | |
*** mnaser has joined #zuul | 08:05 | |
*** tosky has joined #zuul | 08:10 | |
*** tima has quit IRC | 08:12 | |
*** tima has joined #zuul | 08:12 | |
openstackgerrit | Tobias Henkel proposed zuul/zuul master: Support squash merge in Github https://review.opendev.org/661096 | 08:13 |
*** zbr has joined #zuul | 08:19 | |
openstackgerrit | Felix Schmidt proposed zuul/zuul master: Differentiate between queued and waiting jobs in zuul web UI https://review.opendev.org/660878 | 08:43 |
*** saneax has joined #zuul | 09:13 | |
openstackgerrit | Felix Schmidt proposed zuul/zuul master: Differentiate between queued and waiting jobs in zuul web UI https://review.opendev.org/660878 | 09:45 |
*** electrofelix has joined #zuul | 10:11 | |
*** panda has quit IRC | 10:38 | |
*** gtema has quit IRC | 10:39 | |
*** panda has joined #zuul | 10:46 | |
*** panda is now known as panda|rover | 10:48 | |
openstackgerrit | Fabien Boucher proposed zuul/zuul master: A reporter for Elasticsearch https://review.opendev.org/644927 | 10:53 |
*** jpena is now known as jpena|lunch | 11:40 | |
*** rfolco is now known as rfolco|brb | 11:51 | |
*** bjackman has quit IRC | 11:54 | |
*** EmilienM is now known as EvilienM | 11:58 | |
*** sshnaidm is now known as sshnaidm|afk | 12:06 | |
*** hashar has quit IRC | 12:09 | |
*** pwhalen has quit IRC | 12:22 | |
*** hashar has joined #zuul | 12:23 | |
*** pwhalen has joined #zuul | 12:24 | |
*** rlandy has joined #zuul | 12:35 | |
*** jpena|lunch is now known as jpena | 12:38 | |
*** jamesmcarthur has joined #zuul | 12:52 | |
openstackgerrit | Fabien Boucher proposed zuul/zuul master: Pagure driver - https://pagure.io/pagure/ https://review.opendev.org/604404 | 12:54 |
*** flepied has joined #zuul | 12:56 | |
*** rfolco|brb is now known as rfolco | 13:18 | |
openstackgerrit | Markus Hosch proposed zuul/zuul master: WIP: Fix case sensitivity in codeowners check https://review.opendev.org/661003 | 13:57 |
openstackgerrit | Tobias Henkel proposed zuul/zuul master: WIP: Fix case sensitivity in codeowners check https://review.opendev.org/661003 | 14:14 |
openstackgerrit | Tobias Henkel proposed zuul/zuul master: Evaluate CODEOWNERS settings during canMerge check https://review.opendev.org/644557 | 14:18 |
*** jamesmcarthur has quit IRC | 14:24 | |
dmsimard | tristanC: thanks for the ara pin patch, you beat me to it :) | 14:28 |
*** chandankumar is now known as raukadah | 14:48 | |
*** AshBullock has joined #zuul | 14:50 | |
openstackgerrit | Fabien Boucher proposed zuul/zuul master: Disable gc in test_scheduler.TestExecutor as done in base assertFinalState https://review.opendev.org/661316 | 14:52 |
openstackgerrit | Fabien Boucher proposed zuul/zuul master: Pagure driver - https://pagure.io/pagure/ https://review.opendev.org/604404 | 14:53 |
*** jamesmcarthur has joined #zuul | 14:55 | |
*** armstrongs has joined #zuul | 14:55 | |
*** hashar has quit IRC | 14:57 | |
armstrongs | seem to be hitting - ' ERROR: Could not find a version that satisfies the requirement dictdiffer (from openshift) (from versions: none)' - 'ERROR: No matching distribution found for dictdiffer (from openshift)' on ansible 2.7 when installing zuul managed ansible versions | 14:57 |
armstrongs | seems to have went through now, haha looks like it got tagged | 14:58 |
*** jamesmcarthur has quit IRC | 14:59 | |
openstackgerrit | James E. Blair proposed zuul/zuul-jobs master: WIP: registry test job https://review.opendev.org/661327 | 15:04 |
*** jamesmcarthur has joined #zuul | 15:05 | |
corvus | mordred, clarkb, fungi: ^ there's a start on a job to test the registry | 15:05 |
corvus | er, rather, the registry roles | 15:06 |
fungi | ooh! | 15:09 |
*** jangutter has quit IRC | 15:10 | |
corvus | i think we need to rethink how we do test jobs for zuul-jobs (we can't really put them in openstack-zuul-jobs anymore if we're going to set up a zuul tenant). i think we either need to make a new repo (zuul/zuul-jobs-tests) or put them in zuul-jobs itself (but still don't include a project stanza, do that in zuul/project-config) | 15:10 |
*** jamesmcarthur has quit IRC | 15:11 | |
openstackgerrit | David Moreau Simard proposed zuul/zuul master: Pin ARA to <1.0.0 https://review.opendev.org/661331 | 15:15 |
fungi | of the two options, i do prefer the idea of zuul-jobs having its tests of its jobs in its own tree rather than in a separate repo | 15:18 |
*** jamesmcarthur has joined #zuul | 15:19 | |
fungi | especially if it means that it's easier for folks who fork zuul-jobs to test that their alterations don't break a tested contract | 15:19 |
mordred | yeah - I like the idea of putting them in zuul-jobs - although I think we shoudl be careful to not have them make specific mention of nodesets or whatnot that a zuul-jobs consumer wouldn't necessarily have defined and just rely on the base job to bring things in like that | 15:20 |
mordred | of course that might make it hard to do multi-node | 15:20 |
corvus | mordred: yeah, and this is a multinode job (3 nodes!) | 15:20 |
corvus | i hadn't thought of that... it seems like that's going to push us to the extra-repo model | 15:21 |
mordred | corvus: it makes me want a construct that could say "please give me three nodes of whatever nodetype the base job uses" | 15:22 |
mordred | corvus: but we'd have to invent that - so extra-repo might be better for now | 15:22 |
corvus | mordred: yeah, i agree that's an idea worth noodling over. later. | 15:23 |
AshBullock | Hey all, quick question, I've setup a local executor setup feeding logs to a logging server. I was expecting to see the full output of my task run shown in my job-output.json file, but the tasks are left as empty arrays: http://paste.openstack.org/show/752046/ is there a verbosity setting I'm missing to get this showing? | 15:25 |
AshBullock | currently the testjob.yml has simply two debugs: http://paste.openstack.org/show/752047/ These are what I was expecting to see in the tasks list. Any help would be much appreciated | 15:27 |
corvus | AshBullock: i notice there's no "end" attribute under duration -- are all of those plays failing? | 15:27 |
corvus | AshBullock: if it is something like that, you may see more information in the executor log | 15:29 |
AshBullock | the plays are passing, but it does look as if those tasks are not being run | 15:33 |
corvus | AshBullock: oh, it may be due to the delegate_to -- there are special restrictions about delegating to localhost in zuul in untrusted job; i'm not sure if that would be allowed | 15:34 |
corvus | i think that would cause the play to fail, but that should be visible in the executor log... unless that's an unfortunate situation where it only shows up in debug-level logging | 15:35 |
corvus | mordred: ^ might know for sure | 15:36 |
mordred | looking | 15:39 |
AshBullock | thanks, I added a fail task in the role and it still passes, so it definitely looks like the tasks are not running | 15:40 |
mordred | hrm. yeah - I wouldn't expect us to be blocking debug with delegate_to ... but in this case, maybe doing delegate_to: localhost would work better (since localhost is the special inventory value) | 15:40 |
mordred | oh - weird | 15:40 |
*** jamesmcarthur has quit IRC | 15:46 | |
AshBullock | we've reset the playbook hosts to be: - hosts: localhost and this has now ran the tasks, however we'll want to use hosts: all in order to target boxes, how do we set hosts within the playbook for zuul? | 15:48 |
AshBullock | so in a play we are going to need to alternate between local actions and target boxes so how would we do that with zuul as setting localhost won't all us to do that? | 15:49 |
AshBullock | does nodepool available hosts become all and if none are available does it just skip? | 15:50 |
clarkb | AshBullock: the hosts in our nodeset end up in the zuul job inventory | 15:52 |
clarkb | s/our/your/ | 15:52 |
AshBullock | ok that makes sense, need to set up a nodepool host, should there be error handling in the case there is no hosts in the nodepool, rather than it just passing and not running anything? | 15:53 |
AshBullock | I guess it's just mimicking what ansible does that point | 15:53 |
*** jamesmcarthur has joined #zuul | 15:55 | |
*** nick_x has joined #zuul | 15:59 | |
nick_x | morning #zuul, I have a question: | 15:59 |
nick_x | I've checked out a branch with gerrit, | 15:59 |
nick_x | and would like to merge/checkin/new branch | 15:59 |
nick_x | how do I? | 15:59 |
*** jamesmcarthur has quit IRC | 16:02 | |
*** jamesmcarthur has joined #zuul | 16:03 | |
clarkb | nick_x: commits to branches go through the normal review process in gerrit. If you want to merge say feature/foo into master you can propose a merge commit to the master branch and review and merge it | 16:04 |
*** saneax has quit IRC | 16:06 | |
*** pwhalen has left #zuul | 16:10 | |
*** flepied has quit IRC | 16:15 | |
nick_x | clarkb, I asked a coworker and he said `checkout master` | 16:17 |
nick_x | sorry I know my question was a little bit fuzzy lol | 16:17 |
nick_x | merge commit to master branch? | 16:18 |
clarkb | to merge a commit to master branch you would locally make your commit, then run the git review utility to push that to gerrit. Then zuul can test it and merge it for you once it has the appropriate votes | 16:18 |
nick_x | so ..... just to be clear ..... once all the changes in the branch are merged to master, the branch is effectively == master | 16:19 |
clarkb | what is "the branch" in this context? | 16:19 |
nick_x | I made a branch "in-which-we-implement-a-new-role" | 16:20 |
nick_x | I made a branch "in-which-we-implement-a-new-[foo]-role" | 16:20 |
nick_x | I implemented the new role, committed, reviewed, Zuul said ok buddy | 16:20 |
nick_x | all is merged | 16:20 |
nick_x | I'm done with the branch | 16:20 |
clarkb | ya that would be a local working branch that is no longer necessary when the commit is merged to master by zuul | 16:21 |
nick_x | so now I can do "in-which-we-implement-a-new-[bar]-role" rinse repeat | 16:21 |
nick_x | :D | 16:22 |
clarkb | yes | 16:22 |
nick_x | cool! I'm getting the hang 'o this! | 16:22 |
nick_x | what are you up to clarkb? | 16:22 |
clarkb | catching up on changes that happened since I left the computer yesterday | 16:23 |
nick_x | in opendev? or? | 16:24 |
clarkb | ya | 16:24 |
clarkb | and email and irc messages | 16:24 |
nick_x | heavy is the crown clarkb | 16:25 |
nick_x | at least it's friday though | 16:25 |
nick_x | :) | 16:29 |
*** jamesmcarthur has quit IRC | 16:34 | |
nick_x | hmm, I have commits up to date with master, but that haven't been merged :1 I'm expecting these commits to have merged with my +2 and zuul +2 | 16:46 |
clarkb | nick_x: you may also need to do the approval +1 vote | 16:47 |
nick_x | hmm, let's see | 16:47 |
nick_x | ugh it wants rebased & new patchset x_x grrrr | 16:49 |
*** manjeets has quit IRC | 16:51 | |
*** electrofelix has quit IRC | 17:02 | |
*** jpena is now known as jpena|off | 17:04 | |
fungi | if there is an explicit parent change (you're using gerrit, right?) and it's been updated more recently, then gerrit won't allow that to merge without a rebase | 17:05 |
nick_x | yeah fungi that's pretty much what happened | 17:06 |
nick_x | I +1'd top of stack and was trying to get bottom of stack to merge, | 17:06 |
nick_x | it's sorted now, I think | 17:07 |
*** AshBullock has quit IRC | 17:09 | |
*** mattw4 has joined #zuul | 17:09 | |
*** mattw4 has quit IRC | 17:15 | |
*** electrofelix has joined #zuul | 17:38 | |
*** electrofelix has quit IRC | 17:51 | |
*** pcaruana has quit IRC | 17:53 | |
*** armstrongs has quit IRC | 18:13 | |
openstackgerrit | David Shrewsbury proposed zuul/zuul master: WIP: Store hold requests in zookeeper https://review.opendev.org/661114 | 18:36 |
*** pcaruana has joined #zuul | 18:48 | |
*** pcaruana has quit IRC | 18:48 | |
*** tosky has quit IRC | 19:16 | |
*** panda|rover has quit IRC | 19:36 | |
*** panda has joined #zuul | 19:40 | |
corvus | SpamapS: we're using paused jobs for our image build/test/deployment pipeline in opendev/system-config if you want to see it in action | 19:48 |
*** EvilienM is now known as EmilienM | 20:33 | |
*** aspiers has quit IRC | 20:38 | |
clarkb | corvus: mordred do you have that change you asked me to review about gerrit stream events behavior? I am fairly certain I did review it and wanted to check for followups but I cannot find it in gerrit's search | 20:50 |
corvus | clarkb: https://review.opendev.org/649900 | 20:52 |
clarkb | thanks | 20:52 |
mordred | corvus: right there where clarkb pointed to | 20:57 |
* mordred is so helpful | 20:57 | |
clarkb | mordred: you got your names mixed up :P | 20:58 |
clarkb | now to figure out why that didn't show up in my searches (or I just missed it?) | 20:58 |
clarkb | heh it shows up now | 20:58 |
clarkb | (becuse I left a new vote) | 20:58 |
clarkb | er comment | 20:58 |
corvus | clarkb: hahaha :) | 20:58 |
mordred | clarkb: and wow - I did get the names backwards .. and when you said I did I looked and thought "no I didn't" | 20:58 |
corvus | clarkb: i found that extremely amusing given the topic of the change :) | 20:58 |
clarkb | corvus: yes exactly | 20:59 |
clarkb | I am beginning to wonder if maybe they don't use a workflow category | 20:59 |
clarkb | since I think that separate category is what solves this for us | 20:59 |
*** aspiers has joined #zuul | 21:00 | |
clarkb | I'll have to consider that case if there are sane ways to deal with that they don't require changing gerrit configs | 21:00 |
corvus | yeah... the only other thing i can think of is a behavior flag which is :/ | 21:01 |
corvus | i'm still noodling on it | 21:01 |
*** mattw4 has joined #zuul | 21:31 | |
evgenyl | Hi everyone, I'm trying to run zuul-scheduler using docker container, but it fails in a crashloop http://paste.openstack.org/show/752058/ , in my config in section `gearman_server` I have `start=true` what is the best way to debug the problem and to find out why gearman does not get started? | 21:45 |
clarkb | evgenyl: that message indicates the server named "scheduler" doesn't have dns records or /etc/hosts entries so it doesn't know what to bind to | 21:46 |
clarkb | evgenyl: you can update the config to bind to :: and it will bind to all addresses | 21:47 |
evgenyl | clarkb: Oops, let me check that, thank you! | 21:47 |
evgenyl | clarkb: Yep, that was the problem, sorry for not reading the logs carefully enough and thanks again. | 21:52 |
clarkb | no problem | 21:57 |
*** jamesmcarthur has joined #zuul | 22:12 | |
*** rlandy has quit IRC | 22:16 | |
*** jamesmcarthur has quit IRC | 22:19 | |
*** jamesmcarthur has joined #zuul | 22:50 | |
*** jamesmcarthur has quit IRC | 22:57 | |
*** mattw4 has quit IRC | 23:09 | |
*** jamesmcarthur has joined #zuul | 23:33 | |
*** jamesmcarthur has quit IRC | 23:37 |
Generated by irclog2html.py 2.15.3 by Marius Gedminas - find it at mg.pov.lt!