From f1bff237a4f539d8197cc7f6e4cb72410779417a Mon Sep 17 00:00:00 2001 From: Brooks J Rady Date: Fri, 14 May 2021 11:41:00 +0100 Subject: [PATCH 01/16] feat(build): incorporate git committing and tagging into the publish process --- Makefile.toml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Makefile.toml b/Makefile.toml index c02ba1cc..75f78b25 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -122,9 +122,22 @@ args = ["install", "cross"] [tasks.publish] clear = true workspace = false -dependencies = ["build-plugins-release", "wasm-opt-plugins", "build-release", "publish-zellij-tile", "publish-zellij-tile-utils"] +dependencies = ["build-plugins-release", "wasm-opt-plugins", "release-commit", "build-release", "publish-zellij-tile", "publish-zellij-tile-utils"] run_task = "publish-zellij" +[tasks.release-commit] +dependencies = ["commit-all", "tag-release"] +command = "git" +args = ["push", "--atomic", "origin", "main", "v${CARGO_MAKE_CRATE_VERSION}"] + +[tasks.commit-all] +command = "git" +args = ["commit", "-aem", "chore(release): v${CARGO_MAKE_CRATE_VERSION}"] + +[tasks.tag-release] +command = "git" +args = ["tag", "v${CARGO_MAKE_CRATE_VERSION}"] + [tasks.publish-zellij-tile] ignore_errors = true cwd = "zellij-tile" From ba206b1f29065d2cdd304809ab37db2963d6ec7d Mon Sep 17 00:00:00 2001 From: a-kenji Date: Sat, 15 May 2021 12:45:24 +0200 Subject: [PATCH 02/16] Invert Assets Installation Feature * changed `enable_automatic_asset_installation` to `disable_automatic_asset_installation` This ensures that people by default get the asset installation and need to opt out at compile time, rather than opt in. * removed default features Not needed anymore. --- Cargo.toml | 3 +-- src/common/utils/consts.rs | 4 ++-- src/server/mod.rs | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b2faa935..1acd2c11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -80,5 +80,4 @@ assets = [ ] [features] -default = [ "enable_automatic_asset_installation", ] -enable_automatic_asset_installation = [] +disable_automatic_asset_installation = [] diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index 479405c3..42843eb8 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -49,6 +49,6 @@ lazy_static! { } pub const FEATURES: &[&str] = &[ - #[cfg(feature = "enable_automatic_asset_installation")] - "enable_automatic_asset_installation", + #[cfg(feature = "disable_automatic_asset_installation")] + "disable_automatic_asset_installation", ]; diff --git a/src/server/mod.rs b/src/server/mod.rs index a4a79ca0..3bd38999 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -187,7 +187,7 @@ fn init_session( // Determine and initialize the data directory let data_dir = opts.data_dir.unwrap_or_else(get_default_data_dir); - #[cfg(enable_automatic_assets_installation)] + #[cfg(not(disable_automatic_assets_installation))] populate_data_dir(&data_dir); // Don't use default layouts in tests, but do everywhere else From fef150c8ff9d929e9924e9a16d623f107f3868e7 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Sat, 15 May 2021 13:17:35 +0200 Subject: [PATCH 03/16] docs(changelog): Invert Asset Installation --- CHANGELOG.md | 1 + src/server/mod.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c925429..a99a6f36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] * Add `check` flag to `setup` subcommand, move `generate-completions` subcommand to `setup` flag (https://github.com/zellij-org/zellij/pull/503) +* Change the asset installation from an opt-in to an opt-out (https://github.com/zellij-org/zellij/pull/512) ## [0.10.0] - 2021-05-14 * Change Switch default config loading order of `HOME` and system (https://github.com/zellij-org/zellij/pull/488) diff --git a/src/server/mod.rs b/src/server/mod.rs index 3bd38999..283fc035 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -187,7 +187,7 @@ fn init_session( // Determine and initialize the data directory let data_dir = opts.data_dir.unwrap_or_else(get_default_data_dir); - #[cfg(not(disable_automatic_assets_installation))] + #[cfg(not(disable_automatic_asset_installation))] populate_data_dir(&data_dir); // Don't use default layouts in tests, but do everywhere else From f37018e949b0f97c2ba3be5b55f12c6a703edddc Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Sat, 15 May 2021 13:27:40 +0200 Subject: [PATCH 04/16] chore(release): v0.11.0 --- assets/plugins/status-bar.wasm | Bin 461867 -> 462240 bytes assets/plugins/strider.wasm | Bin 564308 -> 564581 bytes assets/plugins/tab-bar.wasm | Bin 451557 -> 451906 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/plugins/status-bar.wasm b/assets/plugins/status-bar.wasm index 47c2b6f2ed1297259f00096dbff661223c1f0d4e..8ca71ac64b0661cd35e6f32a530fcbd87882190a 100644 GIT binary patch delta 69493 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�nLT)aiY~@Z7Ydkv9YLQJE3%v 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 Awg3PC diff --git a/assets/plugins/strider.wasm b/assets/plugins/strider.wasm index 80421c0d41da085c403f7c58dfe875538dbb158c..f687db8dadbc5f8e09a8913e2ef0a68b874bf1ff 100644 GIT binary patch delta 93881 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

sm*2}0|qtWUTiZ~jLR+hzR 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 delta 93153 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%0D{G?)#EedbYLhXtpdXQnHnrN2cttUhrdEoGqL^?~ zYZ!vAC??d@8b$AmVuDSr@dRt7s#~qZJ^qx>>~(*1)u|0~w>#z3#Q>}4Y2Br(d&Fsj z@qWQ+edS=+J?&%Z?@mAcV!ZD-y*f0&N~8~PQ{Qf=qB={&gRp^KTP69HZgWrm_5ody zMns8jsClGS4Fauo=YD(AeoH0JI2gmL&KPkJ>kUGkgucw-0VkPGP{?kV3JvPaC#-y6P1%*MT9s?ORo&l!8g+__iGyL-j-nzUy< z=j|19|6VcMCk>bGZm+XfO6l^q&b~-0OR>s`=q?Sn)0$?}%}^!I`ax}U^9D`d8TYCm zROjAfz)ojO_N3O(Z7#yz@05`4Ncf9i+>|KmNcflufqYe6IubtVRHD2i;jbHVC=$*W zspv@A#UjCcLf4Lj-Ast&6Dm6rX1rQlqN*d|S|&go8hEQa5@sVI$kyFE&N(mo1}kPD zb}l*h%yS*ci0S8kJLe-Ji}KZ^cprU~22e7Tj}8W-2>N|xFpi+#IAlo|Cl6DqG#|}6 zt5~PsI7@Mj{Z|8vt|W^vAq8xxrOe590JZqhS@-hu1|8$~pH+6{xTlN99g!7m#~&hA z97>i@$*>_C^UbqtxqJ5HD?+56a`)ZIRfp?0^0EyjLaSTpd3HA1Br}drL4|8_W-UTq zEN&8}Djz$ns!O4&F0878RUu<>Ri1nPkA_5j8qB&2el#7Z?|FWm&RffciEH!D=C+u>IGGxn3&x! zro2WRUy`XPrFI`w<(-lPQ-2V~L=nJTbivf&#_VF|6KENTd}Qjey*SBWL6VP~*PJ~4aC@r`l-&(eA)0J}l>#QUTf3&*S2xxU$GX*-oQ0jjZseb% z&5?v2Mmz$a4bq&2Hw*Si$=Fz{iW70acTvwY^ggbvuwv7z&~fh5BPw&SN)laEXEnO? ziXv=KiAD3?X{Hv|p_>k>iso!gFX{jdwI2XN?HwlIfkuR) zb_y>9P#Y_3w|#Ln*0{xB2F7XZ1-S4-S@4PLv>qU~du;1~oUO8xOOg?*@L!P1cwt38 z4w3}61@?h2e*enBf(3G5(?AMvg}MO>hImXW0*GLRqtVMjFOt;nwXFq4V5|vjJ+WZ2 z%(b>#%`m`Fk^!=)6NW)%42@$U6)S2L3uewF|DjbHa*A5TbiB`2XLdB2`;V<+PWq-+ zgJYl*bZQkk!9H7UZEc*qS5I^M?kZ-uLZckBxUsdsylXd-MzY%a>QhN1Z+)dXRwEf2 zMF#~Se?T>muLEkRF~~;8!@`1bo0!UpCY~^hud$gxK}HJOtjIH%xE_u z7e>aUIPT%Rohcj0h?78nvWa|;V7UWDC5)-rG{$xSRZcf$5l4Pw2TU#rSYlCD0W>f> zb8@i?km%mf9nTa}H4ue{fI5sDvxbPRqCV*sh`Y{B(WC~&{3#$VkGT8~!q>AAK z{<4wr7;oTqYE~*>6F?uv*JTBcAN(6%ml5ymKS{;6f!S&p^??2g+WzWokQev@+@@%M zg(&K;XKyUVIhkY7@vxN8Jd1%E4l7QIGy*d;B`BbV{{!}zpu7I()r~L%q7cRxqYDNL zYvQIZ4xFa3qi@Nn%57~8UOak=?#cc|`9R8Yb`0|_%$pFRZ(C;m z{?dOA9E&9iTwJhSx;thJkf2*P^Pm&RE&;McGK!_WmbLId6eK)lEhs)jr$nbn=x%#Q z!hjcc7tHK&;);)Hg9xj@v0B~4kk#Dcj)D!3)BUYGeJ0NHt zBK%r$D}o;)gbGBWV;D-^3D-DB`>5X0foi*e zY7l;BRBOx>4`nGyCgd)==Dt15WdXG*Z!W8j2OJ9nlx$8{xwEgmGWwZWQ$OOC&N|Nd zih%%Er!Ye$Gd9#Qu6xu~zehY)t?sm04Y`{bh-e#HjD`tOxB1C7#XNqyk{|PCgwhP z-Sge4R|DA*^{Hk^3sP^@Oz=ln=3ai|^*y-=c<6>fFkx-J;fHdFd-UwX!?Rz4O|;Uz zX7*S_ygYlxzN34(|Nccns@=$qub_@MZ=@OT?>F|6s^v8|mD+O1^8Pn(6BO<0_C~Ie z?ix!Z)a@xoFW6D1|Xow-EJF7;_k<#RNsLx}DK97g5_r z<7GmGW?^n?9c{3V#K1#a*(_Ijv+n$K9eVi z2Fw7;k0P8gz~8?>k2U{fFK4t^Qp3W3{MP{>5M=Flbm8Bu7t~V#dyW=&oO( z%*l7t7@)}v#(<6z?sa$n5R1vr?;b#t0G5z$W`QvY6t64YA1)Zkbgue;x!^!e5!52g z3nDi!sFhmxp9@-0*VKDP3?s?-8Q3Uai_8amSORE@sCM7JXTB_Quei7S!Hc`o1~v>{Kqi z5Wh1Qz5-{E(5!928Fc2a9zkUK*H_|q_OCCI^ev0%GCF+`T}DCy&0KFTx)YI?wjF=^ zx;uT>i7HCv_V z4Wzw973FZJK71(3J@oKEZG}Wefa~+Bl^*GS`tbEg{@Kzx{NB3Mk-qL@OYiQXi7%nv z@+G?smQ=fbjuy3WcQ08s0NL+a)=vhz&o3JWZvr;~>9*5@-OwWg_J}$BkpZv{{qT{) zL3Rrtx$M9qO9;!6cu8=08he#Cj$o2bS2J0^ET6D^slii?TlFYW`ox3T8faG-n=WR9 z2{so1t3aKAzrTF60eJ>L_G};Bm$3T4noL6Fz?M*v#8j)=I_9g&mFu<9YHo%5&sFd{ zxbMX(+-HA77t3eAsgr};vUE4M-{VIjeBR@2_{BB`H~YjOh}N=nPxr@9^g9synQX2- zl~J9Qg zZASDI6Vho|%OD%kr^P~I5ile0=T^I|Pgh1MU3B2Cr^lkX51u~sza2BwV8)D9o!EXq zO7Ctz5c7A#nr6({cdQu}-o0My0I#hXg^2QJev024o*7nZq6-x5ZeBASDS>A>#n(T3 zqCNX9x8>O*VFY{P*)jI^KhVRCz~HrQduV#L+M3t&Ivk_j-NxrK{kGE4Nnfb%`V6R@ zjIr~o4%fFJI=DV7-1*Nf+NlbB1r^3ZrE?jxpGuQ%j~9NqSH-(JSA0xv z=0;RO9|=XPsOyV@aG=shtL7BNA$VI+5FS;XWqwf{vfNt~g!@!yd88-~Syq{#JmRig zH*C^khD_H$9qQqtpw=jpx{9Y5Z4^k*ym}!Y#JUB_GboTcc|y;Xu6K zzTqA@!p(hoR2S`*#xfJDf3vk?`SP1z{f;2@lixSW0C(_fYxVnJcgdG!H82QpRj-={ zDi2QSR!Ejqy2mK7)-l4QkGv?#kCQR4Q&zY)3i^dpie^}}IP;xti0a<8zNso13fBSH56hQeo zHg$psbOM$c;P!pzhG8p!Pv3%LDF*t}V4~l+DTfxu)g}uq0Tu%8`|k`5Js^qngKo{A zzSkXZ;H|*LSPJ;2f#4u34H^zKreAlzes`!m;6DGS6aH@+;=W8aH16GeL%DY+cV$Dc zHuwz%60n|`1~drlL?)E95@-kX=&h*#B3?O@Eq?qA!T35wyev)j({+rUJkvnVR?M8WSK^yCH7D1B`&%KvjV(xBz>I)!anb2dLGo z=3zvv^U8YJmCGl+|6ai7l|#rY<3H@#!7J;m0@=pd~zn1#s5?Ss(`boW` zDHiF*Z%1_yOc6{^Z~}A_Y>uj<>mkQwUlqt ziGVl-Sht#->;L($v8(vXOE`yNekWD6r;Dqf!a*FU7s zMCy{TZDP$3R68Nq(#PwXv9h8w2a%GV==S^f6KCq3>@bT%YXib3K(a!6npg+9p;tS4 z@nen;g!BrDS}tuqTp@8?2w`njNOUGrLFcYXuAq>x*d4X|^zQ30xzQzHsowr(K8qAy zfruU3+!ed~hFdvEr?~I#z6(g*_ax%p{A!*1*_SCfZTXj9zGByLZyFIbmlFU3*wd^Q z>cFiZ%3OQKOWrh*I?$qbyWq&kEbq>sWIWH7;Y^U4F_3C0 ze2SG=luUU;j+tPfWJQQ#eInhubevEqdk$9V~A&|ukR zd>+CbS+G*Wd3jI<*sRBNCh*BW%2Odr%)P0ptya*%|)oe??ZhatEENe+`UG^|U2Ikb_R z>NIWqbfD6o#JM}X#IdQ)&ZH#5RBl%CxJ)TkLF( zrbHdBX5l;rL>!32bP1h8L!t3z%@idLp(t`2bC8EhLL@vrtNCXzK(KZ?MKm$mh=#&B z4K_^RF#e*Kvov2vveFNefIgQ%J0~NrEvO$){kExEps3SD4&>qk@ISU9aZ54%~yzNf!$iLXNxnQ6X zea<ZskQasmU)oLJPtP4^Ueh^fh!A#7i!Wfq*Q%ao>mwF+neVCcU)cE}O(xP`$ z1~V{fh&rqiODMm-Tu2Y5O>4fcb8>K>0mTtm+0QNx&nyH~GQG%) z$D~_7Q+){4>CM5Gn%73j5p;lA&XQz0ObyHk~GSf@}Izvr4}qk zYZS%#X-2SY#h!aE6d-Pmgj|wMfOVY2%nW!5_DrIv1h5+er{yF@c$ddIqmlA4^aEVNz^s3?`Fz1TUkN5X=RW~rAT?O=gD!EV%v>=2?g?IIQ1 zzy*(}-V1u7$&-c`jub$S=W2v1A2YszRPGBDZysVgNO|r_acMiZR8YSxH=P2h0H*vk^f^81*(>KYT=CG(sB@e_AXm&H$nXuDotNW04$=hHu11vxXKx*CI z*}T7&;=ty2yk%+Wj>ju$IaI#0GFFD8M|jTaA~U6Y);e$#*jLr#PX`*ko)z-gz7ke$ zMS`4WasdSB=zft-<&hF8N`W9L%9bk*Y51p_G;_s3Z?* z=VreE{Hl*yz+xE6G*Ce#8H}aJCZ=^z1GZA(*eLlCM0buiv|60OW`$Ah*yb>Wt=e8D zy>jml7mwI;J&L5t{cgvetW}Rwl_hZ$zC8s9F0*5G>kP zUw{3zbukzc?Loy?YrQM#q)|3_Pt?hvzBAt|^l}+AwvJFw)&7=AS`iL=I}VX<-hgfr zx37A|8{SRE$QEx}HyK_3+AHlAJVu(1K-nSeNib17yveo$7iTPW&F{UByU74~!t2^y zM&faNcd3x|-nrdntUd2_@1gE;bp5>7_o~W7b*k!xH%wI@d!u`xs*kg$$wWuGc3p~EICo(XTSfUH_tm~5?X@q%YBR(>#nPcUe`H8b@gB>_2-)a; znvui2g;}ZgR91c{z+GH|Ch!ye-5>`U0}N104?IyMR$a6V+~+ zxTTDXn7CFkaqAgZ;>X!0ZsuPQSBE%QG>Ul)eA&UKMJZkO;O*@pY*==yyrq4mMpmqR z5eG4RDZ({Jpis%mF7?t|jx7iaDWo8qW~hW(0HZlvOmK8khB2&da2*_O^a>xY8t>=* z<;?KL?HJh_?=Ssjwyf}`43I&1EEpi8%eUwhLIL=9nryoU$iVO~KSiGto-^OBl7(K= z0WwiOSb56SQ-lc=&#Hzf$<3I*e$yU2f;yZ)n82OWjBRvDafF}-?@0DR2 z2c{gTa2uY)d}OCD_SOsrK6ZO=4VJp_iW!L9?Cl;bW9$u2t~`2()QVi}oz)=6_io+M zj@eO5mJDC?Y-uJ$iY+va%3f=bEhw;RsGO82D&SQPlauWEJG{xmG$^+XlZ$%ohL#3? z!TfO$=D9M98%{xCm@cZ72IP(%UcUq7q^@rh3&HeQy0_GO4205SSKf4>ER~p+X`%EF zQr@d8q{=(%V7WTH6p*HmU-|LDIQt)7U;3w>HoLag9Yykr+ zq#v1Ng?G}C7=$xd_8KKWmG9+eLiH$sQ9b?Vq*csDl5*sk+Hb`+N&Yj^`8WCQA#JG{?-Cf&WrQBvP!3o(F2Jkm8;&;Ey} zj*^PdIf+k$#!~P7_$aB8nclTW$s*EM!_o2xg6|(K(`4q#vq#G?0aMQ%BZrl5`3L6i zfdKw#*fh8jP+Pn|kCB&pGC|>g>RAi_Nv;5XZ52{07^v}H9xF#yy*}wMqj=(%XT1G$ z-rmh;+U2;A#YCCN{O|Nate;sIGqGIw@UZxve|kZr*VVjx!oC zy}+)6a{6xE>>khMfZK*Av*9LaCFVa1XJo8erw|jFkuA{+3Y?*h&P2Ri)AW_eS~>&4 zgJvyKUzc8-wd%4d?D@yi8XKz2f4jc6W@O8br(zv|ASyY&&M7NOI{|lMcqQW`J`n}4 zaZ>rD=m}Y=%cPp@CX8=gCZm4$Q?>r5cy+MPI^sl+*VDRM9-WNC>XOMICXuN^vxm%T zY6S#g_w2)agzw&(O1ZqJDVs^W&wP8}^G zO%WVws-=g6iy+DQwJZjOc81!)rgYT8Ek|}^$DfnpK*7?QY036~+qQl|o{ zp82t9bLa7-J@y)zjPojKQIzEt+gnGjaJoqT_y_!%ixn1GtK- z1-Nd-uTgEVE>O9pi$cxn<@AN9|5Xc{sUabP*e$GDZ-6X;u9xkid9HK@8cR84*JLYk zEG;{9dbXO+L!2&rba94GZ*jUfmHE7t)3Y^9IJ70x&8hZd0cGWM#I`s!eoRY~?tioe zv6*2_SQ4W7S!{WTSYV^cYShI`vej%T#mCiQhn|86KwxWR9OVmSxP^DHC3gzPRQt>$#$gwJOntrP%^|2sg)x1^ zRO^yI2mSoWp@XIfZuwETxNwDBR(3LmzQ*Y`4YVySnMxAd$)H|{kQyg^`V<%<`#2cm16ojIM6LxnK_>%SrUCjA z=a3fX&=zzBgfZ0VJq`TOXPPr$nsdN3WXV*cvMx?<=RhVLJk1$C%{hpr%UW1LliiZ( z(uA8K(5EosP=C$INbT0*;81GI8T4qO-+GUG0;DSN5ahHC(&^HYbpR$HN0~FQ{hS5R z9IBoMbVlK#D07_CQ+f-!1BD$1Gt5R|wv;JDdKcg#&E2PExW59qA(oqI-YY>cTSBTO zR&j3x7?J}6?qEtZhbA0Mx~$ry_*jMSLt_ylzzLh4mrQdiPtL|5T@XcVq7*N9(WB?r zi0UeVO2?^my749rAJxu?7KElbWz!9jluXO?2Bx|MaGr%FFs?uqPz&AzzVfKj`=GG| zC#p2;T^y$++XrB95+bG|C{#HO-46pzl};axBDl=_P6oh@8BTlgi$J3^#KPgYt=&>J zYB3(^K{-T};cqoVTskHZ*h-F|^2)%je4r%54OC9`8BR?5CLsq~h*}UA&;husr=2k+ zg;~6;sRCDsoJtyKI(@nmZ8;Sl4o>gk446OaRG#5jx&~0@7h60tW0{UgN z$vzo5do=~8p|D;{S-@~et%~K9aj52zB~1<2G&Nl7^z@t)A*3+5Q}h1{#5i zdLHq>hTJ1<;u7uzswtWXQWSWYi#hrs1?NFbE7>q(! zJvk5?5!HWU%0`Md>|_6mMiHXzsacrbdb55Ea?W53G9wiLVA^a?`H}+vkgR=-gsBE# z>o@?)28fZ=B6`L^HbhFA^AfR%%@k1Xi3*Gxh`S!dnvD?>0VFXar(*_^n1%%HuP6Ed zi=p_8^*_TB>jaB&3KABm%HWv}X%gOTV226TBG z2qYMZ;UHnWsCH0~W^HgDmTptB<%Zrf^~eR1YNzmLCee&Xa?&)tHLT0!a}PppU>*8x zNHNLooO=$;S7;@ld$7q(RbMeFfZU**9Epeghg)Fqm=n$7)(0mGvW1bKs#u;WGb8cp z;|8jg6AI){ro|CH ztbi?e>>bElvXv%(R35~F*kAn-V0yy@yc`4027{j>#R32p22`S#4mM>#DOOnEY+SU4 zpVI#%1IqH0t)g)AMacB{zdwrh*9ZfFmF}mXc{ayDb?PSgzk|)cp`REfzmL2*5f>q9 z9xv+Zp#Rv_efBg5EcsJcCvk_PTRs!RPd1gD?8q%EZC|J{h!4DDu9Zfjh`41h%G&2$R zo+LA+TI%n=vtZ=^rnCF#Yp!TiaW;vgirdf%1YC~JcACM82slCl)~0n#isLXg$^S&Z zy04g|*jGrUV8U)Rj?7Y32E!6q4=N}A4??G>M82x zlR!{Skwf)<*e`j6vGY%~BZne!8elLZcab;NQcKZG}9qz5*+6@CA8DwF*s(=3i zC=xrUkk*Vz3RnK}jpSJhb<=Lf`C*iU-rIov#!zf^%j2M!bCI#|Lx05)QbR{trB11) za%|RVa7winoGVqO=Q^ zSf=?Qott-Z|E;1Iq*haC-j^R>(4bbXD%d^<(y1`*R~Q|y!f&6tm1#fzzqVh&_Msk` z?pLt;xK}FVR8XseSSVIopr9sr&aAM5fosl+BDV-Hpo-~m&d>*}N4SQKzc_qIddvn$ zXAKjmxT0HKeKR9SPcL@3hh%jOyKcZ=z9Bh@OnSM5D@UnEuFtOzpdsP)(@)y==6O7brjlyj5cjVLcbL5sDnQVk9?*ZZ85!@GO0>xuH35*MUz1DH_FS5dwMZLo z!+czacW83y8KN=sZk)SzEZ|kG0t70fHshgEDIKLsM8l!tyLGYHU_?Ligv%#=*d276n!@0c;BQ0;E<9W#ZPiSW#H$=l`OnZfmD z#h#gHv1bNe8`=PIE8{*rGhOJJ@xDGrY9=BlOy&7}#uWqed6U4Xm?`VziiyFaLuR$K zD<;+?Fng826$6V|-W3ytE2bB&x&JRbG4cGI1VPT7QSi`oxKpCq%MnM#^m6n-tHw=( z{fn6%ScaiZ2rPJIQV=8HA#4OsHIu;^pCci12RZbYc0PTQ#;b#s{G4Rrx-OmS`+0N$ zU1Kos=SiZqJ^VZbY#(kOI(YgsH~A9#o1roEpgF;|hV}M(Cx8DL859FCrxv z4@!VO8f;{yk0wkXOrB1B9}TXaWqOo88n8)6daLiF;o@FrfRAR63}_*T63`k;+$YlWn|k0wy;Q7Jf7EbUO?p1vK1> zYrhB9=-5lc0NpQnhXQ;oQFN`?Cy|=2oiVV~!W38Hq+nSl?-&OJof1rFDL7?NzKd~= z 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 diff --git a/assets/plugins/tab-bar.wasm b/assets/plugins/tab-bar.wasm index 3487df715dee0502c9c1dfde9640876c5d426929..bb981a5b910955201ba8cb559240e858b1c848f1 100644 GIT binary patch delta 64701 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

