Perl 6 language and compiler development | Logs at colabti.org/irclogger/irclogger_log/perl6-dev | For toolchain/installation stuff see #perl6-toolchain | For MoarVM see #moarvm
Set by Zoffix on 27 July 2018.
00:01 anatofuz joined 00:08 anatofuz left, anatofuz joined 00:09 anatofuz left 00:10 anatofuz joined
vrurg jnthn: BTW, I'm almost done fixing $a = 1; $a ,= 2 where current implementation causes the LHS scalar to be assigned with the newly created list causing a recursive data structure. Like: 00:12
m: my $a = 1; $a ,= 2; say $a.perl
evalable6 (my \List_93926578496192 = $(List_93926578496192, 2))
AlexDaniel` japhb: there's already a matrix client in perl6 00:13
00:13 leont left
vrurg There're two solutions: either decont $a or clone the container when it's passed into an infix op. Can't choose which way is better. 00:13
Container cloning is a bit slower way but it wouldn't break operators whose behavior might depend on whether they receive a value or a container. 00:15
AlexDaniel` japhb: also there are 20+ people in Perl 6 / Raku community on matrix.org 00:16
japhb: and I'm using matrix right now to talk to you via their freenode bridge… :) 00:17
timotimo how many of them are on matrix but not on the bridge? 00:18
vrurg AlexDaniel: regarding the release blockers: two of them depend on #3174.
AlexDaniel` timotimo: I was only sending invites to those lurking on #perl6 channel 00:19
via the bridge
timotimo OK
AlexDaniel` and if your server is federating with matrix.org (I guess most servers do), then you can join #perl6 via the bridge
timotimo i had a matrix client but i only used it once and forgot its name so now i can't go on matrix any more 00:20
AlexDaniel` here: riot.im/app/#/room/#freenode_#perl...matrix.org 00:21
though it probably won't let you in unless you log in? I'm not sure
yeah, seems so
timotimo riot refused to work for me last time i tried 00:22
AlexDaniel` surprisingly this is publicly visible: riot.im/develop/#/group/+perl6:matrix.org 00:23
vrurg timotimo: maybe you'd have an opinion on my question above? I'm balancing 50/50 toward two different solutions and can't make the final choice.
timotimo oof 00:25
vrurg ok 00:31
timotimo i find it difficult to decide 00:34
either you end up with unexpectedly no container, or you end up with unexpectedly a container
in different situations
... i think
vrurg timotimo: there will be no unexpected container. It would clone Scalar only if finds a Scalar. The only possible problem is that it'll be not the container passed into the op. But that'd be easier to explain then loss of container. 00:42
Basically, I tend to use cloning as more clean and predictable path. The thing which worries me is that it adds a bit of CPU cycles to metaop_assign. 00:43
I can't nqp::clone(a.VAR) because it fails on nativerefs. So, I need to nqp::if(nqp::istype(a.VAR, Scalar), clone(a.VAR), a) 00:44
timotimo at least istype is something spesh knows how to deal with, generally 00:45
vrurg spectesting... Will submit with cloning if it works. 00:48
jnthn Hm, this is one of the cases where the most obvious behavior is the one you're trying to eliminate. :) 00:50
(I agree the current behavior probably isn't terribly useful.) 00:51
m: my @a = 1..5; @a ,= 6; dd @a; 00:52
evalable6 Array @a = ((my @Array_93885994670744) = [@Array_93885994670744, 6])
vrurg jnthn: R#1205 Junction falls into deep recursion
synopsebot R#1205 [open]: github.com/rakudo/rakudo/issues/1205 [junctions] Compound junction-assignement operators cause a hang
jnthn I suspect the most sensible behavior would be to turn `a foo= b` into `my \tmp = a; a = a<> foo b;` 00:54
vrurg jnthn: This behavior isn't changing with my fix: ((my @Array_140471863286768) = [@Array_140471863286768, 4])
jnthn Though that only deals with the scalar case
vrurg: Yeah, I don't know what we can really do with the non-Scalar case. I mean, consistency argues for not changing anything, so anything we do here is going to introduce an inconsistency in the name of trying to be more useful. 00:55
vrurg jnthn: I'd rather avoid deconting. If someone decides to make an op behaving differently depending on containerization of its first arg then it won't do what's expected 00:56
jnthn vrurg: Well, that's the thing: the definition of `,` is to retain the container of what it gets
vrurg jnthn: that's why I limited change to Scalars only.
00:57 benchable6 left, benchable6 joined
jnthn Thing is 00:58
m: my $a = 1; $a = $a, 2; dd $a
evalable6 WARNINGS for /tmp/l2PgVdcHCK:
Useless use of constant integer 2 in sink context (lines 1, 1)
Int $a = 1
jnthn gah :)
m: my $a = 1; $a = ($a, 2); dd $a
evalable6 List $a = (my \List_94748131518656 = $(List_94748131518656, 2))
vrurg jnthn: But this is explicit and controllable by a user. Whereas ,= is implicit and causes confusion. 00:59
jnthn We'd be breaking the "you can replace `a = a foo b` with `a foo= b`
Uh, I'm pretty sure the language user can control when they use the assign meta-op :P 01:00
timotimo there's kind of already the thing that it calls the zero-arg meaning if the variable is undefined at that point
jnthn I'm yet to be convinced the cure is worse than the disease.
timotimo: True. 01:01
m: my $a; $a ,= 2; dd $a
evalable6 List $a = $((), 2)
jnthn hah :)
timotimo now *that*'s funny
vrurg Almost makes sense. Undef makes it an empty list. 01:02
jnthn Yes, no argument that it makes sense, though the current behavior also makes sense in the same kind of way.
vrurg What is confusing is that it behaves totally differently to when its defined. 01:03
jnthn I guess part of this is that just because you *can* use the assign meta-op on most things doesn't mean it will always have a useful meaning.
m: my $a; $a Z= 42 01:04
evalable6
jnthn m: my $a; $a [==]= 42
evalable6 (exit code 1) 04===SORRY!04=== Error while compiling /tmp/RxgHUz3FXI
Cannot …
jnthn, Full output: gist.github.com/ec781078d9aa20da4c...c26cb1e0af
jnthn There are some constraints, e.g. "Cannot make assignment out of == because chaining operators are too diffy"
I wonder if a better solution would be to not offer `,=`, `&=`, and friends. 01:05
timotimo "too footgunny"
"too funny. funny is short for footgunny"
jnthn I'm surprised , and the junction formers aren't considered diffy, tbh. 01:06
They certainly return a different type
I think I'd prefer to explore in this direction than to try and "fix" the behavior, given I don't actaully see the results of those changes being useful
vrurg What actually makes sense is: my $j = 1 & 2; $j &= 3; 01:08
01:08 benchable6 left
jnthn Hmm, maybe but it's still a bit surprising in so far as I suspect it will be expected to give all(1,2,3) but it'll really give all(all(1,2),3) 01:08
01:08 benchable6 joined
jnthn I guess that's not actually so bad 01:09
In so far as it doesn't impact the eventual boolification
vrurg Ok, my task is probably even harder now than before I asked. ;) But it makes more sense now. 01:11
Thanks to all!
jnthn Well, whatever we do, I agree the current user experience is bad :)
I can just argue the thing a bunch of different ways :)
From a performance design perspective, I really don't like the "extra container" approach though 01:12
01:12 anatofuz left
vrurg jnthn: I'd better ask to argue to R#3174 when there is a bit of time. Or say "it's ok". ;) 01:12
synopsebot R#3174 [open]: github.com/rakudo/rakudo/pull/3174 [data types] Provide means of preserving the decontainerization of values on Hash -> Map coercion
01:13 anatofuz joined
jnthn Just because I'm beating my head up implementing EA doesn't mean I want `$a += $b` to produce an extra temporary container for me eliminate. :) 01:13
01:13 anatofuz left, anatofuz joined
vrurg jnthn: The performance matter was my primary reason too. Good I asked because the whole direction I took was wrong. 01:13
jnthn I guess decont makes the junction case work 01:14
Anyway, I should probably have gone to bed an hour ago... :)
vrurg Wow... I always forget about your location. 01:15
vrurg wonders when some people sleep at all?
jnthn I slept most of this morning, so... :) 01:16
Anyways, 'night o/
vrurg jnthn: o/ 01:22
02:19 anatofuz left 02:20 anatofuz joined
releasable6 Next release in ≈6 days and ≈15 hours. R6 is down. At least 9 blockers. Please log your changes in the ChangeLog: github.com/rakudo/rakudo/wiki/ChangeLog-Draft 03:00
03:09 anatofuz left 03:10 anatofuz joined
vrurg .tell jnthn junction operators cannot be diffy because it breaks reduction where they're totally ok. Perhaps deconting junction values is the only good solution which might also have good impact on performance. 03:11
tellable6 vrurg, I'll pass your message to jnthn
03:14 anatofuz left 03:15 anatofuz joined 04:06 anatofuz left 04:08 anatofuz joined 04:25 anatofuz left 04:27 anatofuz joined 04:42 anatofuz left 04:48 tbrowder left 04:53 anatofuz joined 04:54 tbrowder joined 05:17 anatofuz left 05:18 anatofuz joined 05:23 anatofuz left 05:30 anatofuz joined 06:43 anatofuz left, anatofuz joined 06:46 anatofuz left, anatofuz joined 07:08 anatofuz left 07:09 anatofuz joined 07:12 anatofuz left 07:13 anatofuz joined 07:51 anatofuz left 07:52 anatofuz joined 07:57 anatofuz left 08:06 anatofuz joined 08:35 leont joined 08:45 anatofuz left 08:46 anatofuz joined
[Tux] Rakudo version 2019.07.1-260-g9dd67cb37 - MoarVM version 2019.07.1-201-ge4a756c6a
csv-ip5xs0.692 - 0.698
csv-ip5xs-205.021 - 5.151
csv-parser22.341 - 24.223
csv-test-xs-200.422 - 0.424
test7.268 - 7.462
test-t1.785 - 1.796
test-t --race0.819 - 0.896
test-t-2029.961 - 30.373
test-t-20 --race9.312 - 10.143
08:47
08:50 anatofuz left 08:58 anatofuz joined 10:16 anatofuz left, anatofuz joined 10:21 anatofuz left 10:54 anatofuz joined 11:14 anatofuz left, anatofuz joined 12:05 FROGGS joined 12:47 epony left 12:52 anatofuz left 12:53 anatofuz joined 12:57 anatofuz left 12:59 lucasb joined 13:25 anatofuz joined 13:54 leont left 13:58 anatofuz left 14:36 FROGGS left 14:54 dogbert17 left 15:06 epony joined 15:32 dogbert17 joined 15:55 anatofuz joined 16:16 gdonald left
Geth ¦ problem-solving: JJ assigned to AlexDaniel Issue Ecosystem stability issues github.com/perl6/problem-solving/issues/105 16:18
16:29 anatofuz left 16:44 Ven`` joined 17:01 anatofuz joined 17:34 Ven`` left 17:35 Ven`` joined, anatofuz left, Ven`` left
Geth rakudo: vrurg++ created pull request #3186:
De-containerize Junction values.
17:38
rakudo/newer-sprintf: 40c4cc5225 | (Elizabeth Mattijsen)++ | src/core.e/Rakudo/Internals/Sprintf.pm6
Add complete support for *.* for %b/%x
18:23
roast/new-sprintf: 79e0b68058 | (Elizabeth Mattijsen)++ | S32-str/sprintf-b.t
Add additional "*" and "*.*" tests to %b
rakudo/master: 4 commits pushed by (Vadim Belman)++, (Elizabeth Mattijsen)++ 18:24
vrurg lizmat: it was a little bit preliminary. ;) I'm now working on the actual freeze of gist/perl methods 18:26
lizmat sorry... was glad you caught it... :)
vrurg lizmat: it wasn't me. ;) But the possible freeze is still there because one can $a = 1; $a = ($a, 1); say ~$a – though it's now only about List. 18:28
lizmat: I'd like to ask your opinion on R#3174. 18:31
synopsebot R#3174 [open]: github.com/rakudo/rakudo/pull/3174 [data types] Provide means of preserving the decontainerization of values on Hash -> Map coercion
lizmat vrurg: /me commented 18:38
vrurg lizmat: thanks!
AlexDaniel jnthn: so, are you ok with #89 not providing any specific extensions? 18:45
I was busy with some stuff so I wasn't able to follow what happened there
but basically, some people said that the PR shouldn't have extensions specified (including samcv), yet I vaguely remember jnthn saying that extensions should be decided as part of this PR 18:46
so which one is it?
vrurg lizmat: but taking into account that we need to get a fix before the coming release, what would you say about the approach I took? It was generally agreed that deconting hash values on Map coercion is the way to go. 18:47
AlexDaniel releasable6: status 18:48
releasable6 AlexDaniel, Next release in ≈6 days and ≈0 hours. R6 is down. At least 9 blockers. Unknown changelog format
AlexDaniel, Details: gist.github.com/ab53b7adb3746cf3c7...5b77bfa365
AlexDaniel I'm not sure if this is realistic…
lizmat feels icky, as that would imply that a Map can have containers sometimes, and other times not 18:49
code as "my %m is Map = a => (my $ = 42)" would have containers
whereas "my %m = { a => (my $ = 42) }.Map" would not 18:50
eh... make that := :-)
vrurg lizmat: Unfortunately, it has to be this way because we have code relying on |%h.Map for argument passing. :( 18:53
lizmat code in the core, or in the ecosystem ? 18:54
vrurg And same time Map is currently unfified with List in their behaviors. So, considering that Map -> Hash conterizes values, having Hash -> Map doing vice versa is an acceptable compromize.
lizmat: in the ecosystem.
tobs I had code like that (in the ecosystem) but vrurg++ PRd a fix after an earlier Blin run, IIRC 18:55
vrurg Right, I submitted to PRs on this to two modules. 18:56
So, probably ecosystem is currently clean of this problem. But people tend to use that construct, especially for passing on arrays because plain |%h passes a conteinarized array which gets assigned as a single element. R#3168 is about this problem. 18:58
synopsebot R#3168 [open]: github.com/rakudo/rakudo/issues/3168 [BLOCKER][regression] Unpacking a |%h.Map has a different behaviour from 2019.07.1
lizmat vrurg: added my review and requested changes :-)
vrurg lizmat++ thanks! Makes sense. 19:03
19:04 Kaiepi left, Kaypie joined
Geth roast/new-sprintf: 2932a5648a | (Elizabeth Mattijsen)++ | S32-str/sprintf-x.t
Add additional "*" and "*.*" tests to %x
19:08
MasterDuke anyone else getting errors in t/spec/S32-temporal/DateTime.t ? `Second out of range. Is: 60, should be in 0..^60; a leap second can occur only at 23:59 in block at t/spec/S32-temporal/DateTime.t line 804 in block <unit> at t/spec/S32-temporal/DateTime.t line 706` 19:14
hm, works fine if i disable jit 19:15
even if i just disable the expr jit 19:16
.tell brrt some expr jit problem colabti.org/irclogger/irclogger_lo...09-15#l238 19:17
tellable6 MasterDuke, I'll pass your message to brrt
vrurg MasterDuke: anything special needed to see the problem? Because I'm currently running spectests tens of times each day, no problem about datetime 19:18
MasterDuke vrurg: nope. but are you at HEAD on moarvm?
19:18 Ven`` joined
vrurg MasterDuke: last updated to 3f97d73d4c7 couple of days ago. 19:19
AlexDaniel .tell jnthn please let me know colabti.org/irclogger/irclogger_lo...09-15#l210 19:20
MasterDuke then i suspect it's the recent merge brrt did of github.com/MoarVM/MoarVM/pull/1176
tellable6 AlexDaniel, I'll pass your message to jnthn
Geth rakudo: vrurg++ created pull request #3187:
Protect List from freezing on self-recursion
19:28
rakudo: edbcd7596a | (Vadim Belman)++ | src/core.c/List.pm6
Protect List from freezing on self-recursion

