From 9427b206b416de79644e3533b33015a6451106f3 Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Wed, 3 Jul 2019 19:07:04 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Project=20structure=20changes,=20ve?= =?UTF-8?q?rsion=20change?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets.sketch | Bin 0 -> 19748 bytes phpmon.xcodeproj/project.pbxproj | 60 ++++++++++++++---- phpmon/AppDelegate.swift | 22 ++++++- .../PhpVersion.swift} | 18 +++--- phpmon/Info.plist | 6 +- .../BootChecks.swift} | 45 ++++++++----- phpmon/{Helpers => Terminal}/Services.swift | 10 +++ phpmon/{Helpers => Terminal}/Shell.swift | 7 +- .../Base.lproj/Main.storyboard | 0 .../ViewController.swift | 0 10 files changed, 124 insertions(+), 44 deletions(-) create mode 100644 assets.sketch rename phpmon/{Helpers/PHPVersion.swift => Classes/PhpVersion.swift} (51%) rename phpmon/{Helpers/Environment.swift => Startup/BootChecks.swift} (60%) rename phpmon/{Helpers => Terminal}/Services.swift (79%) rename phpmon/{Helpers => Terminal}/Shell.swift (78%) rename phpmon/{ => View Controllers}/Base.lproj/Main.storyboard (100%) rename phpmon/{ => View Controllers}/ViewController.swift (100%) diff --git a/assets.sketch b/assets.sketch new file mode 100644 index 0000000000000000000000000000000000000000..12f1a5dd9f95b1ab767b78d17cb636daf36c2b2b GIT binary patch literal 19748 zcmcF~V{|4#*X@&JVq=m_Y}>YN+qN~q#J25BY-8eNVp~sa>q&Cweed_@yZ>*mb*idY z_3ApcyI1$w`&22(LVUvjfCFFv|2difbU!)40Duf|008mdxtXJ>yS=%C8-tCjqeH0D zq{AO36cAQ^!&w3fL0e#?*iw4dHkAm)T1jON_7Bn^rO%#d=_pzC$D`b}OzoM-YE^0v zUKZj^ndk3|VGlPQ8rh0cQ^BODP6C8sV8wZazHB$a849C=%!hntG52$Pc_UOJSWH%K zojN*JWhG+2RhHUQXe!+n9T+tERjd+IGtNxR$>E&LY7gmG9P(YWk9czI?UvCT{?zvX5WU-;?rackg`|1@!QV!EnwYnf*BAQTa` zh|H{trLvuUNtHd_ip6qH->;&7il5~_)V$+-Z5wZ;pPv(;cpkr3)syiG#j9tstCL*D zaj`U4R`(_4K$|viWkXxO`e4}i&qwykA0a@t-i_yqT`f=?WRCW8qnS@!H zIYl`*n1uiP3@-KUU2!>+K541_Ikc?0N%N8Fx@u({RGmG}Yisp%n}@XcCQG7<&@9_P zJ8jIO%6PqTVJXzS#WH3#Tqo9m*nm#oz^k8zp!+)uFHg_gkKxOkkCXkS;iZTC1D^Zy9WoJo*#&mKfCa!!tQU~TyFV;G_i^m z+ZNV9j%|l<0((30Gd2PDPL_Go0!YU%A74HG?#y|5+na{5wE@_l%vn9XI(j|SKk2FG zHL*Nb7T&Xe8(JL1W9@wLba&wT2e{v!+r2n1dTk@Ths1XbY22?l@x5Ae&?8q@s!bW_ z>&1^;*ByVK+ZoloKR;V2KYJ#8!99(;zI$0XIZHnk94X$BeK*$y9a;GK@^-$RyK#K3 zxUmp!+XXzwqYB(M-cBJeOd=QmPKE!%-ih7WBD%j{`>>kZA{_C&e>nBv8kl=IjNecm zo-aAuA6DeD-Wd@8cs|eSBkx!{aRAlb0{y*CI9RG*4j#!H*4%nCS`Q=M)~sIkM)$VD zonjHw$rxod>#bjpMo-nZKt5hr8nuj$z1d&R3pwF$aMRDgv(deaL914?y#p@;pQtZA zKjhHpS0@g`uH)xhAYA_Ky?-Gb7xA^_!n-a;!s$o%Z3f{^_vg!PfWT1V-=?_}&6MAL z)thgxL5GvbeR>Cv&nvOF3`MOX2(Mn8_|vr<%MxY`5~%EvBYW%hEa>HxB;z{8?dVyS zw+ObT2g`4?-L5ZJ4nD4eggrmLeiPIij&cDW+uD06uNl)^RDb>%@N@O%f79CW4{y|l zdRiKGY{BTI#=yvdpEpT$dhckj29^9FtV#envh(CmdlhOb(%IvQZSli?(OOQ zh%jj_Lq8iSSA%6AMz{Xu$@$zgg0&Pn|G`Fm{^BgeAc?N_-D|Y(RH*k2>8Jn5yMO|G zo5S6w#lY8%jbFUmi;%3}l~cf1{hLznF*3`CI(5+*F|JMo4NXN;Fg7AMY8K8u+2N4Q zkC3~t5tKgWUr-Ht$wp`F+BH(QEX;3Lod&RG0-s!+Z)f#y9U5h?RcVJs(HqN$TaPy$ z59u}0s?hYo%yD98KTr{7{XEuCk<`Qn+W`!Hufwn4h*nw*)12maZ|rN<@hA;HMq2ufFF$2lSL%k9!hi%lQe1hVeKi)k5NSfERboyAvV-SGZSj} zA+8^C6WZ?;eat<7prXblmsl#?qw!!m-yl+JE3f=3k$l;6dpci5DEd#}bm^C7v3&)4 zd_nIXQN=;Ss&deFajNK95ZEv=hL|Q z?uIoVH!OHdHIHr)!-jow=N1}H^qRo6D>4;}+uKCsXmjU=1l`j;;xwG;kL1p^s^t1* z>9ro!Xj$4GpE3dE+ED#h)NqSh2Xn83@U+f|IUqX~an78K?cF6JP z(@d#RH40$;#-BmsHF#}5?!#Mixwq*7UH=LjMS{EJXgOjlR4L8dRQ#*B&=B~pVYiEd zMg5$r(@==JCi$a+4R9|n1JAfNqXFVi+V99)z^_7k%`oF*;I$dHN7Sn7D6Rq><9B{} z@emTctC%!>sGn;O_Zv`yUHE~4-O}ZJ(rVl!7%fBIgHj0$WE34M>rX+U+q2h*AIBUI z_UPR;l^4pYw88#qz09#`_3KxsPEFylrYIG{3sw03A&86?id{$?p9DUXS2+npnztwQ zeXX$(8hX}D$R}H<2^;eQCNLST6MQ&7QW4+^may?IxQp>Ls!OZr7qYOLN{dmhkIQ`} zTNcY&ub~5JA@}a)js#{E^`UgD>FJ=7Tx1DjhaFfq)1FZAp;e{mC7XS~@s<^`vcoRN zH8%MDO`hxLdK{~aIcjg)C3!FHSA=;l3qALz3;Av6ZJGTybal6<__h?UBZMY#EGh?) zdcnyxAf?@qlMwue{4= zOKn!U57%Da=&=8hK0C^ARg=ul_4mz#SeL`^jbwFn47D(=tg!%j+MBk^#P;Bl-|qX; zhWu587L8@-5Y61;zMPTjZ&=)%Ne%!l5HFqh!B~YKiUd zs+t#j`%Qh&Q^NVSuxez!R%os0ez}H!7!GGwWWE4T)tWNsf;A%FAL(}EY_;ulmjk)C z3wTNFsi*W{qv|}rM*@gHZEDxVK>0Nt(Ed6 zo7E^RaesQgH}F-qz3|-gCuWiSRl@$U}n>}1DC0>w(_Jm)+`V~pJ44@H61CJ9pZ(O z$x(jRkvOh%XdWy@q8J5}N!p;TN>YiG!@Xw(v(qWq9LF0W(eLwI0bRJwf3{V;&F>R{ z5@nzaO(YdDfG+%la>QF9r#x6$wm5DF2j&(|J&lSCO3m&~3_z}>sX~NM_1wx2^@#08 zfv|pe^nJMn+HHLWVsw8ppw~*X_hhc!GlFqFwXXPS#%Y}k8UP|H=goFo9c;;6RHm|| z(;_F(r}vjq@MJqB>ClxXzUtZHn$*+xYik!Qy*YlMlM!T*n5jsAd4-se? zfD3s)(IFiVQpnNQVTN5{N)B9)Y8JzN3NR`=UxL+9o~j~p!!N1sJo*IVoP3^Lw{b4) zMd?g%F8qrN=wTY*po)2if?uufB6R!ci7IjH5C_&Wg`#kfWpKpJU~qEv6e4d8(5sS< zC2W5TQ~#-(3im0^9Ues+P9YKjLz$5y>NjWER2mc)kX)vI6L%G?DLsvdd4)-HqF_ZO z<~9+gFezq;B7RYemF_a7xnM5Q^JidW*Ul{n3-KDKF7CxO3~=`@UXBwlWHq+G6Qf~U zh8(7Tq|gO7Fe9kuoTzFl&)2nF|5hbxl89ZZgh(|IIYojFnMHXK{49`1rk>)VrX$5j= z_Zy?bB$g^D5BfZ+MT$^0r=SPci~+v)XI9^jspHj}GC*HGqGR1?dJAH`i(;Xc&l3~F z!p5F?s&N_J=V@KvcI?rY>Q80=&z%X3&aUCaULBzo_z4wtjj4JU1kRMQlHm7=CJESuKQwC)CypOeRN5B0ZcXjJr4EFTSIpL_i1`=( z)!g8(!b*9yVgK8NvCQ~TyB9h_zl&lxo65+QRwrnwcVVy1TmjO+rm87R-k-&4`PeDm z`B`fU9XivcW9y(9uvAlXQ)jJs$qZx4vnwO=XbLN{kLXKYD_ zeqK#XAfz46rzG2l*InB~TsZDJ1u-5~d?2STl%Ht}&U0jhj!bd7Tt_g(Lt%^UL|kf| z@}r8oF1dRm$m~Q3S0l-i#@;OPYsEN8Br26lg77$b{_78XcVg0L^PDc z!bqBZR2Ep*MaoO7`MEs!vCtb5s~YL$K#4HbsEmG+1|BGg@!Q?P$2hm1Z+F3`6?}q3jiWfK8!rc5TtY~1z>F8Z~4&UbHoDBY3EY>Oj(i2BSion2|Nf;NpUkbR}R6p zsdxNgO@nnHM{fbquU$D72n(@)!Cf5kL@$5>p*$rdtxQkzUHM|XBrk^c8$L8F01X?O zqQw};`c!i#6U;uUh!+q>D-(v88j`S7N{^G9G1}1@?u=gNpD7 zeauZd-aCVD2_gMZnRHHyqNqwt*>>C>fD|XHOOh*5m^nUC@XD+uds7rYu^y^2B_yq^ zM`4Pv(tWfOh?W#$rY2hu{%eogj0Zt9xm&$z8g-d$Ce!N)1wNidmraZ>HbO3_xQ|+l zgu0UMmwKS=^TV}F;}Z$1q!T+6Nkz$!OK~K;o_SUg=9}HM44;l!LaF5M#8i7sya-g1 zWGnJBS#u1{)*5pPf@kcBPMT7j0tIsf?A^_f#AuvU2rwxFU2^u8%_rtG%a+LsGdWsZ z7_;~hPo!WkO0v03-CbtOYiq~!M-Od6(^FGAM*5LP|4Am*HBq-{YqA0St zta1fSKi^24ld{x-$Axt2l)FW^OglNPBWOk+Z-Kn(MLS-vL zealK1CZG)N&_enp298pVHK4_ClE<2Dn^w6JnKn46Lq&$EC9)7$Sc)wEuKQ%27++-8xA#80YX!-R+?*rH;K>frVlWW*fGcLo`G zG*>E*d9i)Fr(eTHszB)iUoV%B%SP(*cT(jEE)qPYeT2tvxlI_&^&;wZI5S0k?CR3i zY4EIvM{LZ-9|vSyoTSlpdoNXJXj zjZ-8l@H~>uWM;OpvCYk*eX&~k-%yo6j|o9c-;>z~L{vUA*`MyYqv*S9C65#Grnsx& z1f<}SU>&SqTlO~{0$NH*)g_%PemC{VvsE&h7%Bm;Bm`q9t|#Z|^}XfD<7Cs-BR9A$ zvzXl=VDK@}QJPamn8w*_;;jWy^pM83{Cv8c>FRoq5&yBr)|;0}Umn=8$|V(DT{QPWc)U(W( zz1BjxXl-p~g0lC3dX8u3RvO@|vW7_+Qp}G=e@iTx)$pu#*mQXX&6s;L{A$@~2bVI$ z;uaWFYOqH##YIvRKRhW+O8ilE&dZdYdBtUm8Ls5M+~rQ=e^qG7Qi_*MJxL_(aZ(L~ zk9~{D@6Ll7_Gc)EA`3AEhQCulh1|p(NX81MSKc^~_!aqQXeY&X(2j$o z=zY%%Zg^&9=nf@fnoYYtk%d90iz5Y6M!)f!S(Ml;N+ebmy3{%jF0trg-*fGhgWkG+ zM?jxrQ_XbVnO>0(GA?B;a~)E8#r8(+;gTf{^@o%3P*;J2JQF~2buPW?NT5~*h z@CW2M@Bev^UpS`ES4-`O<8AMwwnwc#1u= zR~a#AMiS8AeX~J4@4`gl;Ypz2(O|-wQ5w+WlZ3pl5kKFE+R2N0&Na}#pjhb%DMJ%% zfYT2jQmlDHV0Z997xZ_-Yb$mA=Uj*kT;u$ubDVT%Ly ze&uZE4_8J@?Tv@BPz0eb|7&TvhIDls5^>4F;7Znq)M)69Dq^8P>A{^};Svh-~Hu87ZD+9E?#Wb`8HX38h0*(x-K{r^fGte$#Kd zhy@)|nB&d3S%nJdMH9B0lBhn~mRh})Fl~**WD`H6^HPUV(3}l+*KZ6d zfsM~mXzA^>ihSN-@br~NITi#Nmj1uG7?ao1$3e+y<6`o)+6*>@fC8mObkSr|Vc66T zBs?zx?gt8T?#FqQx*pnh3wGu;W^fIa%SNZ#30L>L^iiu0>MXL`#vHsz9W+y}#kU!I>&GX9>-@!YbTcI4UA1O9YRq&Mm~^6ed&~$up2W82paZ3 zab2;(x8O|Gm#Snz_*kf!F>=H&H8+X1=$FcxZ>`x4ua6eR z3$EQYQ4ECS7yPCWFSLx>e+XFX9gdw!2N$t5@ zv|<&LEhZB#(sq?3MMK66w5)u&l25NC%tQ>r@dhTb{hDPIjiI-tf=B%^mKJ0+z*=c&p$F zmC%wLW=(TGdKQWjqeBgz0oJyb%EJy5G47OtR*;_s89S{kMG5%iEz$PxFu#PilPko#IL9V4x4vx;8uR{He zwWEXC`q>^oE0Iw&q!yMXlYq|=U892geDg(Pe<*uQ+7$E z+$;whYG5AcxRR1>F(YVT^nRgBhMLGx*D2_=9mZGFcO#|nZpvY^uU+fv6y*wA)bXDV zfDX=U2VGQnacEPyavnaq^ns^ler$)wmj2Tp+R4v}I4wS0Bf3~Hun_S575#LES&;MI zABxH;!u$9gyOR~elNY~FxnSzLWJUA;zAk|ONl zS_znAfjvZ9S%@?c9$`U{)Juo@M>=hvM^AFiHD8e&8y%`i<&D;OiYlaPg0LzvCNWUi|wdJ5QoN@SAZE-r2* zdYzI?3uY-ug#XwpUg`>G>;z#=oSCz{Il^7XqI>UHRFJ;5HZ>_JX@kMx;bCLIhtKKh zX(GSx)6gSb_s6AUde?PtR{_IDW-cU*N?9b4h5z$S`vtTYG9vI0rQg?Tw%-?F_Y$9x z6f1yZil{FQU`0<`FTH2DCIn=_P5s&BAY{-}Btb(%!xr3h9hzcdRIVtSZs1e7>As>r zKQ~AGTcak4GS5q7`*qrLA`+d_?E=ftuVK^YyhfxGo}t}{cF3|w^zMF7I8gRs5*^YDtCz%>EfP+T@^yL0Oa2K|Om!9UxsO7xZu zND*vu^5{z3;OcE{Y|P%DF6Wn*DL6NsLb@Mo98+y;J0yDlO?9$m#o)K8C7WThRieZ_ z8?iqJ;^5b;lA@inLL~g;bgAoHg&q5OQfFv z|Oj}HDoMjXN=NBl?BL&{?1SdR|xWTSP{sguubrK7J*Ta0_MHyQzd9U{5kR{fI9v9 zk{}%y3(=-PXSV<86l#RNZ6}~>x-L6A+x&XFrW8*;qtv&xJKA%Q|+RO8#v$Hcuc6@Gf z6T$nxtS&qL&*SQv`sB7NwM&HZ1K*R!=fed-#y@ay&}ysnettaq02L)T4bQp6i3<2E zy|H)sBVKE#ydj04yqI?mZA2+auCa}w0#Ue-&@d4Vpm<_?56Jd^+N$qX5o0XtOvVPu zqf(+CEjZimwqY{wh6PkJUJBg&-c6wc;DgFYH_(`H$y-l;a~cwNb%m8SINJ%!ODbfV zy3V$=wEVI9OAW0l-uu*2H}2VcpSwy>PK(FqrKC}<<=lDXt*%HE9~&$Eyc+>}JIUZ% zNKS?TFdcX6n|=o*)~Ik1VZ*}8L0StnfF%sV&8jzV^peE5fhj?PD%k5ye#5AXBolfe z6s`{ZyySc!d={TG%Nv_HQ?-)6ehDOwrC1F7@}GJ?JbR=+dk%F$<)*IpUuB&#MChlG zf;ssdAnveTX$Q3zOF)foPC?;9S4(UG1_GI;lBzI>V2wbs_a&3CeI)AQFFDJ|8Q;9b zXp`qyOgm6^D`59B9%XD*lt+3s$oW#7cs_sIJWsaZ;*=B?3a_+Ezndt!c8<7yeLTHkT$e( zQ{oYn&XJs)F!i@)9`h)mY__|Bh!rQmm@u}J$Vj?;gJ*DQv9jXONe;-+u0Wb_3oQ?tlZ{`Ge3ROnjnRf+}rTkoJ-r3$*K36+DOfNuPZ6g7-8 z6eseGSCt^9X{6fK-J_h_#>e4&6C=Tw-H<<}{AK60T?*GcES7HYck=4$ zY6UG`x7EejS(0VGKS!Rge0W&nk?wwFYg3b|LqMZK=Ll^90Uo>}t{4Kq2ex7fOt?f^ zm8t=P1Wb-aLyD;()K3^G=C;u|t&U-p z^tVRqxxUm&wD;R+@5eE+3VG*DoeEw z+!f}69$ysTPJW9gWKLw>d?dKPoMZC{`F75dv((=7xT`dqBrsOwL^0D}-bLKj2u2a* zqN19YEWzi#q7zGb4ZzE;QbIN#93gStJ}fv|{FKIhn>&?lyarVp&o_v2Cp-Eiho0Z@ z6(b@cP4rHKy)JzQbR4e*yw0PC+z}Gur^WNJ&=C5YiCt~-k@c;v#7AEXw@}agx@Z0_ zcJW%Vt9Mf3dfqGWy1k5k*S2+u0vkTx1V9rOdFF}3PDFFU1%ibXgsDRHW^l~8ko18~ z2f8_kDi~~&-QAHV+V$5(E`Zejg!sJu+V0)%=3Ah@+Z}M`4$c-@oL*#4DArxzz1n#s zp|`r3L0TkRA*L!$I(b>>tfe_moNKh%^UIF!u*sgB+jAWZpwm_6rn?q&6fWIVvs1`#C-~}X^O)fGx1|7cKoGpw0r2Y=_frz7P=f_jv8c=41N(hmqjEse z?uj|7`6O8ux1PBq$QLt{iby8nlzAcLLTO0{EmisFe;ZH|1ioGH+^AOTkd=N{;hVm; zA3L}$jOT27n0PnLO76_E;cvPR%s{R*3*6e;qJMU{Oz3)>4%$*32|rkjb&3GPtkEg+ z4Gv*H7I^KBdp|OxCAWW|zr86-P3%4f<EMm)UIwwWie;{TMB7IFaZ_Ae0V$`-sf#$O_7kDDrRDqofm!GhO=Z4I9lQw4u>m^gu?7uyg3;;dq5iX zptqVqJIrA+q)b&STv3kUsAD&TX(H(P^6~C;wEk_8w}94;5g2MNEoKMqU}Pkeuh#9q zLUS5z69EfJg70Adj0vWfF{a4#Sd*Sgrq9?|yDg+Svou6K-_*_odf)Qu{$A&be->>f zUNeSYH$7gYN+8YKgVGD-u~9dAQ?DT+YM;Rc&ZtX#Qu)ZiPmDi$sH}bpk$J}p?;>HF z55f?;V(Wn$g8Dm2BMB^K#7#oX2lQk0yx4ub8}d=X zO};$|*roJ>nV#vT2)B-Ck!$%FGBs@{!b_+3B0lBXW?G%k9EFRZVf(Httc&~h{`dD} zNm)!HS7hs^G4PN}%fdp5^U;0!@{!7VX)@7%CuW4aL0ws(fPi_-9Pah*JW>WfrV5k4$OpH$>X@;Y`vf4Nn+L zOmjjjnk-?y@Q}XBsh;ZbpdNagg78@5?%}UWZwg!e4k_RuF6k@Kw5(Jh0cHumn+IV` zBR2$az3dvdI57*c5I5nHCrn~J8nj@5H9nEhwh#VtzAG>dmwRlQ-}> zvhCwtWGf`#qMT1>TQR4ee0=_=u_SQH+rzb15nqbZ3GR>C92_qI?;OF+uH<;vsT3ah zj#fu1`KIsP4+7j=p0Z_$NaZ;ja0xjKq19z!$SSXCH2vWvscS%X>L;73bRi-2De`jIOf=83k>PQ zNfy-Ip{%p7i({l4_u){LmJ_!U>I>A1dd;VhFysl!-j$gqbm#P_>EI${D2cdPwGPU+ zUAX2tc2laarEu85O3aIJx&d1i7qd%$?}aC=lqfmWst_#A&MQlg9k1kXYj_zZw!Q5Y z=5r~}%ILGVCo}BfqdaCK14)=3M83O-5(@@dZhkE!Ki;hrR2HUnC1A zazV8NZ6a)8BH{$$G=jjf3O{TJms+=f$)E!Wyai%@+Z^r47Oo7~tF{{Xy1y0fDcbhm zfxd!%JTJcQ=fJdZ@h80Nm2%jbqbg}>ux!=D@9ffQarh`Xzi%h-r&q<9m?Y;R29C&d z6xYq!6ZPh+rdZdTO&$JXJjdS=U6m8!E}j)}T=OxaO+V`U+teH??NR17JDu-HNHu2u zy}$K}_5Nze`VI8-8Q583 zD$EI<7d&tJz%$G}JA-v`5qFVL?s~kJPLGSN0rGUNG)XzA)r?Q9*{4$Q3|Aa2WQ}|_ z?^+chX+LVTk0^jTBLP0AvpO@~J>7^{shU7DQS{4X!0M$8ES>Lucb{Xm+|{ZMW4^DQ zSf}s1`xLMIL37jiKlr;zj@?R(@t(^?$>LmB4F>vsJbenB`>fbGS_#Jq!B>aLqF2lB zuCC$nu}CraaCPM@=!W65%11)|YwlQ4ygCHAf}6qw+}K$m(@bq1OLr#6yBH(B8A2lb zt)wD&i@(H%L&mF2Mi$Ux&_#ZpdR;6r3zWCztxq=^j~_3}l9%T*nWb;`-T$VBg053e zK=PYzQ?piL=8Ux1fA&7>8>{nqJ0T+c~fQa;3JVd?k#K=!87`G(^Tn9tAJh|vc zi_e$ilZp)re&4W?OoezUd1AeqA8TpLJvCiE&`{~(V8H7rx-y1>aNU-fh06$sYGV?M z3BJ6*I;h109P_28ZQ~q2gcSrHzeWxdN!h+P_iF{qRMZD7MhM@`dMSKvv_f%ju8>~$ zQPu5KWnP-rlYehmkPWc0vdgd?LYPZ#JrclWTZt;UaPRgP$X<-gCZgea5bdCZy3aV? zFNMiQ--}5~pDyg?iRy?FmhxzN{xr&SKx5x zZs2G^?!3Y_DXFZv+~Ep=10#f?Pq`BGL6|YHnLQ&>3T?z`tu)Gt_GV;4xSalIqHCLd zm6Q+1GZ@C{+v@}AV6bPBDJ+iM=v0unG>x}hcmC9Z|L9UwuE|I>LliJ^lmx-SNU&iu zm1?oMYo%5>D5|Pgwxw)&?_5m0Q|~_+GhCEZ8xy$jzBis_4nfX?_@?wSUMZ-pki_Nu zBaX*p?FkB#o2Qc*xYyYlbbC6@tF!XSun<3K!i?vRWDc}C=$kXAlRc!9^RXe9G zdHHX^V~5x!a}{oZBBR_BVUx-J?<~3KI{08kupR#KWEWV8rKGKo*0SMrzmrkdUXXyY z*)A^PyuwU9K&&AgF!g$fF+i;{`eP{3fmZBQKORK3&dR>bRdQV>t%_Tf6e zs6LV0$3eiL3|Ucm)I@b$pAT&nMDVchSBD@jyEtaUx1J!ls);y5GQpR+05q6^mnkF8 zo?2Bv)ipTL55q!jziYtwP5aH~y(p)89uJw2*l{oxZ#ug?`^Mi(KbnK@o4BcyQi8ZW zz8sfN5BHybt*cSjCB4YZ7l9);_l&5ktd>N*U#Z#gUo?yxog?l(Dli7F{dqw$fG)+e z^K*CuvV57Rq1GgD4(Myy0C}xD-W)?TA^7sa-!>Xss{uFu-~l(RBxoeOzJFm;wB?Fo zX7oAQDF1HpYsnV|R~aYadR+p{>A|M&Lt--)Ipk+CQLaZD57q!2hjk-1^Y-atcfCLR zUGmQcbaY5p2}=)5TiR*8!96(brI{Dl+R}2ZuNeV7burB;$eE&*5W+PaB~1;#k6p8L zvW+}(wkLp={03h6?u#0QuI+2EMy_}qQ#UNU1)pVYM7bDqQYG4l>m(;@&(FscHdOu(o!Ph7ZAWI;cZ5K8Ycv%ATd|e9>94POY!O( z9jq>M^9RY!UWu0+^Kg-V1{vUiUNYj`jdl40H}%xW1GyS(VOVCbjSLwAy4fL~*lxs0 zZ>jq{7+&20-Ap7^DuGgxZ0IMbQ$a-)&^tZ6_byv+Rub1V3ZlbBQdc`6ym4Y#6i8Im zu8%qqL<$dEh;2eow&jFbd_sY9^V z2OW`ZYrkxJBtGkLsW#2f^J`jtK5@tYA!wL`9>DlR%!-fB!I$y6Ls|%tr-NF?+j;MD z5R${Q%g7DrhVmL)(wNN6FUT325olo?Yl0U$3;J58bXiT0{8(sZFr<|Z|0x-6`3$+5 z)a@mg2D-_@rmvk=mi>L(LJ^oXQr2{7OmId0S6eCE?|IGnH2-i4=Q~IA)Q%k_jH1p3 zYl4y%AbA3DmzB?1XkB3)TTM)V_eZ~~R^NatLAdki!b(;u!%;b+Tv;Qv;U7ox=BDia z1D~~jVn74o7>`g%Gj4S2(Z5rd7ZKUq@G)a6B0Yq)B&^{&oPk@kL4LZ7a`~u@%bXDx{U&v z85&$|@A=LcZbw(n{_LMZ5;)2NWSE~B2^o(Eey@rwR4OzByFt?V%^Kj4NpbA?3Z*sw zI?OSdBFRt1c%>M+F;H-+P|gz=SD=Z*hnvSZx)6UL&iI;YHbhb1!P1x_8_-P7aasvw z8X2;ZV=}Fz<0%p$1Bzm>{=B<&_C}lhIitD1Gu820=^#+H%D2Fo4f;!O6)PWSq;jO_$Pr(XR*y z*xx*5rn83btT$d?a3ssBE3-go5kHGNR*ZH2GYS;|8%*@TSmSy`OLP3%m@BWBQf`%^ zSteWnlN@j*pq}{+MmD?yVU_LBEm`uSRY#(0NSSV7^(yBfG`SU0$1`gVR}gFfS$zA+ z$>7r=yu+gN?e8xK%A>^gUa{Ts13f>4jCa99!PDtNL2UhE0TasFt1OxFXbCzsYXh0`P-k4wupkNO*C>bV zJS|+^u^A2rxo}cZtpxhJy3Eu~p4Kds=?C(@Fp%`=7-zjstj$p=>5m{IhunKeTUr<` zj=|roLT2o{W?;~8!k?^u+1HxTq^~QCgDa^FD3#eGoF8g8zYwoGKxU2xy`khi_HPui z9{X?wiWf~$yUdWm)77FOXMdA!x&N+Bu>BD9maC2ptsco8V|KXvjd3{&mVLEwe4*gT zeQ8U5q-hlXDf0F0X$(fQwi(?rQ^O#szs%f^XFdlv!PFEHPGZoWiNq5e4+aMk3ZXi# zD4QKE6Yr5>Ts|;3@Q}FRj#e>tlCxFpF07TW7e6<7@}>j4H=RqJBm;I|l6k8gSNV-7 zugU3{0$L}bz^9XKWr1f`>fzTfJ}8uvp6W|%2FSj(spg{qNZRZb+HJlux7nU0y;Nwfw0^seKMp7{C z+G7v4hcfO^xitVW^duf2k-Ar0|MRRcszEs@I)|Ep5>!Sf{v#trB~+#NHv3Hib%$F` z8|8;safyD0zy*At^lL5)SdDYi7BY*b;Ob0Dk^m_88Qp(yK1T2j*m}qh^J!)IsgN#% zv#R$)TO%^^M#;o2w|0KFKI1iE#M7~;TBuxBgdb6EU8tx7SMNL~PFw}a=oOfWo@h5{ zT1V3sxKp7<#JNh|E$8J_vQVj4KI{o{pOQ{%GIu^<;lZ$gcKiixL>gP`gV zBs@IZXALJ%^$X)Uq%jmsseZDc&!cYWLN?oNv-<7Nf;>w%J*8y$%>_*GaOq^&;f!H! z`iS@vbN|}tklK8IYdPqqJna>)DNCisz6oKSU|Q{X;LgUAC&?Um1Wns@Pp>mLWSk`u zm|31cT1g7g*WqXZVvu#8SA~8IRzQDT{G2P>%AQus;OY9b0}A3tqBbgbIqBy7K?buX zp#M#5XNM#FZxswiYnVVwO3L>cHkfl^Mbw5|_k8w|zK%BPG|@Q1%TdC7{PR@B-T);V zn-{R3P4pY{m1LUYRsbBa{5xGSPAwpF{~skb4JIx`IY}xi(Y3SwQi4Vg2yr77)2@M# zYK$7NU{F=$;jXfGVVr*kQu!U_2iD!WP3WXqa(ZHR?cZ2Q^YRIX1)ai4YEU%{NeDjZ zrBn{O<4*ZGW7*3@hr>yVh)tgl*~9Fe?4K?*91zef;p1B#klX_d>cPv0q6%qQoNcbe z$+-$D+(U%^brllv4qFovFZY&@7Bk}-Wg_yzx?A?rlILfD1sD(*L*r3F-KBKWKJ?e_ zxzgcx_YeTW&Nd9T_SczcTd;FX6q_F($KBfgr0UW;Fb{RX8mrH3r@o4B%*a`}6A5sP zcV*+{KhJO@^k&>P6O2KgP<#xNmxjoe4N&)M(EJnZ%2XBh7RbzT-UxG@qa&|HcBl8Ml6vW$+@+eCH^_LlPwAUk({i-$2 z>1_1}^dfA|S`XWH@6V+AuoQcZ-Du3hor zT#EKp$Gj?IDT1Y7`%wpAq-xM=&rH7xf>!hJ3dopt%QhgQZ!2Sd<@+;p^E=w8@2ZZJ z8CFeM^I3ic)X#EkBHII9ybba)n*0r~7uz;upY{_+?z}y0Ukmuk<72r3_l!X0VEoin zFc9t{-~e0B<5j+F_K`ZGC~vC2FK}LN;kgZKF0?+Gv!bkXf1bF!^9xPTKEXdA1jqS? zFE66@=XTvsSx!@PA?@pPnsX*TWV^*5Iz1BaZ=_*s=bjNH@7M@n-uI@vK~B)ye+K?^ zPg3@!*D&(NYjdCGzMXdg>oM&}|ie91d^`3K8P8{l+EUK}oI-3=xzSy7RBxH0|0v4>A& z3Cu)#GLuleY>MTZuJ!)oxCG0eE8k8*eG?v~3MBibW72h(ZM0a(Xy^a$3w1o{Tzr1| zmg(epl$X{}n3vy9mn7(WSXsbPYc`p!ywgsTw9@)xQEgPKB6f+?B`6>=!bq^#{WC0Q zt64hnJBBR5YRu~8TMFU7#V(nq?&9Bkc_5AONsRdFkm8hy{>)q0MaMVSUNtFC5+mPR z{9d&G1C16hw%Gp?OA!%itv%^cM0b^b=rvs>57(Q43Av*Fx*BK(O7j(5HhEAu=$JP> zHtbJ>9{{z{*rg^-|F2}Q{UEA-HW1!?O5%DYZAg=6b) ztjz00z#xgq6w57gwN2!YA^C|An{z#D?U-lPUj*zB(H2j?ii6_618uA0fEs?|)@6}9 zub+TVio>6u=+8+fAgVwR?4{e*bpY zNjHgzCP%hocvaWbkmBz>T*<6c^~wq|c3;hG)#RK#x#?XO044_spF;3V8AHKDAMci* zmhW0NNf>&}P~l+^<)0UIRGPjeP^W@+cUjiVc#_l(jR*BObq4S+itPNj_$tHEv^Us~ zS2^459W6ElB~tnhPz~gC(gQ}>u=PW8d0R!7CBjQeyA^e4p-Nh8#Auu~YO1Q{d1Kw( z-RC#EMRas@Sd8+gL42{VNrYb$!pBznPHf%M4@9TK1fC~*33xBo;iL9cR?SF4&N{jq zOyTPgDxrbO0mlPzf=$fYgh-o__M4vUJyWg=@uu}Kay;q9_7zO}vGcE>U8hgYz2N%Q zA?oo-of}DcWKr-TtDj{_)Nu-&O9Y8Kj)Viy)Y;$Lzp<4^^EKU>7J-;mSS^(%%1Fv@ zp%6s}TXw1YEFT^9u)l3JJOn~jt3AZbL1e<>^D>!r*6mY*a*z;@8REOW;_Bld5iF9Ra(K9vM~^rYsX-S9TrgiLj@soa0FUzv z^W>uhGYF4V;2h#u9}HFd#FlG*CytDaV0WLEzjpuit5Ta+Ma2p0w_wxK2_4mhjsyoG z_sZhcEOi>IBBZbd>0~O$i@1juRY&|e*N|{oD3jtKGLiqc>FUeNlPrJK5)Wzr-e`ir z>{~jm>?Y$A$lMfKAakB*(dV#;$i_q$EBmO;csFpw`p=uwREHyIn{($fM;-_NnKk6p zETq(-Oj}L4CLj4p5oSTKJbFU)l$rgad|!{qo}gjFrXGl8H|5vJ5{@SYE`ubjo zBZ!r_XU61An>N~&R3G<-*lMOfE9v$2B)h=BujDo7cQ+d;Oj%tBUVE1Hn4{vN2BCJ< zXgKmy^dqK~s48ar`4q*08yC)`Tpr1~xNL6LjpR9F8}it{%Mu?H|9PPg87>cX0k}x@DlX;28MVYH893r1e#kB_X=(YG6-#c9hG0|7*TI{Jx2M+ctNtkar{t!HyVF67xySqlbUO7OFbi z*+2kl&;WlX3-ndVa_O1ZS&Lr^6RxZof-q`lx;GSu6l^u1z<=*F!#aLX!78IzNA~Ui zdiNB+Blat4MEvP&Tz2Z17YKl6LmY)b`?`p$k&<_iTW@%n5HdB*vqpyX|BsiQSv1z^ z2aUQqQ#=-)5DYf|r<3!HY68pRcxW=x6latc5UDB%0s%tNs6YY+0|O{1QUoayLkTqy zA>gPGTsnpl3@lBg1}P#S0apS6f;2&pYC?d}i-1JgcxLy^tY_!L?tLHLdFS5$J@0;b z=e={@@3vJer(XE#mKK0<12JErw8*G&w`8^9SmUbfkH+33jml~=^5_iK;g`oS5uk;- zv@Hv`0L9TjNjIIT<DV6PG)CaczK#-Ea>@w&+zZ`C5jIe0Y1M6Es4xs?-*UxAyr z=PWEI*FS$QPH{SRpCE6+m$3(|)JzZHaMp0sM@AodIQ7@m!w}}@-uIQ8)CIb7sGIPn z=>0xH#fDGli4nt3)JM)QfN{*G|8+pq%*N)n#-JK~9 zwm-olg;uCL)>#e*4*)zfAuiH^tBCF^Pf!L>IiRShDB9xSSefK>a^zp z9wN|=c*HyXwDys7I1*V}=0Lv0V<2Ah8e%3PaHW9NO7W;u3&2ed4;AaZBcrsBlDuD3gZ%7n^<+h>ZbjWeuVnVVWz!xF056HHoCE9Iif z6F}brRpd82dQ#Xh93(PhKxNJo8rM~mwmyeKti)m3TFB^n&cp&y-MPu(E9L&(x>I~1 zRk>C$NuJCb$hr>AL#R~hL;J2g?+2S^wbD6i)Gupi5%p<_hiK9G+SWv#&1pcc9x_7+Z(oTwWK!>vFJ{BlVhE0YFNT zYXWtC3iK5ltat!i%6BHZ8?=VmEP4i?c;Ta2WXImj&5HN#iNu49u1j3IOv1}DdR}H= z#^apA6u+F3qD*FJys=0_fgH;7tItr|1^+fWI?5R5Gh(djL@?($3ycp(uhI^ImX-R3 zwsb52=V}E@W@OUkx`z<1$Ry_mkGFmd%hX2a&FWf99e$A#TDj%l+Ip$^ z7ZCoiQ7pZZEqFMqSEx#=_F&CW>9x*s#W7~oA~1;xb#Vhc&`22E*$tA0raDQU#tjI% z(^Mkm^`^_VqYD#h?SW6&0%z?DXN3msJRYj(Z%M2_dAR+o8>4>_As+#9GlHPtS%k&; ze;k)rs5+>p;yk6*-oJ}!eJ=GLyY}l&l$)4-R!M!LyU@Cn@u-ybFSn%=XQZ>Adz(&F zVg2bEH7Y))xV3|Z&P25F@z{{A?bYF5_g6YpI9vSt?skmz0M#Rd2!6EpRix{q1~DNf z0oL15yJWAG($8Q-Gec%+(~guM5^XGVnv6 zs?p4b>Y#a>T195>7FgT0n5aFjkVCg+VY-fWw%?0j)W1Qt`T!Wj6zA@rGt2JVMu||) zhk#R}?iWtiKUL+e1Fz-nxg2kch_=FWM2?pao_xkREq~s83d1}_HQrzFfRQJfJQ1t{ z@};~fK|QJkKs!bs1Wea`6x#J(v6q(Lj9PD83nVMW5~R;P2pHh^5q#Wo8X}KeouL#C z^-d=?C(K1xV|URx3)Y`M0Cb1qT*DTU3#A-zDl&3%?=hbt=WAi-Yqy8AQ&_yjwj(m4 z9=9d|elz8-kCN0K9&Ya+04&@KI~hw-b-ldN=m_HV5k94WvF%x5+^_8D8m&bJAC0Df z$Kq_YoZUr4M9i%YEnj{L&TFZt(BSA!Xd8g+6k$+yp&w9Fz|`F)&IRS`@cwErEz8U# zyu2;_*tf9pHf1x!hNS$gp-tl%ZP!L+&y0=4Z>xI&5!=h@`wf^2%gYhzm#r`Gwg{O6 z0YN|>89rTsaBZ-ErjArgI@w*&;+czdFinDe2YLxhKDYESX$DR;Wh}3( z412*deqJrhzmoBjgELN>7HDW9ufuxHmj&|D@vu!+C}$6dJG(Y75oN3Iu|qx>hga|< z%L9l9uaQ)Za7Rmp+~Rx1!UUqG)(n{^_~v${>L92w_0my$CzFa4>wO9qH-`aVH ze-eF5iS-r~$V-Z=8B7f7-c>vv)jJ%WVYaA)3BrdMrX(-S_2pMDHOQ_P%BnF-);9R= ziY7gNm1j!Gzsu%x_N4DvN|PQd?OnU7_7%O+|A<*FY(MpPq(>7zS6y@Jp`hy*!nFqg z#C|`j7iPfsS-re_K-20iECHD8)ELsKAId#op_(=&a)qL=ek(T%_*(}tfoSYo=+`AJWqE@RobLOQSPX_ONnzG)IbT4G4sL<9vQFUW<@R0HAC$a_YX?bMj zFkFj8xT5-Pcbgteu)(+LffOvEj4qoJd{nlYOookSvxApjHZ)w<`~?%Sf46)a5#g_? z-6k>;xOf)o+wx3_V)fMc6!$aOt8ZP*i_opekJlMK2ZtjJYUTZH+d*shxZcYM&R@JSG(<`;i|U_1bc_RLE;lT@n12SE|ZN ztMlWv9gb1Xi^a~?u8+f*7nmBy;vHkYkhQulFpDfu4PV485-n?IxOFy$jd>6^Mz}H- zIZ%5DUw`4i;tYxqKzA3uO?gVCciO2PVEMX-1rDNBURh-Fs@T$B1DR1T*r<7 zKa;KQ^RV)xCO7&=zH$KufQ1>twBnL$j5VBxOQZaCAFuDRTx8{6_8(onew6;$pz6Ek zcc~k9`XAd>{h0hm+UJktXvsgZKR?QTL~j0&DM|ea!1=fAuV9hyvfnLF`oE(i)^LIE Rd 0 && !self.busy) { var shortcutKey = 1 @@ -108,6 +114,16 @@ class AppDelegate: NSObject, NSApplicationDelegate { NSApplication.shared.orderFrontStandardAboutPanel() } + @objc public func openActiveConfigFolder() + { + Services.openPhpConfigFolder(version: self.version!.short) + } + + @objc public func restartPhp() + { + Services.restartPhp(version: self.version!.short) + } + @objc public func switchToPhpVersion(sender: AnyObject) { self.setStatusBar(image: NSImage(named: NSImage.Name("StatusBarIcon"))!) let index = sender.tag! diff --git a/phpmon/Helpers/PHPVersion.swift b/phpmon/Classes/PhpVersion.swift similarity index 51% rename from phpmon/Helpers/PHPVersion.swift rename to phpmon/Classes/PhpVersion.swift index a8f2819..f2886a7 100644 --- a/phpmon/Helpers/PHPVersion.swift +++ b/phpmon/Classes/PhpVersion.swift @@ -8,21 +8,23 @@ import Foundation -class PHPVersion { +class PhpVersion { var short : String = "???" var long : String = "???" init() { - // Get the info about the PHP installation - let output = Shell.execute(command: "php -v") - // Get everything before "(cli)" (PHP X.X.X (cli) ...) - var version = output.components(separatedBy: " (cli)")[0] - // Strip away the text before the version number - version = version.components(separatedBy: "PHP ")[1] + let version = Shell + // Get the version directly from PHP + .execute(command: "php -r 'print phpversion();'") + // also remove any colors + .replacingOccurrences(of: "\u{1b}(B\u{1b}[m", with: "") + + // That's the long version self.long = version + // Next up, let's strip away the minor version number - let segments = version.components(separatedBy: ".") + let segments = long.components(separatedBy: ".") // Get the first two elements self.short = segments[0...1].joined(separator: ".") } diff --git a/phpmon/Info.plist b/phpmon/Info.plist index 41770a1..04aa118 100644 --- a/phpmon/Info.plist +++ b/phpmon/Info.plist @@ -17,9 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.1 CFBundleVersion - 4 + 10 + LSApplicationCategoryType + public.app-category.utilities LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement diff --git a/phpmon/Helpers/Environment.swift b/phpmon/Startup/BootChecks.swift similarity index 60% rename from phpmon/Helpers/Environment.swift rename to phpmon/Startup/BootChecks.swift index 789c1c1..684204f 100644 --- a/phpmon/Helpers/Environment.swift +++ b/phpmon/Startup/BootChecks.swift @@ -8,22 +8,9 @@ import Foundation -class Environment { +class BootChecks { - public static func presentAlertOnMainThreadIf(_ condition: Bool, messageText: String, informativeText: String) - { - if (condition) { - DispatchQueue.main.async { - Alert.present( - messageText: messageText, - informativeText: informativeText - ) - } - // TODO: Quit the app in any of these scenarios? - } - } - - public static func performBootChecks() + public static func perform() { self.presentAlertOnMainThreadIf( !Shell.execute(command: "which php").contains("/usr/local/bin/php"), @@ -43,6 +30,32 @@ class Environment { informativeText: "You must install Valet via brew. Try running `which valet` in Terminal, it should return `/usr/local/bin/valet`. The app will not work correctly until you resolve this issue." ) - // TODO: Add check for /private/etc/sudoers.d/brew || /private/etc/sudoers.d/valet + self.presentAlertOnMainThreadIf( + !Shell.execute(command: "cat /private/etc/sudoers.d/brew").contains("/usr/local/bin/brew"), + messageText: "Brew has not been added to sudoers.d", + informativeText: "You must run `sudo valet trust` to ensure Valet can start and stop services without having to use sudo every time. The app will not work correctly until you resolve this issue." + ) + + self.presentAlertOnMainThreadIf( + !Shell.execute(command: "cat /private/etc/sudoers.d/valet").contains("/usr/local/bin/valet"), + messageText: "Valet has not been added to sudoers.d", + informativeText: "You must run `sudo valet trust` to ensure Valet can start and stop services without having to use sudo every time. The app will not work correctly until you resolve this issue." + ) + } + + private static func presentAlertOnMainThreadIf( + _ condition: Bool, + messageText: String, + informativeText: String + ) + { + if (condition) { + DispatchQueue.main.async { + Alert.present( + messageText: messageText, + informativeText: informativeText + ) + } + } } } diff --git a/phpmon/Helpers/Services.swift b/phpmon/Terminal/Services.swift similarity index 79% rename from phpmon/Helpers/Services.swift rename to phpmon/Terminal/Services.swift index 521a609..19c3943 100644 --- a/phpmon/Helpers/Services.swift +++ b/phpmon/Terminal/Services.swift @@ -7,6 +7,7 @@ // import Foundation +import AppKit class Services { public static func mysqlIsRunning() -> Bool { @@ -43,4 +44,13 @@ class Services { _ = Shell.execute(command: "valet use php@\(version)") } } + + public static func restartPhp(version: String) { + _ = Shell.execute(command: "brew services restart php@\(version)") + } + + public static func openPhpConfigFolder(version: String) { + let files = [NSURL(fileURLWithPath: "/usr/local/etc/php/\(version)/php.ini")]; + NSWorkspace.shared.activateFileViewerSelecting(files as [URL]); + } } diff --git a/phpmon/Helpers/Shell.swift b/phpmon/Terminal/Shell.swift similarity index 78% rename from phpmon/Helpers/Shell.swift rename to phpmon/Terminal/Shell.swift index 9aac1ca..fd32474 100644 --- a/phpmon/Helpers/Shell.swift +++ b/phpmon/Terminal/Shell.swift @@ -9,6 +9,7 @@ import Cocoa class Shell { + public static func execute(command: String) -> String { let task = Process() @@ -20,7 +21,11 @@ class Shell { task.launch() let data = pipe.fileHandleForReading.readDataToEndOfFile() - let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String + + let output: String = NSString( + data: data, + encoding: String.Encoding.utf8.rawValue + )! as String return output } diff --git a/phpmon/Base.lproj/Main.storyboard b/phpmon/View Controllers/Base.lproj/Main.storyboard similarity index 100% rename from phpmon/Base.lproj/Main.storyboard rename to phpmon/View Controllers/Base.lproj/Main.storyboard diff --git a/phpmon/ViewController.swift b/phpmon/View Controllers/ViewController.swift similarity index 100% rename from phpmon/ViewController.swift rename to phpmon/View Controllers/ViewController.swift