GvriYUqE@v!Nd`=_X!%l?Gi4c)W0zWX$fyMPO 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 delta 64079 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
wLP>GqKmETSjw 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 X{=nRav;1 Date: Sat, 15 May 2021 13:50:35 +0200 Subject: [PATCH 05/16] chore(version): bump development version --- CHANGELOG.md | 5 +++++ Cargo.lock | 6 +++--- Cargo.toml | 4 ++-- zellij-tile-utils/Cargo.toml | 2 +- zellij-tile/Cargo.toml | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a99a6f36..136e0642 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] + +## [0.11.0] - 2021-05-15 + +This version is mostly an installation hotfix. + * Add `check` flag to `setup` subcommand, move `generate-completions` subcommand to `setup` flag (https://github.com/zellij-org/zellij/pull/503) * Change the asset installation from an opt-in to an opt-out (https://github.com/zellij-org/zellij/pull/512) diff --git a/Cargo.lock b/Cargo.lock index 39c1dad2..2aeaa926 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2254,7 +2254,7 @@ dependencies = [ [[package]] name = "zellij" -version = "0.11.0" +version = "0.12.0" dependencies = [ "ansi_term 0.12.1", "async-std", @@ -2290,7 +2290,7 @@ dependencies = [ [[package]] name = "zellij-tile" -version = "0.11.0" +version = "0.12.0" dependencies = [ "serde", "serde_json", @@ -2300,7 +2300,7 @@ dependencies = [ [[package]] name = "zellij-tile-utils" -version = "0.11.0" +version = "0.12.0" dependencies = [ "ansi_term 0.12.1", ] diff --git a/Cargo.toml b/Cargo.toml index 1acd2c11..978c0653 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij" -version = "0.11.0" +version = "0.12.0" authors = ["Aram Drevekenin "] edition = "2018" description = "A terminal workspace with batteries included" @@ -38,7 +38,7 @@ wasmer-wasi = "1.0.0" interprocess = "1.1.1" names = "0.11.0" colors-transform = "0.2.5" -zellij-tile = { path = "zellij-tile/", version = "0.11.0" } +zellij-tile = { path = "zellij-tile/", version = "0.12.0" } [dependencies.async-std] version = "1.3.0" diff --git a/zellij-tile-utils/Cargo.toml b/zellij-tile-utils/Cargo.toml index cee6df30..a69f53be 100644 --- a/zellij-tile-utils/Cargo.toml +++ b/zellij-tile-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij-tile-utils" -version = "0.11.0" +version = "0.12.0" authors = ["denis "] edition = "2018" description = "A utility library for Zellij plugins" diff --git a/zellij-tile/Cargo.toml b/zellij-tile/Cargo.toml index 60d30021..4728ec1e 100644 --- a/zellij-tile/Cargo.toml +++ b/zellij-tile/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zellij-tile" -version = "0.11.0" +version = "0.12.0" authors = ["Brooks J Rady "] edition = "2018" description = "A small client-side library for writing Zellij plugins" From fd421192193a3f8a0f004ec2bf7457fee370fd3d Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 15 May 2021 14:31:54 +0200 Subject: [PATCH 06/16] Remove unused import Signed-off-by: Matthias Beyer --- src/server/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 283fc035..149e2dbd 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -19,7 +19,7 @@ use crate::common::{ screen::{screen_thread_main, ScreenInstruction}, setup::{get_default_data_dir, install::populate_data_dir}, thread_bus::{ChannelWithContext, SenderType, SenderWithContext}, - utils::consts::{ZELLIJ_IPC_PIPE, ZELLIJ_PROJ_DIR}, + utils::consts::ZELLIJ_IPC_PIPE, wasm_vm::{wasm_thread_main, PluginInstruction}, }; use crate::layout::Layout; From 20d4b1826d89d8f547d57e19d6409a7fb114e05a Mon Sep 17 00:00:00 2001 From: a-kenji Date: Sat, 15 May 2021 17:39:29 +0200 Subject: [PATCH 07/16] docs(changelog): Remove unused import --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 136e0642..359e0f07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] +* Remove unused imports (https://github.com/zellij-org/zellij/pull/504) ## [0.11.0] - 2021-05-15 From 0d792e26f23ad8e1fc2dd44555cae79427361c15 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 11 May 2021 11:47:08 +0530 Subject: [PATCH 08/16] Switch to multiprocess model: Not looking good --- Cargo.lock | 17 +++++++ Cargo.toml | 1 + src/cli.rs | 3 ++ src/client/mod.rs | 34 +++++++++---- src/common/os_input_output.rs | 26 +++++----- src/main.rs | 22 ++++---- src/server/mod.rs | 95 ++++++++++++++++------------------- src/tests/fakes.rs | 2 +- 8 files changed, 114 insertions(+), 86 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2aeaa926..92b2d0ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -248,6 +248,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "boxfnonce" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5988cb1d626264ac94100be357308f29ff7cbdd3b36bda27f450a4ee3f713426" + [[package]] name = "bumpalo" version = "3.6.1" @@ -467,6 +473,16 @@ dependencies = [ "syn", ] +[[package]] +name = "daemonize" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70c24513e34f53b640819f0ac9f705b673fcf4006d7aab8778bee72ebfc89815" +dependencies = [ + "boxfnonce", + "libc", +] + [[package]] name = "darling" version = "0.12.3" @@ -2261,6 +2277,7 @@ dependencies = [ "backtrace", "bincode", "colors-transform", + "daemonize", "directories-next", "futures", "insta", diff --git a/Cargo.toml b/Cargo.toml index 978c0653..099d17f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ include = ["src/**/*", "assets/plugins/*", "assets/layouts/*", "assets/config/*" ansi_term = "0.12.1" backtrace = "0.3.55" bincode = "1.3.1" +daemonize = "0.4.1" directories-next = "2.0" futures = "0.3.5" libc = "0.2" diff --git a/src/cli.rs b/src/cli.rs index 69496808..72666dd6 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -16,6 +16,9 @@ pub struct CliArgs { #[structopt(long)] pub data_dir: Option, + #[structopt(long)] + pub server: Option, + /// Path to a layout yaml file #[structopt(short, long)] pub layout: Option, diff --git a/src/client/mod.rs b/src/client/mod.rs index 6f298615..d24b66d3 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -5,7 +5,10 @@ pub mod panes; pub mod tab; use serde::{Deserialize, Serialize}; -use std::io::Write; +use std::env::current_exe; +use std::io::{self, Write}; +use std::path::Path; +use std::process::Command; use std::sync::mpsc; use std::thread; @@ -18,6 +21,7 @@ use crate::common::{ input::options::Options, os_input_output::ClientOsApi, thread_bus::{SenderType, SenderWithContext, SyncChannelWithContext}, + utils::consts::ZELLIJ_IPC_PIPE, }; use crate::server::ServerInstruction; @@ -30,8 +34,25 @@ pub enum ClientInstruction { Exit, } +fn spawn_server(socket_path: &Path) -> io::Result<()> { + let status = Command::new(current_exe()?) + .arg("--server") + .arg(socket_path) + .status()?; + if status.success() { + Ok(()) + } else { + let msg = "Process returned non-zero exit code"; + let err_msg = match status.code() { + Some(c) => format!("{}: {}", msg, c), + None => msg.to_string(), + }; + Err(io::Error::new(io::ErrorKind::Other, err_msg)) + } +} + pub fn start_client(mut os_input: Box, opts: CliArgs, config: Config) { - let clear_client_terminal_attributes = "\u{1b}[?1l\u{1b}=\u{1b}[r\u{1b}12l\u{1b}[?1000l\u{1b}[?1002l\u{1b}[?1003l\u{1b}[?1005l\u{1b}[?1006l\u{1b}[?12l"; + spawn_server(&*ZELLIJ_IPC_PIPE).unwrap(); let take_snapshot = "\u{1b}[?1049h"; let bracketed_paste = "\u{1b}[?2004h"; os_input.unset_raw_mode(0); @@ -50,12 +71,8 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C let config_options = Options::from_cli(&config.options, opts.option.clone()); let full_screen_ws = os_input.get_terminal_size_using_fd(0); - os_input.connect_to_server(); - os_input.send_to_server(ServerInstruction::NewClient( - full_screen_ws, - opts, - config_options, - )); + os_input.connect_to_server(&*ZELLIJ_IPC_PIPE); + os_input.send_to_server(ServerInstruction::NewClient(full_screen_ws, opts)); os_input.set_raw_mode(0); let _ = os_input .get_stdout_writer() @@ -130,7 +147,6 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C }) .unwrap(); - #[warn(clippy::never_loop)] loop { let (client_instruction, mut err_ctx) = receive_client_instructions .recv() diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 6f891e0d..2a9a14e0 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -1,8 +1,5 @@ use crate::client::ClientInstruction; -use crate::common::{ - ipc::{IpcReceiverWithContext, IpcSenderWithContext}, - utils::consts::ZELLIJ_IPC_PIPE, -}; +use crate::common::ipc::{IpcReceiverWithContext, IpcSenderWithContext}; use crate::errors::ErrorContext; use crate::panes::PositionAndSize; use crate::server::ServerInstruction; @@ -319,7 +316,7 @@ pub trait ClientOsApi: Send + Sync { fn recv_from_server(&self) -> (ClientInstruction, ErrorContext); fn receive_sigwinch(&self, cb: Box); /// Establish a connection with the server socket. - fn connect_to_server(&self); + fn connect_to_server(&self, path: &Path); } impl ClientOsApi for ClientOsInputOutput { @@ -379,14 +376,19 @@ impl ClientOsApi for ClientOsInputOutput { } } } - fn connect_to_server(&self) { - let socket = match LocalSocketStream::connect(&**ZELLIJ_IPC_PIPE) { - Ok(sock) => sock, - Err(_) => { - std::thread::sleep(std::time::Duration::from_millis(20)); - LocalSocketStream::connect(&**ZELLIJ_IPC_PIPE).unwrap() + fn connect_to_server(&self, path: &Path) { + let socket; + loop { + match LocalSocketStream::connect(path) { + Ok(sock) => { + socket = sock; + break; + } + Err(_) => { + std::thread::sleep(std::time::Duration::from_millis(50)); + } } - }; + } let sender = IpcSenderWithContext::new(socket); let receiver = sender.get_receiver(); *self.send_instructions_to_server.lock().unwrap() = Some(sender); diff --git a/src/main.rs b/src/main.rs index c1f0f387..d08deb4a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,7 @@ use crate::command_is_executing::CommandIsExecuting; use crate::common::input::{config::Config, options::Options}; use crate::os_input_output::{get_client_os_input, get_server_os_input, ClientOsApi, ServerOsApi}; use crate::utils::{ - consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, + consts::{ZELLIJ_IPC_PIPE, ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, logging::*, }; use std::convert::TryFrom; @@ -39,15 +39,13 @@ pub fn main() { let config_options = Options::from_cli(&config.options, opts.option.clone()); atomic_create_dir(&*ZELLIJ_TMP_DIR).unwrap(); atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap(); - let server_os_input = get_server_os_input(); - let os_input = get_client_os_input(); - start( - Box::new(os_input), - opts, - Box::new(server_os_input), - config, - config_options, - ); + if let Some(path) = opts.server { + let os_input = get_server_os_input(); + start_server(Box::new(os_input), path); + } else { + let os_input = get_client_os_input(); + start_client(Box::new(os_input), opts, config); + } } } pub fn start( @@ -57,7 +55,7 @@ pub fn start( config: Config, config_options: Options, ) { - let ipc_thread = start_server(server_os_input, config_options); + start_server(server_os_input, ZELLIJ_IPC_PIPE.clone()); start_client(client_os_input, opts, config); - drop(ipc_thread.join()); + //drop(ipc_thread.join()); } diff --git a/src/server/mod.rs b/src/server/mod.rs index 149e2dbd..f85a4c7f 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,5 +1,6 @@ pub mod route; +use daemonize::Daemonize; use interprocess::local_socket::LocalSocketListener; use serde::{Deserialize, Serialize}; use std::sync::{Arc, RwLock}; @@ -19,7 +20,7 @@ use crate::common::{ screen::{screen_thread_main, ScreenInstruction}, setup::{get_default_data_dir, install::populate_data_dir}, thread_bus::{ChannelWithContext, SenderType, SenderWithContext}, - utils::consts::ZELLIJ_IPC_PIPE, + utils::consts::ZELLIJ_PROJ_DIR, wasm_vm::{wasm_thread_main, PluginInstruction}, }; use crate::layout::Layout; @@ -56,10 +57,12 @@ impl Drop for SessionMetaData { } } -pub fn start_server( - os_input: Box, - config_options: Options, -) -> thread::JoinHandle<()> { +pub fn start_server(os_input: Box, socket_path: PathBuf) { + Daemonize::new() + .working_directory(std::env::var("HOME").unwrap()) + .umask(0o077) + .start() + .expect("could not daemonize the server process"); let (to_server, server_receiver): ChannelWithContext = channel(); let to_server = SenderWithContext::new(SenderType::Sender(to_server)); let sessions: Arc>> = Arc::new(RwLock::new(None)); @@ -85,13 +88,11 @@ pub fn start_server( let os_input = os_input.clone(); let sessions = sessions.clone(); let to_server = to_server.clone(); - let capabilities = PluginCapabilities { - arrow_fonts: config_options.simplified_ui, - }; + let socket_path = socket_path.clone(); move || { - drop(std::fs::remove_file(&*ZELLIJ_IPC_PIPE)); - let listener = LocalSocketListener::bind(&**ZELLIJ_IPC_PIPE).unwrap(); - set_permissions(&*ZELLIJ_IPC_PIPE).unwrap(); + drop(std::fs::remove_file(&socket_path)); + let listener = LocalSocketListener::bind(&*socket_path).unwrap(); + set_permissions(&socket_path).unwrap(); for stream in listener.incoming() { match stream { Ok(stream) => { @@ -125,48 +126,38 @@ pub fn start_server( } }); - thread::Builder::new() - .name("server_thread".to_string()) - .spawn({ - move || loop { - let (instruction, mut err_ctx) = server_receiver.recv().unwrap(); - err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); - match instruction { - ServerInstruction::NewClient(full_screen_ws, opts, config_options) => { - let session_data = init_session( - os_input.clone(), - opts, - config_options, - to_server.clone(), - full_screen_ws, - ); - *sessions.write().unwrap() = Some(session_data); - sessions - .read() - .unwrap() - .as_ref() - .unwrap() - .senders - .send_to_pty(PtyInstruction::NewTab) - .unwrap(); - } - ServerInstruction::UnblockInputThread => { - os_input.send_to_client(ClientInstruction::UnblockInputThread); - } - ServerInstruction::ClientExit => { - *sessions.write().unwrap() = None; - os_input.send_to_client(ClientInstruction::Exit); - drop(std::fs::remove_file(&*ZELLIJ_IPC_PIPE)); - break; - } - ServerInstruction::Render(output) => { - os_input.send_to_client(ClientInstruction::Render(output)) - } - _ => panic!("Received unexpected instruction."), - } + loop { + let (instruction, mut err_ctx) = server_receiver.recv().unwrap(); + err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); + match instruction { + ServerInstruction::NewClient(full_screen_ws, opts) => { + let session_data = + init_session(os_input.clone(), opts, to_server.clone(), full_screen_ws); + *sessions.write().unwrap() = Some(session_data); + sessions + .read() + .unwrap() + .as_ref() + .unwrap() + .senders + .send_to_pty(PtyInstruction::NewTab) + .unwrap(); } - }) - .unwrap() + ServerInstruction::UnblockInputThread => { + os_input.send_to_client(ClientInstruction::UnblockInputThread); + } + ServerInstruction::ClientExit => { + *sessions.write().unwrap() = None; + os_input.send_to_client(ClientInstruction::Exit); + drop(std::fs::remove_file(&socket_path)); + break; + } + ServerInstruction::Render(output) => { + os_input.send_to_client(ClientInstruction::Render(output)) + } + _ => panic!("Received unexpected instruction."), + } + } } fn init_session( diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index eb0d14e8..1697e65f 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -217,7 +217,7 @@ impl ClientOsApi for FakeInputOutput { cb(); } } - fn connect_to_server(&self) {} + fn connect_to_server(&self, path: &std::path::Path) {} } impl ServerOsApi for FakeInputOutput { From f2c43ac577d9d2a93695564cb3185264e3492a68 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 12 May 2021 18:46:21 +0530 Subject: [PATCH 09/16] Fix memory overflow error and add panic hook for server --- src/cli.rs | 11 ++++--- src/client/mod.rs | 62 ++++++++++++++++++++--------------- src/common/errors.rs | 31 +++++++++++++++--- src/common/os_input_output.rs | 4 +-- src/server/mod.rs | 34 ++++++++++++++----- src/tests/fakes.rs | 4 +-- 6 files changed, 96 insertions(+), 50 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 72666dd6..9ea84374 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -13,22 +13,23 @@ pub struct CliArgs { pub max_panes: Option, /// Change where zellij looks for layouts and plugins - #[structopt(long)] + #[structopt(long, parse(from_os_str))] pub data_dir: Option, - #[structopt(long)] + /// Run server listening at the specified socket path + #[structopt(long, parse(from_os_str))] pub server: Option, /// Path to a layout yaml file - #[structopt(short, long)] + #[structopt(short, long, parse(from_os_str))] pub layout: Option, /// Change where zellij looks for the configuration - #[structopt(short, long, env=ZELLIJ_CONFIG_FILE_ENV)] + #[structopt(short, long, env=ZELLIJ_CONFIG_FILE_ENV, parse(from_os_str))] pub config: Option, /// Change where zellij looks for the configuration - #[structopt(long, env=ZELLIJ_CONFIG_DIR_ENV)] + #[structopt(long, env=ZELLIJ_CONFIG_DIR_ENV, parse(from_os_str))] pub config_dir: Option, #[structopt(subcommand)] diff --git a/src/client/mod.rs b/src/client/mod.rs index d24b66d3..594960eb 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -32,6 +32,7 @@ pub enum ClientInstruction { Render(Option), UnblockInputThread, Exit, + ServerError(String), } fn spawn_server(socket_path: &Path) -> io::Result<()> { @@ -52,7 +53,6 @@ fn spawn_server(socket_path: &Path) -> io::Result<()> { } pub fn start_client(mut os_input: Box, opts: CliArgs, config: Config) { - spawn_server(&*ZELLIJ_IPC_PIPE).unwrap(); let take_snapshot = "\u{1b}[?1049h"; let bracketed_paste = "\u{1b}[?2004h"; os_input.unset_raw_mode(0); @@ -60,12 +60,11 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C .get_stdout_writer() .write(take_snapshot.as_bytes()) .unwrap(); - let _ = os_input - .get_stdout_writer() - .write(clear_client_terminal_attributes.as_bytes()) - .unwrap(); + std::env::set_var(&"ZELLIJ", "0"); + spawn_server(&*ZELLIJ_IPC_PIPE).unwrap(); + let mut command_is_executing = CommandIsExecuting::new(); let config_options = Options::from_cli(&config.options, opts.option.clone()); @@ -131,22 +130,39 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C .name("router".to_string()) .spawn({ let os_input = os_input.clone(); - move || { - loop { - let (instruction, mut err_ctx) = os_input.recv_from_server(); - err_ctx.add_call(ContextType::Client(ClientContext::from(&instruction))); - if let ClientInstruction::Exit = instruction { - break; + let mut should_break = false; + move || loop { + let (instruction, mut err_ctx) = os_input.recv_from_server(); + err_ctx.add_call(ContextType::Client(ClientContext::from(&instruction))); + match instruction { + ClientInstruction::Exit | ClientInstruction::ServerError(_) => { + should_break = true; } - send_client_instructions.send(instruction).unwrap(); + _ => {} + } + send_client_instructions.send(instruction).unwrap(); + if should_break { + break; } - send_client_instructions - .send(ClientInstruction::Exit) - .unwrap(); } }) .unwrap(); + let handle_error = |backtrace: String| { + os_input.unset_raw_mode(0); + let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); + let restore_snapshot = "\u{1b}[?1049l"; + let error = format!( + "{}\n{}{}", + goto_start_of_last_line, restore_snapshot, backtrace + ); + let _ = os_input + .get_stdout_writer() + .write(error.as_bytes()) + .unwrap(); + std::process::exit(1); + }; + loop { let (client_instruction, mut err_ctx) = receive_client_instructions .recv() @@ -159,18 +175,10 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C ClientInstruction::Exit => break, ClientInstruction::Error(backtrace) => { let _ = os_input.send_to_server(ServerInstruction::ClientExit); - os_input.unset_raw_mode(0); - let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); - let restore_snapshot = "\u{1b}[?1049l"; - let error = format!( - "{}\n{}{}", - goto_start_of_last_line, restore_snapshot, backtrace - ); - let _ = os_input - .get_stdout_writer() - .write(error.as_bytes()) - .unwrap(); - std::process::exit(1); + handle_error(backtrace); + } + ClientInstruction::ServerError(backtrace) => { + handle_error(backtrace); } ClientInstruction::Render(output) => { if output.is_none() { diff --git a/src/common/errors.rs b/src/common/errors.rs index c2caf19d..c92b9b7f 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -19,12 +19,29 @@ const MAX_THREAD_CALL_STACK: usize = 6; use super::thread_bus::SenderWithContext; #[cfg(not(test))] use std::panic::PanicInfo; + +pub trait ErrorInstruction { + fn error(err: String) -> Self; +} + +impl ErrorInstruction for ClientInstruction { + fn error(err: String) -> Self { + ClientInstruction::Error(err) + } +} + +impl ErrorInstruction for ServerInstruction { + fn error(err: String) -> Self { + ServerInstruction::Error(err) + } +} + /// Custom panic handler/hook. Prints the [`ErrorContext`]. #[cfg(not(test))] -pub fn handle_panic( - info: &PanicInfo<'_>, - send_app_instructions: &SenderWithContext, -) { +pub fn handle_panic(info: &PanicInfo<'_>, sender: &SenderWithContext) +where + T: ErrorInstruction + Clone, +{ use backtrace::Backtrace; use std::{process, thread}; let backtrace = Backtrace::new(); @@ -70,7 +87,7 @@ pub fn handle_panic( println!("{}", backtrace); process::exit(1); } else { - let _ = send_app_instructions.send(ClientInstruction::Error(backtrace)); + let _ = sender.send(T::error(backtrace)); } } @@ -333,6 +350,7 @@ pub enum ClientContext { Error, UnblockInputThread, Render, + ServerError, } impl From<&ClientInstruction> for ClientContext { @@ -340,6 +358,7 @@ impl From<&ClientInstruction> for ClientContext { match *client_instruction { ClientInstruction::Exit => ClientContext::Exit, ClientInstruction::Error(_) => ClientContext::Error, + ClientInstruction::ServerError(_) => ClientContext::ServerError, ClientInstruction::Render(_) => ClientContext::Render, ClientInstruction::UnblockInputThread => ClientContext::UnblockInputThread, } @@ -355,6 +374,7 @@ pub enum ServerContext { TerminalResize, UnblockInputThread, ClientExit, + Error, } impl From<&ServerInstruction> for ServerContext { @@ -366,6 +386,7 @@ impl From<&ServerInstruction> for ServerContext { ServerInstruction::Render(_) => ServerContext::Render, ServerInstruction::UnblockInputThread => ServerContext::UnblockInputThread, ServerInstruction::ClientExit => ServerContext::ClientExit, + ServerInstruction::Error(_) => ServerContext::Error, } } } diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 2a9a14e0..a8d67478 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -302,7 +302,7 @@ pub trait ClientOsApi: Send + Sync { fn set_raw_mode(&mut self, fd: RawFd); /// Set the terminal associated to file descriptor `fd` to /// [cooked mode](https://en.wikipedia.org/wiki/Terminal_mode). - fn unset_raw_mode(&mut self, fd: RawFd); + fn unset_raw_mode(&self, fd: RawFd); /// Returns the writer that allows writing to standard output. fn get_stdout_writer(&self) -> Box; /// Returns the raw contents of standard input. @@ -326,7 +326,7 @@ impl ClientOsApi for ClientOsInputOutput { fn set_raw_mode(&mut self, fd: RawFd) { into_raw_mode(fd); } - fn unset_raw_mode(&mut self, fd: RawFd) { + fn unset_raw_mode(&self, fd: RawFd) { let orig_termios = self.orig_termios.lock().unwrap(); unset_raw_mode(fd, orig_termios.clone()); } diff --git a/src/server/mod.rs b/src/server/mod.rs index f85a4c7f..884dbee1 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -5,7 +5,7 @@ use interprocess::local_socket::LocalSocketListener; use serde::{Deserialize, Serialize}; use std::sync::{Arc, RwLock}; use std::thread; -use std::{path::PathBuf, sync::mpsc::channel}; +use std::{path::PathBuf, sync::mpsc}; use wasmer::Store; use zellij_tile::data::PluginCapabilities; @@ -18,8 +18,8 @@ use crate::common::{ os_input_output::{set_permissions, ServerOsApi}, pty::{pty_thread_main, Pty, PtyInstruction}, screen::{screen_thread_main, ScreenInstruction}, - setup::{get_default_data_dir, install::populate_data_dir}, - thread_bus::{ChannelWithContext, SenderType, SenderWithContext}, + setup::install::populate_data_dir, + thread_bus::{ChannelWithContext, SenderType, SenderWithContext, SyncChannelWithContext}, utils::consts::ZELLIJ_PROJ_DIR, wasm_vm::{wasm_thread_main, PluginInstruction}, }; @@ -37,6 +37,7 @@ pub enum ServerInstruction { Render(Option), UnblockInputThread, ClientExit, + Error(String), } pub struct SessionMetaData { @@ -63,10 +64,21 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { .umask(0o077) .start() .expect("could not daemonize the server process"); - let (to_server, server_receiver): ChannelWithContext = channel(); - let to_server = SenderWithContext::new(SenderType::Sender(to_server)); + + let (to_server, server_receiver): SyncChannelWithContext = + mpsc::sync_channel(50); + let to_server = SenderWithContext::new(SenderType::SyncSender(to_server)); let sessions: Arc>> = Arc::new(RwLock::new(None)); + #[cfg(not(test))] + std::panic::set_hook({ + use crate::errors::handle_panic; + let to_server = to_server.clone(); + Box::new(move |info| { + handle_panic(info, &to_server); + }) + }); + #[cfg(test)] thread::Builder::new() .name("server_router".to_string()) @@ -149,15 +161,19 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { ServerInstruction::ClientExit => { *sessions.write().unwrap() = None; os_input.send_to_client(ClientInstruction::Exit); - drop(std::fs::remove_file(&socket_path)); break; } ServerInstruction::Render(output) => { os_input.send_to_client(ClientInstruction::Render(output)) } + ServerInstruction::Error(backtrace) => { + os_input.send_to_client(ClientInstruction::ServerError(backtrace)); + break; + } _ => panic!("Received unexpected instruction."), } } + drop(std::fs::remove_file(&socket_path)); } fn init_session( @@ -167,12 +183,12 @@ fn init_session( to_server: SenderWithContext, full_screen_ws: PositionAndSize, ) -> SessionMetaData { - let (to_screen, screen_receiver): ChannelWithContext = channel(); + let (to_screen, screen_receiver): ChannelWithContext = mpsc::channel(); let to_screen = SenderWithContext::new(SenderType::Sender(to_screen)); - let (to_plugin, plugin_receiver): ChannelWithContext = channel(); + let (to_plugin, plugin_receiver): ChannelWithContext = mpsc::channel(); let to_plugin = SenderWithContext::new(SenderType::Sender(to_plugin)); - let (to_pty, pty_receiver): ChannelWithContext = channel(); + let (to_pty, pty_receiver): ChannelWithContext = mpsc::channel(); let to_pty = SenderWithContext::new(SenderType::Sender(to_pty)); // Determine and initialize the data directory diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 1697e65f..2612848d 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -153,7 +153,7 @@ impl ClientOsApi for FakeInputOutput { .unwrap() .push(IoEvent::IntoRawMode(pid)); } - fn unset_raw_mode(&mut self, pid: RawFd) { + fn unset_raw_mode(&self, pid: RawFd) { self.io_events .lock() .unwrap() @@ -217,7 +217,7 @@ impl ClientOsApi for FakeInputOutput { cb(); } } - fn connect_to_server(&self, path: &std::path::Path) {} + fn connect_to_server(&self, _path: &std::path::Path) {} } impl ServerOsApi for FakeInputOutput { From c5675e965b9edede26cd26f4658c01ae29b7f2cb Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 12 May 2021 20:16:56 +0530 Subject: [PATCH 10/16] Use ClientToServerMsg and ServerToClientMsg for IPC --- src/client/mod.rs | 39 +++++++++++++++++++++-------------- src/common/errors.rs | 9 ++++---- src/common/input/handler.rs | 8 +++---- src/common/ipc.rs | 32 +++++++++++++++++++--------- src/common/os_input_output.rs | 30 +++++++++++++-------------- src/common/pty.rs | 4 ++-- src/common/screen.rs | 4 ++-- src/common/wasm_vm.rs | 4 ++-- src/server/mod.rs | 35 ++++++++++++++++++------------- src/server/route.rs | 28 +++++++++---------------- src/tests/fakes.rs | 23 ++++++++++----------- 11 files changed, 117 insertions(+), 99 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 594960eb..819fddf0 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -4,7 +4,6 @@ pub mod pane_resizer; pub mod panes; pub mod tab; -use serde::{Deserialize, Serialize}; use std::env::current_exe; use std::io::{self, Write}; use std::path::Path; @@ -15,18 +14,17 @@ use std::thread; use crate::cli::CliArgs; use crate::common::{ command_is_executing::CommandIsExecuting, - errors::{ClientContext, ContextType}, + errors::ContextType, input::config::Config, input::handler::input_loop, - input::options::Options, + ipc::{ClientToServerMsg, ServerToClientMsg}, os_input_output::ClientOsApi, thread_bus::{SenderType, SenderWithContext, SyncChannelWithContext}, utils::consts::ZELLIJ_IPC_PIPE, }; -use crate::server::ServerInstruction; /// Instructions related to the client-side application and sent from server to client -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Debug, Clone)] pub enum ClientInstruction { Error(String), Render(Option), @@ -35,6 +33,17 @@ pub enum ClientInstruction { ServerError(String), } +impl From for ClientInstruction { + fn from(instruction: ServerToClientMsg) -> Self { + match instruction { + ServerToClientMsg::Exit => ClientInstruction::Exit, + ServerToClientMsg::Render(buffer) => ClientInstruction::Render(buffer), + ServerToClientMsg::UnblockInputThread => ClientInstruction::UnblockInputThread, + ServerToClientMsg::ServerError(backtrace) => ClientInstruction::ServerError(backtrace), + } + } +} + fn spawn_server(socket_path: &Path) -> io::Result<()> { let status = Command::new(current_exe()?) .arg("--server") @@ -71,7 +80,7 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C let full_screen_ws = os_input.get_terminal_size_using_fd(0); os_input.connect_to_server(&*ZELLIJ_IPC_PIPE); - os_input.send_to_server(ServerInstruction::NewClient(full_screen_ws, opts)); + os_input.send_to_server(ClientToServerMsg::NewClient(full_screen_ws, opts)); os_input.set_raw_mode(0); let _ = os_input .get_stdout_writer() @@ -117,7 +126,7 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C os_input.receive_sigwinch(Box::new({ let os_api = os_input.clone(); move || { - os_api.send_to_server(ServerInstruction::TerminalResize( + os_api.send_to_server(ClientToServerMsg::TerminalResize( os_api.get_terminal_size_using_fd(0), )); } @@ -132,15 +141,15 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C let os_input = os_input.clone(); let mut should_break = false; move || loop { - let (instruction, mut err_ctx) = os_input.recv_from_server(); - err_ctx.add_call(ContextType::Client(ClientContext::from(&instruction))); + let (instruction, err_ctx) = os_input.recv_from_server(); + err_ctx.update_thread_ctx(); match instruction { - ClientInstruction::Exit | ClientInstruction::ServerError(_) => { + ServerToClientMsg::Exit | ServerToClientMsg::ServerError(_) => { should_break = true; } _ => {} } - send_client_instructions.send(instruction).unwrap(); + send_client_instructions.send(instruction.into()).unwrap(); if should_break { break; } @@ -168,13 +177,11 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C .recv() .expect("failed to receive app instruction on channel"); - err_ctx.add_call(ContextType::Client(ClientContext::from( - &client_instruction, - ))); + err_ctx.add_call(ContextType::Client((&client_instruction).into())); match client_instruction { ClientInstruction::Exit => break, ClientInstruction::Error(backtrace) => { - let _ = os_input.send_to_server(ServerInstruction::ClientExit); + let _ = os_input.send_to_server(ClientToServerMsg::ClientExit); handle_error(backtrace); } ClientInstruction::ServerError(backtrace) => { @@ -196,7 +203,7 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C } } - let _ = os_input.send_to_server(ServerInstruction::ClientExit); + let _ = os_input.send_to_server(ClientToServerMsg::ClientExit); router_thread.join().unwrap(); // cleanup(); diff --git a/src/common/errors.rs b/src/common/errors.rs index c92b9b7f..262dfd6b 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -120,6 +120,11 @@ impl ErrorContext { break; } } + self.update_thread_ctx() + } + + /// Updates the thread local [`ErrorContext`]. + pub fn update_thread_ctx(&self) { ASYNCOPENCALLS .try_with(|ctx| *ctx.borrow_mut() = *self) .unwrap_or_else(|_| OPENCALLS.with(|ctx| *ctx.borrow_mut() = *self)); @@ -369,9 +374,7 @@ impl From<&ClientInstruction> for ClientContext { #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum ServerContext { NewClient, - Action, Render, - TerminalResize, UnblockInputThread, ClientExit, Error, @@ -381,8 +384,6 @@ impl From<&ServerInstruction> for ServerContext { fn from(server_instruction: &ServerInstruction) -> Self { match *server_instruction { ServerInstruction::NewClient(..) => ServerContext::NewClient, - ServerInstruction::Action(_) => ServerContext::Action, - ServerInstruction::TerminalResize(_) => ServerContext::TerminalResize, ServerInstruction::Render(_) => ServerContext::Render, ServerInstruction::UnblockInputThread => ServerContext::UnblockInputThread, ServerInstruction::ClientExit => ServerContext::ClientExit, diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index b2f4d0a3..4ac2cf83 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -4,10 +4,10 @@ use super::actions::Action; use super::keybinds::Keybinds; use crate::client::ClientInstruction; use crate::common::input::config::Config; +use crate::common::ipc::ClientToServerMsg; use crate::common::thread_bus::{SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::ClientOsApi; -use crate::server::ServerInstruction; use crate::CommandIsExecuting; use termion::input::{TermRead, TermReadEventsAndRaw}; @@ -139,7 +139,7 @@ impl InputHandler { Action::SwitchToMode(mode) => { self.mode = mode; self.os_input - .send_to_server(ServerInstruction::Action(action)); + .send_to_server(ClientToServerMsg::Action(action)); } Action::CloseFocus | Action::NewPane(_) @@ -151,13 +151,13 @@ impl InputHandler { | Action::MoveFocusOrTab(_) => { self.command_is_executing.blocking_input_thread(); self.os_input - .send_to_server(ServerInstruction::Action(action)); + .send_to_server(ClientToServerMsg::Action(action)); self.command_is_executing .wait_until_input_thread_is_unblocked(); } _ => self .os_input - .send_to_server(ServerInstruction::Action(action)), + .send_to_server(ClientToServerMsg::Action(action)), } should_break diff --git a/src/common/ipc.rs b/src/common/ipc.rs index 190680dc..38a2fd4f 100644 --- a/src/common/ipc.rs +++ b/src/common/ipc.rs @@ -1,10 +1,14 @@ //! IPC stuff for starting to split things into a client and server model. -use crate::common::errors::{get_current_ctx, ErrorContext}; +use crate::cli::CliArgs; +use crate::common::{ + errors::{get_current_ctx, ErrorContext}, + input::actions::Action, +}; +use crate::panes::PositionAndSize; use interprocess::local_socket::LocalSocketStream; use nix::unistd::dup; use serde::{Deserialize, Serialize}; -use std::collections::HashSet; use std::io::{self, Write}; use std::marker::PhantomData; use std::os::unix::io::{AsRawFd, FromRawFd}; @@ -29,9 +33,9 @@ pub enum ClientType { } // Types of messages sent from the client to the server -#[derive(Serialize, Deserialize)] -pub enum _ClientToServerMsg { - // List which sessions are available +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ClientToServerMsg { + /*// List which sessions are available ListSessions, // Create a new session CreateSession, @@ -40,16 +44,24 @@ pub enum _ClientToServerMsg { // Force detach DetachSession(SessionId), // Disconnect from the session we're connected to - DisconnectFromSession, + DisconnectFromSession,*/ + ClientExit, + TerminalResize(PositionAndSize), + NewClient(PositionAndSize, CliArgs), + Action(Action), } // Types of messages sent from the server to the client -// @@@ Implement Serialize and Deserialize for this... -pub enum _ServerToClientMsg { - // Info about a particular session +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ServerToClientMsg { + /*// Info about a particular session SessionInfo(Session), // A list of sessions - SessionList(HashSet), + SessionList(HashSet),*/ + Render(Option), + UnblockInputThread, + Exit, + ServerError(String), } /// Sends messages on a stream socket, along with an [`ErrorContext`]. diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index a8d67478..5e7b3ce2 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -1,8 +1,8 @@ -use crate::client::ClientInstruction; -use crate::common::ipc::{IpcReceiverWithContext, IpcSenderWithContext}; +use crate::common::ipc::{ + ClientToServerMsg, IpcReceiverWithContext, IpcSenderWithContext, ServerToClientMsg, +}; use crate::errors::ErrorContext; use crate::panes::PositionAndSize; -use crate::server::ServerInstruction; use crate::utils::shared::default_palette; use interprocess::local_socket::LocalSocketStream; use nix::fcntl::{fcntl, FcntlArg, OFlag}; @@ -167,8 +167,8 @@ fn spawn_terminal(file_to_open: Option, orig_termios: termios::Termios) #[derive(Clone)] pub struct ServerOsInputOutput { orig_termios: Arc>, - receive_instructions_from_client: Option>>>, - send_instructions_to_client: Arc>>>, + receive_instructions_from_client: Option>>>, + send_instructions_to_client: Arc>>>, } /// The `ServerOsApi` trait represents an abstract interface to the features of an operating system that @@ -192,9 +192,9 @@ pub trait ServerOsApi: Send + Sync { /// Returns a [`Box`] pointer to this [`ServerOsApi`] struct. fn box_clone(&self) -> Box; /// Receives a message on server-side IPC channel - fn recv_from_client(&self) -> (ServerInstruction, ErrorContext); + fn recv_from_client(&self) -> (ClientToServerMsg, ErrorContext); /// Sends a message to client - fn send_to_client(&self, msg: ClientInstruction); + fn send_to_client(&self, msg: ServerToClientMsg); /// Adds a sender to client fn add_client_sender(&mut self); /// Update the receiver socket for the client @@ -233,7 +233,7 @@ impl ServerOsApi for ServerOsInputOutput { waitpid(Pid::from_raw(pid), None).unwrap(); Ok(()) } - fn recv_from_client(&self) -> (ServerInstruction, ErrorContext) { + fn recv_from_client(&self) -> (ClientToServerMsg, ErrorContext) { self.receive_instructions_from_client .as_ref() .unwrap() @@ -241,7 +241,7 @@ impl ServerOsApi for ServerOsInputOutput { .unwrap() .recv() } - fn send_to_client(&self, msg: ClientInstruction) { + fn send_to_client(&self, msg: ServerToClientMsg) { self.send_instructions_to_client .lock() .unwrap() @@ -288,8 +288,8 @@ pub fn get_server_os_input() -> ServerOsInputOutput { #[derive(Clone)] pub struct ClientOsInputOutput { orig_termios: Arc>, - send_instructions_to_server: Arc>>>, - receive_instructions_from_server: Arc>>>, + send_instructions_to_server: Arc>>>, + receive_instructions_from_server: Arc>>>, } /// The `ClientOsApi` trait represents an abstract interface to the features of an operating system that @@ -310,10 +310,10 @@ pub trait ClientOsApi: Send + Sync { /// Returns a [`Box`] pointer to this [`ClientOsApi`] struct. fn box_clone(&self) -> Box; /// Sends a message to the server. - fn send_to_server(&self, msg: ServerInstruction); + fn send_to_server(&self, msg: ClientToServerMsg); /// Receives a message on client-side IPC channel // This should be called from the client-side router thread only. - fn recv_from_server(&self) -> (ClientInstruction, ErrorContext); + fn recv_from_server(&self) -> (ServerToClientMsg, ErrorContext); fn receive_sigwinch(&self, cb: Box); /// Establish a connection with the server socket. fn connect_to_server(&self, path: &Path); @@ -346,7 +346,7 @@ impl ClientOsApi for ClientOsInputOutput { let stdout = ::std::io::stdout(); Box::new(stdout) } - fn send_to_server(&self, msg: ServerInstruction) { + fn send_to_server(&self, msg: ClientToServerMsg) { self.send_instructions_to_server .lock() .unwrap() @@ -354,7 +354,7 @@ impl ClientOsApi for ClientOsInputOutput { .unwrap() .send(msg); } - fn recv_from_server(&self) -> (ClientInstruction, ErrorContext) { + fn recv_from_server(&self) -> (ServerToClientMsg, ErrorContext) { self.receive_instructions_from_server .lock() .unwrap() diff --git a/src/common/pty.rs b/src/common/pty.rs index 3c471d6a..5f5442b5 100644 --- a/src/common/pty.rs +++ b/src/common/pty.rs @@ -8,7 +8,7 @@ use std::pin::*; use std::time::{Duration, Instant}; use crate::client::panes::PaneId; -use crate::common::errors::{get_current_ctx, ContextType, PtyContext}; +use crate::common::errors::{get_current_ctx, ContextType}; use crate::common::screen::ScreenInstruction; use crate::common::thread_bus::{Bus, ThreadSenders}; use crate::layout::Layout; @@ -87,7 +87,7 @@ pub struct Pty { pub fn pty_thread_main(mut pty: Pty, maybe_layout: Option) { loop { let (event, mut err_ctx) = pty.bus.recv().expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Pty(PtyContext::from(&event))); + err_ctx.add_call(ContextType::Pty((&event).into())); match event { PtyInstruction::SpawnTerminal(file_to_open) => { let pid = pty.spawn_terminal(file_to_open); diff --git a/src/common/screen.rs b/src/common/screen.rs index bc99f953..62fcec19 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -7,7 +7,7 @@ use std::str; use crate::common::input::options::Options; use crate::common::pty::{PtyInstruction, VteBytes}; use crate::common::thread_bus::Bus; -use crate::errors::{ContextType, ScreenContext}; +use crate::errors::ContextType; use crate::layout::Layout; use crate::panes::PaneId; use crate::panes::PositionAndSize; @@ -353,7 +353,7 @@ pub fn screen_thread_main( .bus .recv() .expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Screen(ScreenContext::from(&event))); + err_ctx.add_call(ContextType::Screen((&event).into())); match event { ScreenInstruction::PtyBytes(pid, vte_bytes) => { let active_tab = screen.get_active_tab_mut().unwrap(); diff --git a/src/common/wasm_vm.rs b/src/common/wasm_vm.rs index e5567285..51eb4ed8 100644 --- a/src/common/wasm_vm.rs +++ b/src/common/wasm_vm.rs @@ -15,7 +15,7 @@ use wasmer::{ use wasmer_wasi::{Pipe, WasiEnv, WasiState}; use zellij_tile::data::{Event, EventType, PluginIds}; -use crate::common::errors::{ContextType, PluginContext}; +use crate::common::errors::ContextType; use crate::common::pty::PtyInstruction; use crate::common::screen::ScreenInstruction; use crate::common::thread_bus::{Bus, ThreadSenders}; @@ -44,7 +44,7 @@ pub fn wasm_thread_main(bus: Bus, store: Store, data_dir: Pat let mut plugin_map = HashMap::new(); loop { let (event, mut err_ctx) = bus.recv().expect("failed to receive event on channel"); - err_ctx.add_call(ContextType::Plugin(PluginContext::from(&event))); + err_ctx.add_call(ContextType::Plugin((&event).into())); match event { PluginInstruction::Load(pid_tx, path) => { let plugin_dir = data_dir.join("plugins/"); diff --git a/src/server/mod.rs b/src/server/mod.rs index 884dbee1..96c0a3ce 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -2,7 +2,6 @@ pub mod route; use daemonize::Daemonize; use interprocess::local_socket::LocalSocketListener; -use serde::{Deserialize, Serialize}; use std::sync::{Arc, RwLock}; use std::thread; use std::{path::PathBuf, sync::mpsc}; @@ -10,11 +9,10 @@ use wasmer::Store; use zellij_tile::data::PluginCapabilities; use crate::cli::CliArgs; -use crate::client::ClientInstruction; use crate::common::thread_bus::{Bus, ThreadSenders}; use crate::common::{ - errors::{ContextType, ServerContext}, - input::{actions::Action, options::Options}, + errors::ContextType, + ipc::{ClientToServerMsg, ServerToClientMsg}, os_input_output::{set_permissions, ServerOsApi}, pty::{pty_thread_main, Pty, PtyInstruction}, screen::{screen_thread_main, ScreenInstruction}, @@ -29,17 +27,25 @@ use route::route_thread_main; /// Instructions related to server-side application including the /// ones sent by client to server -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Debug, Clone)] pub enum ServerInstruction { - TerminalResize(PositionAndSize), - NewClient(PositionAndSize, CliArgs, Options), - Action(Action), + NewClient(PositionAndSize, CliArgs), Render(Option), UnblockInputThread, ClientExit, Error(String), } +impl From for ServerInstruction { + fn from(instruction: ClientToServerMsg) -> Self { + match instruction { + ClientToServerMsg::ClientExit => ServerInstruction::ClientExit, + ClientToServerMsg::NewClient(pos, opts) => ServerInstruction::NewClient(pos, opts), + _ => unreachable!(), + } + } +} + pub struct SessionMetaData { pub senders: ThreadSenders, screen_thread: Option>, @@ -65,6 +71,8 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { .start() .expect("could not daemonize the server process"); + std::env::set_var(&"ZELLIJ", "0"); + let (to_server, server_receiver): SyncChannelWithContext = mpsc::sync_channel(50); let to_server = SenderWithContext::new(SenderType::SyncSender(to_server)); @@ -140,7 +148,7 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { loop { let (instruction, mut err_ctx) = server_receiver.recv().unwrap(); - err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); + err_ctx.add_call(ContextType::IPCServer((&instruction).into())); match instruction { ServerInstruction::NewClient(full_screen_ws, opts) => { let session_data = @@ -156,21 +164,20 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { .unwrap(); } ServerInstruction::UnblockInputThread => { - os_input.send_to_client(ClientInstruction::UnblockInputThread); + os_input.send_to_client(ServerToClientMsg::UnblockInputThread); } ServerInstruction::ClientExit => { *sessions.write().unwrap() = None; - os_input.send_to_client(ClientInstruction::Exit); + os_input.send_to_client(ServerToClientMsg::Exit); break; } ServerInstruction::Render(output) => { - os_input.send_to_client(ClientInstruction::Render(output)) + os_input.send_to_client(ServerToClientMsg::Render(output)) } ServerInstruction::Error(backtrace) => { - os_input.send_to_client(ClientInstruction::ServerError(backtrace)); + os_input.send_to_client(ServerToClientMsg::ServerError(backtrace)); break; } - _ => panic!("Received unexpected instruction."), } } drop(std::fs::remove_file(&socket_path)); diff --git a/src/server/route.rs b/src/server/route.rs index bd4b1b60..31b82eb5 100644 --- a/src/server/route.rs +++ b/src/server/route.rs @@ -2,9 +2,9 @@ use std::sync::{Arc, RwLock}; use zellij_tile::data::{Event, PluginCapabilities}; -use crate::common::errors::{ContextType, ServerContext}; use crate::common::input::actions::{Action, Direction}; use crate::common::input::handler::get_mode_info; +use crate::common::ipc::ClientToServerMsg; use crate::common::os_input_output::ServerOsApi; use crate::common::pty::PtyInstruction; use crate::common::screen::ScreenInstruction; @@ -193,23 +193,18 @@ pub fn route_thread_main( capabilities: PluginCapabilities, ) { loop { - let (instruction, mut err_ctx) = os_input.recv_from_client(); - err_ctx.add_call(ContextType::IPCServer(ServerContext::from(&instruction))); + let (instruction, err_ctx) = os_input.recv_from_client(); + err_ctx.update_thread_ctx(); let rlocked_sessions = sessions.read().unwrap(); match instruction { - ServerInstruction::ClientExit => { - to_server.send(instruction).unwrap(); + ClientToServerMsg::ClientExit => { + to_server.send(instruction.into()).unwrap(); break; } - ServerInstruction::Action(action) => { - route_action( - action, - rlocked_sessions.as_ref().unwrap(), - &*os_input, - capabilities, - ); + ClientToServerMsg::Action(action) => { + route_action(action, rlocked_sessions.as_ref().unwrap(), &*os_input); } - ServerInstruction::TerminalResize(new_size) => { + ClientToServerMsg::TerminalResize(new_size) => { rlocked_sessions .as_ref() .unwrap() @@ -217,12 +212,9 @@ pub fn route_thread_main( .send_to_screen(ScreenInstruction::TerminalResize(new_size)) .unwrap(); } - ServerInstruction::NewClient(..) => { + ClientToServerMsg::NewClient(..) => { os_input.add_client_sender(); - to_server.send(instruction).unwrap(); - } - _ => { - to_server.send(instruction).unwrap(); + to_server.send(instruction.into()).unwrap(); } } } diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 2612848d..62375914 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -7,11 +7,10 @@ use std::path::PathBuf; use std::sync::{mpsc, Arc, Condvar, Mutex}; use std::time::{Duration, Instant}; -use crate::client::ClientInstruction; +use crate::common::ipc::{ClientToServerMsg, ServerToClientMsg}; use crate::common::thread_bus::{ChannelWithContext, SenderType, SenderWithContext}; use crate::errors::ErrorContext; use crate::os_input_output::{ClientOsApi, ServerOsApi}; -use crate::server::ServerInstruction; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::tests::utils::commands::{QUIT, SLEEP}; use crate::utils::shared::default_palette; @@ -77,10 +76,10 @@ pub struct FakeInputOutput { win_sizes: Arc>>, possible_tty_inputs: HashMap, last_snapshot_time: Arc>, - send_instructions_to_client: SenderWithContext, - receive_instructions_from_server: Arc>>, - send_instructions_to_server: SenderWithContext, - receive_instructions_from_client: Arc>>, + send_instructions_to_client: SenderWithContext, + receive_instructions_from_server: Arc>>, + send_instructions_to_server: SenderWithContext, + receive_instructions_from_client: Arc>>, should_trigger_sigwinch: Arc<(Mutex, Condvar)>, sigwinch_event: Option, } @@ -90,10 +89,10 @@ impl FakeInputOutput { let mut win_sizes = HashMap::new(); let last_snapshot_time = Arc::new(Mutex::new(Instant::now())); let stdout_writer = FakeStdoutWriter::new(last_snapshot_time.clone()); - let (client_sender, client_receiver): ChannelWithContext = + let (client_sender, client_receiver): ChannelWithContext = mpsc::channel(); let send_instructions_to_client = SenderWithContext::new(SenderType::Sender(client_sender)); - let (server_sender, server_receiver): ChannelWithContext = + let (server_sender, server_receiver): ChannelWithContext = mpsc::channel(); let send_instructions_to_server = SenderWithContext::new(SenderType::Sender(server_sender)); win_sizes.insert(0, winsize); // 0 is the current terminal @@ -195,10 +194,10 @@ impl ClientOsApi for FakeInputOutput { fn get_stdout_writer(&self) -> Box { Box::new(self.stdout_writer.clone()) } - fn send_to_server(&self, msg: ServerInstruction) { + fn send_to_server(&self, msg: ClientToServerMsg) { self.send_instructions_to_server.send(msg).unwrap(); } - fn recv_from_server(&self) -> (ClientInstruction, ErrorContext) { + fn recv_from_server(&self) -> (ServerToClientMsg, ErrorContext) { self.receive_instructions_from_server .lock() .unwrap() @@ -278,14 +277,14 @@ impl ServerOsApi for FakeInputOutput { self.io_events.lock().unwrap().push(IoEvent::Kill(fd)); Ok(()) } - fn recv_from_client(&self) -> (ServerInstruction, ErrorContext) { + fn recv_from_client(&self) -> (ClientToServerMsg, ErrorContext) { self.receive_instructions_from_client .lock() .unwrap() .recv() .unwrap() } - fn send_to_client(&self, msg: ClientInstruction) { + fn send_to_client(&self, msg: ServerToClientMsg) { self.send_instructions_to_client.send(msg).unwrap(); } fn add_client_sender(&mut self) {} From e203f96d78865f3710061934c82cca1e5dd78fa9 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 12 May 2021 20:45:27 +0530 Subject: [PATCH 11/16] fix testing --- src/client/mod.rs | 1 + src/main.rs | 17 +++----------- src/server/mod.rs | 11 +++++---- src/tests/integration/basic.rs | 3 ++- src/tests/integration/close_pane.rs | 3 ++- src/tests/integration/compatibility.rs | 3 ++- src/tests/integration/layouts.rs | 3 ++- src/tests/integration/move_focus_down.rs | 3 ++- src/tests/integration/move_focus_left.rs | 3 ++- src/tests/integration/move_focus_right.rs | 3 ++- src/tests/integration/move_focus_up.rs | 3 ++- src/tests/integration/resize_down.rs | 3 ++- src/tests/integration/resize_left.rs | 3 ++- src/tests/integration/resize_right.rs | 3 ++- src/tests/integration/resize_up.rs | 3 ++- src/tests/integration/tabs.rs | 3 ++- .../integration/terminal_window_resize.rs | 3 ++- src/tests/integration/toggle_fullscreen.rs | 3 ++- src/tests/mod.rs | 23 +++++++++++++++++++ 19 files changed, 64 insertions(+), 33 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 819fddf0..c1458b1a 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -72,6 +72,7 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C std::env::set_var(&"ZELLIJ", "0"); + #[cfg(not(test))] spawn_server(&*ZELLIJ_IPC_PIPE).unwrap(); let mut command_is_executing = CommandIsExecuting::new(); diff --git a/src/main.rs b/src/main.rs index d08deb4a..5acd6df5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,10 +14,10 @@ use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::common::input::{config::Config, options::Options}; -use crate::os_input_output::{get_client_os_input, get_server_os_input, ClientOsApi, ServerOsApi}; +use crate::common::input::config::Config; +use crate::os_input_output::{get_client_os_input, get_server_os_input}; use crate::utils::{ - consts::{ZELLIJ_IPC_PIPE, ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, + consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, logging::*, }; use std::convert::TryFrom; @@ -48,14 +48,3 @@ pub fn main() { } } } -pub fn start( - client_os_input: Box, - opts: CliArgs, - server_os_input: Box, - config: Config, - config_options: Options, -) { - start_server(server_os_input, ZELLIJ_IPC_PIPE.clone()); - start_client(client_os_input, opts, config); - //drop(ipc_thread.join()); -} diff --git a/src/server/mod.rs b/src/server/mod.rs index 96c0a3ce..4d52e779 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,7 +1,5 @@ pub mod route; -use daemonize::Daemonize; -use interprocess::local_socket::LocalSocketListener; use std::sync::{Arc, RwLock}; use std::thread; use std::{path::PathBuf, sync::mpsc}; @@ -13,7 +11,7 @@ use crate::common::thread_bus::{Bus, ThreadSenders}; use crate::common::{ errors::ContextType, ipc::{ClientToServerMsg, ServerToClientMsg}, - os_input_output::{set_permissions, ServerOsApi}, + os_input_output::ServerOsApi, pty::{pty_thread_main, Pty, PtyInstruction}, screen::{screen_thread_main, ScreenInstruction}, setup::install::populate_data_dir, @@ -65,7 +63,8 @@ impl Drop for SessionMetaData { } pub fn start_server(os_input: Box, socket_path: PathBuf) { - Daemonize::new() + #[cfg(not(test))] + daemonize::Daemonize::new() .working_directory(std::env::var("HOME").unwrap()) .umask(0o077) .start() @@ -105,6 +104,9 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { let _ = thread::Builder::new() .name("server_listener".to_string()) .spawn({ + use crate::common::os_input_output::set_permissions; + use interprocess::local_socket::LocalSocketListener; + let os_input = os_input.clone(); let sessions = sessions.clone(); let to_server = to_server.clone(); @@ -180,6 +182,7 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { } } } + #[cfg(not(test))] drop(std::fs::remove_file(&socket_path)); } diff --git a/src/tests/integration/basic.rs b/src/tests/integration/basic.rs index 1ebcb922..83cae205 100644 --- a/src/tests/integration/basic.rs +++ b/src/tests/integration/basic.rs @@ -3,6 +3,7 @@ use ::insta::assert_snapshot; use crate::common::input::{config::Config, options::Options}; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::commands::{ BRACKETED_PASTE_END, BRACKETED_PASTE_START, PANE_MODE, QUIT, SCROLL_DOWN_IN_SCROLL_MODE, SCROLL_MODE, SCROLL_PAGE_DOWN_IN_SCROLL_MODE, SCROLL_PAGE_UP_IN_SCROLL_MODE, @@ -10,7 +11,7 @@ use crate::tests::utils::commands::{ SPLIT_RIGHT_IN_PANE_MODE, TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, }; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { FakeInputOutput::new(fake_win_size.clone()) diff --git a/src/tests/integration/close_pane.rs b/src/tests/integration/close_pane.rs index d151f63d..c492591f 100644 --- a/src/tests/integration/close_pane.rs +++ b/src/tests/integration/close_pane.rs @@ -2,8 +2,9 @@ use crate::panes::PositionAndSize; use ::insta::assert_snapshot; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs index b986b1de..40c2b9bf 100644 --- a/src/tests/integration/compatibility.rs +++ b/src/tests/integration/compatibility.rs @@ -4,8 +4,9 @@ use ::std::collections::HashMap; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; use crate::tests::possible_tty_inputs::Bytes; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::QUIT; diff --git a/src/tests/integration/layouts.rs b/src/tests/integration/layouts.rs index bd7ceb3f..42a5b66f 100644 --- a/src/tests/integration/layouts.rs +++ b/src/tests/integration/layouts.rs @@ -4,9 +4,10 @@ use std::path::PathBuf; use crate::common::input::{config::Config, options::Options}; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::commands::QUIT; use crate::tests::utils::get_output_frame_snapshots; -use crate::{start, CliArgs}; +use crate::CliArgs; fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { FakeInputOutput::new(fake_win_size.clone()) diff --git a/src/tests/integration/move_focus_down.rs b/src/tests/integration/move_focus_down.rs index e182acf9..d8121994 100644 --- a/src/tests/integration/move_focus_down.rs +++ b/src/tests/integration/move_focus_down.rs @@ -2,8 +2,9 @@ use ::insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/move_focus_left.rs b/src/tests/integration/move_focus_left.rs index c991d1e8..9533184a 100644 --- a/src/tests/integration/move_focus_left.rs +++ b/src/tests/integration/move_focus_left.rs @@ -2,8 +2,9 @@ use ::insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/move_focus_right.rs b/src/tests/integration/move_focus_right.rs index ffc8cacf..03177bca 100644 --- a/src/tests/integration/move_focus_right.rs +++ b/src/tests/integration/move_focus_right.rs @@ -2,8 +2,9 @@ use ::insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/move_focus_up.rs b/src/tests/integration/move_focus_up.rs index 54bfef5e..e6e7c301 100644 --- a/src/tests/integration/move_focus_up.rs +++ b/src/tests/integration/move_focus_up.rs @@ -2,8 +2,9 @@ use ::insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/resize_down.rs b/src/tests/integration/resize_down.rs index 0e710b4e..47293951 100644 --- a/src/tests/integration/resize_down.rs +++ b/src/tests/integration/resize_down.rs @@ -2,8 +2,9 @@ use insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/resize_left.rs b/src/tests/integration/resize_left.rs index 5d498e96..d0581c52 100644 --- a/src/tests/integration/resize_left.rs +++ b/src/tests/integration/resize_left.rs @@ -2,8 +2,9 @@ use ::insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/resize_right.rs b/src/tests/integration/resize_right.rs index 8be15315..562161b7 100644 --- a/src/tests/integration/resize_right.rs +++ b/src/tests/integration/resize_right.rs @@ -2,8 +2,9 @@ use ::insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/resize_up.rs b/src/tests/integration/resize_up.rs index ba810a9f..ed4d5f1f 100644 --- a/src/tests/integration/resize_up.rs +++ b/src/tests/integration/resize_up.rs @@ -2,8 +2,9 @@ use ::insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/tabs.rs b/src/tests/integration/tabs.rs index 1d8a2c9d..f81c1cc6 100644 --- a/src/tests/integration/tabs.rs +++ b/src/tests/integration/tabs.rs @@ -1,9 +1,10 @@ use insta::assert_snapshot; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; +use crate::CliArgs; use crate::{panes::PositionAndSize, tests::utils::commands::CLOSE_PANE_IN_PANE_MODE}; -use crate::{start, CliArgs}; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/integration/terminal_window_resize.rs b/src/tests/integration/terminal_window_resize.rs index 7c06609a..4bb7240b 100644 --- a/src/tests/integration/terminal_window_resize.rs +++ b/src/tests/integration/terminal_window_resize.rs @@ -3,9 +3,10 @@ use ::insta::assert_snapshot; use crate::common::input::{config::Config, options::Options}; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::commands::QUIT; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; fn get_fake_os_input(fake_win_size: &PositionAndSize) -> FakeInputOutput { FakeInputOutput::new(fake_win_size.clone()) diff --git a/src/tests/integration/toggle_fullscreen.rs b/src/tests/integration/toggle_fullscreen.rs index 8a63bbea..8707afff 100644 --- a/src/tests/integration/toggle_fullscreen.rs +++ b/src/tests/integration/toggle_fullscreen.rs @@ -2,8 +2,9 @@ use insta::assert_snapshot; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; +use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; -use crate::{start, CliArgs}; +use crate::CliArgs; use crate::common::input::{config::Config, options::Options}; use crate::tests::utils::commands::{ diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 6e07c96d..7aaad79f 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -3,3 +3,26 @@ pub mod integration; pub mod possible_tty_inputs; pub mod tty_inputs; pub mod utils; + +use crate::cli::CliArgs; +use crate::client::start_client; +use crate::common::input::config::Config; +use crate::os_input_output::{ClientOsApi, ServerOsApi}; +use crate::server::start_server; +use std::path::PathBuf; + +pub fn start( + client_os_input: Box, + opts: CliArgs, + server_os_input: Box, + config: Config, +) { + let server_thread = std::thread::Builder::new() + .name("server_thread".into()) + .spawn(move || { + start_server(server_os_input, PathBuf::from("")); + }) + .unwrap(); + start_client(client_os_input, opts, config); + let _ = server_thread.join(); +} From 41212dc0e8b139fccac443297c06b9478857d5ea Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 12 May 2021 22:27:25 +0530 Subject: [PATCH 12/16] Fix after rebase --- src/client/mod.rs | 13 +++++++++++-- src/common/ipc.rs | 4 ++-- src/main.rs | 4 ++-- src/server/mod.rs | 23 +++++++++++++++++------ src/server/route.rs | 7 ++++++- src/tests/mod.rs | 5 +++-- 6 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index c1458b1a..2fada592 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -17,6 +17,7 @@ use crate::common::{ errors::ContextType, input::config::Config, input::handler::input_loop, + input::options::Options, ipc::{ClientToServerMsg, ServerToClientMsg}, os_input_output::ClientOsApi, thread_bus::{SenderType, SenderWithContext, SyncChannelWithContext}, @@ -62,6 +63,7 @@ fn spawn_server(socket_path: &Path) -> io::Result<()> { } pub fn start_client(mut os_input: Box, opts: CliArgs, config: Config) { + let clear_client_terminal_attributes = "\u{1b}[?1l\u{1b}=\u{1b}[r\u{1b}12l\u{1b}[?1000l\u{1b}[?1002l\u{1b}[?1003l\u{1b}[?1005l\u{1b}[?1006l\u{1b}[?12l"; let take_snapshot = "\u{1b}[?1049h"; let bracketed_paste = "\u{1b}[?2004h"; os_input.unset_raw_mode(0); @@ -69,7 +71,10 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C .get_stdout_writer() .write(take_snapshot.as_bytes()) .unwrap(); - + let _ = os_input + .get_stdout_writer() + .write(clear_client_terminal_attributes.as_bytes()) + .unwrap(); std::env::set_var(&"ZELLIJ", "0"); #[cfg(not(test))] @@ -81,7 +86,11 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C let full_screen_ws = os_input.get_terminal_size_using_fd(0); os_input.connect_to_server(&*ZELLIJ_IPC_PIPE); - os_input.send_to_server(ClientToServerMsg::NewClient(full_screen_ws, opts)); + os_input.send_to_server(ClientToServerMsg::NewClient( + full_screen_ws, + opts, + config_options, + )); os_input.set_raw_mode(0); let _ = os_input .get_stdout_writer() diff --git a/src/common/ipc.rs b/src/common/ipc.rs index 38a2fd4f..129727a1 100644 --- a/src/common/ipc.rs +++ b/src/common/ipc.rs @@ -3,7 +3,7 @@ use crate::cli::CliArgs; use crate::common::{ errors::{get_current_ctx, ErrorContext}, - input::actions::Action, + input::{actions::Action, options::Options}, }; use crate::panes::PositionAndSize; use interprocess::local_socket::LocalSocketStream; @@ -47,7 +47,7 @@ pub enum ClientToServerMsg { DisconnectFromSession,*/ ClientExit, TerminalResize(PositionAndSize), - NewClient(PositionAndSize, CliArgs), + NewClient(PositionAndSize, CliArgs, Options), Action(Action), } diff --git a/src/main.rs b/src/main.rs index 5acd6df5..25c363a5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,7 @@ use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::common::input::config::Config; +use crate::common::input::{config::Config, options::Options}; use crate::os_input_output::{get_client_os_input, get_server_os_input}; use crate::utils::{ consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, @@ -41,7 +41,7 @@ pub fn main() { atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap(); if let Some(path) = opts.server { let os_input = get_server_os_input(); - start_server(Box::new(os_input), path); + start_server(Box::new(os_input), path, config_options); } else { let os_input = get_client_os_input(); start_client(Box::new(os_input), opts, config); diff --git a/src/server/mod.rs b/src/server/mod.rs index 4d52e779..afa846e8 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -10,6 +10,7 @@ use crate::cli::CliArgs; use crate::common::thread_bus::{Bus, ThreadSenders}; use crate::common::{ errors::ContextType, + input::options::Options, ipc::{ClientToServerMsg, ServerToClientMsg}, os_input_output::ServerOsApi, pty::{pty_thread_main, Pty, PtyInstruction}, @@ -27,7 +28,7 @@ use route::route_thread_main; /// ones sent by client to server #[derive(Debug, Clone)] pub enum ServerInstruction { - NewClient(PositionAndSize, CliArgs), + NewClient(PositionAndSize, CliArgs, Options), Render(Option), UnblockInputThread, ClientExit, @@ -38,7 +39,9 @@ impl From for ServerInstruction { fn from(instruction: ClientToServerMsg) -> Self { match instruction { ClientToServerMsg::ClientExit => ServerInstruction::ClientExit, - ClientToServerMsg::NewClient(pos, opts) => ServerInstruction::NewClient(pos, opts), + ClientToServerMsg::NewClient(pos, opts, options) => { + ServerInstruction::NewClient(pos, opts, options) + } _ => unreachable!(), } } @@ -62,7 +65,7 @@ impl Drop for SessionMetaData { } } -pub fn start_server(os_input: Box, socket_path: PathBuf) { +pub fn start_server(os_input: Box, socket_path: PathBuf, config_options: Options) { #[cfg(not(test))] daemonize::Daemonize::new() .working_directory(std::env::var("HOME").unwrap()) @@ -111,6 +114,9 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { let sessions = sessions.clone(); let to_server = to_server.clone(); let socket_path = socket_path.clone(); + let capabilities = PluginCapabilities { + arrow_fonts: config_options.simplified_ui, + }; move || { drop(std::fs::remove_file(&socket_path)); let listener = LocalSocketListener::bind(&*socket_path).unwrap(); @@ -152,9 +158,14 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { let (instruction, mut err_ctx) = server_receiver.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer((&instruction).into())); match instruction { - ServerInstruction::NewClient(full_screen_ws, opts) => { - let session_data = - init_session(os_input.clone(), opts, to_server.clone(), full_screen_ws); + ServerInstruction::NewClient(full_screen_ws, opts, config_options) => { + let session_data = init_session( + os_input.clone(), + opts, + config_options, + to_server.clone(), + full_screen_ws, + ); *sessions.write().unwrap() = Some(session_data); sessions .read() diff --git a/src/server/route.rs b/src/server/route.rs index 31b82eb5..34db835f 100644 --- a/src/server/route.rs +++ b/src/server/route.rs @@ -202,7 +202,12 @@ pub fn route_thread_main( break; } ClientToServerMsg::Action(action) => { - route_action(action, rlocked_sessions.as_ref().unwrap(), &*os_input); + route_action( + action, + rlocked_sessions.as_ref().unwrap(), + &*os_input, + capabilities, + ); } ClientToServerMsg::TerminalResize(new_size) => { rlocked_sessions diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 7aaad79f..86391456 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -6,7 +6,7 @@ pub mod utils; use crate::cli::CliArgs; use crate::client::start_client; -use crate::common::input::config::Config; +use crate::common::input::{config::Config, options::Options}; use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::server::start_server; use std::path::PathBuf; @@ -16,11 +16,12 @@ pub fn start( opts: CliArgs, server_os_input: Box, config: Config, + config_options: Options, ) { let server_thread = std::thread::Builder::new() .name("server_thread".into()) .spawn(move || { - start_server(server_os_input, PathBuf::from("")); + start_server(server_os_input, PathBuf::from(""), config_options); }) .unwrap(); start_client(client_os_input, opts, config); From 378dd90f8f32d29557bb2437900e318faea460d2 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 12 May 2021 23:48:47 +0530 Subject: [PATCH 13/16] Do not pass config_options while spawning server process --- src/main.rs | 11 ++++++-- src/server/mod.rs | 26 +++++++------------ src/server/route.rs | 21 ++++----------- src/tests/integration/basic.rs | 16 +----------- src/tests/integration/close_pane.rs | 15 +---------- src/tests/integration/compatibility.rs | 22 +--------------- src/tests/integration/layouts.rs | 3 +-- src/tests/integration/move_focus_down.rs | 4 +-- src/tests/integration/move_focus_left.rs | 5 +--- src/tests/integration/move_focus_right.rs | 5 +--- src/tests/integration/move_focus_up.rs | 4 +-- src/tests/integration/resize_down.rs | 15 +---------- src/tests/integration/resize_left.rs | 15 +---------- src/tests/integration/resize_right.rs | 15 +---------- src/tests/integration/resize_up.rs | 15 +---------- src/tests/integration/tabs.rs | 10 +------ .../integration/terminal_window_resize.rs | 6 +---- src/tests/integration/toggle_fullscreen.rs | 4 +-- src/tests/mod.rs | 5 ++-- 19 files changed, 40 insertions(+), 177 deletions(-) diff --git a/src/main.rs b/src/main.rs index 25c363a5..2430d84a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,7 @@ use structopt::StructOpt; use crate::cli::CliArgs; use crate::command_is_executing::CommandIsExecuting; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::os_input_output::{get_client_os_input, get_server_os_input}; use crate::utils::{ consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, @@ -24,6 +24,13 @@ use std::convert::TryFrom; pub fn main() { let opts = CliArgs::from_args(); + let config = match Config::try_from(&opts) { + Ok(config) => config, + Err(e) => { + eprintln!("There was an error in the config file:\n{}", e); + std::process::exit(1); + } + }; if let Some(crate::cli::ConfigCli::Setup(setup)) = opts.option.clone() { Setup::from_cli(&setup, opts).expect("Failed to print to stdout"); @@ -41,7 +48,7 @@ pub fn main() { atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap(); if let Some(path) = opts.server { let os_input = get_server_os_input(); - start_server(Box::new(os_input), path, config_options); + start_server(Box::new(os_input), path); } else { let os_input = get_client_os_input(); start_client(Box::new(os_input), opts, config); diff --git a/src/server/mod.rs b/src/server/mod.rs index afa846e8..b925b4d2 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -49,6 +49,7 @@ impl From for ServerInstruction { pub struct SessionMetaData { pub senders: ThreadSenders, + pub capabilities: PluginCapabilities, screen_thread: Option>, pty_thread: Option>, wasm_thread: Option>, @@ -65,7 +66,7 @@ impl Drop for SessionMetaData { } } -pub fn start_server(os_input: Box, socket_path: PathBuf, config_options: Options) { +pub fn start_server(os_input: Box, socket_path: PathBuf) { #[cfg(not(test))] daemonize::Daemonize::new() .working_directory(std::env::var("HOME").unwrap()) @@ -96,11 +97,8 @@ pub fn start_server(os_input: Box, socket_path: PathBuf, config let sessions = sessions.clone(); let os_input = os_input.clone(); let to_server = to_server.clone(); - let capabilities = PluginCapabilities { - arrow_fonts: !config_options.simplified_ui, - }; - move || route_thread_main(sessions, os_input, to_server, capabilities) + move || route_thread_main(sessions, os_input, to_server) }) .unwrap(); #[cfg(not(test))] @@ -114,9 +112,6 @@ pub fn start_server(os_input: Box, socket_path: PathBuf, config let sessions = sessions.clone(); let to_server = to_server.clone(); let socket_path = socket_path.clone(); - let capabilities = PluginCapabilities { - arrow_fonts: config_options.simplified_ui, - }; move || { drop(std::fs::remove_file(&socket_path)); let listener = LocalSocketListener::bind(&*socket_path).unwrap(); @@ -135,14 +130,7 @@ pub fn start_server(os_input: Box, socket_path: PathBuf, config let os_input = os_input.clone(); let to_server = to_server.clone(); - move || { - route_thread_main( - sessions, - os_input, - to_server, - capabilities, - ) - } + move || route_thread_main(sessions, os_input, to_server) }) .unwrap(); } @@ -218,6 +206,10 @@ fn init_session( #[cfg(not(disable_automatic_asset_installation))] populate_data_dir(&data_dir); + let capabilities = PluginCapabilities { + arrow_fonts: config_options.simplified_ui, + }; + // Don't use default layouts in tests, but do everywhere else #[cfg(not(test))] let default_layout = Some(PathBuf::from("default")); @@ -259,7 +251,6 @@ fn init_session( Some(os_input.clone()), ); let max_panes = opts.max_panes; - let config_options = config_options; move || { screen_thread_main(screen_bus, max_panes, full_screen_ws, config_options); @@ -290,6 +281,7 @@ fn init_session( to_plugin: Some(to_plugin), to_server: None, }, + capabilities, screen_thread: Some(screen_thread), pty_thread: Some(pty_thread), wasm_thread: Some(wasm_thread), diff --git a/src/server/route.rs b/src/server/route.rs index 34db835f..c435a0e6 100644 --- a/src/server/route.rs +++ b/src/server/route.rs @@ -1,6 +1,6 @@ use std::sync::{Arc, RwLock}; -use zellij_tile::data::{Event, PluginCapabilities}; +use zellij_tile::data::Event; use crate::common::input::actions::{Action, Direction}; use crate::common::input::handler::get_mode_info; @@ -12,12 +12,7 @@ use crate::common::thread_bus::SenderWithContext; use crate::common::wasm_vm::PluginInstruction; use crate::server::{ServerInstruction, SessionMetaData}; -fn route_action( - action: Action, - session: &SessionMetaData, - os_input: &dyn ServerOsApi, - capabilities: PluginCapabilities, -) { +fn route_action(action: Action, session: &SessionMetaData, os_input: &dyn ServerOsApi) { match action { Action::Write(val) => { session @@ -35,7 +30,7 @@ fn route_action( .senders .send_to_plugin(PluginInstruction::Update( None, - Event::ModeUpdate(get_mode_info(mode, palette, capabilities)), + Event::ModeUpdate(get_mode_info(mode, palette, session.capabilities)), )) .unwrap(); session @@ -43,7 +38,7 @@ fn route_action( .send_to_screen(ScreenInstruction::ChangeMode(get_mode_info( mode, palette, - capabilities, + session.capabilities, ))) .unwrap(); session @@ -190,7 +185,6 @@ pub fn route_thread_main( sessions: Arc>>, mut os_input: Box, to_server: SenderWithContext, - capabilities: PluginCapabilities, ) { loop { let (instruction, err_ctx) = os_input.recv_from_client(); @@ -202,12 +196,7 @@ pub fn route_thread_main( break; } ClientToServerMsg::Action(action) => { - route_action( - action, - rlocked_sessions.as_ref().unwrap(), - &*os_input, - capabilities, - ); + route_action(action, rlocked_sessions.as_ref().unwrap(), &*os_input); } ClientToServerMsg::TerminalResize(new_size) => { rlocked_sessions diff --git a/src/tests/integration/basic.rs b/src/tests/integration/basic.rs index 83cae205..bb581eb1 100644 --- a/src/tests/integration/basic.rs +++ b/src/tests/integration/basic.rs @@ -1,7 +1,7 @@ use crate::panes::PositionAndSize; use ::insta::assert_snapshot; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::fakes::FakeInputOutput; use crate::tests::start; use crate::tests::utils::commands::{ @@ -33,7 +33,6 @@ pub fn starts_with_one_terminal() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -62,7 +61,6 @@ pub fn split_terminals_vertically() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -91,7 +89,6 @@ pub fn split_terminals_horizontally() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -127,7 +124,6 @@ pub fn split_largest_terminal() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -156,7 +152,6 @@ pub fn cannot_split_terminals_vertically_when_active_terminal_is_too_small() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -185,7 +180,6 @@ pub fn cannot_split_terminals_horizontally_when_active_terminal_is_too_small() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -214,7 +208,6 @@ pub fn cannot_split_largest_terminal_when_there_is_no_room() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -251,7 +244,6 @@ pub fn scrolling_up_inside_a_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -290,7 +282,6 @@ pub fn scrolling_down_inside_a_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -326,7 +317,6 @@ pub fn scrolling_page_up_inside_a_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -365,7 +355,6 @@ pub fn scrolling_page_down_inside_a_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -405,7 +394,6 @@ pub fn max_panes() { opts, Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -443,7 +431,6 @@ pub fn toggle_focused_pane_fullscreen() { opts, Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -484,7 +471,6 @@ pub fn bracketed_paste() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/close_pane.rs b/src/tests/integration/close_pane.rs index c492591f..cfb912ee 100644 --- a/src/tests/integration/close_pane.rs +++ b/src/tests/integration/close_pane.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ CLOSE_PANE_IN_PANE_MODE, ESC, MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_DOWN_IN_RESIZE_MODE, RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, RESIZE_UP_IN_RESIZE_MODE, @@ -46,7 +46,6 @@ pub fn close_pane_with_another_pane_above_it() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -90,7 +89,6 @@ pub fn close_pane_with_another_pane_below_it() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -131,7 +129,6 @@ pub fn close_pane_with_another_pane_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -173,7 +170,6 @@ pub fn close_pane_with_another_pane_to_the_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -220,7 +216,6 @@ pub fn close_pane_with_multiple_panes_above_it() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -265,7 +260,6 @@ pub fn close_pane_with_multiple_panes_below_it() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -312,7 +306,6 @@ pub fn close_pane_with_multiple_panes_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -357,7 +350,6 @@ pub fn close_pane_with_multiple_panes_to_the_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -424,7 +416,6 @@ pub fn close_pane_with_multiple_panes_above_it_away_from_screen_edges() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -487,7 +478,6 @@ pub fn close_pane_with_multiple_panes_below_it_away_from_screen_edges() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -552,7 +542,6 @@ pub fn close_pane_with_multiple_panes_to_the_left_away_from_screen_edges() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -617,7 +606,6 @@ pub fn close_pane_with_multiple_panes_to_the_right_away_from_screen_edges() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -655,7 +643,6 @@ pub fn closing_last_pane_exits_app() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs index 40c2b9bf..06222a3a 100644 --- a/src/tests/integration/compatibility.rs +++ b/src/tests/integration/compatibility.rs @@ -8,7 +8,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::QUIT; /* @@ -49,7 +49,6 @@ pub fn run_bandwhich_from_fish_shell() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -79,7 +78,6 @@ pub fn fish_tab_completion_options() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -114,7 +112,6 @@ pub fn fish_select_tab_completion_options() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -153,7 +150,6 @@ pub fn vim_scroll_region_down() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -189,7 +185,6 @@ pub fn vim_ctrl_d() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -224,7 +219,6 @@ pub fn vim_ctrl_u() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -254,7 +248,6 @@ pub fn htop() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -284,7 +277,6 @@ pub fn htop_scrolling() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -314,7 +306,6 @@ pub fn htop_right_scrolling() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -352,7 +343,6 @@ pub fn vim_overwrite() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -385,7 +375,6 @@ pub fn clear_scroll_region() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -415,7 +404,6 @@ pub fn display_tab_characters_properly() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -445,7 +433,6 @@ pub fn neovim_insert_mode() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -477,7 +464,6 @@ pub fn bash_cursor_linewrap() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -509,7 +495,6 @@ pub fn fish_paste_multiline() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -539,7 +524,6 @@ pub fn git_log() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -571,7 +555,6 @@ pub fn git_diff_scrollup() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -601,7 +584,6 @@ pub fn emacs_longbuf() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -631,7 +613,6 @@ pub fn top_and_quit() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -667,7 +648,6 @@ pub fn exa_plus_omf_theme() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/layouts.rs b/src/tests/integration/layouts.rs index 42a5b66f..4c64afb2 100644 --- a/src/tests/integration/layouts.rs +++ b/src/tests/integration/layouts.rs @@ -1,7 +1,7 @@ use insta::assert_snapshot; use std::path::PathBuf; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::panes::PositionAndSize; use crate::tests::fakes::FakeInputOutput; use crate::tests::start; @@ -34,7 +34,6 @@ pub fn accepts_basic_layout() { opts, Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/move_focus_down.rs b/src/tests/integration/move_focus_down.rs index d8121994..b1032bd0 100644 --- a/src/tests/integration/move_focus_down.rs +++ b/src/tests/integration/move_focus_down.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ MOVE_FOCUS_DOWN_IN_PANE_MODE, MOVE_FOCUS_UP_IN_PANE_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, @@ -38,7 +38,6 @@ pub fn move_focus_down() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -76,7 +75,6 @@ pub fn move_focus_down_to_the_most_recently_used_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_left.rs b/src/tests/integration/move_focus_left.rs index 9533184a..4842f342 100644 --- a/src/tests/integration/move_focus_left.rs +++ b/src/tests/integration/move_focus_left.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ ENTER, MOVE_FOCUS_LEFT_IN_NORMAL_MODE, MOVE_FOCUS_LEFT_IN_PANE_MODE, MOVE_FOCUS_RIGHT_IN_PANE_MODE, NEW_TAB_IN_TAB_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, @@ -38,7 +38,6 @@ pub fn move_focus_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -77,7 +76,6 @@ pub fn move_focus_left_to_the_most_recently_used_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -116,7 +114,6 @@ pub fn move_focus_left_changes_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_right.rs b/src/tests/integration/move_focus_right.rs index 03177bca..6ff6e21a 100644 --- a/src/tests/integration/move_focus_right.rs +++ b/src/tests/integration/move_focus_right.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ ENTER, MOVE_FOCUS_LEFT_IN_PANE_MODE, MOVE_FOCUS_RIGHT_IN_NORMAL_MODE, MOVE_FOCUS_RIGHT_IN_PANE_MODE, NEW_TAB_IN_TAB_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, @@ -39,7 +39,6 @@ pub fn move_focus_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -77,7 +76,6 @@ pub fn move_focus_right_to_the_most_recently_used_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -116,7 +114,6 @@ pub fn move_focus_right_changes_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_up.rs b/src/tests/integration/move_focus_up.rs index e6e7c301..068ded52 100644 --- a/src/tests/integration/move_focus_up.rs +++ b/src/tests/integration/move_focus_up.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ MOVE_FOCUS_DOWN_IN_PANE_MODE, MOVE_FOCUS_UP_IN_PANE_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, @@ -37,7 +37,6 @@ pub fn move_focus_up() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -76,7 +75,6 @@ pub fn move_focus_up_to_the_most_recently_used_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_down.rs b/src/tests/integration/resize_down.rs index 47293951..cc4b9ec4 100644 --- a/src/tests/integration/resize_down.rs +++ b/src/tests/integration/resize_down.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_DOWN_IN_RESIZE_MODE, RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, SLEEP, SPLIT_DOWN_IN_PANE_MODE, @@ -49,7 +49,6 @@ pub fn resize_down_with_pane_above() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -95,7 +94,6 @@ pub fn resize_down_with_pane_below() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -147,7 +145,6 @@ pub fn resize_down_with_panes_above_and_below() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -198,7 +195,6 @@ pub fn resize_down_with_multiple_panes_above() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -251,7 +247,6 @@ pub fn resize_down_with_panes_above_aligned_left_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -303,7 +298,6 @@ pub fn resize_down_with_panes_below_aligned_left_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -353,7 +347,6 @@ pub fn resize_down_with_panes_above_aligned_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -404,7 +397,6 @@ pub fn resize_down_with_panes_below_aligned_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -458,7 +450,6 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -514,7 +505,6 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -587,7 +577,6 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_lef CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -662,7 +651,6 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_ CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -705,7 +693,6 @@ pub fn cannot_resize_down_when_pane_below_is_at_minimum_height() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_left.rs b/src/tests/integration/resize_left.rs index d0581c52..c5ba5427 100644 --- a/src/tests/integration/resize_left.rs +++ b/src/tests/integration/resize_left.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, RESIZE_UP_IN_RESIZE_MODE, SLEEP, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, @@ -45,7 +45,6 @@ pub fn resize_left_with_pane_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -89,7 +88,6 @@ pub fn resize_left_with_pane_to_the_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -135,7 +133,6 @@ pub fn resize_left_with_panes_to_the_left_and_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -184,7 +181,6 @@ pub fn resize_left_with_multiple_panes_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -235,7 +231,6 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -283,7 +278,6 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -333,7 +327,6 @@ pub fn resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -382,7 +375,6 @@ pub fn resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -436,7 +428,6 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pa CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -492,7 +483,6 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_p CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -565,7 +555,6 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_abov CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -641,7 +630,6 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_abo CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -684,7 +672,6 @@ pub fn cannot_resize_left_when_pane_to_the_left_is_at_minimum_width() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_right.rs b/src/tests/integration/resize_right.rs index 562161b7..43409ec1 100644 --- a/src/tests/integration/resize_right.rs +++ b/src/tests/integration/resize_right.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_MODE, RESIZE_RIGHT_IN_RESIZE_MODE, RESIZE_UP_IN_RESIZE_MODE, SLEEP, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, @@ -45,7 +45,6 @@ pub fn resize_right_with_pane_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -89,7 +88,6 @@ pub fn resize_right_with_pane_to_the_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -135,7 +133,6 @@ pub fn resize_right_with_panes_to_the_left_and_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -184,7 +181,6 @@ pub fn resize_right_with_multiple_panes_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -235,7 +231,6 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -283,7 +278,6 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -333,7 +327,6 @@ pub fn resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -382,7 +375,6 @@ pub fn resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -436,7 +428,6 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_p CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -492,7 +483,6 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_ CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -565,7 +555,6 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_abo CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -640,7 +629,6 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_ab CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -683,7 +671,6 @@ pub fn cannot_resize_right_when_pane_to_the_left_is_at_minimum_width() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_up.rs b/src/tests/integration/resize_up.rs index ed4d5f1f..200fcc6e 100644 --- a/src/tests/integration/resize_up.rs +++ b/src/tests/integration/resize_up.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, RESIZE_LEFT_IN_RESIZE_MODE, RESIZE_MODE, RESIZE_UP_IN_RESIZE_MODE, SLEEP, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, @@ -47,7 +47,6 @@ pub fn resize_up_with_pane_above() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -93,7 +92,6 @@ pub fn resize_up_with_pane_below() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -144,7 +142,6 @@ pub fn resize_up_with_panes_above_and_below() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -194,7 +191,6 @@ pub fn resize_up_with_multiple_panes_above() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -245,7 +241,6 @@ pub fn resize_up_with_panes_above_aligned_left_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -297,7 +292,6 @@ pub fn resize_up_with_panes_below_aligned_left_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -347,7 +341,6 @@ pub fn resize_up_with_panes_above_aligned_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -398,7 +391,6 @@ pub fn resize_up_with_panes_below_aligned_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -452,7 +444,6 @@ pub fn resize_up_with_panes_above_aligned_left_and_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -508,7 +499,6 @@ pub fn resize_up_with_panes_below_aligned_left_and_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -581,7 +571,6 @@ pub fn resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_ CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -656,7 +645,6 @@ pub fn resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_ri CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -699,7 +687,6 @@ pub fn cannot_resize_up_when_pane_above_is_at_minimum_height() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/tabs.rs b/src/tests/integration/tabs.rs index f81c1cc6..0995d16c 100644 --- a/src/tests/integration/tabs.rs +++ b/src/tests/integration/tabs.rs @@ -6,7 +6,7 @@ use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots} use crate::CliArgs; use crate::{panes::PositionAndSize, tests::utils::commands::CLOSE_PANE_IN_PANE_MODE}; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ CLOSE_TAB_IN_TAB_MODE, NEW_TAB_IN_TAB_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, SWITCH_NEXT_TAB_IN_TAB_MODE, SWITCH_PREV_TAB_IN_TAB_MODE, TAB_MODE, @@ -39,7 +39,6 @@ pub fn open_new_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -76,7 +75,6 @@ pub fn switch_to_prev_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -113,7 +111,6 @@ pub fn switch_to_next_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -150,7 +147,6 @@ pub fn close_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -188,7 +184,6 @@ pub fn close_last_pane_in_a_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -228,7 +223,6 @@ pub fn close_the_middle_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -273,7 +267,6 @@ pub fn close_the_tab_that_has_a_pane_in_fullscreen() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -310,7 +303,6 @@ pub fn closing_last_tab_exits_the_app() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/integration/terminal_window_resize.rs b/src/tests/integration/terminal_window_resize.rs index 4bb7240b..2e56300f 100644 --- a/src/tests/integration/terminal_window_resize.rs +++ b/src/tests/integration/terminal_window_resize.rs @@ -1,7 +1,7 @@ use crate::panes::PositionAndSize; use ::insta::assert_snapshot; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::fakes::FakeInputOutput; use crate::tests::start; use crate::tests::utils::commands::QUIT; @@ -36,7 +36,6 @@ pub fn window_width_decrease_with_one_pane() { opts, Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -73,7 +72,6 @@ pub fn window_width_increase_with_one_pane() { opts, Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -110,7 +108,6 @@ pub fn window_height_increase_with_one_pane() { opts, Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer @@ -147,7 +144,6 @@ pub fn window_width_and_height_decrease_with_one_pane() { opts, Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/toggle_fullscreen.rs b/src/tests/integration/toggle_fullscreen.rs index 8707afff..00d98170 100644 --- a/src/tests/integration/toggle_fullscreen.rs +++ b/src/tests/integration/toggle_fullscreen.rs @@ -6,7 +6,7 @@ use crate::tests::start; use crate::tests::utils::{get_next_to_last_snapshot, get_output_frame_snapshots}; use crate::CliArgs; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::tests::utils::commands::{ MOVE_FOCUS_IN_PANE_MODE, PANE_MODE, QUIT, SPLIT_DOWN_IN_PANE_MODE, SPLIT_RIGHT_IN_PANE_MODE, TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE, @@ -38,7 +38,6 @@ pub fn adding_new_terminal_in_fullscreen() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output @@ -74,7 +73,6 @@ pub fn move_focus_is_disabled_in_fullscreen() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), - Options::default(), ); let output_frames = fake_input_output diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 86391456..7aaad79f 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -6,7 +6,7 @@ pub mod utils; use crate::cli::CliArgs; use crate::client::start_client; -use crate::common::input::{config::Config, options::Options}; +use crate::common::input::config::Config; use crate::os_input_output::{ClientOsApi, ServerOsApi}; use crate::server::start_server; use std::path::PathBuf; @@ -16,12 +16,11 @@ pub fn start( opts: CliArgs, server_os_input: Box, config: Config, - config_options: Options, ) { let server_thread = std::thread::Builder::new() .name("server_thread".into()) .spawn(move || { - start_server(server_os_input, PathBuf::from(""), config_options); + start_server(server_os_input, PathBuf::from("")); }) .unwrap(); start_client(client_os_input, opts, config); From 07ca0cbb11bbc0491e134c863cd8a6133c2a9cf1 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Wed, 12 May 2021 23:57:22 +0530 Subject: [PATCH 14/16] Fix after rebase --- src/server/mod.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index b925b4d2..4c6fb757 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -15,9 +15,8 @@ use crate::common::{ os_input_output::ServerOsApi, pty::{pty_thread_main, Pty, PtyInstruction}, screen::{screen_thread_main, ScreenInstruction}, - setup::install::populate_data_dir, + setup::{get_default_data_dir, install::populate_data_dir}, thread_bus::{ChannelWithContext, SenderType, SenderWithContext, SyncChannelWithContext}, - utils::consts::ZELLIJ_PROJ_DIR, wasm_vm::{wasm_thread_main, PluginInstruction}, }; use crate::layout::Layout; From 050d846b5e41851d4ff5e8a4bbd7f24c72754507 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 13 May 2021 18:37:59 +0530 Subject: [PATCH 15/16] clean and exit on window close --- .gitignore | 3 ++- src/client/mod.rs | 27 +++++++++++++++++++-------- src/common/os_input_output.rs | 11 ++++++----- src/main.rs | 8 -------- src/tests/fakes.rs | 4 ++-- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 54137021..433d02d7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ .vscode .vim .DS_Store -/assets/man/zellij.1 \ No newline at end of file +/assets/man/zellij.1 +**/target \ No newline at end of file diff --git a/src/client/mod.rs b/src/client/mod.rs index 2fada592..862c13cc 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -132,15 +132,26 @@ pub fn start_client(mut os_input: Box, opts: CliArgs, config: C .name("signal_listener".to_string()) .spawn({ let os_input = os_input.clone(); + let send_client_instructions = send_client_instructions.clone(); move || { - os_input.receive_sigwinch(Box::new({ - let os_api = os_input.clone(); - move || { - os_api.send_to_server(ClientToServerMsg::TerminalResize( - os_api.get_terminal_size_using_fd(0), - )); - } - })); + os_input.handle_signals( + Box::new({ + let os_api = os_input.clone(); + move || { + os_api.send_to_server(ClientToServerMsg::TerminalResize( + os_api.get_terminal_size_using_fd(0), + )); + } + }), + Box::new({ + let send_client_instructions = send_client_instructions.clone(); + move || { + send_client_instructions + .send(ClientInstruction::Exit) + .unwrap() + } + }), + ); } }) .unwrap(); diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 5e7b3ce2..adde6fdf 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -314,7 +314,7 @@ pub trait ClientOsApi: Send + Sync { /// Receives a message on client-side IPC channel // This should be called from the client-side router thread only. fn recv_from_server(&self) -> (ServerToClientMsg, ErrorContext); - fn receive_sigwinch(&self, cb: Box); + fn handle_signals(&self, sigwinch_cb: Box, quit_cb: Box); /// Establish a connection with the server socket. fn connect_to_server(&self, path: &Path); } @@ -362,14 +362,15 @@ impl ClientOsApi for ClientOsInputOutput { .unwrap() .recv() } - fn receive_sigwinch(&self, cb: Box) { - let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT]).unwrap(); + fn handle_signals(&self, sigwinch_cb: Box, quit_cb: Box) { + let mut signals = Signals::new(&[SIGWINCH, SIGTERM, SIGINT, SIGQUIT, SIGHUP]).unwrap(); for signal in signals.forever() { match signal { SIGWINCH => { - cb(); + sigwinch_cb(); } - SIGTERM | SIGINT | SIGQUIT => { + SIGTERM | SIGINT | SIGQUIT | SIGHUP => { + quit_cb(); break; } _ => unreachable!(), diff --git a/src/main.rs b/src/main.rs index 2430d84a..49e42ffb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,13 +24,6 @@ use std::convert::TryFrom; pub fn main() { let opts = CliArgs::from_args(); - let config = match Config::try_from(&opts) { - Ok(config) => config, - Err(e) => { - eprintln!("There was an error in the config file:\n{}", e); - std::process::exit(1); - } - }; if let Some(crate::cli::ConfigCli::Setup(setup)) = opts.option.clone() { Setup::from_cli(&setup, opts).expect("Failed to print to stdout"); @@ -43,7 +36,6 @@ pub fn main() { std::process::exit(1); } }; - let config_options = Options::from_cli(&config.options, opts.option.clone()); atomic_create_dir(&*ZELLIJ_TMP_DIR).unwrap(); atomic_create_dir(&*ZELLIJ_TMP_LOG_DIR).unwrap(); if let Some(path) = opts.server { diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index 62375914..98ec694a 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -204,7 +204,7 @@ impl ClientOsApi for FakeInputOutput { .recv() .unwrap() } - fn receive_sigwinch(&self, cb: Box) { + fn handle_signals(&self, sigwinch_cb: Box, _quit_cb: Box) { if self.sigwinch_event.is_some() { let (lock, cvar) = &*self.should_trigger_sigwinch; { @@ -213,7 +213,7 @@ impl ClientOsApi for FakeInputOutput { should_trigger_sigwinch = cvar.wait(should_trigger_sigwinch).unwrap(); } } - cb(); + sigwinch_cb(); } } fn connect_to_server(&self, _path: &std::path::Path) {} From 8d742ccc53770032d8d5891a6ff43875f4987ede Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 15 May 2021 23:07:39 +0530 Subject: [PATCH 16/16] Docs(changelog): Multiprocess model #499 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 359e0f07..536e1012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] * Remove unused imports (https://github.com/zellij-org/zellij/pull/504) +* More Infrastructure changes for the upcoming session detach feature: run server and client in separate processes (https://github.com/zellij-org/zellij/pull/499) ## [0.11.0] - 2021-05-15