If the first element of a list is a Scalar containing the list itself then method join hangs due to a deep recursion.
19:30
rakudo: 7dede2d374 | (Vadim Belman)++ (committed using GitHub Web editor) | src/core.c/List.pm6
Merge pull request #3187 from vrurg/rakudo_1205

Protect List from freezing on self-recursion
roast/master: 4 commits pushed by (Vadim Belman)++ 19:33
rakudo/revert-3187-rakudo_1205: bfe4613733 | (Vadim Belman)++ (committed using GitHub Web editor) | src/core.c/List.pm6
Revert "Protect List from freezing on self-recursion"
19:40
19:41 brrt joined
Geth rakudo: vrurg++ created pull request #3188:
Revert "Protect List from freezing on self-recursion"
19:41
rakudo: bfe4613733 | (Vadim Belman)++ (committed using GitHub Web editor) | src/core.c/List.pm6
Revert "Protect List from freezing on self-recursion"
19:42
rakudo: 2bc3ac4b6b | (Vadim Belman)++ (committed using GitHub Web editor) | src/core.c/List.pm6
Merge pull request #3188 from rakudo/revert-3187-rakudo_1205

Revert "Protect List from freezing on self-recursion"
lizmat gets confused 19:50
vrurg lizmat: that's how github reverses a merged PR. 19:52
lizmat would have been easier to just revert the commit :-)_ 19:54
19:54 leont joined
vrurg I didn't know how it happens, thought they'd do just that. 19:54
I think there is no fast solution to protect join from freezing on recursion. Either way, I end up re-implementing gistseen. 19:58
19:59 Kaypie left, Kaypie joined
lizmat perhaps we need an outer "join" method that would initialize a dynamic variable $*JOIN-DEPTH, and an "inner" join logic that would increment and check that and throw when it gets too deep ? 20:02
I mean, if you're using self-referential structures, and you want to .join them, there's probably something wrong ?
vrurg m: my %h; %h<h> := %h; say ~%h 20:04
evalable6 (signal SIGHUP) «timed out after 10 seconds»
vrurg Aha, same problem...
lizmat yes, I know it's easy to create
vrurg m: my %h; %h<h> := %h; say %h
evalable6 (\Hash_94339087695856 = {h => Hash_94339087695856})
vrurg What I meant is that perhaps Str must follow .perl/.gist on this? 20:05
I.e. print something like the above output instead of freezing?
brrt does anybody know how to run prove for a single spectest?
lizmat make t/spec/foo/bar.t 20:06
brrt thank you lizmat
lizmat vrurg: perhaps we should only do the recursion check for .perl (aka perlseen) 20:07
in that case, one knows that it is intended to be looked at with a special eye 20:08
I'm not too sure we need the overhead in .gist or .Str
vrurg And have .Str (and .join for Lists) freezing?
I could try dying on detected recursion. Should be faster because this could be done with just nqp::where and a dynamic symbol. 20:10
lizmat I was just checking how Perl 5 handles that... 20:13
it doesn't, as you cannot have this situation
you can only put a reference to an array in an array
if you put the array into itself, it will flatten the "old" version into itself 20:14
$ 5 'my @a = "baz"; @a = ("foo",@a,"bar"); say join(",",@a)'
foo,baz,bar
$ 5 'my @a = "baz"; @a = ("foo",\@a,"bar"); say join(",",@a)'
foo,ARRAY(0x7fb6a201d448),bar
vrurg lizmat: but we unwind nested structures. So, can't compare to 5. 20:24
lizmat indeed 20:25
20:47 Kaypie left, Kaypie joined 20:52 anatofuz joined 20:53 brrt left 20:58 anatofuz left 21:01 Ven`` left 21:34 anatofuz joined
jnthn AlexDaniel: I feel extensions should be decided in the rename PR; there's already been a discussion issue on the topic, and I don't care to have to read/follow another such discussion; I don't know what's to gain by delaying it. 21:46
tellable6 2019-09-15T03:11:36Z #perl6-dev <vrurg> jnthn junction operators cannot be diffy because it breaks reduction where they're totally ok. Perhaps deconting junction values is the only good solution which might also have good impact on performance.
2019-09-15T19:20:26Z #perl6-dev <AlexDaniel> jnthn please let me know colabti.org/irclogger/irclogger_lo...09-15#l210
AlexDaniel jnthn: alright, I see 21:47
MasterDuke AlexDaniel: mind doing an nqp+rakudo bump? 21:50
Geth nqp: a46eb14278 | (Aleks-Daniel Jakimenko-Aleksejev)++ | tools/templates/MOAR_REVISION
[MoarVM Bump] Brings 31 commits

