From 04fd5f14467e8bbf984b968ceb74a26186366728 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 22 Mar 2017 21:20:33 +0530 Subject: [PATCH 01/12] CI Status Favicon --- .../images/ci_favicons/icon_status_canceled.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_created.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_failed.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_manual.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_not_found.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_pending.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_running.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_skipped.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_success.ico | Bin 0 -> 5430 bytes .../images/ci_favicons/icon_status_warning.ico | Bin 0 -> 5430 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 app/assets/images/ci_favicons/icon_status_canceled.ico create mode 100755 app/assets/images/ci_favicons/icon_status_created.ico create mode 100755 app/assets/images/ci_favicons/icon_status_failed.ico create mode 100755 app/assets/images/ci_favicons/icon_status_manual.ico create mode 100755 app/assets/images/ci_favicons/icon_status_not_found.ico create mode 100755 app/assets/images/ci_favicons/icon_status_pending.ico create mode 100755 app/assets/images/ci_favicons/icon_status_running.ico create mode 100755 app/assets/images/ci_favicons/icon_status_skipped.ico create mode 100755 app/assets/images/ci_favicons/icon_status_success.ico create mode 100755 app/assets/images/ci_favicons/icon_status_warning.ico diff --git a/app/assets/images/ci_favicons/icon_status_canceled.ico b/app/assets/images/ci_favicons/icon_status_canceled.ico new file mode 100755 index 0000000000000000000000000000000000000000..5a19458f2a2e0e5585f3932f01736cf838b86c76 GIT binary patch literal 5430 zcmZQzU}Ruo5D);-3Je)63=C=v3=9ei5dI1Q28KQs1_liV1_l9;I0HnSfk>dQudkDu znmQpSCgw^^Ow1=Jz5)^h$>B0aLPCNqAt7N(e0=<$Y15|tKXKy3{|65qfH8;-5(CMB z)PU3?n*-v<#>VcctgQV1?Af#bxBy75s;cULOiaukkRF&BATvRFzkmOZODkL)qy}UL zNDoLq$WI`5fy{<0LSwvn^XC8DxpV)2`t%7b15yjp1JVl$7m(k;5?Bb3-onB{kemPa z_4UD3fb@X$g2EXTK5z*n2D09yq@@4Xu3dx6g7kp&g5n1h&Tt7R1D{@y5|AE{UJwSc zL1HjWNH0hoNDoLa$PFO3fW$zU7`-5MAUzKx#ntf%IU*AU}b^1r)Z>_yOf%ocZ?yKLf)7W(I}^ zMhM1cCbAez9Y_yIFQ}YRU|?WyAhDc5HWQiM(9pmZ8yo8u6B9EfCMITIY;5cem_MNG zeIPlI8jxCKy_B#M5)vfh;^L;o#Ke36r9UF^2aq0+UUKcu&CO+tiHT{7jg9?+Y-e3v z-T&pwm;c|nbLan)Cr^Sghz$}0$swzS>TLp?v9CxIR-N;BO~MgmMvTUzkBx% zIlEwGgVcc3g7m=jgUkY%NsJp35)yP`VqzY_^e$bx^#9kdU$NSSPY|RBq!(rm$jrF7 zI6ZuB0J#yQ4x}d~CFTF=)2H!SL6qE?GiUyT%mSGSG8<$EHaCFc2oz2rbs+Wk@82iN zd}0)V%mSGSG8<$E$S!m@fYKUNo+|!EcNZueVCIADLbe|iCeXC{9~5WkdP(8mxN+nE zQUt>;{<+s<%M) z!|HDk8zcsjBZMin8)QDnE|8rd`$1s@E!)}oIAiF?zLhU9h{ZY$qkp0N% z57cG?xdoIbKyuhHHSGqO53&nnC&+GS82~OfL1hC-9vOqmbEsOd8WIbqT0E$5p1n)ZwE+W`pbi*#)u_WH$_h+5{ju z5T-`E3*8+cGeKrUaTCm57!7I@f!anOc~Dyk)Mi3AgIqqyERdNXvq5%%?1I^gOoPG% z)J6oU1E~kOnOr+z`aouY%mSGSG8<$EvYqJcfoy-n+yZhVD4d{f{trsCpfU)QcVYg* zMT69U@)$@DOh3phkeM*^iJ?Jp1WJ>jw2EX7xSawjKS5#eWv;Y170Q3L<3=IGOFfiEvU|^8{ vz`(%&fPsPi00RRv2sbb=FoH114WwX@9uNkZ0m2|NL1u&O0NDky6J$34dIU%k literal 0 HcmV?d00001 diff --git a/app/assets/images/ci_favicons/icon_status_created.ico b/app/assets/images/ci_favicons/icon_status_created.ico new file mode 100755 index 0000000000000000000000000000000000000000..4dca9640cb373737df8c7cce41af6dd8160b3913 GIT binary patch literal 5430 zcmZQzU}Ruo5D);-3Je)63=C=v3=9ei5dI1Q28KQs1_liV1_l9;I0HnSfk@!#>8Ueq z+O!G%{ry+^`};pZ@fDC5NDh}Vs;a7N6DCZUGI8R>Kiju&|9|u5&Hpc7z64_s8zcsj z1E~S2MK%Y-@9*#5vv~31|L@+t`;QBN_XQIOguxdO`663TK!&$jvbI=rl+UrVgYB zq!)xiY?wGm4Z1!UA0!7;2hs!53vvU$q}f5+kQsF=4`lPaq6s?}N&@fz)C%gB-D`Q>RKyoH%jXgb5Qqpr<`t ze2`j@9*|yg>;&nVG-(oBe}8{de}DfMm^~9FO!&Wi`SSmV4juY`{`~p>w{G16V-Oo8 z29g7*fvJb;Z33AEGLu*ga`%J@6OO^mnLd5`|1)RK{QvUh3$El37YC^UsRikQ=?9qw zGLsnlCrp^2H(|nrMHfXoKD0c01l{h%;`rd4p-M%RnZ|NHmv|HqFX|G#?mDj0*7HVvf?2k8Zgf#g7HVCvCn zkl7$RKe+W*nFcvme%W0GSC26R;#20SZHqJUJMo7tJ^@7i1UIJW%)#X!--? z0gzijZ3nR9un?fU1X4o^2I;|K6j%r?{|#vQ11$r=ZM%Uee?fHss4f77EvRk))e+!8 z!a{(`R8Y8r$`+7%WDF7m$$`{h(FzsCm1*#iB zZ3VD{sYrm#1ep!817sJ-PGk&f6M@=BAbC(*3Djnymh~XBKxTr>2H63!3)yZM8x#-7 z?N5-KDRl$L3?#cBf$V_Uhm9V{_BYHuAUA@-2^3x+3`(=0ya{SM5DE{F8c-Vtqz9xI zgh6J3%!HXw3=N7SP&$F-3#d8&L1h=H{sxudpn3#^L2Qs1NDe8Df$A$z-;Lz{7qa_6 z?gr&mPO6{r?01|Njk)|Nk*C)c;{% zu>ZlpApe1Zf&T#m1N#9624)a$U|?W`VM2a@sRPj*uwyFhk=>;?dc CL%a9@ literal 0 HcmV?d00001 diff --git a/app/assets/images/ci_favicons/icon_status_failed.ico b/app/assets/images/ci_favicons/icon_status_failed.ico new file mode 100755 index 0000000000000000000000000000000000000000..c961ff9a69baa8f3cbd63ab9083c05554482052e GIT binary patch literal 5430 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 Z9f$_$1!0g`ATvQ`gX{p=1+o)lHvn77w7UQR literal 0 HcmV?d00001 diff --git a/app/assets/images/ci_favicons/icon_status_not_found.ico b/app/assets/images/ci_favicons/icon_status_not_found.ico new file mode 100755 index 0000000000000000000000000000000000000000..21afa9c72e6ee7432b988907f1d8f90b70cd02a2 GIT binary patch literal 5430 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/ci_favicons/icon_status_running.ico b/app/assets/images/ci_favicons/icon_status_running.ico new file mode 100755 index 0000000000000000000000000000000000000000..f328ff1a5ed098a18d98abf27676e60128e75303 GIT binary patch literal 5430 zcmZQzU}Ruo5D);-3Je)63=C=v3=9ei5dI1Q28KQs1_liV1_l9;I0HnSfk=?&FQM~j zk@n6LW@im!mgKytW@F<0khySdb4%8iAFf1Vwz`2Xqt&i~)vTmxee8zcsj z1E~S2MK%Y-zp+4X&;5#up2>oKzc#p0`ePJ;{X5u@2)NTe`CHLie8vmATwa@0Omc`#WIT z!SvT>C;s1A<$~1=kY7NGKzcxWLGc3$XOI{&{`2GG|7QovFw6jj2S^=A4@fTvgV-Q3 zY#8Qt7>z~$6;S+Q(+d)V>4VYe?gxbdC@er~v0<1#5REPTKyd(y3t0T2n*q`X!XUla z;t!MtKxqM#CO~NeT|dabAUDI}4WtI77NiHH7lc7+k&^TaGXrEM$SKx#ntf%IU*pzr{NDJ*S(;upjQiGk$M_56@$V0ggJz;J+>fuVsBg3;B$_%L~p zT96))UQjusz`(%ZKw>!qGZUTuzbcgN_9A_^oAdRi+*qKy@5TbX8#fl{eu7{ydml&+ zqz0rGT|c?}`}0jDZY|K8c5{L52T*z;27}as^nmn|YwzuCo@}=k>Nee2p!Wr4=gkGW z{~vCS{Qv57@BjDLmVnDrP#y!ZL1G{|kQ$hJkY11(AhSqu2guzw7w8>>nR9!Y&HuNT z=l%cv^(A^Xz~F<_fYgHY!1RO60+~sS8*VH#(!04p?-58Z$Sb^rhS^Am*uwyU^VLN+%F`UEKcu_Zyt%9`8#3 ze`|>aybig!(CGi89ZCP+-&pzo-``(Y-2w^+SX_YYLbe|iCZMzmvL6&@*bMmb_WJ+( z8-n0=g4ANecUQar2i23<%mA4U*0VtG3&>8G8$fv#Bo0cmpmc+-_tU-Y|3Q8PsUZg6 zTxj_Ji?$PSPhAUi?!gUTvUc>xjwAuVPYMR;l;dwi{HJ%-02%sbEPw#J@j3|Gzrb_5bDq z?Cm&^ndlglFVKwymDON%AiF{J*nC}Zd5*3Q7atU_cUQR*6&9d$3yMQzvq1F)#C~wS z32MuO^EI*>LTpezd3LazC^taLD1?ciIty$+s2>5U!{_UgY(LC2s5yAufzy7F-DHG6 z%x(}($bKTie;>#UP?`XlM=A#C#fJ%{KX4wH4{2ABYBxwdKD$A3gz_J#3;?MEl?kA- z0c0jA7^D{$CZ_xWm4TqL5M&0n@|TcXK>Dy@V#{Ap9RR8eKxTmI22j2tWGAvbNFO=| z*-dQy1F|1f7ZR#}k?llgquUJ%b5Qw&tOmx$RsVwA0BRF}%mSqYP+I|}hY$_cLt*;^ zWIw1)1Zo?B%mcNRKy4;Mc7x<0Weer)FOVBR@qpU?+ykeVW#0H6h117sF4c4AWlayO`afR#~TbJ512(8WM%L3%)X zv6)GZ7^s{CmDS+-0@iK;*Poz1IJg}_R{#6|2mb&68yNrpV_>NN!@ywwgMmT*0|Nv9 s0|o~60}KqzAl$&fzzD;H+zwL*qCt8=7-Sa6Opw_iJ3w}U>;%~j03^SzNdN!< literal 0 HcmV?d00001 diff --git a/app/assets/images/ci_favicons/icon_status_skipped.ico b/app/assets/images/ci_favicons/icon_status_skipped.ico new file mode 100755 index 0000000000000000000000000000000000000000..b4394e1b4af94ab7efe98ed2c5dad06c49434c7f GIT binary patch literal 5430 zcmZQzU}Ruo5D);-3Je)63=C=v3=9ei5dI1Q28KQs1_liV1_l9;I0HnSfk@!#>8Ueq z+O!G%{ry+^`};pZ@fDC5NDh}Vs;a7N6DCZUGI8R>Kiju&|9|u5&Hpc7z64_s8zcsj z1E~S2MK%Y-@9*#5vv~31|L@+t`;QBN>%|D10EIs3gelMT-_;H3Osvq!$!Fpm2uiynOlc|D{Wp!tuO$^Zxhu_k+zq zRtI8(^nx&mO@aO^Ah*EuBh$pV9~1_lut3%aV}rttQ22r302CLXIDzSd(Zs|bC=Gzp z0w_&@(gsW~E*hi;q!y$Hq!)xiX_1oj3o`>`Cde(DnR~XJB~1&cJYhnSr5!5rWax!1yqEkXn!)kX}$Zqrkwx z;6P$I12YqyUbSi!s2p(v`E$aA3H$o{`)^E`FyRvjL)rVFa&92C==#a!Pn|kdV&cS! z(P2{{E)^{{Am8J3(oF`SRue4;?!6|NQy$|8L#8 z1;!vYNDL$gQUg;D)!PIzixhW&+&y8!gkvysrca;#|IC>)|G#|sf-CvM#X)L7YC(En z`ax!a%p}GQ6DCa1n=oO*BamK@UqJr)@#6>Fd}0|OJs`axGoWTYnml>34n8-4+z7LK z%9JVp@7%dVtaUim-M)SMKgcYY8$fnoa|0-jK;Z;Z2T~8p-#85=Q37NZ$V`ygAUi;I zp}PT^*1+`vHT;e4L{K=u;sRtBvi+bifu>b(+D6w)Ej}ncfWiP|7syVS8$fv#Bo0cm zpmam5eV}^e(W6KIiPZyA2eJcX7syVK{h+c6R9=9@K>3DPyFu!9?AQUW!>3N2`v1w3 zCm;}aRDDM(907(I;Jps}S!l3j;j2l39fb0V4nJ{4jxI723 zmn~a{WHNEgyLa#YpEz+M*gqgMh;;+VE|7X?eF3UV$WC{lGMH31z|tYC9s{`rREFd7 z^^F@h{_owp_y3+fd$8gK3l_k`0Av;@9NxZti_180-2qYutv5k!d2l^~O~bQi&rr;U z>LVz&d-rZ^#(~8^VFon^R(}tO{jjzJ$SngH{sWr+KzRV2962NqRLXw?TK+)G zKyce`Aj)4*9RR8eKyd)78$fjgu~9&c`Uhk`s4fK6i6A$C$|hp%CsiHDY>*uwyFhk= z?1o`bn*bySsvAIU1yao>q#k4@$ZU`uAiH4p!e~&N2-G$L$%D#IP@9R6nZ(M2%mSGS zG8<$E$S#<@$TTQSklUXiHxp|IE_EO?knDa0vIE&pboM~DzhQ0xxe*jjpzs1=P`&`= zO;Fnbmp@_RAT^*i4oDA3F9?Io0+|UjpBNexN1${9N~<6Cmtla{t zKS3DUjv%Z5{r?01|Njk)|Nk*C)c;{%u>ZlpApe1Zf&T#m1N#9624)a$U|?W`VM2a@ asRPj*uwyFhk=>;?eyMpTsm literal 0 HcmV?d00001 diff --git a/app/assets/images/ci_favicons/icon_status_success.ico b/app/assets/images/ci_favicons/icon_status_success.ico new file mode 100755 index 0000000000000000000000000000000000000000..4f436c9524219a91bde74d32eda45fd37c6acef1 GIT binary patch literal 5430 zcmZQzU}Ruo5D);-3Je)63=C=v3=9ei5dI1Q28KQs1_liV1_l9;I0HnSfkdc!Lz>kU6a@fDC5NDh}VQo6isX&cR_q-`+yGy6>S|I<%){eSr3Iv9i4ATf{} zNDW9WvN<4r>UzUH4g13WKmT<9KP~{01E~S21?hpA0WuRL{{8nCTw3AcAT=PhAUz=c zAU}cJ1u`41hyVkm7NiHH7ZffazoBc{erx{!3CFVkfBS{qO|#Eb{RimUQqmi!WpLj)RUcHeNFo#|F5{z17>401EdF}7lc7D3q!IXgXfb@dG09*LM)WPVxZ!f}_ zU>X*Fpf~`<1t?Cy5=0OnwIDqpy`VGzN(-Pg0ZJQ$w1d=u)PnSY^nx%bErQY{NE~D~ zE;B%KAT=PhAUz1X!vSUnh6Y9mMmH12hslG~g7kp&g31{M1_lNP63ZEwndo%G)ljz7 z4MuLM8;qu;Y%tuHy58_c>UzUZP<#U{w!vr$NDW9Wx_)x`SzApdQq~(zOWk1f0had& z(NMM1KzhlwH+P#STgpbmrj!kaU*Ps_F#O+oAm;z-EB*iX++Ftn^wV8n3}S=CKyoP? zAmsyC4@mDu!zPefq__j*?$ixN$G~Q+H~gQ!)#3k+TMPcb|NaVB5{8R|)PU52^uY9k z%mSH7j2kjH8tJ93H+%%vyTS1Ps>^-wS=(ye)SB@4dTBNDGQQ$PSQQApM}S8eE>Q zH~imnAO=MpHV(4gApIarjvGLBf%Jmy-e9;7#0Hh0*zAOfVY3^g4}?i|1IR9rK5(72 z-tY#94JyN7cA?X|ZZC$1IY@2hCiDN(PL`mEk>UoBT_AH{bts4ps!P!Ah4G8GyTa`P z*?sxtQLxm?%e`=MkQv0f0c00QeaZ$SaQzKpgT%mwVj)0j3}iO4-7sb3xB+Ar$WD0M zVZ9-^K82Zyjeh?5-v0+U@*AmcKn{OU8UVQklqRs*ORN~W8;Z8O;M5AT3uGtAZg3u0 z4{2B6)Ig*JvKv5Y7MC{U{0Axnpl%_meSynNnE2M4bN?T_zXry|pwY`8Xc-7@+kx6G z7#gT7fL{KB>Htt(015+8-2kd1sB9(NIFQ*OJ3w}U>;%~j!l1ekR40POL3Jct1C<#d zvq5%%>;l;dvKxj$Z33v=e^6V2%2tETgw;DByI}UhXi%F7)HVXS0n}CkwV9~p29Q}G zGeKs9>;TyXvlp2Lg$byQ2vP@9PmOQ@nE^5jWG2XLkR8Z&qO%9G{S9*q$c>0 zVGtW61}@jA(EmbqAIROHyb5Zsf!zRVqZ7bTwG{O~k=+1dL(563_rL#t;Q#->f${%8 z28Q}S3=H-^7#QR~Ffi~xU|?WBz`(!^!VL@zj4%vx3qA}}2ckiGK^SBf$V`ygAUi;I Jf$Rj?4FJ}!)13eS literal 0 HcmV?d00001 diff --git a/app/assets/images/ci_favicons/icon_status_warning.ico b/app/assets/images/ci_favicons/icon_status_warning.ico new file mode 100755 index 0000000000000000000000000000000000000000..805cc20cdec49d82bc29a06676e8263a89425a9d GIT binary patch literal 5430 zcmZQzU}Ruo5D);-3Je)63=C=v3=9ei5dI1Q28KQs1_liV1_l9;I0HnSfk+_YTCbx% z>Hh?kuK!n5y8eHH;wvCAkQ^>!xRmVKRC@kT(dhaAr)bOn|J!c-|9|xb1cTThF_0Wc z4M;7rIUv4j*Z(~}^Z)<9`}RLh0Fv{b|Np;g_y0X0JuovsW`gv7`H9f_^UwePT?Zf- z#D>X$)PT$Y=>h2n`3dAMkl8RbAo{_(|Nm9GAQ;33iNP>PEl3YYFDP6;L};VGtW84x>SOKzc#py!8f56qSDd>HmKaMiqtdKzcxWLGc3$XNV|*1nGmhAH+t; zKv*C>AiW?AVnaj`B*@P&{UA0%2EqdA0qF&~0TjOwQ3MIngHJ!q{h%-ag#|(=DC`};86DZ9PlYT(@L1__`enDn{%!arC zlLX0u)S#zdm>D2b)6 z|5H@D|L;@j{(nQY`~N2p2C+e6AUTj4kXmeJkRztu^6Q=;QVY@p z(o2q=AU!IR{O-P|AMoSvJ{lZKx~j0NKU02QZ|9~ zfb@dQ0GS0clUNLLw`$k_V<0m?*ktnm|Fcg1|Nr7MX4*v;0jUA01?d6l1!0g`ATx=v zU%mUko@&?sM<9J5zqIZD|NqkubXy4XL3%)XL1uu=0-34N_g@E}8$fOZsROCkoACet zu3LodA*5pGt^fZ)W`WEEnGLc7n;SrJ1PUjRI*|G+FYufE_1FLZ58p#Dh>cG*$SjbV zAhW@CO#07;?gnr=0o7~Wg#8VQW0-j$GeK;S7(O?E!T}x^-T#}A?FWSkD6N9b0>v3V zb3k$j?;+ASNDl~u#6WWRFvx6>T992JJ7I1B4L&nKav-}v>X9)>3?zpS zgUklm0n!Ju6J$TAtOAu6ATdzB!KWW4ckLyn|3P9fd3^NDlMuZiJ3)4X%1e;lptvCv zhsfrF{JZGv|NkHiVk67pV}tAf*#)u_WH+eH2C)Md;nPK3Igni-JHd8?>XI%I<-bXdMb-gX$4t z?Fac8qz4&;#E8`ovJ0eFwF_E*cR}hhV)cXU0_jJ_ATeU~!|m_>|B0ON2ib*eH;4@q zBi4T8@CT;>64M{ZE|8tb7$iol{h+o2Sa0|Lec(LM1!-3hs~=<+SU)uFf!H81V)Y~E zKTsI}(hn*VKxG3lW`OJh>mkE_kR2eqK>9&;gUUcqSqS12TmDjFKYIBKssliE0myz( z-2kd12!#Q;_Jhm@*#WW(WGBdO5C+wSpgIvG4yq$*Wk1MlkR2eqKz4%chGFFP2dJ%p z&kdkB1hqLpW`Qt>4HCnr2V^EJ-a&T3?1j+--Tnf(0~98pHX_VVAUEUl6ESiiGeF@3 zG81Gr$PSQQxbQ%>zhQ0yxe?q>h30Qing!)eLU9ZV50DyA9s}tC`5A;kW`WFvnNJK2 zP7hf6U!bxJRDOcWa8Nx0!XP$C3?v6jV_P<`Tjn zwIDqpz1YkoM+{U>g33#9eF17SLE8?L_P_ss;Q#->f${%828Q}S3=H-^7#QR~Ffi~x rU|?WBz`(!^!VL@zj4({d?J#v98l)G5L1ux>1ep!817sJ-PLSOII$vN( literal 0 HcmV?d00001 -- GitLab From 0253ade6963472d5aaff44b5dd75575e3ce74555 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 22 Mar 2017 21:21:01 +0530 Subject: [PATCH 02/12] Update Favicon to reflect job status for CI --- app/assets/javascripts/build.js | 1 + app/assets/javascripts/merge_request_widget.js | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/build.js b/app/assets/javascripts/build.js index 6efd26ccc3788a..9aaf340e9f1a95 100644 --- a/app/assets/javascripts/build.js +++ b/app/assets/javascripts/build.js @@ -88,6 +88,7 @@ window.Build = (function() { dataType: 'json', success: function(buildData) { $('.js-build-output').html(buildData.trace_html); + gl.utils.setCIStatusFavicon(`${this.pageUrl}/status.json`); if (window.location.hash === DOWN_BUILD_TRACE) { $("html,body").scrollTop(this.$buildTrace.height()); } diff --git a/app/assets/javascripts/merge_request_widget.js b/app/assets/javascripts/merge_request_widget.js index f32d77c1648858..6de5f07ed1d1f7 100644 --- a/app/assets/javascripts/merge_request_widget.js +++ b/app/assets/javascripts/merge_request_widget.js @@ -38,11 +38,14 @@ import MiniPipelineGraph from './mini_pipeline_graph_dropdown'; function MergeRequestWidget(opts) { // Initialize MergeRequestWidget behavior // - // check_enable - Boolean, whether to check automerge status - // merge_check_url - String, URL to use to check automerge status + // check_enable - Boolean, whether to check automerge status + // merge_check_url - String, URL to use to check automerge status // ci_status_url - String, URL to use to check CI status + // new_ci_status_url - String, URL to use to get CI status for Favicon // this.opts = opts; + this.opts.new_ci_status_url = this.opts.ci_status_url.split('/ci_status')[0] + '/pipeline_status.json'; + this.$widgetBody = $('.mr-widget-body'); $('#modal_merge_info').modal({ show: false }); @@ -180,6 +183,7 @@ import MiniPipelineGraph from './mini_pipeline_graph_dropdown'; _this.status = data.status; _this.hasCi = data.has_ci; _this.updateMergeButton(_this.status, _this.hasCi); + gl.utils.setCIStatusFavicon(_this.opts.new_ci_status_url); if (data.environments && data.environments.length) _this.renderEnvironments(data.environments); if (data.status !== _this.opts.ci_status || data.sha !== _this.opts.ci_sha || -- GitLab From 19612849ca5fa8c0e62e5d9042e658dee292e617 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 22 Mar 2017 21:21:21 +0530 Subject: [PATCH 03/12] Initialize Pipelines index with status URL --- app/assets/javascripts/dispatcher.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/dispatcher.js b/app/assets/javascripts/dispatcher.js index 5e827b44a07825..f06cfcb9c06adf 100644 --- a/app/assets/javascripts/dispatcher.js +++ b/app/assets/javascripts/dispatcher.js @@ -231,9 +231,11 @@ const ShortcutsBlob = require('./shortcuts_blob'); case 'projects:pipelines:builds': case 'projects:pipelines:show': const { controllerAction } = document.querySelector('.js-pipeline-container').dataset; + const pipelineStatusUrl = `${document.querySelector('.js-pipeline-tab-link a').getAttribute('href')}/status.json`; new gl.Pipelines({ initTabs: true, + pipelineStatusUrl, tabsOptions: { action: controllerAction, defaultAction: 'pipelines', -- GitLab From a47b98cfad53bc3d7597e4aa54ea1c6ade06e91a Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 22 Mar 2017 21:22:18 +0530 Subject: [PATCH 04/12] Update Favicon to reflect pipeline status --- app/assets/javascripts/pipelines.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/javascripts/pipelines.js b/app/assets/javascripts/pipelines.js index 9203abefbbc27f..420201ea702a7d 100644 --- a/app/assets/javascripts/pipelines.js +++ b/app/assets/javascripts/pipelines.js @@ -9,6 +9,10 @@ require('./lib/utils/bootstrap_linked_tabs'); new global.LinkedTabs(options.tabsOptions); } + if (options.pipelineStatusUrl) { + gl.utils.setCIStatusFavicon(options.pipelineStatusUrl); + } + this.addMarginToBuildColumns(); } -- GitLab From 10e013dcfc3aeb532bd023c5eced3cdf863bb4b8 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 22 Mar 2017 21:22:41 +0530 Subject: [PATCH 05/12] Set ID to query and update favicon --- app/views/layouts/_head.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index f6d8bb08a646a4..a611481a0a43c3 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -23,7 +23,7 @@ %title= page_title(site_name) %meta{ name: "description", content: page_description } - = favicon_link_tag favicon + = favicon_link_tag favicon, id: 'favicon' = stylesheet_link_tag "application", media: "all" = stylesheet_link_tag "print", media: "print" -- GitLab From 3b710875a282a0ff254118f098fbde911ffac68c Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 22 Mar 2017 21:23:02 +0530 Subject: [PATCH 06/12] Add utility methods to update Favicon for CI status --- .../javascripts/lib/utils/common_utils.js | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js index 46b80c04e20e24..170e54a4997c83 100644 --- a/app/assets/javascripts/lib/utils/common_utils.js +++ b/app/assets/javascripts/lib/utils/common_utils.js @@ -2,6 +2,8 @@ (function() { (function(w) { var base; + const faviconEl = document.getElementById('favicon'); + const originalFavicon = faviconEl ? faviconEl.getAttribute('href') : null; w.gl || (w.gl = {}); (base = w.gl).utils || (base.utils = {}); w.gl.utils.isInGroupsPage = function() { @@ -361,5 +363,35 @@ fn(next, stop); }); }; + + w.gl.utils.setFavicon = (iconName) => { + if (faviconEl && iconName) { + faviconEl.setAttribute('href', `/assets/${iconName}.ico`); + } + }; + + w.gl.utils.resetFavicon = () => { + if (faviconEl) { + faviconEl.setAttribute('href', originalFavicon); + } + }; + + w.gl.utils.setCIStatusFavicon = (pageUrl) => { + $.ajax({ + url: pageUrl, + dataType: 'json', + success: function(data) { + const FAVICON_PATH = 'ci_favicons/'; + if (data && data.icon) { + gl.utils.setFavicon(FAVICON_PATH + data.icon); + } else { + gl.utils.resetFavicon(); + } + }, + error: function() { + gl.utils.resetFavicon(); + } + }); + }; })(window); }).call(window); -- GitLab From 0be10a39f35755e0748339b1857a95f28ccba47d Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 22 Mar 2017 21:23:38 +0530 Subject: [PATCH 07/12] Karma: Update tests --- spec/javascripts/build_spec.js | 2 + .../lib/utils/common_utils_spec.js | 51 +++++++++++++++++++ .../merge_request_widget_spec.js | 7 +++ 3 files changed, 60 insertions(+) diff --git a/spec/javascripts/build_spec.js b/spec/javascripts/build_spec.js index 549c7af8ea8dae..5286328c9c0af5 100644 --- a/spec/javascripts/build_spec.js +++ b/spec/javascripts/build_spec.js @@ -75,6 +75,7 @@ describe('Build', () => { expect(url).toBe(`${BUILD_URL}.json`); expect(dataType).toBe('json'); expect(success).toEqual(jasmine.any(Function)); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); success.call(context, { trace_html: 'Example', status: 'running' }); @@ -83,6 +84,7 @@ describe('Build', () => { it('removes the spinner', () => { const [{ success, context }] = $.ajax.calls.argsFor(0); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); success.call(context, { trace_html: 'Example', status: 'success' }); expect($('.js-build-refresh').length).toBe(0); diff --git a/spec/javascripts/lib/utils/common_utils_spec.js b/spec/javascripts/lib/utils/common_utils_spec.js index 5a93d479c1fc06..e7213e6568a609 100644 --- a/spec/javascripts/lib/utils/common_utils_spec.js +++ b/spec/javascripts/lib/utils/common_utils_spec.js @@ -310,5 +310,56 @@ require('~/lib/utils/common_utils'); }); }, 10000); }); + + describe('gl.utils.setFavicon', () => { + it('should set page favicon to provided favicon', () => { + const faviconName = 'custom_favicon'; + const fakeLink = { + setAttribute() {}, + }; + + spyOn(window.document, 'getElementById').and.callFake(() => fakeLink); + spyOn(fakeLink, 'setAttribute').and.callFake((attr, val) => { + expect(attr).toEqual('href'); + expect(val.indexOf('/assets/custom_favicon.ico') > -1).toBe(true); + }); + gl.utils.setFavicon(faviconName); + }); + }); + + describe('gl.utils.resetFavicon', () => { + it('should reset page favicon to tanuki', () => { + const fakeLink = { + setAttribute() {}, + }; + + spyOn(window.document, 'getElementById').and.callFake(() => fakeLink); + spyOn(fakeLink, 'setAttribute').and.callFake((attr, val) => { + expect(attr).toEqual('href'); + expect(val).toMatch(/favicon/); + }); + gl.utils.resetFavicon(); + }); + }); + + describe('gl.utils.setCIStatusFavicon', () => { + it('should set page favicon to CI status favicon based on provided status', () => { + const BUILD_URL = `${gl.TEST_HOST}/frontend-fixtures/builds-project/builds/1/status.json`; + const FAVICON_PATH = 'ci_favicons/'; + const FAVICON = 'icon_status_success'; + const spySetFavicon = spyOn(gl.utils, 'setFavicon').and.stub(); + const spyResetFavicon = spyOn(gl.utils, 'resetFavicon').and.stub(); + spyOn($, 'ajax').and.callFake(function (options) { + options.success({ icon: FAVICON }); + expect(spySetFavicon).toHaveBeenCalledWith(FAVICON_PATH + FAVICON); + options.success(); + expect(spyResetFavicon).toHaveBeenCalled(); + options.error(); + expect(spyResetFavicon).toHaveBeenCalled(); + }); + + gl.utils.setCIStatusFavicon(BUILD_URL); + }); + }); }); })(); diff --git a/spec/javascripts/merge_request_widget/merge_request_widget_spec.js b/spec/javascripts/merge_request_widget/merge_request_widget_spec.js index 561e6e8a036bdb..0ec86d859c4de6 100644 --- a/spec/javascripts/merge_request_widget/merge_request_widget_spec.js +++ b/spec/javascripts/merge_request_widget/merge_request_widget_spec.js @@ -143,18 +143,21 @@ require('~/lib/utils/datetime_utility'); it('should call showCIStatus even if a notification should not be displayed', function() { var spy; spy = spyOn(this["class"], 'showCIStatus').and.stub(); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); return expect(spy).toHaveBeenCalledWith(this.ciStatusData.status); }); it('should call showCIStatus when a notification should be displayed', function() { var spy; spy = spyOn(this["class"], 'showCIStatus').and.stub(); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(true); return expect(spy).toHaveBeenCalledWith(this.ciStatusData.status); }); it('should call showCICoverage when the coverage rate is set', function() { var spy; spy = spyOn(this["class"], 'showCICoverage').and.stub(); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); return expect(spy).toHaveBeenCalledWith(this.ciStatusData.coverage); }); @@ -162,12 +165,14 @@ require('~/lib/utils/datetime_utility'); var spy; this.ciStatusData.coverage = null; spy = spyOn(this["class"], 'showCICoverage').and.stub(); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); return expect(spy).not.toHaveBeenCalled(); }); it('should not display a notification on the first check after the widget has been created', function() { var spy; spy = spyOn(window, 'notify'); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); this["class"] = new window.gl.MergeRequestWidget(this.opts); this["class"].getCIStatus(true); return expect(spy).not.toHaveBeenCalled(); @@ -175,6 +180,7 @@ require('~/lib/utils/datetime_utility'); it('should update the pipeline URL when the pipeline changes', function() { var spy; spy = spyOn(this["class"], 'updatePipelineUrls').and.stub(); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); this.ciStatusData.pipeline += 1; this["class"].getCIStatus(false); @@ -183,6 +189,7 @@ require('~/lib/utils/datetime_utility'); it('should update the commit URL when the sha changes', function() { var spy; spy = spyOn(this["class"], 'updateCommitUrls').and.stub(); + spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); this.ciStatusData.sha = "9b50b99a"; this["class"].getCIStatus(false); -- GitLab From 130462339580700d58a8eeaf4e0c3ed6991696cd Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Mon, 27 Mar 2017 18:44:27 +0530 Subject: [PATCH 08/12] Add changelog entry --- changelogs/unreleased/12818-ci-status-as-favicon.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/12818-ci-status-as-favicon.yml diff --git a/changelogs/unreleased/12818-ci-status-as-favicon.yml b/changelogs/unreleased/12818-ci-status-as-favicon.yml new file mode 100644 index 00000000000000..70194178d9060a --- /dev/null +++ b/changelogs/unreleased/12818-ci-status-as-favicon.yml @@ -0,0 +1,4 @@ +--- +title: Show CI status as Favicon on Pipelines, Job and MR pages +merge_request: 10144 +author: -- GitLab From f2f8bbee8ca04867bc33cc3db5811167db84639f Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 29 Mar 2017 23:12:13 +0530 Subject: [PATCH 09/12] Pass `pipeline_status` path from controller to widget init --- app/views/projects/merge_requests/widget/_show.html.haml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/projects/merge_requests/widget/_show.html.haml b/app/views/projects/merge_requests/widget/_show.html.haml index 0b0fb7854c2171..c716b69b35b5e5 100644 --- a/app/views/projects/merge_requests/widget/_show.html.haml +++ b/app/views/projects/merge_requests/widget/_show.html.haml @@ -12,6 +12,7 @@ merge_check_url: "#{merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", check_enable: #{@merge_request.unchecked? ? "true" : "false"}, ci_status_url: "#{ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", + pipeline_status_url: "#{pipeline_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", ci_environments_status_url: "#{ci_environments_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", gitlab_icon: "#{asset_path 'gitlab_logo.png'}", ci_status: "#{@merge_request.head_pipeline ? @merge_request.head_pipeline.status : ''}", -- GitLab From 2be4e561cca0a2442957fb2e2e57a5b15a05c464 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 29 Mar 2017 23:12:36 +0530 Subject: [PATCH 10/12] Update to use pipeline status URL from widget opts --- app/assets/javascripts/merge_request_widget.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js b/app/assets/javascripts/merge_request_widget.js index 6de5f07ed1d1f7..f1658fe6c9200c 100644 --- a/app/assets/javascripts/merge_request_widget.js +++ b/app/assets/javascripts/merge_request_widget.js @@ -41,10 +41,10 @@ import MiniPipelineGraph from './mini_pipeline_graph_dropdown'; // check_enable - Boolean, whether to check automerge status // merge_check_url - String, URL to use to check automerge status // ci_status_url - String, URL to use to check CI status - // new_ci_status_url - String, URL to use to get CI status for Favicon + // pipeline_status_url - String, URL to use to get CI status for Favicon // this.opts = opts; - this.opts.new_ci_status_url = this.opts.ci_status_url.split('/ci_status')[0] + '/pipeline_status.json'; + this.opts.pipeline_status_url = `${this.opts.pipeline_status_url}.json`; this.$widgetBody = $('.mr-widget-body'); $('#modal_merge_info').modal({ show: false @@ -183,7 +183,7 @@ import MiniPipelineGraph from './mini_pipeline_graph_dropdown'; _this.status = data.status; _this.hasCi = data.has_ci; _this.updateMergeButton(_this.status, _this.hasCi); - gl.utils.setCIStatusFavicon(_this.opts.new_ci_status_url); + gl.utils.setCIStatusFavicon(_this.opts.pipeline_status_url); if (data.environments && data.environments.length) _this.renderEnvironments(data.environments); if (data.status !== _this.opts.ci_status || data.sha !== _this.opts.ci_sha || -- GitLab From 4a265e9148a21c834973ee43fe16c81edcc18e80 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 5 Apr 2017 13:29:17 +0530 Subject: [PATCH 11/12] Remove unnecessary const, rename method to `setCiStatusFavicon` --- app/assets/javascripts/lib/utils/common_utils.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js index 170e54a4997c83..e1e6ca254465a4 100644 --- a/app/assets/javascripts/lib/utils/common_utils.js +++ b/app/assets/javascripts/lib/utils/common_utils.js @@ -376,14 +376,13 @@ } }; - w.gl.utils.setCIStatusFavicon = (pageUrl) => { + w.gl.utils.setCiStatusFavicon = (pageUrl) => { $.ajax({ url: pageUrl, dataType: 'json', success: function(data) { - const FAVICON_PATH = 'ci_favicons/'; if (data && data.icon) { - gl.utils.setFavicon(FAVICON_PATH + data.icon); + gl.utils.setFavicon(`ci_favicons/${data.icon}`); } else { gl.utils.resetFavicon(); } -- GitLab From 628008e33fb511925c4a8fda21d1409f61ac3cb5 Mon Sep 17 00:00:00 2001 From: Kushal Pandya Date: Wed, 5 Apr 2017 13:29:57 +0530 Subject: [PATCH 12/12] Method rename to `setCiStatusFavicon` --- app/assets/javascripts/build.js | 2 +- app/assets/javascripts/merge_request_widget.js | 2 +- app/assets/javascripts/pipelines.js | 2 +- spec/javascripts/build_spec.js | 4 ++-- spec/javascripts/lib/utils/common_utils_spec.js | 4 ++-- .../merge_request_widget_spec.js | 14 +++++++------- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/build.js b/app/assets/javascripts/build.js index 9aaf340e9f1a95..fe54ecffdfe844 100644 --- a/app/assets/javascripts/build.js +++ b/app/assets/javascripts/build.js @@ -88,7 +88,7 @@ window.Build = (function() { dataType: 'json', success: function(buildData) { $('.js-build-output').html(buildData.trace_html); - gl.utils.setCIStatusFavicon(`${this.pageUrl}/status.json`); + gl.utils.setCiStatusFavicon(`${this.pageUrl}/status.json`); if (window.location.hash === DOWN_BUILD_TRACE) { $("html,body").scrollTop(this.$buildTrace.height()); } diff --git a/app/assets/javascripts/merge_request_widget.js b/app/assets/javascripts/merge_request_widget.js index f1658fe6c9200c..a75247b236b7e0 100644 --- a/app/assets/javascripts/merge_request_widget.js +++ b/app/assets/javascripts/merge_request_widget.js @@ -183,7 +183,7 @@ import MiniPipelineGraph from './mini_pipeline_graph_dropdown'; _this.status = data.status; _this.hasCi = data.has_ci; _this.updateMergeButton(_this.status, _this.hasCi); - gl.utils.setCIStatusFavicon(_this.opts.pipeline_status_url); + gl.utils.setCiStatusFavicon(_this.opts.pipeline_status_url); if (data.environments && data.environments.length) _this.renderEnvironments(data.environments); if (data.status !== _this.opts.ci_status || data.sha !== _this.opts.ci_sha || diff --git a/app/assets/javascripts/pipelines.js b/app/assets/javascripts/pipelines.js index 420201ea702a7d..4252b6158877ec 100644 --- a/app/assets/javascripts/pipelines.js +++ b/app/assets/javascripts/pipelines.js @@ -10,7 +10,7 @@ require('./lib/utils/bootstrap_linked_tabs'); } if (options.pipelineStatusUrl) { - gl.utils.setCIStatusFavicon(options.pipelineStatusUrl); + gl.utils.setCiStatusFavicon(options.pipelineStatusUrl); } this.addMarginToBuildColumns(); diff --git a/spec/javascripts/build_spec.js b/spec/javascripts/build_spec.js index 5286328c9c0af5..beee6cb2969e24 100644 --- a/spec/javascripts/build_spec.js +++ b/spec/javascripts/build_spec.js @@ -75,7 +75,7 @@ describe('Build', () => { expect(url).toBe(`${BUILD_URL}.json`); expect(dataType).toBe('json'); expect(success).toEqual(jasmine.any(Function)); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); success.call(context, { trace_html: 'Example', status: 'running' }); @@ -84,7 +84,7 @@ describe('Build', () => { it('removes the spinner', () => { const [{ success, context }] = $.ajax.calls.argsFor(0); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); success.call(context, { trace_html: 'Example', status: 'success' }); expect($('.js-build-refresh').length).toBe(0); diff --git a/spec/javascripts/lib/utils/common_utils_spec.js b/spec/javascripts/lib/utils/common_utils_spec.js index e7213e6568a609..03f3c206f44c00 100644 --- a/spec/javascripts/lib/utils/common_utils_spec.js +++ b/spec/javascripts/lib/utils/common_utils_spec.js @@ -342,7 +342,7 @@ require('~/lib/utils/common_utils'); }); }); - describe('gl.utils.setCIStatusFavicon', () => { + describe('gl.utils.setCiStatusFavicon', () => { it('should set page favicon to CI status favicon based on provided status', () => { const BUILD_URL = `${gl.TEST_HOST}/frontend-fixtures/builds-project/builds/1/status.json`; const FAVICON_PATH = 'ci_favicons/'; @@ -358,7 +358,7 @@ require('~/lib/utils/common_utils'); expect(spyResetFavicon).toHaveBeenCalled(); }); - gl.utils.setCIStatusFavicon(BUILD_URL); + gl.utils.setCiStatusFavicon(BUILD_URL); }); }); }); diff --git a/spec/javascripts/merge_request_widget/merge_request_widget_spec.js b/spec/javascripts/merge_request_widget/merge_request_widget_spec.js index 0ec86d859c4de6..889c26b1ee5d8d 100644 --- a/spec/javascripts/merge_request_widget/merge_request_widget_spec.js +++ b/spec/javascripts/merge_request_widget/merge_request_widget_spec.js @@ -143,21 +143,21 @@ require('~/lib/utils/datetime_utility'); it('should call showCIStatus even if a notification should not be displayed', function() { var spy; spy = spyOn(this["class"], 'showCIStatus').and.stub(); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); return expect(spy).toHaveBeenCalledWith(this.ciStatusData.status); }); it('should call showCIStatus when a notification should be displayed', function() { var spy; spy = spyOn(this["class"], 'showCIStatus').and.stub(); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(true); return expect(spy).toHaveBeenCalledWith(this.ciStatusData.status); }); it('should call showCICoverage when the coverage rate is set', function() { var spy; spy = spyOn(this["class"], 'showCICoverage').and.stub(); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); return expect(spy).toHaveBeenCalledWith(this.ciStatusData.coverage); }); @@ -165,14 +165,14 @@ require('~/lib/utils/datetime_utility'); var spy; this.ciStatusData.coverage = null; spy = spyOn(this["class"], 'showCICoverage').and.stub(); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); return expect(spy).not.toHaveBeenCalled(); }); it('should not display a notification on the first check after the widget has been created', function() { var spy; spy = spyOn(window, 'notify'); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); this["class"] = new window.gl.MergeRequestWidget(this.opts); this["class"].getCIStatus(true); return expect(spy).not.toHaveBeenCalled(); @@ -180,7 +180,7 @@ require('~/lib/utils/datetime_utility'); it('should update the pipeline URL when the pipeline changes', function() { var spy; spy = spyOn(this["class"], 'updatePipelineUrls').and.stub(); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); this.ciStatusData.pipeline += 1; this["class"].getCIStatus(false); @@ -189,7 +189,7 @@ require('~/lib/utils/datetime_utility'); it('should update the commit URL when the sha changes', function() { var spy; spy = spyOn(this["class"], 'updateCommitUrls').and.stub(); - spyOn(gl.utils, 'setCIStatusFavicon').and.callFake(() => {}); + spyOn(gl.utils, 'setCiStatusFavicon').and.callFake(() => {}); this["class"].getCIStatus(false); this.ciStatusData.sha = "9b50b99a"; this["class"].getCIStatus(false); -- GitLab