From 1aff6c70c69acc366cdddd69358a173a502fe31b Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Sun, 22 Aug 2021 01:01:11 -0700 Subject: [PATCH 01/20] upload new demo image --- .gitignore | 3 ++- img/demo_comment.png | Bin 0 -> 42823 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 img/demo_comment.png diff --git a/.gitignore b/.gitignore index 2edf4555..650d0dbf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ clang-format-report.txt -clang-tidy-report.txt \ No newline at end of file +clang-tidy-report.txt +.cpp_linter_action_changed_files.json diff --git a/img/demo_comment.png b/img/demo_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..1040442127ad8cbe7bd31a83cb3c9e73f84faaf3 GIT binary patch literal 42823 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 A#sB~S literal 0 HcmV?d00001 From 26c6744fd86cb51afda6e1c5c22ef6f2574d907e Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Sun, 22 Aug 2021 01:18:50 -0700 Subject: [PATCH 02/20] Revert "upload new demo image" This reverts commit 1aff6c70c69acc366cdddd69358a173a502fe31b. --- .gitignore | 3 +-- img/demo_comment.png | Bin 42823 -> 0 bytes 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 img/demo_comment.png diff --git a/.gitignore b/.gitignore index 650d0dbf..2edf4555 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ clang-format-report.txt -clang-tidy-report.txt -.cpp_linter_action_changed_files.json +clang-tidy-report.txt \ No newline at end of file diff --git a/img/demo_comment.png b/img/demo_comment.png deleted file mode 100644 index 1040442127ad8cbe7bd31a83cb3c9e73f84faaf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42823 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 A#sB~S From a274052e2f7de2378f754e553ce4b0469477c959 Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Sun, 22 Aug 2021 02:01:54 -0700 Subject: [PATCH 03/20] update readme & upload new demo pic --- README.md | 13 +++++-------- img/demo_comment.png | Bin 0 -> 42823 bytes 2 files changed, 5 insertions(+), 8 deletions(-) create mode 100644 img/demo_comment.png diff --git a/README.md b/README.md index e297642a..0b43e5f4 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ Just create a `yml` file under your GitHub repository. For example `.github/work ```yml name: cpp-linter -# Triggers the workflow on push or pull request events -on: [push, pull_request] + push: + pull_request: [opened] jobs: cpp-linter: name: cpp-linter @@ -31,7 +31,7 @@ jobs: |------------|---------------|-------------| | style | 'llvm' | The style rules to use. Set this to 'file' to have clang-format use the closest relative .clang-format file. | | extensions | 'c,h,C,H,cpp,hpp,cc,hh,c++,h++,cxx,hxx' | The file extensions to run the action against. This is a comma-separated string. | -| tidy-checks | 'boost-*,bugprone-*,performance-*,readability-*,portability-*,modernize-*,clang-analyzer-*,cppcoreguidelines-*' | A string of regex-like patterns specifying what checks clang-tidy will use.| +| tidy-checks | 'boost-\*,bugprone-\*,performance-\*,
readability-*,portability-\*,
modernize-\*,clang-analyzer-\*,
cppcoreguidelines-\*' | A string of regex-like patterns specifying what checks clang-tidy will use.| | repo-root | '.' | The relative path to the repository root directory. This path is relative to path designated by the runner's GITHUB_WORKSPACE environment variable. | | version | '10' | The desired version of the clang tools to use. Accepted options are strings which can be 6.0, 7, 8, 9, 10, 11, 12. | @@ -39,16 +39,13 @@ jobs: This action creates 1 output variable named `checks-failed`. Even if the linting checks fail for source files this action will still pass, but users' CI workflows can use this action's output to exit the workflow early if that is desired. -### Outputs - -This action creates 1 output variable named `checks-failed`. Even if the linting checks fail for source files this action will still pass, but users' CI workflows can use this action's output to exit the workflow early if that is desired. ## Results of GitHub Actions Here is a test repository [cpp-linter-action-demo](https://github.com/shenxianpeng/cpp-linter-action-demo) which has added `cpp-linter.yml`. when an unformatted C/C++ source file was committed and create a Pull Request will automatically recognize and add warning comments. -For example, this PR [#7](https://github.com/shenxianpeng/cpp-linter-action-demo/pull/7), and warning message like below: +For example, see this PR [#7](https://github.com/shenxianpeng/cpp-linter-action-demo/pull/2), and the warning message like below: -![github-actions bot](https://github.com/shenxianpeng/cpp-linter-action-demo/blob/master/img/result.png?raw=true) +![github-actions bot](https://github.com/shenxianpeng/cpp-linter-action/blob/master/img/demo_comment.png?raw=true) Please feel free to commit code to the [demo](https://github.com/shenxianpeng/cpp-linter-action-demo) repository and create a Pull Request to see how the process works. diff --git a/img/demo_comment.png b/img/demo_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..1040442127ad8cbe7bd31a83cb3c9e73f84faaf3 GIT binary patch literal 42823 zcmce-WmH_t76ym}2%bQ24I13tlHjh5ySuwf2pR|wAb23SyK8WFcXw^PkvZhPJG0hX z^Jf0cniI0B`*c;Esx9By_3f%K1vzn4Bzz<&C@54(2@xeIC|Fe}D3~9w;ek5{$OZaP zP|(2^!omuY!osBXj&`ON)+SI;A7XrB1SC2?5_an;=ZMmxVZU|gQ_!gbZ@QEB5j_HzU-dKBdRWM%V& zh;(XDhJ&vM3RD%T!cS%DL}$2$_384xzeS|P&=lr=FbaR~tbn(7OT-2JsgqxnEu|f6 zJ2l2A>vDPMY*-#ALmF7n;b%NW@NKI5)GuTVAx9n8yKhe81_5SYzsXoeam&zSFRI%b zsj{kUNN$8?S^i)$)=}lQb5I=w%`{W{8GI;X$ZL>udgDM(7C<4=mv0Dbq8>U?7-L8# z3SmKi_TQ9`m8P17$K}~k3_$8X4|?u6wH^M`RiE-M96F7u_L1e)E7t(A;o7!nnR6vTmKM6BHC9`OAN3_Z%VD7xg(y%8DXvzs5%3McF~$?E-G$Ig6@03)|V)nAkc) z2|Jn?IGY%gx>-1zlZs2qDyRjZ;Xpx=LP?5zQgL56TK3QenQZi)qaVV(f;MsJMpYcE zX2(&PT5{|+nM!5X(yq#_q-U$yHY+um++dH(v4|*8-kCGxvCIjSw&XaG(A;7C1w#he zetN1$#xcfua|!Wn+2L66s@>(^{kS_=MTo$(`Vmvf()S4(s;jrVkX7X6vQ>;Kgn9e- zf}{I?E)~l${#I!Clp4{L6&Htjazc!|r0wA92v0~`pHEd8sga#$@;x~@aNK-q8uO)Y zj8sP^_i2Trn_Hge)q!^FyWVNKFyrhz16I({VHqJIp*=^v;_x8BD*h7%C1p%=L9 z+S)n|_D}pkEiBiE&%NqAJUogmo>xl2w1?LtBO~0rygNwpXlQ7_hmE77$hf#T27N5P zu-qIBuj_ZyMQU|6egZI7(;HHT7>J0736(S|VJ{?4IcP9(Bb=zPxI|t~PVT1+RiqesQc@D`H?hj9DwZS};12M?iGeLiroO)ZNB%ag z07E>`#NO?uz7z=%3?&rjY9A~0*WBXXz(Q%)yeR443w%$GXKM(t$O-V(yzI&=>uvvnHsyZS!0w@xz5jL*> z%kSUhRB>U&#qI1a+Xs(GVaY{9}AEDZ%|ebTZ>6u+E9;LO%BjY6!>Iq^zz!U2|QZEDtW) zwaNBI5kdD24N=h1MF0;31Ss}<{F;Z24KuD^B!$yPz25%4*UgE^Lbb(<2GY`O4wcmB z&Ib(_+-g++YG+BC_8zZois?0Hk_Y&xw0vS?D!6@uBB%M%c3uqB_frj^0-&b z022Eh)878^39|Z(fsHMushP~c9&b#BbXXiPlThsYc>fk3U+Q$Fg~#;>7cc|dZ#@|D zgN$S^m(p9QB}0?dM<#CWpA1^HZ-C~erc}1JwtzXzCG6IfT=`uWAM*0?ZSL&6{DMlr zxfMd<`^)8U2Iz*Y2`>D_{z8{NP+C@0W)zGrFQ=IdCX6?GII*&_+Pk=HcZFeUw|K^5 zGic5=B5G3qDtCpgKI!FU9OMNyy8RQ&Nh?)4dEo2VE8LmfA2%UB5>c;Jbvpd~bI* z-0$(eAap?qV`B=y7WpAZRVYNfQ`ossN=i!1Nir%$stmJ1Ctpzs)XVjuwd!ms>FFa| zylystDSCSHmT1+Po^NzV;!8#( zHEn`gc-3NK-<7|pgMymQ;|?Bsu8ono9J@FAq|T={st5@kotl<*V8(N6YpbilY4bZTJYK?vxM>wn-%wHpHajsFY|M)>w$1=aGlc>1Nrj%3)JXOZq1$&a|Z7e%-r(?w91`n~_wWpoMl@w3U^WdR*;>*zY2q zVxA3zooklugL%A3`!BFmIPqdOv<18_hmH?*KaqG;E3}G_dc_3p_kP!Y-(J&Cj}_qI zna3_HUN;*~<_JCk1NL9@xXAnI#jnG{!fK5)qWL^7j5%$W%puy?%h1aLOOo=V3i*v; zpX1}=*v=~)wmnlXBb_IVHuDvKQvriPQhTv76P26u^%1^BMW%e{fPfk(VBGw9@=yIM zEnX5*5(<>@ZsnCxc9!E=aGhUKt6IzkXqlP6-(MX%9Zb<^MZ`WH`CotPU&tA|pXbF! z{skcWRFT@Ks|>TetpgyC$sB2%tgNh3iyB&+{K9>lzV2J@WjHQqbaZrWl+tbD!XuqV z=eKQ8e*FCWQw$0(GH4-gxgV?5@q&u#?y~3aS&GGcqaIOv%nRH@@Ld683R$mY4-|&# za~O8L23i6B-!(r!KSRV!L$jZ3gM=g$JbbcybR=VFNEQ$f(2(om=HOs(d$ukjDynlM zspg%JWI7b<$NYnXpJN?1YPU&_N%!FzZ{hjU4Sr-nJKRY7^cu@0eY>;B(*=W3r}T`i zHTL@#c~m{PqS&+3p8EG^+p#5GMVzH|toy8)1P;zZ;MD{DgYzKCcAQ zM8xvqd~GGs2p-{ca_O#mf=sLFZBG>_=cHpV-~U;cPGn@Unkm+XxH&s_8MBVp+GuHM zNby~HnphNAvbxgf`8EAu=>XmA6wvRkt*?JF6*GNrRQLy%-v>kIVen~gA8+5-)Ocfk z-Qn*xhn*?brYX?Y{BDb7}{XDq;U_Qs2%X-mI^PaB#L%>phZ zGMOvuG>o0Rat_KG!fV2wwSAoi^)9^~Wo2atu)T5-$Ygu{F_@+))B|!&d~IXI?BFUWvvK>p++8WkL!a;vCyJ+}0;L&w^0(Sm<+cAjnnG!aEbY+0s#yv-L&1^CG7 z9PFQ;$YzD={e)Jgef9v|wRpK%4S_Te=nh|D)mY8;tgfzJr(JcoEY{gE#ofpx$xx-H zrAf-m*R{CMwRRVp4kxo)PKEkFuIC3-EIxzIxUre=<#eD%$|2O|tI#uoJn7rLj&3nl zw-;{w(;dz8W1_1pmqYmJ$!B>c;;6V)TYO)W-MW%ET6-rP(IXi(N z;;R?gF`%Ri{`js9p&7oP88g>0eg1AYKig-#nicd{GZd}L~0__&tN-0zM) zBAnj!_CvWX(g(fPb@yf=Mey#=M2MTw(sx@CrgjyfqNf2-K(weI4ps=C1&nfbmCsYEi2`mRzo*VUY z#qmnXxH-yI7EwECt`YzMCSQs^S|97pn~y+<HQg?;u9XTu@f0}Dv3Jp zpG!+iZ}0B5X_a$cgDy9^MLP?u2v&{JQ0%EzYuYlVqcM#VFJ|l=gHfP(zjVeu;+mrx zb)M$!vO?BWUM*fHd}M#{=&`OMCSMhi7%ND1(D0~Z388Ibo+`o-K;{q8Z`>(Kw9CkR zOiKMV4cIYUmgY= z9tO-Ui}7;7u6Y6XZ+-!1pEc1VHF{ulKU#ZmHvwKQjiyD6)TGF^dP>b=3ge1y=ljJi zU>nd0Z2M)VOd9d%NRE>_u9=3P`A?lBsmj(D?RPUB2w*R0no*5YuH3Kfi{IWdw*;?tS-kD*rjH!;U>@Na4ZKctOEU2j!6q&YFHC_Ma69gF!F?}|4$fh4BHa1V zX@1fcpI^_-*u#}4{Y6Ned~@iqr?+Ccl^rk~V~^0$2D6P&&B{6L8JLl*`7s>asiBJw z*VA_`IvQco+Cvwik}_$6?DF%-59=S+9}~Btq!aor6Fq9TP+_n$ryMub(kJbRfRxy#rO04Ta9x2xNjv2^l z$LQNvH8WVmgQ>Bll}k3#PwuxMRF6yv77&E)|86=h0rQg{K5c zoSYm?NS6VoH}^|$`c~{rp-v zuT9^#e)MW>Db@bjCc#05bS7GV~L^C=BT@D!4f*U`V}H!@LUY8X)Y zGF;_OYffW_`i!85KB{cWC-(a-^=_7C$q_N(W-W#bd*F`mPKbg~R#>I0R+XOWkXCp9 z`~w;%l6!fZ`!Kjlh~om%N_Hp8Z0adeTE^HN-}xlvS!$xg<)C%PYKdW#+otccU~1N! zp#xPRcVYkY#a|Cz`8BB`LP8D!Cxj?g^+CuYcZN6S8>+KEEn!?(uN!hJ_o7qV`YJAC zAS32UU%U$1i5}x|wnFR)0{wxo0XR$_?69dvno8DFw`~#j)jTW0DH`-OL;h`y-1ny+T9r3u8%p|+tQXgU}fr{43*vQ&S2ZLOWiZOOn(@!+bO zLZjEFp}u~s)yE465v)%u9qsK&1q7C7j?1%k&<6RmK~f#4M=(RCrZ;W14ZXZy`)8I* ze|-lb^~$Hi9N;MB8Xg(VyTdb9C0GH2w{0;UQWrCYFJ**RstV`x_#*VgF<6?cql02> zZ2IG@WBg$jOfXZD-_An*WYW|&<~=e!nt>mj6USPb@)ya55CwzsAecmMHc&i`*8;9` zALzZioGR3V!>La^{kjQxWQM*gjr`c%wZow*%>UEFJ|E4L@&psqPput{W_G}_x%($P zzp8!!45lGd`fA9ON=+(1s0_q>JT4d6C6si49bO$EoDZ&~I;h{(IAir*=RY)oDJdz= zR@zo*#yLT<6^$^O!b8BiB(%!Q(B9ekWtq$Ca$paH)hThwRbUs{x|6lFk0K(kGBY!Q zC7(8fDh`wG*3GIP6R3QEsC1xKsQ284k4ISN>xvy7wJ4JqYMEB8+Q7mD=E^s!V4~lh zKDGO!UMoVWjYk_`6VV#(wDn8GLC&<}&(k~d8eZ@V@*YX)GpF=M#o;DkS6Ai4%*h^& z0qs~;=$4*snQh+i+Ayy4VRkpzT;J@Sv*gy-ye9{C(<&cCJE1}hB# z%7ep_|}r0@7rZ_S7SQ9%@npi+i;7vP=haeOR6lVa07YT+qG@vAz>Z- zQT_N!jm{RjeXRpkw#7zPwF@;c^DcCq8OgqIU-HImzd*34nTe?G^B?aLSP4X(DYy34 zW9wA6wRRJDFX`rebT}P*DzFakaa@D|ec0zewjv{&@s!BWa9ZYK*6kVhzESR-tqGYI%e|Nos zC#YEGby-sIxGk{yVq$iY7`gauH9N7?%4mHfXRx@Po>MwjFf$0bPjDy?*Tj)zgB+4z zr8OB;Q`{(f6Z+O>fTRV8Xh?s#d34RBohhkMu+#=&yT~V8349=PG&){xN~t|wm;_dw zT18{xg9#H2(rTL3mNvc{5n=t)hEu=~i?vGLXu7QdaGZ~?;Ab{&6`e>Vtj>}IeR#n; z!&Pt}Aof-6=Z3j5NuMn(X``Z|YBgX=*6HkiRn{t)n3*lEgmJi?Xagisg4Mz`KvV&1 z0u6wg0+vUe{r&yde>SLwH61eF4gc5{Q2yn?*%JHZbpt@J5WBmpk_*-vK4%}{tjSAV zfLc1GvT2cr`Pec;`-XGG%LJ=!X46k+{6Jex#Q?sFwm}EodW@c=7#3drpFBc>k%L+_ ze3IWYWHmcGdrmXQ_kN#xBwYZxJzFyF_Pm#5f2D;FSU&^nu40O{pZ&%g;87u_DomzD+kh7L^KD%o5{9b%^GVm>LZsN(*w3b( z@Bk@RTy8XzuNXIUi4sg3L(34^A)JiqB$6p5Vyg>8))Gg-;7bDL(3dx^3v#t1Tm3lT za*yyRWY>Q@TG|TVg)bYLpmGDW8Krarv+WW$!0JT{T;mdO*=_;rVUw=Vx3wRuZ5BCw zpYF_Fc))|{BCwCc8Nf8|Ej6$K4AD+$(+SK_iSi81a!H8}K;0H=)kS3rhvBH^x(*nb` zS*Tv$&G6%tcRJqc!j$Ll=q2$R0;sLm=;(DW%dkIroTvcv8JzYRZOjP6q`p}3I)$F= zQPePlu7)oAFx@}YN5R1nA31cn(eknW zjogS_eIu^Dn_F-9bTFNyq-6m>(8ti`0THX)%6vKy>DJD}7%`>p0$_Kv+{8B<;e}N^ zz@k1cPsL(3LTEaYDk&xg4~YF_xoLBMzyIM5Y%!UO3W!exfVol~zSy`pWJ04WfOdNO z?wv8jnhAh592}e#zh@s}kF6Lh&7yb3+4=q^_HLci-B-z8McIG|@RIPd^KxkvUdYxD z>N=eb*#zpH)6z^WUBGMq)AQ3KKy=Hb^Cv-0+cM5KdnX%RteTsf=j!Y-j^9uDVhcg= z;Fxq8MF8f>X_#yec-a9wCnF={(OgAPUb^Q&qbbY}EoCXG@Xz00s7{queG?K}fHn8n z%M5w3ZHxIz%9|B0CclSsgtC@vd;~PYavP)PKt0H#I;^U%K|g-s(*sx@pu&04BV77pm`qKrxUI=217Ecc81bUh?(bhX3 zfE2bt2DLq0AOrOA#;DMbe zp=|+zmeq3V!}Za;kyc*$M`Kj&=|T{ICx~2JTxdkRU2_#icNS>F&v&DK_0LZbJQl-OKng>&R{eOPCSq<* zeWqBWGaQS~`V_8Gu3uMOI=-mm8@*A&|JA8n-O2vGsMtM-u^US;t-%EbiJF=kK#>bn zMK~Kb*$F4t9&>hVEBJQ&ry6?>6>^?CsRFu>lO+)^qgqO(b!@!)+ys-Go4cmfNfMOe zwZ1=u;SaR8x3_PfpT~P)-hqgaK^ZQX_#TC&~`hPf3|0t@fYEsRzT; z{T`Q4Qo?|CIl#dyEjH-m#S7+;!J4}G!DWy4t;b6DNlQH+DPK7QfI{ulw*REC-iD`Q zF>_4ww-)LK=`-quZyv;puue=O5%GcMb`LdXr`Nfhi0XZgQ6aEx$J#ac>k_GvyZ z-U%z}@P|b!d_%*5Nd?SQvNc)8@N*XJi=n+M-rCvS*!cYMBNTj43a#+K7g#i06kFiW zT@_5h$(aD813-~4YEzoRI>Y|0K)KzoZ%8d7An^Tg-I6&UL*yp;MRkGk+UUbi)Qz+M3_wI=V0zE3w!&kO zle5etCJM{b7(Ea{ew(D|Y0ypUFQ=lj!-7oL#TwWV($n!u{XZ&v&;jhakXdpas^}E|i`UpuDCi6E#nGh}ely#WrMPCIW zUNW*QeNe^5t?xba&MCX!g)L92neGEY8cf<*vkyh|rFMVuDM%WmQ{>=utF@cVb@d@@ zEg;&-u2H44-sB=DImd~sCLiV&yxEI);jm2` zmzQFa760>?Cv!ksJ-v0;=&#w)26P2kxm$P;%m}Q)$v0cflnQwJfnBIIgzQibq3hEe z{4!(^R#WZ@ud~d&r1Pctdg|=x4VNqExRy0In@SkIS;8i!T?WwuMhMIT(VDMkf46Cj z(B65V;AH&NdUHMD;{%m0u3(CeYsy>#k+xJ>FM}UT4MDGqxrW|T%q_~O;8J`~D?A~a zGLPThYO|mb-m|n~d}0wcDxx#XGu!&?6_-hVA+sP6F5e^Ki7hB3`DDaD=CY{b;c1h0 z*r3li<-aHbDGtcG!M9cW@zNyCMt`(rQN@^rNi#-no6$IaGE7 z!+F!wJbDscLDqKhxccsCB8&5cQEY+D#ey?hbb~2=`UGfr>Ji?F99H+>ycXkWsBM?5{=y_}{J0-vo^H;mWqO*r=<$Iub z7zm#nn)9_Gcz6xEYeJo;r0>SaGPv*WuYZ|#?WN>P`?6YB;eBmA^Q$2PBMW}n65y5*^5|Q&3mgt^0Y{O8sZUn~D`{+%mKxQT;rhVQ3I0fkcDJ%_k{q{D~)KGIKa!j}G9 z6Ef>jWg?A&w~q@gj^k#z{KQyQNg2inqhC=Z^h$6N5(HJg%iV!6ocMEOOnc zQj_0)HJuo#w7E`|?FU4_evg+k)J9oUV=`EVhI~wzoJcGO+vtW{cWoM-=2m1tn<>L5 z`mPS(M5tEoB2_1!!AFNc9K9z)C~EP$i2_P-F`s&q>)gi8C)5`Z8VzNlOdkW)H2h|i zV&RGKoaOy&(UG%ro9NK|Y1o3ZZ#NqT442&)TZufpla`mvOxUA_1PtL%+olp1622#= z#YBxy`)6v}d_GP3Bed{^#qEJVtMpFz6URbJZ74PaYPQ)=D0_!8*~5?>Hadq7qa_Tt zOvp(E{o0a_z0;F~a+Pec4auf3rLpO5CcU1K-geLoFtXWZxX{!nt+M+(CX8zGE2Csq zaPH3A{cdK=`2iswmC4z3#!dB`pe8ujbX^hQQ%RYpTaf@0Dfxy!@f0DS2d2J{M?Cch zl{C}e=wR>Tq2X#T7vN0=C?X4P*P=i7Oa>GFwk{P$Ng(@rZ>by5Dp^lz5ngu_DLEhazEP)HVWQ5(2LFE1SA*b8w5Lp zMZn*e@=Vxilb(P*J>*=8T4N#L3H_c%qnkJ3&ey(kei_*f$4R{M8 z62$H4$(+xd@IBiVlA02c{naI9ekbgZPZ@SuWRgv52GD0Kuow0^L=4P!DQsdcKX45 z>G)InqZU(X8p?3ISf}n*fURu40Zl}Zw97$=P+$GJs}oCOjmeU<{P=V20^FCv3H-il zlR*!^dB>HErMD!5b%N`0!>bxkTsHc0`He@OY)9>~(jcMJ5%j{Es4o=5TP z%92I!llb0rt)Op$f=Q_my0nHVD{Xd`ANxJ)qXxLs`+8e|-p~7u&;4bt-pwZ&JtNz7 zhl0t(-i(tUqdnhVUp)tlVj?jAl1GOZeB{Wh92T;xyYcbY3?{tZ85YEXv)L?y+>9HmwkTmI1=TN~ZG7;d7LuE>jn zK@}^pK6f#FRQZLZZ6V>ed!)WPmmg`8&Y;=6EN{%`sg%{Xuxkr}Xg<8*Y&&WZoPVM@d_{FqP$Rmu>CtJL&RCVa^l)dP$B8mZ>%U~9F7ssE%<1q5bo z+J9$wSlV)VrSGBY4g$@IQx)OpI^=iT=2l#m%iXa+DWv%)mFwwK!j}V<)TV`>&qU9U zDLie+l51lVW;WZU5_QX~(b%Q!6--HOOQn$A3=(j|c29wm7gI7UvF%JQGkFh66Q9=& znc%JFGZq$rZ&O(1+9nuHV4Ylfz0M4i`q|0e3+F#ViS1bJA5mfOp<`z2p3h3%6gr{T zSep`?|CmAOkxNrIckQ0~M`x?RK7$(NOgC!%y_^*sjU;u!kiZ}=4t!|8E!|#c2b@7Y zo&FB?wE=?>ip$(|rnPNpB2wbl1tv)<8yAYTw!C7j?HNLq9G;{=!wprYFRBmf;reGB zWl=T!=hePnX6Z{*5&2ek8YrI!^PV&{G;0jQG%G_H5+eL8dP9oM@du`Cq1R@*efKo9dQJ4MyK|g$wOS*Rz}XR-_Ks;EH-+I7|D4QIT>nV4`zD0A&9QEK-8@n z!ZhDHIP?hL^e~;__v1l43&9Uyf0Z?m_5D0#KIu?wz9+*h0RNgALkd<6N}gAs?c4C^ zZXG!+{HRhw$8R1N20xD5&0UV!)?o2~Gd5{;Sp)05M{B!##-6U{U1f?^ zmK8zZ_2bv)fwwx(26d;$)#%0Y67>xk`Zo$r)O(vkWpvk8RE&=vq&JP@=M*qkP;I<* zuzbHPZ6JqYlc2rSG*4p^4*-l1W z>%D^6JeKkAZ69Mn(rx;^aH!w0UciQLW`D-VoaKSXRB$HP|E%r&nhc#v=*}VOYthBz zPcavIKRmg}^+X?&7C)}QKOwBQ>DR9y9^1}r)ehY)_cdCSJr7-Fq9}*FUOaCxTe)x9 zDK|>Lc0IVm?5?diTb)?-)0+*Kyyl!?(VnIKz>X!3$|U`$BhXo~gs@d7J+rnMVD{|+ z?Sa6{x1VSHQ975|L2_h6^_byVqOs3T-zvV+cO-Gv=CaL>Sx0laGcS2PnZy$($SZio z02P*=Iz3Hx{kK7L!FYL>N9G1QQuS7`v*GXPpIYQ#hYf3*o7KkB5{?;j`iIQLN$Ovp zOFMh?qL>?``B1)TjS=1I_3qrpj4+A2p6QLQx*v@suv?C!*Gs9BQ?I=X@ulBHo~y3S z(Tz0TRX$VsT@h&aWwF4hMInrO{-!tQK~4H0?G>rZaYXZ;K*p~4azKU^RAvkHnbask z*m6~5qG`zhhXuf#d{9S3B-CUJ+SffjFAMp6Zp{%+gKkUb{Kjj0Js@-G1c~e9Cv%A8 z`ZgFX|JJV6!0vXl8eAfIh@fja4(p06i!OYTFM$`hpk~CQ$EAk))?>f`Ab7h54yeM1r(C+M(aDTEW^^y zuRerc%|r}@1eh~*oGT0m!q=a!?fg|vVINp(DP{4$j#u1)0-ODB&0WP49a<>zV$t5Q z#}<0Xo+7oreOglr-2R*f3BXC$RPB28ndZUn&iDl4Mw<3j&UourDLXRro3V98T_3?H z111a2kHGqwuAwJma2E{P-CiO%`V;|4-)@zSuDaJw55W)OYalSc$Cy|XOSmW9Wi%C* z6+c7El(o9886vjz8Y}u;)3hS^^!P+=E#w))j`TC8G`oV~NG|yn%A%iQ<7-_?l?PQP zSUgO-<%xipT2JQA!w+ZT_AhuViOB=OCmH?hjLd6G9}XdWQ^A)cDH1gD*J_MWi0>L-jd;&+l{M1H4X6!mf7*7YbCq^jV6Wr z0phOt$_wKiFK!*FV~;}4(Wc0QMDi_1mTZ~K0d)Vk*MPNk!SFg;*LalYE#^W4Rs+PE zGg~VnJYDmY&@WZ~tG>MXQuq_`nW)3b;t%8_b(Rz&I`7-V#SFI08tBt{WM6n%M_Nlr2aX{pnlggAG&#g#o7^}8JhnyF1r~aQH!m0LEVGn6n_PD zYjwsM2KmBt4`zE2r_Jdd0h7Rd+Yc|-KjRB3@t#STW=yd=s&O;Ic`S{~S8bqruZ-&{ zd;cM6FOA20Z{2kMuVI_S>q$v=TS+U;-pAbbOGAsJWVlLIr(#>Z= zwV;nykyXF1#Q7t-=2jcL;rN5R*iPbG*%^)bjA~7e65Nm*Z>%IVINj6q&eOJite%#x zmR1|ua%|E?7X(^ELl$wN$a~wKvk8frtIDt66^$3O*$9;GdUz5w84d9jP5N<`eM5Pl zr<{Y%@U^WE0v6Nhh32es9i*v*79La_@~LHlPPk|cL0OMadK{iir9Lr!O#Xq?h_*ZD zx%Uq0itK)33`>q=!4T1VhedrXG`;0eIo4uEn!=L}GNNB_gOfDhsbm}d(NhS5bn{B> zLAr$NseYD!{i_uLv9BAg+uatu6Z+Agxw;h-sroyxfP8b`uQw2aQ3Nh4u+{AiO+n5M8^^O0_oB*!>vR5%5O!ZJ;s57wBDz! zMwjS_9jNl3PkoX^Z#1!gbbA#mwXSX78F(`naY45pDdMVm(^f$@?LRY^TeZ z+Y01O^G@tBf&nWEbtGlJlR?g#cEtxeXA#E8lB(X!ZagI`MDob!dJFuOKbU%dt_quY zaZPj_5@>j=4JUao8MC0*UH8m;#Y ze~L6p&yA=b5jVtlcb>82?E1Re0&N)^urEvHRV2F zZIOa7t)1ro4y{;ElpP?9K?U7~OF88ZDIM&n!v+=<_9Q*hh8OH0?tvAkdx>|bQs&~(i9=~bKB*f?*CjW$E?Ea%S%cl1qlmf($bh16?dj+GZH199>6AZBTiCaKFYn~%+!*6!+Q+BEik;djFYXYF zc}<$3+t`#tlOb=STkbf-N0Q3oyj+-?wW}Ch?(m;0rzR^N+Z-nv?&R74e0sBRmQg_2_#9aU>69i1-rq!Sm1n9!t!9MoS@ zMYKP9)cc3m_Z&uYT)KKuwehbu=YtfT!42@RTN(sRLbqnFNh(I9ziOU-)ob&@^tk3f^H^SJ^Ys=?5p}^ zTDpQeo75raIE2kvkY8CR95IfY_#e$rsqY{H^07&t!6?*+uiijuq%M|!zazNJ)%nZ% zJI2POM|G^Zg45UHVT&QV&@=l=YT;h8+091~SJc&6qR$YqC-(-gbr@qa3a7h=_qD#2 zU$#>W!`&sz{>c-BY!&r$xs}ICxs-+dNSxABV|lIsy(Ae5RMcrlXlvz#CELch8AK+^ikNvv(K zg227hXUB%zP)kjBNr7jO`b9!YZ>J0?b8s#`{N}Zxb_^=~{2w7nQPzv&sJEnkD@1w` zc|&&roqqgy;=GpW8{4~Tr>nw0iA?3LqsRsu;fV&K@6ysqBnAA5zeb&6|B! zXqqo!bP23k>D!z8AeqKoX}#A1jqOothO`!UNa~5l%`-l9Z?ziV&I3iQQR+rj*bUe> zvZgqg0q5n3{jvvBQ9FZ<*zx7pIDFzSP{>5Y*T2QEMa{e(+}lD;gt}j{2LyE5(O5%94X>V~s`f znh7pD4Ghbn)!wUC9gz0jBZDeJn!`4$UryGFeQPIcK5#adowI2 z>p`wJ4Zj7`Jk{d{X#~Bx7qY4XqE$0CE)O(nXA+HsL>zeYV|ae5M_nyMrUoeYVvlaH zHR>-CjpbRHxt5k6RbeEIx-MDG_{>gRxP*^VEz|_ssE?TC@nISa+ley%Gx5w)f6%8* z(t|X?{?p(RWjl(9y2zoc>HWBEXZm}LaSOf}Hd?DYM-qx>7kNiAwYpYZxzsOmsKVhD z+K>NOdq<&VA&!VqAD;LWcc|waWgJW|Ua}|!S!w_&DIS>GB+`#OoKP6 z3)ryijD`(=4b1icNgd02Za|Kg%~C1!_`To8-bh2@EI~hV+~J8ofF8L4ak^r41wEE_$u~<}7 zDt@`l##9^%E6Cm+)Uxx4_VUDv!xnzE=wYK(m+DiVHru#ZmycDW{bIfpAwh|DzxGv2 z{i$Syxu3M=T~CuQwp0M$kggtX0PnirJo>5J-yg8q5&V{m+FkDkHAttr@LmN5>L?Dr zz{QrT&kR#&BTPcji}x+vId$s_y-@BcF#lIqX^DO`U}2^nv(LbsePR4%^4#9#z3 z_goQ%2^J6hg9U*vSa5%Zr*NbIx3;+{eN!r+;_%|`WS}3K#RCD+(M(YC0vxsKhiz9g zl^Ad=FXMb$pbazw1@jMt&=FJK!sGlNZMGRY(b5>i`O}4!!O9|1_g9M_)Fmm=-2UJ2 z!Xgs%-*~Y%5JAwsM08@J{#G<^S6m5Qzn9;0xZU>g1q&K=J|Y2Nk`tM4cIOT#_XV)D zdyzB6apumYWGET*KK0hFs_B{9?TZ=Tl!(kFWc-5|G7kUP)=wa4lX?yGfH$QlkPcwQ zM3I*oSrGkuiq&oKng^sp^a_s!e@8vx_=r7dSc`aVN(9_WRf4wB;NjyGk`M>B?oEC- z9o+5FD}6=O`8wNknO#pCX?5&k+#GmkPjYP|C&@B4RNe|;u2 z5QNna64+O<jq|nxGoqx~@fD7UOSGbVcprCeiIgD8ElH8kO&c+>_CV4sc1-uUn z6Ffh$e@%4|`4*HPqQgpKpQ_k*MM4+7CW-#0brVy!ID4BeiPX_7`wc#PM}ZB?$4#<- zB~GUgDmS3x+aJo8d|w*^3H!~rtE+2A!6ZW)gu|)P*f<|8jFf)KN-pPXxSwp6UcFI; z&ZRPP@nT_GQWqzM_mS@0qpj-Q;soJMe?3R+6)+`p`FvoL&KkmS4?u& zT_LATCSV_^yj$xITDj<2tra3uy9&k-E3*l@Qrs01f#`cJ({hi9oU&Emb%SpsiSb@w zU*w(B%j-tUny<{}FrkX67Od$8NvQb`9Qpq@OdKNF5Q_o6QlL}hS`jqoMlkC{ac`ef zRwf9pWjWY#C)V|5a}KVO%hOe8r?dR4{3XlLdpN}i5DzzoPrcNa?1@(~p>m5FJi?n1 zFX9E{oBf0H%+L*$@$bHuejsF_EBE*-dJ)?ZGoN9k4}bmgf9)Xo_x}Ifdh+kqlz%J! zuk!!@4wNi-ijYd><8t2@{@u3|2LJv2e>BVtql)-Je*XqLbXZk zNbLBFJT@$u*ZhNMx2R12jc$RMRwekQ%fR@)D@WkCFDWS$aMnKFA;P{L8aRy&{Eb?s zclGqdCM6YwzW}of+&dbE;6kmGjy185AN^@xf;1qElp0*@)ykA&#$7rCHvfqJ)1`z3 z5K^m9hMvFy4FN*9ff!)QX+JqL{rkkRBfl)Kmw@@-Ky=`Hu2v$_?y@h;Byn5F%#}9_ zH$G3DFFrc`Qpw-P0|9r%*RKff)>F$%E5&FW%fr(tX)!WK6=~j(bs_ZzzV(^XUuSsD ze05CFQBYzN%2oD`(>8zY8c7xAqcD7PrGIbJOb6vChPax%W$=~hk(JxH-C|1f*~ILF zhfZ&y>~2UeTXk>REs<}02=-C_?PN=dko+oNYVC1pdFHCI>N}^Z_njxKA%&6T#oiAV z3EkOyGZp3>>!`%&H^bm#mR3T(#H&JLOZ3zpC)kut1K!cn8`Fx1#A-uZ55CPO!6dZS z_Wx||QFD1Yq8$h_+4_{2gq*a*@kX4K@6N5Z?CHDTGa>Rv{Y6OqbL(q-FJ9%Q!*@HQ zGR8|wHrWaH?%(!2fpB}~uoCn;NI{iyK+B-08cJ@t^J~5a!eV#5EDr5UiT%VHg z4Yt180i(=MX9}LH&!t9MQ*qCGS_Bf&vnr~!i zc&xp@1+lHE6r(a$fOpMHO#^7a{9c?kFwD7MG?Vbe1YYc+3-FY?(z~AjWK6-lVs86M-{#ABzTF-4dFjqYicTKaaWZqApcUG9ac6YA?1W=?N;g!=(xR>@69!-c)Uz zn8Q4EW-Eg_WP{UzWdD@C(H=%wt4Tg|w>G7rdp@+5!+T@}sV(COw6tBj5i>wYh}}q_wboi&$`ttSiCdq)A@c~BqEJVjY{v^d{b;h(+Zs!yZ>`(G zmf0Pl;630Lziti4*^qnMwadu2KxaLjUhTa(0HFbD%4)a#sR`r_)1vEI9{Hp1y*xIz zsc+51v1hygWIMGT;)RhU+PZ>nY-J(C=Z#i z#IHgjU0u(FOz$2D1&V<>U@c~WVg%pz4nus(>wESYGWMt!7JCWI+@CMqpUS%Z_p?~ zZ8%-``D_^BwzcV=?g{7ut5Lk0^fKYpf%cifY3``d1%%_hW?cz{XXEILE{NPx-Ol#u z@>C9&NkitqJzxD5TY{UUZrwAsvRxm(=nzPH=kEmjP_#GHB0V`Y6=mM|@)|8wJ65YJroLBFqu&IgD{$Z;J_39ln-;UqrS_s4%+HTKR4olVYfky`{D9LKeKK$e`MT(5ACzwv=~*)<0?C*6g&r@v-k$ z(e@myEI7T&50~Jv;E3lGDt7&pC*RZ=;rp9ifduS=sS7P-b`? z!N)^2$Jc#M(x~YT6_Hq$Y1s&MG&LVfVtJTiKzs2);C_LbRu6L#tVtB66f+|mvk+Mv zPrVx6fK^{OnprF0C@+n+f_ksopzxA7qWP3I@M+HBTs>aGzR&kPk54yq-a=%KKN6g5 z9^!pyLtyNjT8;?%K50>&pFP8%$&CltX5`}!9V~BYXcq0T#T66y2FXAvi}0p5Gg$n( z2We366LE8AUFPugXU;@3ef;G&*dsPkX zrocWho3v2$Z?=ack4|K;^xCeQ;4ML4FVosX^WO@3HmsmER$lwCr1?Zg+(Qo(H-L|8CDbXZ?|qRaBVaf z2xi8F`9g&JH#1Sh)(6diX5*3hel);idxX<+st!&QKb;;ti`VNYP!2!xSt-46``t-E z)xB>lu>9zSo{Y@(A+^#+~1=Xl`s^a`IjoZC-*9@Xgx2cx4Ldq_DMtgIdw7!72r*=X?aCPFE2~OdgJ8K3tkiC>}I{jtc za5N6DF&@DHD{{5EunwHE=*a>xcj)jk-F$cniQt}(1gUhm9GE7<8-La6Ew2mt_|!cP z98>T16?bb47Qm!$%(+hp>iFum|8xgSpVtpFO3cmm;B)>;*YT2f2v3>1quv8Oy>C6C z)SvQ#ybdrFuUCv7e>K;uNv!wL>9_SglY9h8$4yzx%x)eLWW#hw`rve3SX=7I*~&`| z9;gXDRcbSDiLI?%EuCJv7A#3YEF|)%GsiC;_D=hXE9e$B0g80NEB1 zMT?i~xW9sEo8)sOL|gUc&1^gwp3$8iY*zHbF&g9L&`!XGxQpE*E#G(ud-?dL^}1{E zEVJG78qPJ4dauJ_ew@dxq3J}r5DcmL^b%(Dg(^(tz1TGYr6R_$C|p;zORt3?_}#~L z%2Q*a;T&n6FNBmAzrE)tk7X>Xn?`mIp-+9|`lAi@I4pjvXNePbJ)mc4A;TSg z#e)o(i(|%3?~eFrNP5y8XN6?>cT;#dQWxnARydX>F5u6EA_ui?v8B(0s)Yh=!hLZ<}t~XG_fP zP!bZ4Pdz%`^-hiu_m}I+?`^(dO(8aKYxcsI8_ist3~V^)zHna*%s(~N6$UU1Hy}y$9hDA*R1CijTTv;DWA6CoY<&-N_d< zrV~WZjO`W()$CVKwJr}Wx@oZYeotL^xl9zk7qzFuy7zpb~(%(QYnW1N{1t}y0Pmh}iB)5Iq_gcr;T&$NBXCP+o)8?UM zj^y#PHF5GbPFmOYgo@5S2Ye&OtCoC~UV~?z(2G}`&9i;icjCE%akTALAk6!-dpK{> zJ_oJK-fXQzEqS~ zjEW+E9gfP~faloK1W->C*7Y7KUya!HIFK(iHh(;eUR+JX^toJ-kxWxN+O5`dRs!gF z=z*m-2#~^Tz-v*CIj&-If~J=*yBrhRL(QgBD{p~%%fDXzTu51^&wP?ZYgi&Yu<&YM-}ac@I47k)^xaeLc|KX^ zoyRmyC&KK$=b(tjqp4@VdNL``OHzHsG}_xCO%yI#fV25PS)bwImrR-P`&1yGg!Mfh z-MMpC-8tb<){^TSukxmo=}$-n1})!UgP@xIcZ!RS$J{mgMWDStLq-)+t9kIcn&aUY z@ARFOp2&8Vpa*-v+s=h?I_|C7qaOU(64J6GyVDCid!b&raB878;1qm++|+`X9-~c)$D2>IfDShPJev6txOdnwbJIOeBGcZKs$NC;-u?D4Q%RJPPR-7%Q00R?N9RkOPUI7M0Lg##BDPQM-Ca9F z5{TGQ*;h$q-SjVw-eWWxpmh}&u3uDhtQPzlen}YCg}K|FBO zsH>$^(yQjeow~L;rrVVY<85vEp6-a*WnkBG`oSK)_$md-Abk?uj`vx_?2SM9e8cbh z+2*6|6dshPy$nCs30(GPub zjTD{M5PDek$A@b(O)@@RX9FpuuZe*0rq5}6=?-#L<12?K?sfp^ffd(w_0@_3V>ku= z({MX|sGfTHvRZ>Zyts6I&|fXTCy%;aajzi~&rBG8F>UHIpNLuQQR~RZskheGZXfP- z$q!L0UP*g8?Zkv^?NFu6Oe4lCH+qtmip|lp(@X-o>8?$I>rXee?6DeLnSymE*1Db- zJa1}yUTW?Dyo##5wYqQ&1ieRZH(JbcdK~{I@Wl1-e8y#7oJg|Z@WtCv$kM2|cqc{o za?K?LBRI(}N{&RkGb_idgW~2o1=v;MnaOb{eYz(qo~?q}bn{Kbu|HuVKY}RxsqUA< z&#}!-6*P=&tKex*4X4(-UFnw}tM%MN8fBhx86A_6k{CzvpGi^Mx-ZZ%H5jbzdYK=i zx~R?tAX1xp2(@Dp`#X7Pw?f}H@nTK8?itv-X(P&P3 z8*`4{00Ym$@5$~w)|Euwt;f6dx;fShq^1L+RPC2eMIc*o-_j;940J~&{^sMt{LM|x z>hIoAp*^OEWAw~K{w2ceT7;1Bx?cYvfOW7GY0oI|xV(&425(Y~w|>79az5_V7P}D? zVdE?%P-~=IGH$E%GPx$*xv5UR;u=l#*)mUwjrzK@`_$bB!i8W#4)FF3O>uPqohJm_ zveyQYhL2vqe6VnK783p-*ywFia;%vIjiW01DIK_1;ekmi& z%YAqECxm=3_#}OOZ`N6KpYkx#5ngO<-HvKTLQqS-!S1??+aJg!R+EBo5>Exz|v&llgOG?dwS){}l&S3+r zVfUK)_M5J#u1jW!d5PcYIPmdAJF43cr=Lny=a6z5o>do_9;;8Dv=uY4cvM)vhiJ8# zdmX^7nh+gN(`M36_~JO+f;?SZsMAv9s20vVgsS|VFukk6$(`{eFs0*J$vGJer0r}x zIVz$WS;rRan2jQ%x5!z9g0UDao#t^UPA%SeR0a>iG}T5BZlzCsK_ptMr=PJdG|`iP zWF7@OT_7Ildgf*G+@HKEc0I-Z=;~J0MchK!anv^x{xy^wo&K;BS?4Kqz34lx{)uGr zhjVOFSJYm;&GUIabE$6e^u<^)2%(deZv~G|;Pp8s70M2*^C|V#z&7ikt>BTc2d|MI zD~#dc9VgMo44zyx!Qa}%>FpQhdWMsSB76;Q2Y>G?-DOGh zrdZ^CBTfH;#Ls`Bl%OYWwx%cwOo$Y6%UXR__x~iSH?=X3AV>x>D3H+{uBmZIYzKWZeAlcTIorHGGMvxcE(Q@a9=H&9(o+_-T^& z{(!FR0JB2s?$z9j^%T^SbZ<|pg$}lJ7P)r~PYX9fL=oZ4qY(62|9qSjLf0g^sjhCebQ?#EXt?5w*PGYT zo=&@4dlE!0fm0ir2uNLV7EYCg-(Bt++h7L7E86vMz5WSCc~fz;#j_`#BHg!~ys6Oj zIe@pP6yPN1N@ToKF6Ut1G%d~d40H0z!bazpH9x+i%APYM!W z%6Nl4eZ9Z+#rsXkGZ$)uFE>s~FF)XHyK0`zr8j{|Y#M_S)e@&F7L#|};oirJNdfkk z^0SVkkPi;KtL2B<$C)y}>=*dEr!L;(k5hBa_=I=O^%c`JMhVP=`o?%*55-M*DZLWe zn@hLcZbxwjz(DYl_8L?5#I7EtQ&M#@AHp1c+SKQ#+@3c3Oj-KW_|Me9v@EAii%$gY z9G)D)bOtU%mJ?2wC`8W=Om(-yIvT1Y#{~*ajNsH_Cc?oadIPnk!<3Vw16`HpPzvQZ%onadU26-DXy2FxWa=k2xe{ul9Hfg>29>}FrHxHBWlho1NMa`*Ffka zfCBJUHDeMbS#}ovs^J^89Eia=QfXw_!=5&J(?n+9<(hkSs)@4jmhm zalrTNL40>Zi*3^$KjK_=^%(2Z>uS&{EO5{F@hN8YCiFH94|+~sN*<{lt-51-w%v0t z?-pNq1kaa}``xogc|KKeA52`Fect%VAlfd_niTs~{ zCei=(0%R|`aIf*vao!$U+H50 zerx#$OS~WZ@S`it6!;7!$Rj5D>6^Q$75V2+a=zbU=AW+U1wd*1Lf-u8Cp^IZX?IkR zbLolqeeEzZ9#x<|E|1VpEVu0v=~GzPl1K8y9QoG+vMK2FKj{7c{@wl$Xb+r1mXl}w zoq_rH$)6Q>>z%&libqE(nbOtHUx@6})f5n`;|nu>Wj7tUFt-hMS9!lmh9#wmSp%i5 zF7xvU+14Yj?HYpaP6P{z#1B<7U+L|)*A{wK+B)W%)n`nT{FbhhoRO}ZYNXlh#|yd6 zjrPfNH4-DHJ&9<|E-Z%M?>KJnOE1#YqQ~mUwWoLsyfI!?rdw;*fMBAtsYO*JF-Gro5cKyRn4$eY)lnRal#~v z-10OcH9&Vqm-Ac+JL4*rv`n*2j9p`*DrfT~8ws+KCBU%^|KtKtF#U`vP>3x*=ZQ@` zdiDt}_NiafZ(P4NUpdV`10KTY;x_B9{yGZ&uK)b*ga#GKHLewV2nEiB3*Rtipl`I|A82-Xcmym>`<)hzwLS9XO#SpVp z6?>5rkJaugk%*%smTf0T;=>u&DDBk(JWr~C{(N(UmZ`J@tH3vFyNUqri0{uNG+Zs^ zLF@!#`wy}@&9shuS28A}y28O%Zr;azdUhu3`)=4jb}^>{-Dr$JRj{Uwc(m14SBl@& zuWt~r{K0zPbYt`HC0dOaQ|Sv07aYY>y{}`=@bemG-k0=yg+TIu%xg@fnXHTWUY`da zY=M;KFzc{q!cx_bCoij?t7+k?SBt^#@0F6tflhn%)UWhEUbD?!XT_hFH(7If4?mT0 zqsGh82~_e$pI^VKoSPR@#OkTv>}v*y)^{6*ciK%K*Hy^CZ^o~{wUM)Zye`J3B}L`R zNpjV~#b{j) zm89mUOzqUCG5jriI|y=l?mA&E7Y}PIC1q_Ro=yIC6^Bv&rnjB=$j}pNuF)`wIO%dy_BYtndHq><-YeC`&EO_o5nl z9pgOjZj;$=^SH_}`8saNENHqAoh$KI@xV!g|D&#FDj$z znd6Mbwc#CA?S3vh!i@57^duWQyf5v3K4oh88dZZ26ybC%*G$xL2sNVkT|bC|Ao)Ic z;)TC%=8NNVMC~HJpC}Ebg2f@o3fdvumI>BkN>pbodN-a!DioV_kr7s&#p5h-K7Yz?Z>hq z;=8nW#b-7@;F%>BQ@oxrXVz?cVZ>KxK)q1tIn6~>$T)!rCzf6|^2|^-gnesz78gD! z5*#K_Yd!kXUYSx$vT=0&X~E71-PZ>0=u<^tCy50SoGkV`8qGG(%nFaa-bO*hCn)&)XkY7jSOn67&^Bgl-sF3H~;dY-;>H z?mpmp6}HMRu6}5j3)^7_f<}FsjLS>75F1}W`5=Q%c?~ICBWB0N-l*Y| zu}j$?KlTV(czw>CDWt3{Qz$^n{kejak*0K2tBlO}XqmogEmu~g@d-<&l391DO-|?4 zkCBQ{tF6foVfx8cbCdX`KSx^mx67S6vL0+_M!ylLAJ_BcSuba*3U3>@TgJ`Pv$bhh zx?oCyo5Ai3rpQeXGp7=ea}q&~wG@J3)A<-&Xu3Rr1_)WwAA;o-YWhtVV@d zDemijk{oDeUX`Qtff^&C;IonpwaEkt?Bjgh;?^PQc7{!RVRH#YCGsSeI1W?19R9^l z^!E$B`yRd%3%gnI7pt-mBX1`$a$f7SR;LC6d;r885bE<0jHxJ3oSn)rvrCz$VlCFG zIOa0hes5y>EFw{5p;{1;)dc4Vfr$`r_B)i=f;XDNP=Q_#W61icsl6Yt=zQ`dpbac@ zw?XgQ@9F^<@%L`|s@4T_M_*+^CX4S)J(Z9m?(Mo6;?22we&L<`-f&hED*lJE_869+ zS)Fp|_;3{E=KVyoT6zs~rn_bH)lR%hroHyf-egX5Cl;EQRSdo}6=kJ1I3}RD95qk- z^+G-+VLCzT^JUWQWFO{~703<0H&pLC|Gq}x-uBrnGIX=^TErKB?!zC`Qg!v&K9fyv zJ|XsigD8F1Hgg8fmnnzjy(3^;>p3=8>lx`0gZlpZkC{3A^wXP<+(kd91|D3LUjq?) z=;_IYJKHIIc*qLAl$L`I^UfvZbKfe6rV}cX6ZPaMwB5z^yh^|!3{?FRcJ{u&59{3C zt;zOHO`}M8+;11+#9w-|OT&rT$rS2iVioDBakAmB9~?S6a=7Q5OQ&{sq)TEE+?}lS zVd6F98=1`0DAn$K>^)GI8uw#7&GkGhD`2zpo2EA~iFkh`P6XB~n};hab-w2Lrc$Pu+XaoKSQM50JUxAEStj4s zKy$N-nX-+VX@2mrYQHk%C+=bb@*p~;?3#*loROVZ39n%DoWx-ofGxsSRc#*6pbWj# z06&tYW}nJP!`KhQyxV+$`jl?G@G791iu!K&I!M{(VBptWOQ`Wu(tgd(C7 zI)8wQ5*mq&ShQ=AalnPJ?uFwT1f(Yyhl$$=hw-Fd_my9GWUSJP6@T?G1Jx8m)ytwz zf#K18=iT++7HAvMd?ztc<;615g5IAm_e|}QFM{M7e5@I~-#Ewd14>pI$tRs_*jl z)d3dO4?B-AFr(i9(`5#_B_vAN{4e zZ8W(a(opohdL2_M{oJa)l)_NX4io2BuS=EKNC+K$Hg6QLn---pY4PK!Z!a=B5qlFB zQ9*QKLxgr+UMy_+2Hs!Pl-96ifz@N@=sryrJRYnxQLa*+H6>y7f*!F*ECDB$R z!HrDkHJ%&}8vp3v%ZtCo4leE=+zECw&P)YW`3!t*3~yU2Qcik21whT(WJ7s$;zQQ@ zJ8Fe|cZ|mcspAW(Nk4g|*xNaX9!{!_|C zi$dndmMT=olS1_8vaGE?N7JkB?exmmNk@mCvAwDq9bP}C0FcPDY;#2c0i{RP!E7K* zr1j5jW!_TDEm0HQEd1`m_poR>Th4=nV=(tz?{M|o|o36eO+}7 zF|h*Q@F%yoKFGOVk%@6)Z`2NdW5+ZlA;&D`)LjP*+~Kg z6MrqE&w;|z$*H=$7HiKm^WA~;1*h}g`objQZKGeV){xrfX>6IRkwJVm3q3j2u-EuV zgUXnc;!j8s&K3H%h%){a+5dobk>QVpxuYpg1Q;Z@M_&HpOQ8Mp6w)fjxgCe@%$W2e#ht4*<%?>*9tblfcB`ss}j~xedsBFxlYKoXhBMq?8Hc0@iU>x@%vKZx8DoE_p_lYDl z0PDDYtQ^xK&lMoJI;e!97i*|*Fe znbnPg9Fo#Mm7{aO!a`Aaj}QMJLuiWuDEPLz9?}DIyUF7@-Awu1w(YrNrL!jVDkecq zN+Z105(L@Tnuvc9xvj&tZ;f^=j2o{uimT84PA_I;<@(S3ooZhRMfUr{Uw_u{CN$Q+ zV+^<8oU3Hyzk8DZeMJ7FN&L&S{I>#;w1c-3$T0e=q3neJmg1NqlP?Po0uHRxvwwzU zP9wv*igKhGC6PJV=?{T-w&oj`uzGD#4JE;hQx?2fZ38WAmkz>AE9466=)9kAdFc&Cmxvh&|@Cy0j*BNC?d`qAEjdGoJ|)NUME=QNU2o`Ei{%2 zV{hR;5#{(kwPHLW9q7#$aumutG1(FWNDBU8bA4T&jr!XHr-+B}yqZ)`(8$hps!XC= ztXW;{*VA1QISz-oYUH{$UUAM&f}FoS{DNEcY@?uryGm(u)4;baNiy?vU%NPEw{Dk1 zuSK^fWG?Pzh25!5yAVd=3(#~~bvDqve|eUNbz`#LJl}2!HJC_8 zF7)bEPT8HxO{K{^>Sp*A%?HzuB@DeNkB_T9!U7k=PYz}{B)oKq5#Y-^b7EK2$xEwq zddb+@`=C^jOBkr)(m7V%&3edJfV5SJFU8R9hd#B2Z+tQ`*F6E+B^`N4X#(4Ennt;x?v|!N>Im%Hw5e?HJy$asb$2}ZOXsPNGHPwpy(c$~Y zn-MohzpKMfJRI`E zkB7KXBCj+I@W)O*Loo^Ac})HGI!9LD#kw15xbAF-U&YGTSVQYY;c^wKSQ}3Ps+-%lspO-hD3i0Fc>>K3p4Ao|mfJf)HG5`i^2mXa)kk)SP?H($`*%lw~bR{OC zDT=wl9Kc5u!gSB?%p0&|~)R|j*$ zm{g21R1Rw%9QtG6|pD?&js7H2L;BVvOmjBcAmLMyxnJ=5u*UVg39V)K0ta zZEtm4uLP#5OWTkScDD?k(;jk$a|Kn@OuzL_rD>a6u-kyOgD%Zm?@Xd^e(vF>D@6-Myf~7W;rvzGgMu8b4r*J63+l# ziT_kE^0;CkK~XA#=UL|i+nukEjPP|ge*+;#&KO4yEE1Mc0Bc18;<)$1lcwHr;WfO5 z-r7t*lR@bQ`)XZYk2)um6B3`Rnqq2z=GO4|_H_}9tiH%zD$HxA776T-oi^)O+nhH& zH}bvG_RYY}qxOo`SoGNUZW>wM@O?XIUNQyg^!L0Ok+*)fdR-2M&*P!SU6fAAn*-Z& zVmR($bM1R;5;RUS0^FI}fX2~tHhWLtDc!4ni4lCWb45X;xiWUCaecP{d%< z2Hq1P*VDfG^h<;W=(kJqhQFiRq;;F@UJ~V9%-rgN<7vIqE9XB!`N{`)mgbMaL<#+q zedZF-=riy+Sdz6Jz+?c=l=Q%cE`&rbHSscMsQD+JcT!PPdDhkXN$s*;*rDMmUm-?o zGrCWF#+qe|)4ufY`-?+qw_q2O{}2N}!Z8N`sd|y&H(mX?H}b<45D|mHEaS}| z+6aLT^t>`k=mnWY{|HpOyzgFgb0E_eOhzzFJ*?u7F%?N`oExfcessGz0uuEiQO$ql zQvDk&K?25qFCZ<9#EqC=U$+aT0)iTVCF*?5eoPuN>agGP2q4?2g;evoT%9|5ugE^) z96d;NqA;+n&+DOg5mcfv%kQgbX5Q_?vY1(1ET5jYAz{VVQu3SV#1~$dm9~~RCg%8T zd@AMOt;&G}$d5^3T%LS$l|QuSj_L@{pT!!5S2<4Og^?QXi&BO^u;4Dr>7Wbn6_+fgl z#q9jcrDd;&g}C2u`N+m_=0|j}^zIQL-pQM9+PmXU*(dk(4ItSl8;~jey|kn94WUUQ zS@@dYCzhv@+*ZA8S)Jb`9WGwsZtsvTQ$t zd@T8O9yzin0SM~dE7UiNH8Pklw-w7?Ic%UvJFe$toZ{a)|6HqDMWmz~d?;k}9a$@o zBi71wD2a}U8>f$akpZwf@ploPWo4!J%KE8BBW1+Oj7((8GaNlbrnhGS?_4e?Y;pOVpGWx&J_9^tuNU7|TF}*8SOyRWLQIglgzx(dv7SO-UHlg45`Ya7_Bw+`2i?@-t&4$dO z`@!-xL?7t5k6lr3nMUYt`67V(zi{8qpDlL$v1BSqnLj>byWV;{K!_N4J-j%+Ph{ua zQc)ZzDRFDdEA1MTE!8L$bO56Qp#~FJ)+!lS^9OF@b+rZJu7gU{I*to zo31$Uq;BOcb&nKt*jV&Kt)CzWpuTgvmjkl<|G6XN7)R3n+bafo8aX;{$H)I`frqqz zV*tx-{7}~Cdy#qwMF`0lWe@&buPn#Mj&j(@ z`9x6(G$Qd?sT!JJ+iDSneOrg*7$Cg>er3ye0D-s_qDvsnMQ{+HE=alG`(iUgi4%$x z59`|tML+3uBPB$$MAukP86CIJs1G|Np^j*rR6gOFmj(c_h>X+-LBrC{QhQ+ZP(DUudw&lJ$|I~rK} z9PXyBjlVk>Ln@BcJcu}!Wi=`C_x#H1)zb=;5|E1yn4+<#;L-hvaDKgL7Pl&!d;=M_EW2l9VB zfe12RkHo{1WLNeU*AOFojl^(J+3c|=^?`I9Vu|)LiJ&$ zbMQ?1}uucYrky+UCtVRcDG`I*;Y)e(xBt*Gh!_3mkYnx#d6H^-R8H$1}BfJcxdU zu{iZW-C?9~s!_;DZ?il7vXsHvxC*!(gOYM*71T<}v-e|0jldI=xs5@B8XEED&e}$W zWOcPl`g}}9o3{ee(3upVcRx8Drxy~hEP&{zj@#4f{vWwB)_>s61p1G8{>cUS-|*;{ zHn+w+>DD9P>`3F{%%Q~fjsU!8`j5vk!X}|g=h})sJ^%cBIBp^($$up`;F)K> zGCNe>1v3f^^TScUx35%970p73%2u@d6^OJZqUr}LU;FmIh$p4NqME6H^Q_d_${Kt~ z?uT2xr;{3olqDjaIgl>uPX@uhS$D$^=sTX2GuCXq8^TK>GIQDptbaJQSbS1mYHF^Q zJ30K9y5pT-K7LK~`7lIfnwkht;xEM+Y6F-By=$1~%m&Uj^8dwi|V&W(}WK!{2s~648Bc z{On2{@>3k|Nc54@Rm7^JiXMUxx1ht5_b1Yew=n(}bEY~30bcyje`3z=@&Cn~LrTVs z0cGk;Sc_MA!d)Oc>|VX!BpAqfkXDb-ot#0Y>;Qe!%TgL?bBtTi=8@7av=hctlRMyA zPeIYeKOSzwTH$W?A{mo+iKR?o1}SE2rX&&CVCzhu>LK#RBSe z1=q}tX5KKd+CCN<6VXTQ%Yr!?C3O2YBdi|8X{fI)8~Ga0R2v*SXH+np7$r%pk#XoD z?wg9>RohkuXmC`abXP$5_j48y$zbg8W)zPB$?x3o*k%dqAzQusiwz^TR%13cKg0$x zR9QFs9}Qi~s_7-(ijoS;wH0~E| zY>RSM={$Tgl^Z$RX>ZjC5yl=_Ruu94B(}HXR1r|l))V>t$9PBGd}*7kmldbkIMQom zVB=LCC70796bbwtQ0ingFK5-z%bv>k6(G{&6Ca-2mX~F^^92A3k87IK6W{7v?U%e8 zr*Pg7`$)MKyN_XZr4{PoP2b=^_M6HG$_1kAD~BH4SI{HL9lY3dz4}?cFp~(W`0S|= zSf^_Yi|v7snEyooRVp&|VOy6#vbOOQ+^#PiaR;inq0RRYER)8|x+r0}-IA8Fo&xFw zOf@LHAiN&sUtT>cQuN)K@FOpN419MFQmd-jYjaBGgWNhwYj?P$V$8{=Flkaf75f3F z^E3BF3?LTlJ$*dNUG~c;lkbzYi@X`RoJ+AVj`RPp>sNlp+qmS1l!NVhJT-lYQARp zY1Fx!5MCon*C2uYOVqR07C(#TZXL2g{1wb(*B%z#?;D`=rLB10yem9Vw%52ar>yvE zop+LQJz)RY2hI!x$iG;eq8FCuv-uP=NE*O?Eq)d&y8u#6))d% zEKydcZ62`kh+DVW-aHH{HWHpax?8?`&JMAIQ_Ce|=M=*i*1d0|3ovhzn=61+s*fHA z3nZs3mcG`^vnGBKC;yQ2D5XB@-0Jve5F>*VvnAd7P3>_<&GY(nQqsRPqnqziZqd5WX~pjds6?OXL(emYg2rWy@=ZG(i2d(A-geRas_Gf8&KDn*g@+OO zpijaD$Yg0>+SfoxN~pxGcnC<{VQ3GADfCJLghYBe=oV@B+~u{ss_bVdCY#ASVen^Abm3PtVN= zaZQbCYFt*h9A!nTx-DiD5;k%tgegA=Rr)7Ia9Z(#=bbFG24CZ8{Bj{fOcr0s*!w}@ z{Ji(btH2BgE<3m5RB&h4dX5Bevr3%8jEU> zZf?qRz<@!O1Y?>#TdXS)_-n2sry!6VBN=%i)$F&^c_5K(OEK1RqOWz-%vNmn-uo=&dl3|j zfPqq_|1==+PUCN;+x?pEGI|i%eKrS7=KL=E3}2CxvbL*X(Rbu>gURZ!^FGzVxOK|6 zgeWjTSIswf#$zJ)q*F#(UaEmj1@9;iyNY;vL~dUVTS^_1w`Ew zKt^CB6Vly_*tIRRd@9n-l{b;shjc>8;;wIw_dud~M=dL-iW0QBA21HN2_L2^Z-0$f z?f?8!YFFXJ+^~F?(EqWMj-+u&;eoNF&SpUB>rtCZeqM^Yxt(Y{9VmtTE6!3mwWo#B zwDb_MV?!-s#)NNVmD8`B8BlF^XdHVL5`=ghO~-|2wifLTIEqO66RrwXQr5*pXrJuH{e>i!WH(rY> z-^<=+IGH1~iVFC6CY=o9uC_Qa&@|E6^)8v`akjxel{Ni^;cxsGiENX!r#0#L6ktjw zHMb{wLt1Lsfr~tC8EGjR@cxnQc?t3zL^UXfQ295_i_a)ZCs37ZTB{~kjFz@XMTwSG{<&1tseh7zK*ui)N zjCj`?^q;Qku{tVH5(Qfo`6}^0Z{hF7|1H*vyk(%U#3Q@9`Z1sfvYlOU(Sbwe$&wEq zZ%^h|j7%48ji}-)kpl;NP^AB9hM&1DEFrc*!z{qz`vo7zrc|b8v%;4_Ecpl}O5hk! z|1Y>j_xZ!vU1rt587X_<7;w)C{2S2=Nt_f6$cy}^Wk2>BmF9hX3mgHO^jYsro{o1w z-a6JNpv*VgONnP?Z(Xf}>zFZt{~Ke|{ihrI+c&_86C{pV_?%tL^Fw~1Y~XF+<@?!*{f6V%Zy}6t{<~+Lp9uixA?N>RpjtDANbmYi;g<$ zCC;wNRAn9Z^Ct1@^qJ&Yw~y^6Gd9sAa$NZsC(_S6r9*g_E~H#v^u1>-*Y~t2in7ME zp=~ybUBmZ!-C5!i>%oi*G)se2oo%MeLb=XFuDR~6y50|}B}2!2qe6KR3y|CZw0JIg zZzz0Iw_{$_n#npVQ9<_(#>{tlEs>CS3H*dr1P+BNwZ*z7+o0cfcuIX!N1S6intBgW z<>0wRV}zt@4Q8e`w5=AeQbyH&{VIJCcYt+KA;2;ROz6et^Xk}KFri?rElb=gQ%vVV z(OeU5tjLq>h-9-A^u|!9@~O7>u`voTwvDx-p57ejhYC}QLyWh@&i1D!{#SF?8P?R& zt*wYkQLrmup(qG=L_n!Wq@y4u6oH^1QWTL+f+3;@QKSX|1p-nckU*l8(1}zDRR~Fx zPz8h}gd$0VK;Z6te)oL$KF|4ef89TMo;}$!duFY7)_ULBWh!SMjvTMlP0le&rB;`P z);d?*wZffHZ>n9a!a!jdA(5_bZ08S_V%3fzgKIv1h7o2rDGC)RN0RM%wS2A*8i~S- z=0c3qmdkooKqi$|<*ZxJIhxkrODz;R`xMn$0zU$S>_@v!XdLi%rXYzF+qg!B39WXw z>>60x`Y(xj@nY_kCVZV{JuG?Ca#*|_9X1*2H+c963tr6fAf^%Tp3we2uOtLZypwss zml^=r?ZeD z%;4bHyw0W$Nyj?-^Xa_#Wy`3LKW3}#aAgCI4d%I>%LXI>m^DVJy19^JH!SkA4UkBJ zE18*sd}}lv@2c4Mg-njR)>3xh@QzOP@C#C}r}PiJ@d@)IevRq@qu#fF)IywBbdv+6 zr~RefqmHHAHaTj2510TWK@AW5z@oDCw~j7EOb#J{$oE~>C$z+vMe?jg$~A~4FPA9q z&Z(c5g8w|d%o?iRkUwkJHu71-^8NhFl9(l?OrcA?RdFA|)kvk7c7_<)aH0|FXUdpT zjvSNRG+47`Ec^FM)XDlkg7{MT(x^(@o3-p3eiI&RBziEHl)_>ZnWAJ~Qn8cNx;y-% z+?_AEgm9(=LHUMDokrN)3;jMrnl$dlk;?n|T$|g0!Nm2Yk#+C1s|}xB!CHRJMGsSk zHB)p#3#imK=e{`>Q`o-aHdc{R)@TAcjOqD?OK-6$`uT;NG)}Bh4OWGWNrzY{4(PFb zm(7{qyGeo|a!^rGcs|%>k%BM*{XlMGO3cXCc1%#`Z!GoJa*Izr_JrNkBN$N@b>iO> zr~LLdP2At99s2|Q0+X=xVF7RX*)RPxeRJN^-Zp6zs9UA5w65|!d3g!_wT3x^ zCg6B3y3oPbdk%31g-HUlzSdYtwW$y%lY>}+9NpK3{No&5@Z>ayZ61dEa6g8sM2nra zS!nR^Bh59sLuJ$gPN7(0sg-Tg#c6byn)O&l)a2LQYv%PKf6&q_xgT3@XPdDl|DgRv z4}~H6)CX>*U*jgWdS68$i3ot5^x2p31C+mFE8KPA=kth0VVZLWMAM}sonZzQ(%9`VBfnNV^xJjYh zse5U*1Xb8UsnTdS}`Y>)fz%z7Z8LTyb|onJxU zbVB|8#`jo7Q>weWgE(KE5p$qh^cPdM9C?>3Q1KZ3$Q?}P`mLb4Fn$NzIwgQE06{K&Qy(tb!G47!$;se7oLz!h$5L!K|bBxM79aqZbTkLj#+ z4O!cTb9ko69DIp3umjI5NR$#}nIHcD9CVQ9rxR<|{+9Pyq zse`rGY|Xa#I)qaZWAV}I$^<0eCm`b4i|V_xN^7T=Z%U4se3%Fd`5nUA~0 zA!FiFo|cH&0U>opu6|B@PW9Yls8JYEccS5!@#adtfJ#?oH7#hAmM88c{80SX-lH9`FU|!>9ln?R%u%BUC~C&Y zub9CDL9`pshr&Z-&3+a=1QZ5H&^sWf?)ArLyiP0XO(70f+D|t^Q&ZD+Y+yKs$Sem8 z__#a&d;M5p)0a(Y^Iz1ShM|v*z?|YRtbB%EqqEo)lC~_o1Tudj%_EvPVUVx&a}eF+ zkgKi|3UKoa{GMFlvUmZBn!ev>3yGF{)J$sx_PWfPKcxJPqy&KFeAG)ccnrN&K+s&L z519=WJ|DOhqVR`RVVwmz;gg#(fY3@=4%sAHfrijojoIaaEiJFU$&c_=tLJA{o?pRj z_#G8~30O~Es7r|m8Tw6r4j#$ZQ+wmJu4V40i-HYhc5@-zjc3zria9 z?EoVFI9jzKs4HL;+Ic350M!+?f1|Yrl-VW9BgP$~|Awy?N#l1QH) zIOc$1=tT7=Nj0VTv&{YEwsyUIq%^^omH$IOc43#ruS?keFzfjmyd6lP((1_QW$}Gra1x%V{-c7w_X6KX(<8j$4{i165l=EX#V7FDIXp)Rdsj8bN6orKAPc$8!$JK zxJuTRCA6VWuMSQ^%p2?7ovv+dnbVQPdIc=T!$UzDiMn2g?%`}~z1B6igz68fbfHBE zZGG9Q7Oi_#@~EEcnL7YbyjL+UDYMB%w^X&n!}l8v?>NL6i19?aqAj6pg~d3_YaZ#H zC`mB*PLf`QK$N#aYog9cll_42!g!=>`9772u4?jL6L}ADuDp{8lFIda1vNfz?LA!b zvmQz&VzwPbyRe{+dxnL)e6!n`5O~C^V^2AwgiWVR#OOq*)8vuc}rClfnT)Hv z3xqiVA`aA0I{Vj>Y8y(2rZHcR9X1k(|9vG%=4hZ7J`R}ggg(EL>qx!J8lKd^rVmjqhx)8*>Av+tDa8}#(jHmn0T+; z3?U>WBn%Rq1kDZl{sj_f+3O-IQh$k6^~!mxl}%B`?s!4&>i8=vD*e)h3;VLuyi0a!H92(X_-*e)J(q}{iG#EJSOGWm6{qg zcSlL!?>E9g16m44-UAm7zI>!i*j`v+;caN2prc9jo9ZdjIj0==V}YYB2B3`a5#Ej% zOn<+}#Ms9SZGUN;%PwH)#6DBoAAI@dlD56+&~+a{%|GQ&XhVaI8^`0Fw+cG(cNP`2 z^M(@Mu6V;_45Gk-R8;VvJQYCU{U862A@FZ z;!Gp;OkavFk4p1S1kO0=c&E9C+C$4unjtC#Z+5O80Bi-UGZ}QMtT@AdX4DL1HZX?O z4IqN%b|@7vIx96h^emvO^iV$HyP#0m-V~Iq=jxrT_Z3$t%~Ng@n6kiI%qVI1vgc;^ zJs6#Pu=a8o_FjWF+9Ah}e8#_xN82{SMnwc;mM72#1MaYO;U!xRI3|lqoJ!r27Pz;n;?GCb*vaipOp5W0bW8sWV5areHty*`@xW z-e>EzWGKqc^8-CH4W@g8ewae7^5KzY5i-?QqWa%({Y#js_19QuS*ZwafbM#y;RD-o zIf*LO)X1^WOzA!v8hu=)|EcX5$$8WbU5T~SCn*O~N8UHf?G0w^@}TjU$saw3!>Rg3 z=qX&q3cDr)^($nq<34o4gvREi={3ClkkCtscSBPTZ}Qxcu+1)v31GADW`c5^PwB>+~6mAlF5;%*sOGVsf;f6@MsU| zvwr~n`|9VA_JcWJD))|l*^6r|93CzYrtGA4EafUye77&`g>b}=NndfDnNs;;Knp2@ zkN5Y%m+_b2(T(+!;L>{c&P*BHf0r;piiBt#8A zY}HW{oDJr;d`QR+NazKBFg@%R_EK+g{W<~WJV4f@$7XLtGiKf-93C#Pa@952&=;YzvZ8N=b8Bj=KbWRH(pMM}d-QIV>sd;tt&_Aysu6!RlcuMt#QnKS5a60PCFxdx+-tF#*} zi_Ow<__5M5$*&2PWA__fWwcm}olw$3F;PMO!LIkn(Sk@UNSjEGnp+3na8Tv_$QA2Ps9e!xkf^_%J0+OlTl>de6a`0N^LL+J>5TbFmg?JhaG3ljb^ zk1<0<=H8Sudj?(n=*7VoIL*v3eYqk)5HA5}QmrLY%Cyj*Z-kRqoO3FdGgJMwQ5YF8 z-byzStCu}@z;JY6!oj^~x+uZ$u^w+@&6<2ABD8*i>pkmfHq%WWRx`+{vD;YsWTBJ| zY`VA`_`rq##_H;kprd5(scSY1uy^9_=Obs3>tH2C^I^N?qopubtW8#3r1G zUygyVrhs4YPL7VXpPke+39%bEIw!bi;WV?k6<=MwlgE~%0Eb)5j4TbY2DhL77Z`MK A#sB~S literal 0 HcmV?d00001 From c9b8889fbb2abf10330f86636086b1a0eb8c4ea3 Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Sun, 22 Aug 2021 02:11:12 -0700 Subject: [PATCH 04/20] avoids duplicated checks on commits to open PR --- .github/workflows/test.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 72418153..5fdb299d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,8 @@ name: Test action -on: [push, pull_request] +on: + push: + pull_request: [opened] jobs: test: From 778e10dc42714dfb46a2ef1065162ac4969ab549 Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Sun, 22 Aug 2021 02:15:52 -0700 Subject: [PATCH 05/20] fix workflow from last commit --- .github/workflows/test.yml | 3 ++- README.md | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5fdb299d..f0dc8922 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,8 @@ name: Test action on: push: - pull_request: [opened] + pull_request: + types: [opened] jobs: test: diff --git a/README.md b/README.md index 0b43e5f4..b77a8cb3 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,10 @@ Just create a `yml` file under your GitHub repository. For example `.github/work ```yml name: cpp-linter - +on: push: - pull_request: [opened] + pull_request: + types: [opened] jobs: cpp-linter: name: cpp-linter From 8da8e0dcdad0f62806c0a6622416ff64b2febe9f Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Sun, 22 Aug 2021 18:24:10 -0700 Subject: [PATCH 06/20] Revert "fix workflow from last commit" This reverts commit 778e10dc42714dfb46a2ef1065162ac4969ab549. --- .github/workflows/test.yml | 3 +-- README.md | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f0dc8922..5fdb299d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,8 +2,7 @@ name: Test action on: push: - pull_request: - types: [opened] + pull_request: [opened] jobs: test: diff --git a/README.md b/README.md index b77a8cb3..0b43e5f4 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,9 @@ Just create a `yml` file under your GitHub repository. For example `.github/work ```yml name: cpp-linter -on: + push: - pull_request: - types: [opened] + pull_request: [opened] jobs: cpp-linter: name: cpp-linter From e459c4176214f3f8704cf91a903aa32da0533a7d Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Tue, 19 Oct 2021 21:19:51 -0700 Subject: [PATCH 07/20] rename py pkg; allow no clang-tidy & no event.json --- .ci-ignore | 2 +- .github/workflows/build-docs.bak | 32 --------------- .github/workflows/run-pylint.yml | 2 +- Dockerfile | 4 +- {python_action => cpp_linter}/__init__.py | 10 ++--- .../clang_format_xml.py | 10 ++--- {python_action => cpp_linter}/clang_tidy.py | 2 +- .../clang_tidy_yml.py | 10 ++--- {python_action => cpp_linter}/run.py | 39 +++++++++++-------- .../thread_comments.py | 0 ..._xml.md => cpp_linter.clang_format_xml.md} | 2 +- docs/API Reference/cpp_linter.clang_tidy.md | 3 ++ ...dy_yml.md => cpp_linter.clang_tidy_yml.md} | 2 +- docs/API Reference/cpp_linter.md | 3 ++ docs/API Reference/cpp_linter.run.md | 3 ++ .../cpp_linter.thread_comments.md | 3 ++ .../API Reference/python_action.clang_tidy.md | 3 -- docs/API Reference/python_action.md | 3 -- docs/API Reference/python_action.run.md | 3 -- .../python_action.thread_comments.md | 3 -- mkdocs.yml | 14 +++---- setup.py | 6 +-- 22 files changed, 66 insertions(+), 93 deletions(-) delete mode 100644 .github/workflows/build-docs.bak rename {python_action => cpp_linter}/__init__.py (89%) rename {python_action => cpp_linter}/clang_format_xml.py (93%) rename {python_action => cpp_linter}/clang_tidy.py (98%) rename {python_action => cpp_linter}/clang_tidy_yml.py (92%) rename {python_action => cpp_linter}/run.py (95%) rename {python_action => cpp_linter}/thread_comments.py (100%) rename docs/API Reference/{python_action.clang_format_xml.md => cpp_linter.clang_format_xml.md} (74%) create mode 100644 docs/API Reference/cpp_linter.clang_tidy.md rename docs/API Reference/{python_action.clang_tidy_yml.md => cpp_linter.clang_tidy_yml.md} (75%) create mode 100644 docs/API Reference/cpp_linter.md create mode 100644 docs/API Reference/cpp_linter.run.md create mode 100644 docs/API Reference/cpp_linter.thread_comments.md delete mode 100644 docs/API Reference/python_action.clang_tidy.md delete mode 100644 docs/API Reference/python_action.md delete mode 100644 docs/API Reference/python_action.run.md delete mode 100644 docs/API Reference/python_action.thread_comments.md diff --git a/.ci-ignore b/.ci-ignore index afba914c..b9610532 100644 --- a/.ci-ignore +++ b/.ci-ignore @@ -1,2 +1,2 @@ -python_action +cpp_linter mkdocs.yml diff --git a/.github/workflows/build-docs.bak b/.github/workflows/build-docs.bak deleted file mode 100644 index 721744b3..00000000 --- a/.github/workflows/build-docs.bak +++ /dev/null @@ -1,32 +0,0 @@ -name: dev-docs - -on: - push: - pull_request: - types: [opened] - -jobs: - using-mkdocs: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v1 - with: - python-version: 3.7 - - name: Install doc's deps - run: | - python3 -m pip install -r docs/requirements.txt - python3 -m pip install . - - name: Build docs - run: mkdocs build - - name: Save artifact - uses: actions/upload-artifact@v2 - with: - name: "cpp linter action dev docs" - path: site/** - - name: upload to github pages - if: ${{ github.event_name == 'release'}} - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: site diff --git a/.github/workflows/run-pylint.yml b/.github/workflows/run-pylint.yml index 3ef7c8bd..0d103b95 100644 --- a/.github/workflows/run-pylint.yml +++ b/.github/workflows/run-pylint.yml @@ -25,5 +25,5 @@ jobs: python3 -m pip install -r requirements.txt - name: run pylint run: | - pylint python_action/** + pylint cpp_linter/** pylint setup.py diff --git a/Dockerfile b/Dockerfile index 9c0a20f5..43fb1064 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,11 +16,11 @@ RUN apt-get update RUN apt-get -y install python3-pip # RUN python3 -m pip install --upgrade pip -COPY python_action/ pkg/python_action/ +COPY cpp_linter/ pkg/cpp_linter/ COPY setup.py pkg/setup.py RUN python3 -m pip install pkg/ # github action args use the CMD option # See https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runsargs # also https://docs.docker.com/engine/reference/builder/#cmd -ENTRYPOINT [ "python3", "-m", "python_action.run" ] +ENTRYPOINT [ "python3", "-m", "cpp_linter.run" ] diff --git a/python_action/__init__.py b/cpp_linter/__init__.py similarity index 89% rename from python_action/__init__.py rename to cpp_linter/__init__.py index 613a5a2f..416e7e24 100644 --- a/python_action/__init__.py +++ b/cpp_linter/__init__.py @@ -1,4 +1,4 @@ -"""The Base module of the `python_action` package. This holds the objects shared by +"""The Base module of the `cpp_linter` package. This holds the objects shared by multiple modules.""" import io import os @@ -24,7 +24,7 @@ logger.debug("rich module not found") # global constant variables -GITHUB_SHA = os.getenv("GITHUB_SHA", "95915a282b3efcad67b9ad3f95fba1501e43ab22") +GITHUB_SHA = os.getenv("GITHUB_SHA", "") GITHUB_TOKEN = os.getenv("GITHUB_TOKEN", os.getenv("GIT_REST_API", "")) API_HEADERS = { "Authorization": f"token {GITHUB_TOKEN}", @@ -54,13 +54,13 @@ class GlobalParser: tidy_notes = [] """This can only be a `list` of type - [`TidyNotification`][python_action.clang_tidy.TidyNotification]""" + [`TidyNotification`][cpp_linter.clang_tidy.TidyNotification]""" tidy_advice = [] """This can only be a `list` of type - [`YMLFixit`][python_action.clang_tidy_yml.YMLFixit]""" + [`YMLFixit`][cpp_linter.clang_tidy_yml.YMLFixit]""" format_advice = [] """This can only be a `list` of type - [`XMLFixit`][python_action.clang_format_xml.XMLFixit]""" + [`XMLFixit`][cpp_linter.clang_format_xml.XMLFixit]""" def get_line_cnt_from_cols(file_path: str, offset: int) -> tuple: diff --git a/python_action/clang_format_xml.py b/cpp_linter/clang_format_xml.py similarity index 93% rename from python_action/clang_format_xml.py rename to cpp_linter/clang_format_xml.py index ea98f0f2..3657c5ce 100644 --- a/python_action/clang_format_xml.py +++ b/cpp_linter/clang_format_xml.py @@ -37,7 +37,7 @@ class FormatReplacementLine: Attributes: line (int): The line number of where the suggestion starts replacements (list): A list of - [`FormatReplacement`][python_action.clang_format_xml.FormatReplacement] + [`FormatReplacement`][cpp_linter.clang_format_xml.FormatReplacement] object(s) representing suggestions. """ @@ -63,7 +63,7 @@ class XMLFixit: filename (str): The source file that the suggestion concerns. replaced_lines (list): A list of [`FormatReplacementLine`][ - python_action.clang_format_xml.FormatReplacementLine] + cpp_linter.clang_format_xml.FormatReplacementLine] representing replacement(s) on a single line. """ @@ -118,7 +118,7 @@ def log_command(self, style: str) -> str: def parse_format_replacements_xml(src_filename: str): """Parse XML output of replacements from clang-format. Output is saved to - [`format_advice`][python_action.__init__.GlobalParser.format_advice]. + [`format_advice`][cpp_linter.__init__.GlobalParser.format_advice]. Args: src_filename: The source file's name for which the contents of the xml @@ -145,8 +145,8 @@ def parse_format_replacements_xml(src_filename: str): def print_fixits(): - """Print all [`XMLFixit`][python_action.clang_format_xml.XMLFixit] objects in - [`format_advice`][python_action.__init__.GlobalParser.format_advice].""" + """Print all [`XMLFixit`][cpp_linter.clang_format_xml.XMLFixit] objects in + [`format_advice`][cpp_linter.__init__.GlobalParser.format_advice].""" for fixit in GlobalParser.format_advice: print(repr(fixit)) for line_fix in fixit.replaced_lines: diff --git a/python_action/clang_tidy.py b/cpp_linter/clang_tidy.py similarity index 98% rename from python_action/clang_tidy.py rename to cpp_linter/clang_tidy.py index f9a77bbb..47adb0b5 100644 --- a/python_action/clang_tidy.py +++ b/cpp_linter/clang_tidy.py @@ -100,7 +100,7 @@ def parse_tidy_output() -> None: def print_fixits(): """Print out all clang-tidy notifications from stdout (which are saved to clang_tidy_report.txt and allocated to - [`tidy_notes`][python_action.__init__.GlobalParser.tidy_notes].""" + [`tidy_notes`][cpp_linter.__init__.GlobalParser.tidy_notes].""" for notification in GlobalParser.tidy_notes: print("found", len(GlobalParser.tidy_notes), "tidy_notes") print(repr(notification)) diff --git a/python_action/clang_tidy_yml.py b/cpp_linter/clang_tidy_yml.py similarity index 92% rename from python_action/clang_tidy_yml.py rename to cpp_linter/clang_tidy_yml.py index 89476f5e..9cb377b4 100644 --- a/python_action/clang_tidy_yml.py +++ b/cpp_linter/clang_tidy_yml.py @@ -20,7 +20,7 @@ class TidyDiagnostic: cols (int): The columns of the `line` that triggered the diagnostic null_len (int): The number of bytes replaced by suggestions replacements (list): The `list` of - [`TidyReplacement`][python_action.clang_tidy_yml.TidyReplacement] objects. + [`TidyReplacement`][cpp_linter.clang_tidy_yml.TidyReplacement] objects. """ @@ -79,7 +79,7 @@ class YMLFixit: Attributes: filename (str): The source file's name concerning the suggestion. diagnostics (list): The `list` of - [`TidyDiagnostic`][python_action.clang_tidy_yml.TidyDiagnostic] objects. + [`TidyDiagnostic`][cpp_linter.clang_tidy_yml.TidyDiagnostic] objects. """ def __init__(self, filename: str) -> None: @@ -99,7 +99,7 @@ def __repr__(self) -> str: def parse_tidy_suggestions_yml(): """Read a YAML file from clang-tidy and create a list of suggestions from it. - Output is saved to [`tidy_advice`][python_action.__init__.GlobalParser.tidy_advice]. + Output is saved to [`tidy_advice`][cpp_linter.__init__.GlobalParser.tidy_advice]. """ yml = {} with open("clang_tidy_output.yml", "r", encoding="utf-8") as yml_file: @@ -129,8 +129,8 @@ def parse_tidy_suggestions_yml(): def print_fixits(): - """Print all [`YMLFixit`][python_action.clang_tidy_yml.YMLFixit] objects in - [`tidy_advice`][python_action.__init__.GlobalParser.tidy_advice].""" + """Print all [`YMLFixit`][cpp_linter.clang_tidy_yml.YMLFixit] objects in + [`tidy_advice`][cpp_linter.__init__.GlobalParser.tidy_advice].""" for fix in GlobalParser.tidy_advice: for diag in fix.diagnostics: print(repr(diag)) diff --git a/python_action/run.py b/cpp_linter/run.py similarity index 95% rename from python_action/run.py rename to cpp_linter/run.py index e97d11bd..ec221344 100644 --- a/python_action/run.py +++ b/cpp_linter/run.py @@ -1,5 +1,5 @@ """Run clang-tidy and clang-format on a list of changed files provided by GitHub's -REST API. If executed from command-line, then [`main()`][python_action.run.main] is +REST API. If executed from command-line, then [`main()`][cpp_linter.run.main] is the entrypoint. !!! info "See Also" @@ -35,10 +35,10 @@ # global constant variables -GITHUB_EVEN_PATH = os.getenv("GITHUB_EVENT_PATH", "event_payload.json") +GITHUB_EVEN_PATH = os.getenv("GITHUB_EVENT_PATH", "") GITHUB_API_URL = os.getenv("GITHUB_API_URL", "https://api.github.com") -GITHUB_REPOSITORY = os.getenv("GITHUB_REPOSITORY", "2bndy5/cpp-linter-action") -GITHUB_EVENT_NAME = os.getenv("GITHUB_EVENT_NAME", "pull_request") +GITHUB_REPOSITORY = os.getenv("GITHUB_REPOSITORY", "") +GITHUB_EVENT_NAME = os.getenv("GITHUB_EVENT_NAME", "") # setup CLI args cli_arg_parser = argparse.ArgumentParser( @@ -184,7 +184,7 @@ def is_file_in_list(paths: list, file_name: str, prompt: str) -> bool: def get_list_of_changed_files() -> None: """Fetch the JSON payload of the event's changed files. Sets the - [`FILES`][python_action.__init__.Globals.FILES] attribute.""" + [`FILES`][cpp_linter.__init__.Globals.FILES] attribute.""" files_link = f"{GITHUB_API_URL}/repos/{GITHUB_REPOSITORY}/" if GITHUB_EVENT_NAME == "pull_request": files_link += f"pulls/{Globals.EVENT_PAYLOAD['number']}/files" @@ -201,7 +201,7 @@ def filter_out_non_source_files( ext_list: list, ignored: list, not_ignored: list, lines_changed_only: bool ) -> bool: """Exclude undesired files (specified by user input 'extensions'). This filter - applies to the event's [`FILES`][python_action.__init__.Globals.FILES] attribute. + applies to the event's [`FILES`][cpp_linter.__init__.Globals.FILES] attribute. Args: ext_list: A list of file extensions that are to be examined. @@ -212,7 +212,7 @@ def filter_out_non_source_files( Returns: True if there are files to check. False will invoke a early exit (in - [`main()`][python_action.run.main]) when no files to be checked. + [`main()`][cpp_linter.run.main]) when no files to be checked. """ files = [] for file in ( @@ -296,7 +296,7 @@ def verify_files_are_present() -> None: def list_source_files(ext_list: list, ignored_paths: list, not_ignored: list) -> bool: """Make a list of source files to be checked. The resulting list is stored in - [`FILES`][python_action.__init__.Globals.FILES]. + [`FILES`][cpp_linter.__init__.Globals.FILES]. Args: ext_list: A list of file extensions that should by attended. @@ -305,7 +305,7 @@ def list_source_files(ext_list: list, ignored_paths: list, not_ignored: list) -> Returns: True if there are files to check. False will invoke a early exit (in - [`main()`][python_action.run.main]) when no files to be checked. + [`main()`][cpp_linter.run.main]) when no files to be checked. """ if os.path.exists(".gitmodules"): submodules = configparser.ConfigParser() @@ -357,6 +357,10 @@ def run_clang_tidy( lines_changed_only: A flag that forces focus on only changes in the event's diff info. """ + if checks == "-*": # if all checks are disabled, then clang-tidy is skipped + # clear the clang-tidy output file and exit function + with open("clang_tidy_report.txt", "wb") as f_out: + return cmds = [f"clang-tidy-{version}"] if sys.platform.startswith("win32"): cmds = ["clang-tidy"] @@ -420,7 +424,7 @@ def capture_clang_tools_output( version: str, checks: str, style: str, lines_changed_only: bool ): """Execute and capture all output from clang-tidy and clang-format. This aggregates - results in the [`OUTPUT`][python_action.__init__.Globals.OUTPUT]. + results in the [`OUTPUT`][cpp_linter.__init__.Globals.OUTPUT]. Args: version: The version of clang-tidy to run. @@ -671,13 +675,14 @@ def main(): logger.info("processing %s event", GITHUB_EVENT_NAME) - # load event's json info about the workflow run - with open(GITHUB_EVEN_PATH, "r", encoding="utf-8") as payload: - Globals.EVENT_PAYLOAD = json.load(payload) - if logger.getEffectiveLevel() <= logging.DEBUG: - start_log_group("Event json from the runner") - logger.debug(json.dumps(Globals.EVENT_PAYLOAD)) - end_log_group() + if args.files_checked_only: + # load event's json info about the workflow run + with open(GITHUB_EVEN_PATH, "r", encoding="utf-8") as payload: + Globals.EVENT_PAYLOAD = json.load(payload) + if logger.getEffectiveLevel() <= logging.DEBUG: + start_log_group("Event json from the runner") + logger.debug(json.dumps(Globals.EVENT_PAYLOAD)) + end_log_group() # change working directory os.chdir(args.repo_root) diff --git a/python_action/thread_comments.py b/cpp_linter/thread_comments.py similarity index 100% rename from python_action/thread_comments.py rename to cpp_linter/thread_comments.py diff --git a/docs/API Reference/python_action.clang_format_xml.md b/docs/API Reference/cpp_linter.clang_format_xml.md similarity index 74% rename from docs/API Reference/python_action.clang_format_xml.md rename to docs/API Reference/cpp_linter.clang_format_xml.md index 47dc0fef..8f7a76c8 100644 --- a/docs/API Reference/python_action.clang_format_xml.md +++ b/docs/API Reference/cpp_linter.clang_format_xml.md @@ -3,4 +3,4 @@ !!! info This API is experimental and not actually used in production. -::: python_action.clang_format_xml +::: cpp_linter.clang_format_xml diff --git a/docs/API Reference/cpp_linter.clang_tidy.md b/docs/API Reference/cpp_linter.clang_tidy.md new file mode 100644 index 00000000..689b12e0 --- /dev/null +++ b/docs/API Reference/cpp_linter.clang_tidy.md @@ -0,0 +1,3 @@ +# clang_tidy module + +::: cpp_linter.clang_tidy diff --git a/docs/API Reference/python_action.clang_tidy_yml.md b/docs/API Reference/cpp_linter.clang_tidy_yml.md similarity index 75% rename from docs/API Reference/python_action.clang_tidy_yml.md rename to docs/API Reference/cpp_linter.clang_tidy_yml.md index 4b01f8d9..7db0ae26 100644 --- a/docs/API Reference/python_action.clang_tidy_yml.md +++ b/docs/API Reference/cpp_linter.clang_tidy_yml.md @@ -3,4 +3,4 @@ !!! info This API is experimental and not actually used in production. -::: python_action.clang_tidy_yml +::: cpp_linter.clang_tidy_yml diff --git a/docs/API Reference/cpp_linter.md b/docs/API Reference/cpp_linter.md new file mode 100644 index 00000000..31b45342 --- /dev/null +++ b/docs/API Reference/cpp_linter.md @@ -0,0 +1,3 @@ +# Base module + +::: cpp_linter.__init__ diff --git a/docs/API Reference/cpp_linter.run.md b/docs/API Reference/cpp_linter.run.md new file mode 100644 index 00000000..4563d550 --- /dev/null +++ b/docs/API Reference/cpp_linter.run.md @@ -0,0 +1,3 @@ +# Run module + +::: cpp_linter.run diff --git a/docs/API Reference/cpp_linter.thread_comments.md b/docs/API Reference/cpp_linter.thread_comments.md new file mode 100644 index 00000000..17a801bc --- /dev/null +++ b/docs/API Reference/cpp_linter.thread_comments.md @@ -0,0 +1,3 @@ +# thread_comments module + +::: cpp_linter.thread_comments diff --git a/docs/API Reference/python_action.clang_tidy.md b/docs/API Reference/python_action.clang_tidy.md deleted file mode 100644 index 754f8f57..00000000 --- a/docs/API Reference/python_action.clang_tidy.md +++ /dev/null @@ -1,3 +0,0 @@ -# clang_tidy module - -::: python_action.clang_tidy diff --git a/docs/API Reference/python_action.md b/docs/API Reference/python_action.md deleted file mode 100644 index ae028699..00000000 --- a/docs/API Reference/python_action.md +++ /dev/null @@ -1,3 +0,0 @@ -# Base module - -::: python_action.__init__ diff --git a/docs/API Reference/python_action.run.md b/docs/API Reference/python_action.run.md deleted file mode 100644 index 281b0fd6..00000000 --- a/docs/API Reference/python_action.run.md +++ /dev/null @@ -1,3 +0,0 @@ -# Run module - -::: python_action.run diff --git a/docs/API Reference/python_action.thread_comments.md b/docs/API Reference/python_action.thread_comments.md deleted file mode 100644 index e83bebae..00000000 --- a/docs/API Reference/python_action.thread_comments.md +++ /dev/null @@ -1,3 +0,0 @@ -# thread_comments module - -::: python_action.thread_comments diff --git a/mkdocs.yml b/mkdocs.yml index 609a75d5..d12bc632 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -7,12 +7,12 @@ repo_name: "shenxianpeng/cpp-linter-action" nav: - index.md - "Dev Docs": - - API Reference/python_action.md - - API Reference/python_action.run.md - - API Reference/python_action.clang_tidy.md - - API Reference/python_action.clang_tidy_yml.md - - API Reference/python_action.clang_format_xml.md - - API Reference/python_action.thread_comments.md + - API Reference/cpp_linter.md + - API Reference/cpp_linter.run.md + - API Reference/cpp_linter.clang_tidy.md + - API Reference/cpp_linter.clang_tidy_yml.md + - API Reference/cpp_linter.clang_format_xml.md + - API Reference/cpp_linter.thread_comments.md theme: name: material @@ -52,7 +52,7 @@ plugins: show_source: true heading_level: 2 watch: - - python_action + - cpp_linter markdown_extensions: - admonition diff --git a/setup.py b/setup.py index 24de2052..c29ad256 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( - name="python_action", + name="cpp_linter", # use_scm_version=True, # setup_requires=["setuptools_scm"], version="v1.2.1", @@ -30,9 +30,9 @@ "Programming Language :: Python :: 3", ], keywords="clang clang-tidy clang-format", - packages=["python_action"], + packages=["cpp_linter"], - entry_points={"console_scripts": ["run-action=python_action.run:main"]}, + entry_points={"console_scripts": ["cpp-linter=cpp_linter.run:main"]}, # Specifiy your homepage URL for your project here url=REPO, download_url=f"{REPO}/releases", From bb3aade6ba4cfb6b098d96cc176bcefa93137abe Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Tue, 19 Oct 2021 21:26:31 -0700 Subject: [PATCH 08/20] pleasing pylint --- cpp_linter/run.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/cpp_linter/run.py b/cpp_linter/run.py index ec221344..348e8ba9 100644 --- a/cpp_linter/run.py +++ b/cpp_linter/run.py @@ -38,7 +38,7 @@ GITHUB_EVEN_PATH = os.getenv("GITHUB_EVENT_PATH", "") GITHUB_API_URL = os.getenv("GITHUB_API_URL", "https://api.github.com") GITHUB_REPOSITORY = os.getenv("GITHUB_REPOSITORY", "") -GITHUB_EVENT_NAME = os.getenv("GITHUB_EVENT_NAME", "") +GITHUB_EVENT_NAME = os.getenv("GITHUB_EVENT_NAME", "unknown") # setup CLI args cli_arg_parser = argparse.ArgumentParser( @@ -675,15 +675,6 @@ def main(): logger.info("processing %s event", GITHUB_EVENT_NAME) - if args.files_checked_only: - # load event's json info about the workflow run - with open(GITHUB_EVEN_PATH, "r", encoding="utf-8") as payload: - Globals.EVENT_PAYLOAD = json.load(payload) - if logger.getEffectiveLevel() <= logging.DEBUG: - start_log_group("Event json from the runner") - logger.debug(json.dumps(Globals.EVENT_PAYLOAD)) - end_log_group() - # change working directory os.chdir(args.repo_root) @@ -700,6 +691,13 @@ def main(): ) exit_early = False if args.files_changed_only: + # load event's json info about the workflow run + with open(GITHUB_EVEN_PATH, "r", encoding="utf-8") as payload: + Globals.EVENT_PAYLOAD = json.load(payload) + if logger.getEffectiveLevel() <= logging.DEBUG: + start_log_group("Event json from the runner") + logger.debug(json.dumps(Globals.EVENT_PAYLOAD)) + end_log_group() get_list_of_changed_files() exit_early = not filter_out_non_source_files( args.extensions, From 323a159b2a92e56fd591deef54e8e5b7deac2b47 Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 00:11:46 -0700 Subject: [PATCH 09/20] various bug fixes --- cpp_linter/__init__.py | 12 ++++-------- cpp_linter/clang_tidy.py | 21 +++++++++------------ cpp_linter/run.py | 39 ++++++++++++++++++++++++++------------- setup.py | 4 ++-- 4 files changed, 41 insertions(+), 35 deletions(-) diff --git a/cpp_linter/__init__.py b/cpp_linter/__init__.py index 416e7e24..aace8e61 100644 --- a/cpp_linter/__init__.py +++ b/cpp_linter/__init__.py @@ -80,19 +80,15 @@ def get_line_cnt_from_cols(file_path: str, offset: int) -> tuple: last_lf_pos = 0 cols = 1 file_path = file_path.replace("/", os.sep) - with io.open(file_path, "r", encoding="utf-8", newline="\n") as src_file: - src_file.seek(0, io.SEEK_END) - max_len = src_file.tell() + # logger.debug("Getting line count from %s at offset %d", file_path, offset) + with io.open(file_path, "rb") as src_file: + max_len = src_file.seek(0, io.SEEK_END) src_file.seek(0, io.SEEK_SET) while src_file.tell() != offset and src_file.tell() < max_len: char = src_file.read(1) - if char == "\n": + if char == b"\n": line_cnt += 1 last_lf_pos = src_file.tell() - 1 # -1 because LF is part of offset - if last_lf_pos + 1 > max_len: - src_file.newlines = "\r\n" - src_file.seek(0, io.SEEK_SET) - line_cnt = 1 cols = src_file.tell() - last_lf_pos return (line_cnt, cols) diff --git a/cpp_linter/clang_tidy.py b/cpp_linter/clang_tidy.py index 47adb0b5..c4f0052a 100644 --- a/cpp_linter/clang_tidy.py +++ b/cpp_linter/clang_tidy.py @@ -2,8 +2,9 @@ import os import sys import re -from . import GlobalParser +from . import GlobalParser #, logger +NOTE_HEADER = re.compile("^(.*):(\d+):(\d+):\s(\w+):(.*)\[(.*)\]$") class TidyNotification: """Create a object that decodes info from the clang-tidy output's initial line that @@ -25,22 +26,17 @@ def __init__(self, notification_line: str): Args: notification_line: The first line in the notification. """ - sliced_line = notification_line.split(":") - if sys.platform.startswith("win32") and len(sliced_line) > 5: - # sliced_list items 0 & 1 are the path seperated at the ":". - # we need to re-assemble the path for correct list expansion (see below) - sliced_line = [sliced_line[0] + ":" + sliced_line[1]] + sliced_line[2:] + # logger.debug("Creating tidy note from line %s", notification_line) ( self.filename, self.line, self.cols, self.note_type, self.note_info, - ) = sliced_line + self.diagnostic, + ) = notification_line - self.diagnostic = re.search("\[.*\]", self.note_info).group(0) - self.note_info = self.note_info.replace(self.diagnostic, "").strip() - self.diagnostic = self.diagnostic[1:-1] + self.note_info = self.note_info.strip() self.note_type = self.note_type.strip() self.line = int(self.line) self.cols = int(self.cols) @@ -90,8 +86,9 @@ def parse_tidy_output() -> None: notification = None with open("clang_tidy_report.txt", "r", encoding="utf-8") as tidy_out: for line in tidy_out.readlines(): - if re.search("^.*:\d+:\d+:\s\w+:.*\[.*\]$", line) is not None: - notification = TidyNotification(line) + match = re.match(NOTE_HEADER, line) + if match is not None: + notification = TidyNotification(match.groups()) GlobalParser.tidy_notes.append(notification) elif notification is not None: notification.fixit_lines.append(line) diff --git a/cpp_linter/run.py b/cpp_linter/run.py index 348e8ba9..debe1402 100644 --- a/cpp_linter/run.py +++ b/cpp_linter/run.py @@ -104,14 +104,14 @@ ) cli_arg_parser.add_argument( "--files-changed-only", - default="true", + default="false", type=lambda input: input.lower() == "true", help="Set this option to 'false' to analyse any source files in the repo. " "Defaults to %(default)s.", ) cli_arg_parser.add_argument( "--thread-comments", - default="true", + default="false", type=lambda input: input.lower() == "true", help="Set this option to false to disable the use of thread comments as feedback." "Defaults to %(default)s.", @@ -173,9 +173,11 @@ def is_file_in_list(paths: list, file_name: str, prompt: str) -> bool: result = os.path.commonpath([path, file_name]).replace(os.sep, "/") if result == path: logger.debug( - '"./%s" is %s as specified in the domain "./%s"', + '".%s%s" is %s as specified in the domain ".%s%s"', + os.sep, file_name, prompt, + os.sep, path, ) return True @@ -319,14 +321,20 @@ def list_source_files(ext_list: list, ignored_paths: list, not_ignored: list) -> root_path = os.getcwd() for dirpath, _, filenames in os.walk(root_path): path = dirpath.replace(root_path, "").lstrip(os.sep) - if path.startswith("."): - # logger.debug("Skipping \"%s\"", path) + path_parts = path.split(os.sep) + is_hidden = False + for part in path_parts: + if part.startswith("."): + # logger.debug("Skipping \".%s%s\"", os.sep, path) + is_hidden = True + break + if is_hidden: continue # skip sources in hidden directories - logger.debug('Crawling "./%s"', path) + logger.debug("Crawling \".%s%s\"", os.sep, path) for file in filenames: if os.path.splitext(file)[1][1:] in ext_list: file_path = os.path.join(path, file) - logger.debug('"./%s" is a source code file', file_path) + logger.debug('".%s%s" is a source code file', os.sep, file_path) if not is_file_in_list( ignored_paths, file_path, "ignored" ) or is_file_in_list(not_ignored, file_path, "not ignored"): @@ -374,6 +382,7 @@ def run_clang_tidy( cmds.append(filename.replace("/", os.sep)) with open("clang_tidy_output.yml", "wb"): pass # clear yml file's content before running clang-tidy + logger.info("Running \"%s\"", " ".join(cmds)) results = subprocess.run(cmds, capture_output=True) with open("clang_tidy_report.txt", "wb") as f_out: f_out.write(results.stdout) @@ -409,11 +418,10 @@ def run_clang_format( for line_range in file_obj["line_filter"]["lines"]: cmds.append(f"--lines={line_range[0]}:{line_range[1]}") cmds.append(filename.replace("/", os.sep)) + logger.info("Running \"%s\"", " ".join(cmds)) results = subprocess.run(cmds, capture_output=True) with open("clang_format_output.xml", "wb") as f_out: f_out.write(results.stdout) - if results.stdout: - logger.debug("clang-format has suggestions.") if results.returncode: logger.warning( "%s raised the following error(s):\n%s", cmds[0], results.stderr.decode() @@ -459,8 +467,8 @@ def capture_clang_tools_output( tidy_notes.append(note) GlobalParser.tidy_notes.clear() # empty list to avoid duplicated output - if os.path.getsize("clang_format_output.xml"): - parse_format_replacements_xml(filename.replace("/", os.sep)) + parse_format_replacements_xml(filename.replace("/", os.sep)) + if GlobalParser.format_advice[-1].replaced_lines: if not Globals.OUTPUT: Globals.OUTPUT = "\n## :scroll: " Globals.OUTPUT += "Run `clang-format` on the following files\n" @@ -640,12 +648,17 @@ def make_annotations(style: str) -> bool: """ # log_commander obj's verbosity is hard-coded to show debug statements ret_val = False + count = 0 for note in GlobalParser.tidy_notes: ret_val = True log_commander.info(note.log_command()) + count += 1 for note in GlobalParser.format_advice: - ret_val = True - log_commander.info(note.log_command(style)) + if note.replaced_lines: + ret_val = True + log_commander.info(note.log_command(style)) + count += 1 + logger.info("Created %d annotations", count) return ret_val diff --git a/setup.py b/setup.py index c29ad256..6cf4d735 100644 --- a/setup.py +++ b/setup.py @@ -15,12 +15,12 @@ name="cpp_linter", # use_scm_version=True, # setup_requires=["setuptools_scm"], - version="v1.2.1", + version="1.3.1", description=__doc__, long_description=".. warning:: this is not meant for PyPi (yet)", author="Brendan Doherty", author_email="2bndy5@gmail.com", - install_requires=["requests"], #, "pyyaml"], # pyyaml is installed with clang-tidy + install_requires=["requests", "pyyaml"], # pyyaml is installed with clang-tidy license="MIT", # See https://pypi.python.org/pypi?%3Aaction=list_classifiers classifiers=[ From f9f706747ca9fb55cf8defbb3f65723535fa34e5 Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 00:17:14 -0700 Subject: [PATCH 10/20] pleasing pylint --- cpp_linter/clang_tidy.py | 4 ++-- cpp_linter/run.py | 6 +++--- setup.py | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/cpp_linter/clang_tidy.py b/cpp_linter/clang_tidy.py index c4f0052a..3543aed9 100644 --- a/cpp_linter/clang_tidy.py +++ b/cpp_linter/clang_tidy.py @@ -1,11 +1,11 @@ """Parse output from clang-tidy's stdout""" import os -import sys import re -from . import GlobalParser #, logger +from . import GlobalParser # , logger NOTE_HEADER = re.compile("^(.*):(\d+):(\d+):\s(\w+):(.*)\[(.*)\]$") + class TidyNotification: """Create a object that decodes info from the clang-tidy output's initial line that details a specific notification. diff --git a/cpp_linter/run.py b/cpp_linter/run.py index debe1402..975a21d5 100644 --- a/cpp_linter/run.py +++ b/cpp_linter/run.py @@ -330,7 +330,7 @@ def list_source_files(ext_list: list, ignored_paths: list, not_ignored: list) -> break if is_hidden: continue # skip sources in hidden directories - logger.debug("Crawling \".%s%s\"", os.sep, path) + logger.debug('Crawling ".%s%s"', os.sep, path) for file in filenames: if os.path.splitext(file)[1][1:] in ext_list: file_path = os.path.join(path, file) @@ -382,7 +382,7 @@ def run_clang_tidy( cmds.append(filename.replace("/", os.sep)) with open("clang_tidy_output.yml", "wb"): pass # clear yml file's content before running clang-tidy - logger.info("Running \"%s\"", " ".join(cmds)) + logger.info('Running "%s"', " ".join(cmds)) results = subprocess.run(cmds, capture_output=True) with open("clang_tidy_report.txt", "wb") as f_out: f_out.write(results.stdout) @@ -418,7 +418,7 @@ def run_clang_format( for line_range in file_obj["line_filter"]["lines"]: cmds.append(f"--lines={line_range[0]}:{line_range[1]}") cmds.append(filename.replace("/", os.sep)) - logger.info("Running \"%s\"", " ".join(cmds)) + logger.info('Running "%s"', " ".join(cmds)) results = subprocess.run(cmds, capture_output=True) with open("clang_format_output.xml", "wb") as f_out: f_out.write(results.stdout) diff --git a/setup.py b/setup.py index 6cf4d735..9e422074 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,6 @@ ], keywords="clang clang-tidy clang-format", packages=["cpp_linter"], - entry_points={"console_scripts": ["cpp-linter=cpp_linter.run:main"]}, # Specifiy your homepage URL for your project here url=REPO, From c5eb9d30b3e2d5f619cdec64a855dfabed725cdb Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 01:15:10 -0700 Subject: [PATCH 11/20] update README about `tidy-checks=-*` --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 55f24f23..889b6c44 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ jobs: #### `tidy-checks` - **Description**: Comma-separated list of globs with optional '-' prefix. Globs are processed in order of appearance in the list. Globs without '-' prefix add checks with matching names to the set, globs with the '-' prefix remove checks with matching names from the set of enabled checks. This option's value is appended to the value of the 'Checks' option in a .clang-tidy file (if any). + - It is possible to disable clang-tidy entirely by setting this option to '-\*'. This allows using only clang-format to lint your source files. - Default: 'boost-\*,bugprone-\*,performance-\*,readability-\*,portability-\*,modernize-\*,clang-analyzer-\*,cppcoreguidelines-\*' #### `repo-root` From 7226e58d2348899b42e0202230776c72fe997adc Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 01:17:42 -0700 Subject: [PATCH 12/20] increase indent in last change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 889b6c44..c2fbc61f 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ jobs: #### `tidy-checks` - **Description**: Comma-separated list of globs with optional '-' prefix. Globs are processed in order of appearance in the list. Globs without '-' prefix add checks with matching names to the set, globs with the '-' prefix remove checks with matching names from the set of enabled checks. This option's value is appended to the value of the 'Checks' option in a .clang-tidy file (if any). - - It is possible to disable clang-tidy entirely by setting this option to '-\*'. This allows using only clang-format to lint your source files. + - It is possible to disable clang-tidy entirely by setting this option to '-\*'. This allows using only clang-format to lint your source files. - Default: 'boost-\*,bugprone-\*,performance-\*,readability-\*,portability-\*,modernize-\*,clang-analyzer-\*,cppcoreguidelines-\*' #### `repo-root` From bae2d171b0b977e520ced36c98f324b37bc7de5c Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 01:28:03 -0700 Subject: [PATCH 13/20] increase indent again (I don't like mkdocs) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2fbc61f..dab2bce8 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ jobs: #### `tidy-checks` - **Description**: Comma-separated list of globs with optional '-' prefix. Globs are processed in order of appearance in the list. Globs without '-' prefix add checks with matching names to the set, globs with the '-' prefix remove checks with matching names from the set of enabled checks. This option's value is appended to the value of the 'Checks' option in a .clang-tidy file (if any). - - It is possible to disable clang-tidy entirely by setting this option to '-\*'. This allows using only clang-format to lint your source files. + - It is possible to disable clang-tidy entirely by setting this option to '-\*'. This allows using only clang-format to lint your source files. - Default: 'boost-\*,bugprone-\*,performance-\*,readability-\*,portability-\*,modernize-\*,clang-analyzer-\*,cppcoreguidelines-\*' #### `repo-root` From 18c04f20a057e13a1c1bdb0b63e684327c689009 Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 01:35:53 -0700 Subject: [PATCH 14/20] update docs --- cpp_linter/clang_tidy.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cpp_linter/clang_tidy.py b/cpp_linter/clang_tidy.py index 3543aed9..55770b73 100644 --- a/cpp_linter/clang_tidy.py +++ b/cpp_linter/clang_tidy.py @@ -5,7 +5,6 @@ NOTE_HEADER = re.compile("^(.*):(\d+):(\d+):\s(\w+):(.*)\[(.*)\]$") - class TidyNotification: """Create a object that decodes info from the clang-tidy output's initial line that details a specific notification. @@ -21,10 +20,12 @@ class TidyNotification: notification. """ - def __init__(self, notification_line: str): + def __init__(self, notification_line: tuple): """ Args: - notification_line: The first line in the notification. + notification_line: The first line in the notification parsed into a tuple of + string that represent the different components of the notification's + details. """ # logger.debug("Creating tidy note from line %s", notification_line) ( From 5bbdd0a5906c8614551a4895bf0d6b49abfceb9f Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 02:02:18 -0700 Subject: [PATCH 15/20] avoid nesting log groups --- cpp_linter/run.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpp_linter/run.py b/cpp_linter/run.py index 975a21d5..ea416cbf 100644 --- a/cpp_linter/run.py +++ b/cpp_linter/run.py @@ -187,6 +187,7 @@ def is_file_in_list(paths: list, file_name: str, prompt: str) -> bool: def get_list_of_changed_files() -> None: """Fetch the JSON payload of the event's changed files. Sets the [`FILES`][cpp_linter.__init__.Globals.FILES] attribute.""" + start_log_group("Get list of specified source files") files_link = f"{GITHUB_API_URL}/repos/{GITHUB_REPOSITORY}/" if GITHUB_EVENT_NAME == "pull_request": files_link += f"pulls/{Globals.EVENT_PAYLOAD['number']}/files" @@ -309,6 +310,7 @@ def list_source_files(ext_list: list, ignored_paths: list, not_ignored: list) -> True if there are files to check. False will invoke a early exit (in [`main()`][cpp_linter.run.main]) when no files to be checked. """ + start_log_group("Get list of specified source files") if os.path.exists(".gitmodules"): submodules = configparser.ConfigParser() submodules.read(".gitmodules") @@ -691,7 +693,6 @@ def main(): # change working directory os.chdir(args.repo_root) - start_log_group("Get list of specified source files") if ignored: logger.info( "Ignoring the following paths/files:\n\t%s", From 1733c4f9879b036c497ca6b0c3230ce580a525ec Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 02:23:12 -0700 Subject: [PATCH 16/20] switch pylint to my check-python-sources action --- .github/workflows/run-pylint.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/run-pylint.yml b/.github/workflows/run-pylint.yml index 0d103b95..d20b52d1 100644 --- a/.github/workflows/run-pylint.yml +++ b/.github/workflows/run-pylint.yml @@ -24,6 +24,8 @@ jobs: python3 -m pip install --upgrade pylint python3 -m pip install -r requirements.txt - name: run pylint - run: | - pylint cpp_linter/** - pylint setup.py + uses: 2bndy5/check-python-sources@master + id: linter + - name: Code needs attention? + if: steps.linter.outputs.checks-failed > 0 + run: exit 1 From f65a8f13dfb7d67540a720ed1e7578801e5c5c1a Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 02:25:25 -0700 Subject: [PATCH 17/20] trigger pylint action --- cpp_linter/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp_linter/__init__.py b/cpp_linter/__init__.py index aace8e61..ae8d6e96 100644 --- a/cpp_linter/__init__.py +++ b/cpp_linter/__init__.py @@ -94,6 +94,6 @@ def get_line_cnt_from_cols(file_path: str, offset: int) -> tuple: def log_response_msg(): - """Output the response buffer's message on failed request""" + """Output the response buffer's message on a failed request.""" if Globals.response_buffer.status_code >= 400: logger.error("response returned message: %s", Globals.response_buffer.text) From 87c42f985770f1e16fe7f98ba479c94bb2e332e8 Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 02:29:34 -0700 Subject: [PATCH 18/20] Revert "switch pylint to my check-python-sources action" This reverts commit 1733c4f9879b036c497ca6b0c3230ce580a525ec. --- .github/workflows/run-pylint.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/run-pylint.yml b/.github/workflows/run-pylint.yml index d20b52d1..0d103b95 100644 --- a/.github/workflows/run-pylint.yml +++ b/.github/workflows/run-pylint.yml @@ -24,8 +24,6 @@ jobs: python3 -m pip install --upgrade pylint python3 -m pip install -r requirements.txt - name: run pylint - uses: 2bndy5/check-python-sources@master - id: linter - - name: Code needs attention? - if: steps.linter.outputs.checks-failed > 0 - run: exit 1 + run: | + pylint cpp_linter/** + pylint setup.py From d295581bdbfa67f78f0f224ff923236be4d28b7f Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 17:31:30 -0700 Subject: [PATCH 19/20] fix regressions from last update --- cpp_linter/run.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/cpp_linter/run.py b/cpp_linter/run.py index ea416cbf..55b68ccd 100644 --- a/cpp_linter/run.py +++ b/cpp_linter/run.py @@ -469,12 +469,13 @@ def capture_clang_tools_output( tidy_notes.append(note) GlobalParser.tidy_notes.clear() # empty list to avoid duplicated output - parse_format_replacements_xml(filename.replace("/", os.sep)) - if GlobalParser.format_advice[-1].replaced_lines: - if not Globals.OUTPUT: - Globals.OUTPUT = "\n## :scroll: " - Globals.OUTPUT += "Run `clang-format` on the following files\n" - Globals.OUTPUT += f"- [ ] {file['filename']}\n" + if os.path.getsize("clang_format_output.xml"): + parse_format_replacements_xml(filename.replace("/", os.sep)) + if GlobalParser.format_advice and GlobalParser.format_advice[-1].replaced_lines: + if not Globals.OUTPUT: + Globals.OUTPUT = "\n## :scroll: " + Globals.OUTPUT += "Run `clang-format` on the following files\n" + Globals.OUTPUT += f"- [ ] {file['filename']}\n" if Globals.PAYLOAD_TIDY: if not Globals.OUTPUT: @@ -651,15 +652,15 @@ def make_annotations(style: str) -> bool: # log_commander obj's verbosity is hard-coded to show debug statements ret_val = False count = 0 - for note in GlobalParser.tidy_notes: - ret_val = True - log_commander.info(note.log_command()) - count += 1 for note in GlobalParser.format_advice: if note.replaced_lines: ret_val = True log_commander.info(note.log_command(style)) count += 1 + for note in GlobalParser.tidy_notes: + ret_val = True + log_commander.info(note.log_command()) + count += 1 logger.info("Created %d annotations", count) return ret_val @@ -678,7 +679,8 @@ def main(): if args.ignore is not None: args.ignore = args.ignore.split("|") for path in args.ignore: - path = path.lstrip("./") # relative dir is assumed + if path.startswith("./"): + path = path.lstrip("./") # relative dir is assumed path = path.strip() # strip leading/trailing spaces if path.startswith("!"): not_ignored.append(path[1:]) @@ -695,12 +697,12 @@ def main(): if ignored: logger.info( - "Ignoring the following paths/files:\n\t%s", + "Ignoring the following paths/files:\n\t./%s", "\n\t./".join(f for f in ignored), ) if not_ignored: logger.info( - "Not ignoring the following paths/files:\n\t%s", + "Not ignoring the following paths/files:\n\t./%s", "\n\t./".join(f for f in not_ignored), ) exit_early = False From 8bee0796dd38d4e82a44f993e182042d321729f4 Mon Sep 17 00:00:00 2001 From: 2bndy5 <2bndy5@gmail.com> Date: Wed, 20 Oct 2021 20:24:27 -0700 Subject: [PATCH 20/20] break out parsing ignore option from main() --- cpp_linter/run.py | 64 +++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/cpp_linter/run.py b/cpp_linter/run.py index 55b68ccd..c5782780 100644 --- a/cpp_linter/run.py +++ b/cpp_linter/run.py @@ -471,7 +471,10 @@ def capture_clang_tools_output( if os.path.getsize("clang_format_output.xml"): parse_format_replacements_xml(filename.replace("/", os.sep)) - if GlobalParser.format_advice and GlobalParser.format_advice[-1].replaced_lines: + if ( + GlobalParser.format_advice + and GlobalParser.format_advice[-1].replaced_lines + ): if not Globals.OUTPUT: Globals.OUTPUT = "\n## :scroll: " Globals.OUTPUT += "Run `clang-format` on the following files\n" @@ -665,6 +668,43 @@ def make_annotations(style: str) -> bool: return ret_val +def parse_ignore_option(paths: str): + """Parse a givven string of paths (separated by a '|') into `ignored` and + `not_ignored` lists of strings. + + Args: + paths: This argument conforms to the CLI arg `--ignore` (or `-i`). + + Returns: + A tuple of lists in which each list is a set of strings. + - index 0 is the `ignored` list + - index 1 is the `not_ignored` list + """ + ignored, not_ignored = ([], []) + paths = paths.split("|") + for path in paths: + is_included = path.startswith("!") + if path.startswith("!./" if is_included else "./"): + path = path.replace("./", "", 1) # relative dir is assumed + path = path.strip() # strip leading/trailing spaces + if is_included: + not_ignored.append(path[1:]) + else: + ignored.append(path) + + if ignored: + logger.info( + "Ignoring the following paths/files:\n\t./%s", + "\n\t./".join(f for f in ignored), + ) + if not_ignored: + logger.info( + "Not ignoring the following paths/files:\n\t./%s", + "\n\t./".join(f for f in not_ignored), + ) + return (ignored, not_ignored) + + def main(): """The main script.""" @@ -675,17 +715,7 @@ def main(): logger.setLevel(int(args.verbosity)) # prepare ignored paths list - ignored, not_ignored = ([], []) - if args.ignore is not None: - args.ignore = args.ignore.split("|") - for path in args.ignore: - if path.startswith("./"): - path = path.lstrip("./") # relative dir is assumed - path = path.strip() # strip leading/trailing spaces - if path.startswith("!"): - not_ignored.append(path[1:]) - else: - ignored.append(path) + ignored, not_ignored = parse_ignore_option("" if not args.ignore else args.ignore) # prepare extensions list args.extensions = args.extensions.split(",") @@ -695,16 +725,6 @@ def main(): # change working directory os.chdir(args.repo_root) - if ignored: - logger.info( - "Ignoring the following paths/files:\n\t./%s", - "\n\t./".join(f for f in ignored), - ) - if not_ignored: - logger.info( - "Not ignoring the following paths/files:\n\t./%s", - "\n\t./".join(f for f in not_ignored), - ) exit_early = False if args.files_changed_only: # load event's json info about the workflow run