MoarVM bump brought: github.com/MoarVM/MoarVM/compare/2...g2ac137c3d 2ac137c3d [JIT] Use the new deopt index for synthetic guards 07983e4cb Fix possible access to fromspace in MVM_string_flip 9138c6998 Fix possible access to fromspace in MVM_frame_move_to_heap a4a599e35 Fix possible access to fromspace in MVM_code_location ... (27 more lines)
21:51
rakudo: daaf0277e4 | (Aleks-Daniel Jakimenko-Aleksejev)++ | tools/templates/NQP_REVISION
[NQP Bump] Brings 4 commits

NQP bump brought: github.com/perl6/nqp/compare/2019....ga46eb1427 a46eb1427 [MoarVM Bump] Brings 31 commits 00eaa35e8 [js] Make --libpath resolve relative path with the compile time cwd 1a6d4e466 [js] Remove a no longer needed hack a759b02f1 [js] Instead of turning :: into a - use directories
jnthn AlexDaniel: I think I also stated that position in the issue. Also worth checking what ugexe exactly said, in that I remember he said something about the extensions issue affected how he'd vote on the rename PR
AlexDaniel jnthn: he just said that he doesn't want a single extension for both modules and scripts
so separate .rk and .rkm is fine, but .rk for modules is not 21:53
jnthn AlexDaniel: Yes, I'm not sure if it's implied that this should be in the rename PR, or just that he'd vote against the rename PR if it tried to drop the distinction.
I'm fine with separate extensions, and inclined to believe give more weight to the viewpoint put forward by the folks who actually support our tooling. 21:54
*believe and
I kind of wanted a base suffix, e.g. .rkm (module), .rkd (doc), .rkt (test) but we absolutely cannot do the last of those 21:55
(Taken by the racket language)
.rk for script, .rm for module, .rd for doc, and .rt for test might fly 21:56
MasterDuke vrurg: i just noticed something odd in the build output. it looks like a literal `\t` is being printed instead of a tab in some cases 21:59
vrurg: `+++ Generating\tperl6-m+++ Generating gen/moar/perl6-debug.nqp+++ Compiling perl6-debug.moarvm+++ Compiling\tinst-perl6-m`
vrurg MasterDuke: thanks! Some echos are left behind. 22:15
AlexDaniel jnthn: I'm a bit worried about .rm
maybe it's unjustified, but it just looks scary :D
MasterDuke vrurg: btw, i like the look of the new output
lucasb $ rm Foo.rm 22:16
vrurg MasterDuke: thanks! Installation needs to be reworked too, but I got to tired of makefiles, needed a change.
tobs .rm does induce subtle stress over here :') But there are only so many options... the other suggestion along .rakulib etc. are kinda long. 22:19
vrurg AlexDaniel, jnthn – .rt is RealTime.
lucasb and also a bug tracker :)
22:20 leont left
lizmat fwiw, HEAD is *not* clean for a test suite of a client atm 22:24
jnthn AlexDaniel: Bad memories of (Buffering...) RealMedia? :D 22:26
But yeah, I'd realized the more obvious connotation too :)
lizmat perhaps should bite the bullet and go for longer extensions 22:27
when raku takes off amongst the younger folk, it will be mostly because of IDE's like Comman 22:28
*Comma
and then length of extensions shouldn't matter that much?
22:32 anatofuz left, anatofuz joined
Geth rakudo/new-sprintf: 5 commits pushed by (Elizabeth Mattijsen)++ 22:33
vrurg lizmat: It really not that important even outside of IDEs with all the completions and considering the fact that it's not something we type very often.
lizmat argh... somehow the new-sprintf branch came back :-( 22:34
Geth rakudo/newer-sprintf: 0f03edf891 | (Elizabeth Mattijsen)++ | src/core.e/Rakudo/Internals/Sprintf.pm6
Fix up %o format
22:35
lizmat sleep& 22:36
22:37 anatofuz left 22:45 anatofuz joined 22:46 anatofuz left 22:47 anatofuz joined
releasable6 Next release in ≈5 days and ≈19 hours. R6 is down. At least 9 blockers. Please log your changes in the ChangeLog: github.com/rakudo/rakudo/wiki/ChangeLog-Draft 23:00
23:14 anatofuz left 23:15 anatofuz joined 23:19 anatofuz left 23:28 anatofuz joined 23:34 anatofuz left 23:35 anatofuz joined 23:39 anatofuz left 23:41 travis-ci joined
travis-ci Rakudo build passed. Aleks-Daniel Jakimenko-Aleksejev '[NQP Bump] Brings 4 commits 23:41
travis-ci.org/rakudo/rakudo/builds/585320674 github.com/rakudo/rakudo/compare/2...af0277e4c7
23:41 travis-ci left