Page MenuHomePhabricator

D18116.id43578.diff
No OneTemporary

D18116.id43578.diff

diff --git a/resources/builtin/repo/code.png b/resources/builtin/repo/code.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7e56be76276860087e987694d3397d22689ef74
GIT binary patch
literal 4346
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
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/commit.png b/resources/builtin/repo/commit.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b4b882041ed7dfaa6fbfe91a6cb4e01d3ca5750
GIT binary patch
literal 3028
zc%1E3>pK$;8y@{at5s^Km2<)(VpdL>Q$}+db1cg-wkBy4Aw?!KtsD|Yh@2*e8A&-s
zniLx&IYx6FAt9$%pWpW{c(31m-Ou%0_x*f$zC6!$$J$t#fq)Po0001)BTdi%fPl*1
z64|xmSmoX^0{{fMHYj`39f`k5`IrCl|A{Sksl=VjUL>Ne>;NJM#EwXxI&bOVb~PY0
zChpEn+!ZGqlQVKh#YKUFdrw;5E&9^a`)%~c<TU^1(#o&78Q%B7zV4cM^<4rm--6BU
z`KgI_!N$jAed<^LtoPqjP&QAiyQHxPm1_?ta(~B~K6>eHw_F``x^V4DWy(RBR|AIs
zj8Pg?6+bSX^RrqAtk~altJWWsu5#jj*RZ@Mqx18KR2w}n0TPkO#y)s9q|}ZqVeTeu
z805UUy!F~!nAMS*T^7bk#)L!}X<v-gw=Kp?9@m|1Ef2pPt%rD<ajkS;Oa6PIX4k{C
zB(lrd%uk1$Z|Fc9y*#NF=%?VX5+5$?Qf&AM00_S^H!-vi7MSgfdi?k6%dQf>F<)=H
z>EF5!Jt~U@{5SMs=d*_Ew-M^#1QX8%6OH80UN_f_%I!<-@g)6Q%NHtp=7^!2jRCMs
z)YYXH4{cZahjhOGu<mi|$2XS)H**$3J$t2o&A33+<LeFiQawyMEwN532rXZ-vzhRt
zo4M1z>8{?{%J}ROD(>@p4ck<yzHd#FL2PVlX<pqHE54M6tD4rr3HdCKsl9SQ@^yxO
zs>j9t<kFwMxZ_ig>Ur)iuSUTSyztXBIE6W-an&|WOic2-S)qr=*kmG4_0CeFy{fBN
z{=7@|!emwv!Csfu^)8B6s1r1e3Yms=g_L$G800~@Rk@{fTyGu`^M=%W2J<M>%_ZCM
zI)Cd|xZFBhj%Mf0Eye^GxD;#yXfB}RCKo~e1=hu~YkpPPwG0S6gNx5ID;9NUG`HD8
z7#0`P;~gSewaCn)#|narZ;Udmt*h{PzE--?363?Gicv=I{Sp>4%_$E4@W@MC@kj+@
zaAXL_WU*8CD`}g5bV{6hplk?a7LDd<{weH*8Vl&WxP0-42PxY#-^Zo|W2{C?yg+y0
zEOHEKiBPd(X-Nz---w>iahC_jX+`n0=3P(v^GX6qR~_?1IwlZeAV2m%$dbf{j{bVn
zf^(z>@mh`VozhlQ-_ITe9(ybwi14e4dRunw-tCT^@yRyL=OEQZL%0p;SPnh=20ojt
z0V|4FOhY2V*cV_b|3Fvql9Z2wa1n!1=lXj>g!@3DE^3gmrV*kNqUncxED%s{ISRWn
z*k*DNZ2#&AsP8zix4kx62s}^=YSN3i_ENx3v5`*(<=04Z+>r=8r0lSN^~3K$k0NbD
z<IsIWh#J=@F);JM$yqg&yYi^Nu+ppyO1t}M4zICC@B-Ri1%>N>7-=CzPM2Ij+vudi
zufTUp_KdC0$b<!yKwIMXM~3!fS)3V!HcHedKc|*qN8LUs^WMW(dE+`jb5QT%@jNQO
zV?^HiEb!|Mpg&1R%@mv}GE8_uB?lC1f}b2e)U9GEIyT}EVf%g$vOG!7VRs|#`x3h0
zD~c&43%cuV^+ns8JC#OI&Viqp>dFud{9O>jVrVZQ8(u5eq0*g`1^+l!tZ;+N-)g>0
zWqLslA=(w9VU4?es}hh60WPx}@HWi^hl{hmC7aX&v-5OM!oK?`2}S}*6us$&8gsg8
zEQ1NdQ#=WGy{2FZq&-hApUxqaupDKa^B(uN)~1P7@Hub?MWjSAp#)DYz2$A`8GSj1
z*k}i%V3yU#j}`ls=rvO3$@%4h!}r5p!zfj64~_5bfpJxxMwt2Ka~qNu2QE21ugWhE
z8i)>~?aWVTj=Sdim4qFY!8%%cf~19}n1dXcxSC<DkR6FaI>sJ+)TzbQLq1KbZS7wN
zROolZxwT;Gtf4=_b3yb3zQTFfiBf4;`l0)*!-OKW=z|+&$A8gpLh}?m0*Hn3**fBO
zAu?Z*J8pk~s)N{Gl$_jh-`Dz7p0cW==$^inPjz@rr7OX5Z51hknb<eKKh;H-u~tdo
zgFy3soA<IcoIx(QOB`LNWG-MT+?4kO{eE@<E;V!M&EBU)zGEG^2Fl|K1Go(&(0p$e
zP1!_L)Oys#Rrv)Hz3SV238*a!=$)1{l=ZG`R&@5a`E;tLx8oQ%QTNFCK5^4CQP}1d
zD|F|8OzPQtkwJ|eLrFQ$t9f|U`~q-5l^K|%CjZIL#I`bW1gF-lG##RvdM2wWrFpQT
zF0ZW4+TAH76CA`;xHNaBB^d&YGUA~JFg1gP=i+AS4wLInncf(>74UXXx?ck=&RG_>
zVXOuU9uh9Cu27>W!L>z<DoiI{il&<(1eSbJuX_&sv<rul*{N;<Hi#A;tiXkBi|m_e
zf#Ecg%2LRr@L|BV<BFHGuT%Cl8>3xmHa=h3s8wlbcwNoolkxZDg4juh6!b(vY{cWW
z#ncvjZ&$oV`11#-4nK6cg5z~Yra^tzyMnc9YX%ncz=t2B;W1TKykOHBr9tG%DvjG6
zq5TqoPAxs#&&rataCVMPSdfbGAd~X#Y7yFBCaIB$&olhOr$nw_SDJhzM>JANVkl?)
zb{)HyCe8`^@eX18wUq4>Eo9{UERf@1ibuHXv%dCEizLD65(Le2!eGaU-2}ECgw-x(
z=DKf73^IA+AzZ2Npi6LhddfOvm*oJ#^x<IPf$$S6Y>TXVLq*F8wnj3x)mROCGKO;~
zz4`<>sG>B}a&J<}&^{d;HwUJ0Y)DI&h?y}FWf4ya6H|zM9oFI|fVeWV!Ao+#whUOk
zCru}F9JA-w8?5WB>Z8xM-5NQ(VZI`*xYU{S{ZWi%<gj+K*Q7WETwUP4YqfAL@$~%K
zG`}vvKumm2wQJJz_mu-1&lJ@;>F&Z`F!Vqs@{P#WQ&LBa#A$o=`3Xzez1V^1bF`4}
zSg!}#Te#tGfgy|IvF)zRYeO|PdLb-&oW-)&ChNL@bGAY5oKGlq$~B-h?Iz9}Nxbd;
zvl@lHKv*}^C93>QTJ^T!+u(Jeto8p$;T>!UZfVuZXV^By|5fIuRwkuJS0eudiSwi`
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/database.png b/resources/builtin/repo/database.png
new file mode 100644
index 0000000000000000000000000000000000000000..2132b8504126bdfd63592d76dce49b971b272d56
GIT binary patch
literal 4716
zc%1E**FPJK!^J~vv4YmD*gIA!iieg6YQ-+GOYK!^hNxM!_ojA;^`JJb-ISt6HD-<4
zdsgv#o~!r0c>ja<cRt^9anAj@II(&<>Qodg6aWB#N&~Kn000O?{xuo!pGKzyr49f9
z0ea62)&7YtKJowMzx@9sf;|=e&oBV55IP0`N+toxhw`erW-ojqGb)-sj^cNY4wlFJ
zTdQ+p1Dq`M)s>`09?$>@*_Dwt{_*9#f9^JhYg18fc2-*a<eDitRow&Fg7g?uK~i``
z=hv0rzoz;?#5@w4`&TzxONG|5bYPR$&9`IGmO5O|vdW^`CW@Yroc$cKr+(h>RQz+O
zXZ>yhCt2wt?LGJDlSebBe%mZ_^d86g3>+WkVV4(mE|qZx1j$f`_mJ;WqT!PoY-nSu
zk^AS`%!hw3bQM!P_FWgUZ67pGx^A3J<bD+<N8~CNY*gaR_cAb(F^E;>uMid7x3nL7
zt35Suy%2h89beYo@qRM&R#0@zdn4R}$wurU7ytljRt;4ZLw|zZ?@z;-lxZVZ8r<*&
zEcg~T{98AC%UD*3j7{}%H}{{tmdhc)|5oqh=O2SJV~ZarM&<^lM;H3O;qbpmyHU3U
zXqAtg#WpK+$@&vA5)EEQcSa=<{iSPZ^;1o!pt@(jk!EvpZ2?!rk!l0HU!(>yHqz5g
z3<D?rN-{D+8kn0bjSq_=f;DUne6);Q%pc#lu;<SqYZIsz6xrmZ&(GDSt}bXmDauck
z`nXH%R%hr*qI2Hm<rHM|25fBHzn2LD88yy#{?wpo!j2`HF*68pI=F?{WlSAm=I14C
zR+kdoFz2k0bw9t0^B|fg9ck32xKqE>T}*Az?Zgz@<XFQhjztNnlc%5-=qwikt3Wui
zj^*>m`}#jbj`K{bktX_0&bykMHjq@+K#_dh7Eaw5*=aORT5|9#hbgj3)7?K=-#uXw
z;j5q6sy%q5(N*$3U7MJBBvc<&-ElE&c)>BOeRfF4yn95Sjcxfe{8Bf6y;&$2R!*st
zG$mBX<i99THce@}vfdJ5jLYut6DI$<A!BQM-n?n-p#x?GHiX+rQ_*pF476-#bHYe!
zA_oK2YdY@-vGW>_4aB`WLz}i8>)Y4p_Q%B!n*#fBj>!$d0fV2uJQ3;tKlv1T&-RRa
zrj8O~*&XxlEZy|#JioKU6UXItEsFyC39mdaN^4%x$j&-Vv7Lwy*Pi{YN5YiGB;Xeo
zIY~kl7q12vaGR)a@!+_c@##~Pnw7r3qTkruxeWQ$1SCN|wag}ZrkSCtluQgmsz1<|
z0K(MFIYZ}*{PaF6@mtRmt&vx~w6@R`I({;*WUZ1zd8`~rQqSe1fDqHVXKEWtFZkMp
zub!W%%FmqO`<ipaX*;1vt{16bx-;djkF*+vpt=L_{upKm@<IX27$!W?$D7O-?H#7o
z-ez_hDs*m7o%)1gO>~45oF^)9s@lltgeQ<F*KU8?|9Mh~q;WU-<{Oj7nwSqW*;@Gl
zhfz2Wc?OjB1b`?TUSv;Auy1`7SX&9Eg)ZOfaIa;x_528yD(VAfN2~ZG39BViJOCPL
z4tN(Z!Pz`vGQ4p3U-IWu_lFNfsEF!6&+c7OW(MgGhqwAWRWw%k*+627*Lxw)<VnI2
zpX<ii+P+XQ+ii8(2E9lSBXeGX2ZKNquwXOd5V~#oN5`2({tTGPC)n*n&f~!G`=lqP
z0%oi1=|zd<vs2xZ-wy--ZmI|vVcX@71KXWkcBDdEXVw+S-gHk^Iy&*q)mt;34xOec
zPSEsMjJ<Vz)t)oO;IUq&0L6WqC%kjyCHES2F)wwO=3NN#c{wx=!bgrcb(pC1<P}<v
zEtVS^J<U>Q-F4iYA!*(ILRn|oW9kyS5oh3GA`;RN@>8q%_2WgWq^qJrAGrq2Qicea
zyCM!aPyRFvaee#HAr$)uA6%3)A1mTszJN%U3KMd|3W4YMmbIql&%*8jscYBeS;ReS
zh$&P#6jW7hI3+NW#KRkhGEsSK1E2BgoUAbqyD*{xgW>glzgjPL(a~t}vY*%raNY<g
zzvV_rjXEY-7JtMyXJk6BuU%-roM#JLjX)amyt0hiGkC?Q7)JkX6#Uh7KSr#$>X8DZ
z3emNUxDv89@U~Vq)AP(D&i5+!N@`EE!ZM5NXzaexu65wQ;dKeWsG>uj6z-G2B78qs
zS_L1qkk>UXEoUX9NB*F0j_o+pEM7`8E}K$79{T7dzO9n<VBL}<ol(o)J)VW`_-3YB
zU0UnDjRtVQd1M+Ctb%iPI@x<*S*9dI*{R4zhhjasC6<G_x#rb6id@_LMVdzJn={fj
z-RsL%V+#xSrCwd%H{}jZpHZ7#`kgkLAGbAf`8p-eN(HZ_Rb;+szy-X@?`CsLlC9RZ
zJfzI*UXp?)l`SVo_+AKc7lKG&+OP*^*;Mb|x~tsE0zn;Noy8RI@CgbMGWVD=7v6M2
z<N&6S=Mf6a0aT{R3M^Hb=>#H2ijiq?^~C3f+|xQn1iACt$<Mb|dL;+w3g8v^Omql=
zBD^?Dus8lI6rNop8WbknP-vdSx3iAcdT&sZ1lEsR2y@Xa9O5P}?NCLNVa0fpUFmQ2
zDf(sa0(il~U%hCPcwdaVtiR$(7-)Z7mx5NFYsOQpCh^eiIU>R=IHnDAlR>y{SpkBr
z0@STgJR7C4unSO=4K;r~xhCuV=}&L$T;T%%au-~9=Nza-XlB3L9O^Rnp-=NrH<uce
zlSM;l_RteIS;&<{jOgiNpLkA8IKc{~0ez|@q&1yxo@ckp$mKR*(ZME8c>&Q>Z1F&5
z_fnHq6|2hvj)$#3Z#}#ORCy=q@3!6WA4q@OPJ5EyW7%3R+$*kYlu8WFbt>7LYQn+W
z=DraUXF}Rq2DXjA#_<0}yN|pbHz{MjHp|i2&x}M-;!oVlb!s#2F0dce@5f8TAF%Ns
z{pH8K5tOT4v(Jn<6%kh0ezoa~Mp-wKo#MO6hi$oU2qLNs8_NGwVXtA);f;qqT>RBm
zSM4Q}Uf)0RE1_!Nc=w+$?w%=U6%^P7gk2+n0@GNzgtO-3qa}wN0^hNAGj%Viz1u!%
zmP+vXmM!_~$CsD0-pcV9eiAlyAeh@xmy~77EH_2Zl;`HRAyG_==IO*Vuyjpe=;E$K
z<{nwu=~VFzz-BMu6*RdnWuK9M7?gjTbt%qF#`W{jr`R>2FYxuB)oDh(ZCf_BR&goA
zx|`rZq){Dii7IbmC!@pju~5SM#roA9ky$-!WKBn3y}sdKwlU^c?dA}n)+c8Uzb^68
zc6(8c=Zo%LD~)2}@UNrI)t;v^8U^+}DFLv>3%BwuK4UClv0Sx(X=jVcO{Kn8y@VL6
zQx)R@^=Ht`Qf3xm$h{0^e^>O=x%4>bz0gG1bIfLc@pa#{@DlD>`i_n{(Osg^d9llO
zpsuk}$7J)`P-D>0UG3{qQ6BS@K@pCSj>Bt#yCQlF1|xhMx7|a2+_QC>`q5+cPCT7L
zreZIliQ*V%Fhh-*@Ni`mA7%{TCCXyhjt%}v`b<8EBfvgaOk8N3>1vf+d{_E7ib7o5
z9(1hw1R@S?BEDK7sqdAczFOv~=W=A5tOJ>Xzel7AClky}U2;$7I1t7uSn@-<_+kh<
z5}3Kl(xM4=jH#C59{vy^u`n%(ozib3v0#>MCvpOdm5|M6FSfH)aVpLMW&Iok5i8oz
zB*^k_0-gmmc3z0;g~+#6xJaB=-7G+(v2d|1TD9?cc`@0V;G%0x#7NK%6J-P<?<NQc
zwnN&rGSOn4e?&g8TeHykw$tKX)cbxj?7l?6aCT(_&K~?4s5ZGF=9Z{FV^#~oh>%K7
zg+o%}tR5w(&#0PO1$Z+PHOSL5rA=27g-ZnGt@td_GH;YI-+n|g5ZQlA0fM{-tM?(T
z3+`y_*OoxRM;z+KIjJuu5uxqh{mvfHT5Q7m33`hhR6!GwN|M4o=bqszi8v_vZpG<X
z)X|3?n$X)ROY+}?`#w^_QW~+_3*#J)sieQVP_Ny8R+UtBDCh%x<f*6@oiV;t7galB
zQ7FM$M>m6ZQMQODM=`B~@tl$}j0e@BcWPQbrJ>i}2h@F0L3XRD&p!B;LPMptht4xE
znx{E3Msub6i_g3+RuHsNc6&9{o_5g7@bP?P`d;-*M-KD!jFw-XHTm!BVisS~$|vgL
zz~3!}mvXQGhR-t|g?$4}cwq#!0C(VujN{|W*2j;+xLjoRe#x+Swn3j$JcJAGlW%m_
z53_`nvy$=W*maF%C$SA&<`qI|aow{L1vP#{-q+MfNYV|1^nLJC{?r1o!cSq4GD?oF
zSk4a=Cx(`mUP{bldee%RZUsD7<O}U_g-9`AG(+u3#6$flR?R$rlZ6f3K*ROnlGy%x
z@iCD$XU~gdtYW>Y>g~y7;dZVQ)Qnf&Bc6PM*^@^U#DoZJg`rk=@JF!G;1QH)BM6nv
z#VYO@^?+=24x{DEA~S2!WGZ`dlF(#Se75CCQ)sU+dK#vb^PofAdebU(_Ac&DrcujS
zgCWIBLx|)x|GW7%|6_$&-AqPXgWJSRVH&!QmlAjv$%7^2A77{OnIo!vpUPoWuKwk_
z)$o&2_xSj>`!+v3&z4-T#Z2yyPy266%gv2NGt7pPTVV2pS1+i<Hz|)b4?))Bv}@^N
z-_R=U!@_@~H5@a!64!VMOT58Je{~b~bwfOw`U(4XQ<M0=I1;X|@g#G6LK8D@43i#&
zF|riEd!W`M%Jij3p89eN;;NZH1g7@okqqWgn%%%|4#9Li@*3O}OsES>3?)jCg#G9T
z6;RJ-DM>R{flp9$o-c0&N~3V;uFKy~M&ZQijSI?QKWKG%^4bi-xM<&FYE%eE(qHui
zGbY&=l|KSI?V2+~zMh(yb0vv;ac|53id8G*2O$!TxAT`&F%CV4J{S{uZ*4h;Rtvsy
zWsmUz{6&(KrQ#z>TQpw-%Dm-3eFls4lAot~nI`88_kG+5`+d6mkrM4NR}D1p39NI|
zQ6J25G~1s|X<+=D)H18q<Yap}G5t(?N3W9Flo|RLrn?AV!*Dr->WzYmj?yn$e%H;2
zS`tezWxEw(@z=FKtLBt3;QHW-5KVbPpz15@R8Xs6R&V2s68W<ya5b|QM^k_EaM&0A
zF*UmGgNRa7z!pVl1s0dVD8FEIbF_0#ci^Y`pcBIV_-xuv?&u`e@4;c+-beJmhb{~f
gy2D6P`9BY@9H2~e0`rYz-}^UdsOhNIKCuq}50^~mh5!Hn
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/desktop.png b/resources/builtin/repo/desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..adc14c782ca05eea1fd332cabfd64eb3e69bb1d2
GIT binary patch
literal 1688
zc%17D@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAm>wnPlzj!n_b*Hibf9Fd!IiY
z80*VQg8YIR*ksL9r|!G{bPB7O^RoX-lg}o(>?-`$w_yI{N%;=Hc`uyj$q~PNF^FT`
z8g-3=S893Bjg04>PDniY@Xvz}5|ST3N&Qt+YHR;FJLUboyT^~r%+9p8Q}z}*bwV&M
z=I9|7?YHl=qJKrz)^v816otIhaox(L+5h4@yI=i^y>-3{db*B`%P0Jsb^G(zwHqEk
zQSG{RklWvjIn?Lor2zTrFSnR-SFS3JUw?y%rNftjfqA{Bi(^Oy<C}x5j12}13>$WT
z<@e!`+16^#00Rv(idL@e_kWc;ZBCfQF*m+gWdni34kDooB4-&G8ynyKANBI;$=j82
zxfAL{)IY>2_NnaM5W&<MWI1JuR_KKlVJcIjWL;jF7EaG>@KF|VpQ-j@i_xQHyiT%(
zLCj0nS-kk_xbnX6=7R!D+>$rWYPjaov&{IyEcas(+yc=zqIAR0Y`o?jyoPs0uJ1;z
zI~$XN*T`<E{r6zyAGuo>MOJe@EfLF)^$S?H?6<i_`Ntc~r!JTLU7ELFd496*{j9tF
zFMov}|MmCg!enihMg@jNVH@5GaI&vT_|H2tzU;j3o!^uFKWQhgwY_GxWxHJV`kt-d
zBXTqDKRb3S;b0Rhx0p`E1~B7VK9m6$p*Q2*)Q#6-);tcBd|kOD>F8>sYt}^@&n;bd
zwMZ@5HD>;zSV7K+&uoNE`(?aFEckk!a_z}x_OH7RX>cqE-Yy<|d)r$6t+}_$l5cPO
zJg>6t|DDcnaj%(TcQ*)#zr3Z|vcu>4I)x*ayUIir*InHDnxn9J-CdWCX!jR4x}rG*
zqkWEx9T#|FCcC@Wp#0sXwbkDRUohUS>Ie{)ySVbWzrdT9#=E}!VO6U5*~PcFs@LP*
zg@xNYUdZ09>_1_5VP?O_!R6;mQogG%d2(85*T(mnL0`X0$Nu;x%5=Z}&!4Yv%z1zR
z&G~*_{=VX;=TGj}|G)gLd(H9#zy2y^{=aN&q@J**D_DU~ep_IIbj^uH4rVnGevL9e
z3MMc;f9RAa$7=TcQ1koqngtK7ZEoypVA{X=p<^ARDAz+rK~=p&jXRG{(b&oR+e<Tu
z?X%ys;3bQMuFYNOBidsf=R5P&;|;k+t!jt2nD%Rg1aqH$r4h=1IBBzH=}yKn)1Wn+
zX-8*iUc1DwIxc9PXxQDQcakMScQzNzznyT|{?$fVGu4&HRdTBQZRfT5p7z$bUdU`_
zS`xHwGq+o5aGvg&R|_Nf-*kNqT4m05IH@*Wvv`|6+ikyZ{5*c*5?TCw91IK!3=BV?
jY5p;B*?L*>Jp(e3S!|uQjxVrm6NuyK>gTe~DWM4fy$||&
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/gears.png b/resources/builtin/repo/gears.png
new file mode 100644
index 0000000000000000000000000000000000000000..c08e733e0019e8e8bbea774c4c3407c84dc1ca78
GIT binary patch
literal 5903
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
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/globe.png b/resources/builtin/repo/globe.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdc379aa78ed5faeeec9acaac99ec011b7d1e54d
GIT binary patch
literal 5820
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
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/locked.png b/resources/builtin/repo/locked.png
new file mode 100644
index 0000000000000000000000000000000000000000..10142e8519c833ed5e36affc4a132635212f091b
GIT binary patch
literal 2888
zc%1E4c{Cg95>JsXVyRxGMXL)ff^N2IRqaIyYRRRRXmN>H8cK=1<w~ns`%<b!CDx!4
zwZ-06#1lIqv{!-<Du}i6^u2f9c}xFz|GsnXoZtMunK^U5`OY`<$HZHh8wv7D@B;t<
zLE~HcRsg_0#UFZ*cQ0a|A8rHy@N`++wl>&v;mCwP@hAS@(PvG_*qi3X04wu50G>m_
zq7o-gN}rMvI}GAGsHkG(7@F5Gw8Gt*YAcR)GrOvEM(Bw8E%&TZRw>e4>yqsQLf>P1
z9o`F`&zSj$dnsRc3m=|+N*v7AzxZ}wp;DgHVqGxJ?i37|T{^vg$1Cys<!jVP*&3SO
zZ*lv`K$!z0U<F)RZ%nhmUCsBkSHAJDEicY*|IQfh|JCrEMGz@k(y#v0X9~0gw*K+B
z_~b8h;Zc}BDy}<4^fVsZbUoVjF4rNwJmEgPef);%8*kliORNp#%j?yfsUaJ5-*^#x
z&Z8NtJI1%qoA{%u>c(DGzkGsDZf(kto6t`BpsaCg<oqB2a6sEwU&lIl-@*XzL&PNj
zuy@6K1x3YMQt^oToJSK+?A3i`)k6<UCiSV9^{bdwLlF<-`sois$CZnQXN39uQ^eS@
zXDQI@FK-uqSn4D@5SGRpgSahiMjClq;q2AX74hp7l3m4QL!eGu{krrGw$zQVUG|z}
z_riAKYhrLXk*g208X|IcSE8$`kPl!t${SElCOR;Y?!wxFlyqC$T_D49nW<e-P*p6!
zn8IM`se^;WCtDH{*}+O#aQi&`Pz4atpd82wm+PidKF_C20^I`Fzh%|bsNXckJ4sC0
z07VCeA$kG=x>pV4C8j$M$hl*lcWxr0OkzDT_jyw;CFQjkHd?fgASB9Nq)am8iU7%X
zEN<#)Kbg&pT|G&*cwsCqBc4%sQT}`Zhouh8TG4S|5%q$Ju<hTvjNW@;vmtA+4KUWq
zE%2LjyY;!QRR9yHXDFQ^Qj&P;bxmMyvJd>;Q+wo4h0?R=V5D!i0v<tiPgllMI`N3y
z5j+hXrZMkVA)c{W#_fzd?&}|y;O&Vp74-3i_bnY>A{3H@Y&{AzVjc#rw`X!VblJ7x
z(KG>pq0o<#lz2h^c@X1WlE=a^v?PA#jLKzAHJWaN$8-1n@MyGGRm-kXC3a49EbbGy
zBsa70P1Z^#w=r+vIOHXKs@)6r^0C*MkU5AkxZka{q(lCs!|B4V67Ffs3Dws4Ea8&f
zK%SBWvyJevlRf?JgpuYWB2YI=wed76W<e-jj&dZTQYwCi=D6DMf$$f;G*EZ(Y@}3#
zMjq%)qMa%0uv?(DnccAF{&Yb*F`T)DZ4uqI<AqU1NUb)n?U=`@5~RN%u2(Hp58Nwu
zpMEMFEJP(cUyKZluhdL#ZsljjIv*nD*82%ocBRP0E=OMX;S-)0%gX;~SS8ed!qxS{
zhQg56WyATHf)>izDR!-lAJo)hM>c6>MxGbvFTQnLVyxEA)ah;Tev}iR(EQPOj!&V>
z^e%@$smJI2>bWn1_NprJ;i5k&Nk$<58x_BqfY_V(zaxc(XO)L$OrH0kqjlP`8kV8X
zt;s!+s8!Y|qxfB->mp;jdlXbeG77U(^=Lba4D;$99Nqp5p>JoDT<*Bb0yCIikC<bj
zWSa?dbnR9(nW6v@^{*{sDjSSPF_@2G>_KHg#%y&9y4Dc6*3=N#_l|*KsB};rg|qTw
z9q1KyWD5A20&R=v_I&Z=nF!UKFLgSL*kFfkCuG31#U^|vpKMwEmDN#Crl_-_q+sMg
zac~Kdh*=uY^1W!}D@S8?+h{-XF7hQ)LeYe?WQsuydYi~?%n?OIWaZ;?*`v3R0Vs$8
z^$P>@{qm;w<Evg$rN4!aNU=^=u)LpZ(iCB(>GT?S4zwcu;?NL#49J*Gxgq;ZRmZ8m
zFJ2Y*xbj>yPz>r4m3r(41OFGg!sP_HYLPQ-OrUzXP3+z=<3z|OYqd&>R6?eOT8nck
zBqKj-tLso^*EwnSd`gp&g2_B<=POgtmYFlM3YUJeh&Gxe=xgqD6diq^Kc@I5_f>J^
zcmJ1#gDOBc=@-QsbKAVFyZ7f*En!>aBMWa^_$kw2iX9xQ-<zsswm%Sd2tCDV_dOu#
zTs%QP`!x52dpu{_m`%HF`aV?ngGp1i8<u1K6t#{n9BYZ0zGjL~aORztR<C!qb5TVR
zH)lse-Ko_|ch)=|qt<ArIwsqfBiif<U>t2Wf5TzEM+0ZeD%!~QgQ&OhfE01f|3P(3
zax#DYW&oXU2vd25KWk-|Z_m6-;-oy_f#<r_aS#0?k$w1I|IN`WljCV;?h+OdWCjcJ
z$$!;s&y5ZQT`RLwZ*y(t`R_V^BZ($PB@m&td}*(Q(R$(q3}e8v>rm-t8bSs7Ofvf4
zTZ6^?I6#WjguN7B8n+xr?rLVbbEjH<b~O*E^i7Z;NyYkVR1M=C2(;x%5ppTS-8-lU
z`)T8q@ZQ35=W#=$n*EigCPGj5fqwpE`;fY?zN1)w7Z%>sV22eFa0!=GR;CT**2Wy@
z3i5y!BX+Q;VHj48KtKh(m9=k+)0?gzRHC@EA~I2gkt2xG2yp5I!qZlX>&PjV9TkCt
zZ_d0%$a6|{1Gc`Txz_Oa{gLKEI*OsB-35opSue?WtYKSgNFHfcq)F>fLK7oNbM09E
zaa^idi9JtaRUYyMx;GDe!Kb+XJ1M3o+Xn6UeL3phJIJx!RhzAKk$(!sxu0l-(v=o>
R+*=|5#s=p4<+?7>e+8Q_l{^3d
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/microchip.png b/resources/builtin/repo/microchip.png
new file mode 100644
index 0000000000000000000000000000000000000000..244b53e374c42e562f0441fede7266cfdcc92659
GIT binary patch
literal 2456
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
SE2XpccZbIkoEx3Kz405lOn!j?
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/mobile.png b/resources/builtin/repo/mobile.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddb5dc21e0b01bcee97adc44e213b97ec14a9f79
GIT binary patch
literal 1905
zc%17D@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAm?R(Plzj!n_b*HiiSV(b4US3
z_TrKtzhDM-CDX{}Ef=1A)bw5a_rF2ud+vreuj>Pj`PY7{W}U$zuyO_Gn$;W&=QoA~
zi9C8BG;_Mm=TFuPUYb-@@b2Ep<NVJlA--<u#q%FFC+~5&E2-D?O77~`ZRbv(JrX*P
zafg=f-u)#y+jq@56#V7c!~0)PD)1?;+8DSg`jV8)+PO>EmMg1NKF!W;>r6|J2utGM
zr=A$jRbyK=+erBF(eEeT8v2<>T{fF2zg&@lfn|!Pi(^Oy<C|-(l}U^OEDw&>7F_?_
z%`L_sc*pbq(j#0R1<yXdjX(6NBT97XlprrnAfdMTXx3)yIqS9-TD>t_eKbdCabfiy
zyPTHuuM4{;{$O^@2{3pdzL=v``NoC}9hEi#{{{yoO|}VM%}!RzZ#G$8IPtVK>LGi_
zA03X3@%tU0o{xX{l|SVl_gdKtoZKs81#Ss@{bpAvsZi<ZbA0K-F;~oSWr&!asE@b(
zqNQ9xSB(>k`J%*~o_*rlvM#^nbT03ftnx!o<&Ma;oL25w+HzXBqq6n1amUqGZ_Xo9
zhgi>KMTe|O%jWXcNvQ6+%6C%4DOXqQ!iy6jR=m1myKHBAtzUiAX{&zl%kZrc2OO3e
zU6}nf?}pUL?QUxqioL#EkyQV4Qms*&Tf2GLi`lytDsV77P};Hl+{5pF5;2|<Q;Nmv
zS<(t$*UoA*n0sQ9s`oUV$W19HCr$N$GJqm$63yOc7>1mS`sWh9`ueWO*DrEEN1A3!
zbJlgIy;VB6FYQ{QFsIq^Ns-Gv47FyOc8WZn6qyXutTXf&*Dj~~o=Q_qnX7bkMGDMs
zx#FDX)}~!k6^iLj+ZtW6Juh_gt-pe?w$s+;g-MHj?h|ufJ@M;$ggL*mx65tU=}a=<
zsZU;>dwUxYS#HafHn)2BIQXk_Z*2C{oh{|cKXdcy5(^6x>pYWQMn>^{j*Ps!J-<{p
zvDVTdDf8xs#@4f!g-)-0)x4qb*_tCoI<I8j%-OH7QD)~3e!e%|QzO3Vu^wD_I$UMi
z+Ks0R9)0RLvgui=s9)^oDG^~Y3m@(}vZ+K_N@~$_)oHD>FO+yEMOyIr9u_*i##(Te
zP``)H<l7et-IHeCY3-{PI{n11<j(X6wapg{wKw|6IUHwxq|q8>)cIJk<chGn?v)^4
znSU1^`pTFFc#9VHtaG}&`1p}Rp{$iEeV5cPd})dJvvAsS>s{6|D$}@DEL}3iV%Nfz
zZ5Cdq7ffqnOX_TIOFt46!gKVApm#9KoT_~uIzI!>Hp(P*wgwv>nKYUEX^QZ9?q0{!
zlX$=GnWH?f(Bey1h0&#j3$7n|BFJbhxc0~tE>TrA!OOe2bM|y9Eo<E#5M*Dtv(o3l
zp%!<w!lTZCg-5>S{rdGm;h)60*>+wzg#lqa9|J%AK6LWrq3_&B+;0YiyQpZYYDsZ%
z^D4Ktv^!-wu3XadKw!nXPt2N%2jtl{{G2HA;5D<eM#pcL>NA%Q%esBMxpmsNfVHc+
zd!GE5zAAW&x?kvA3%<pj_x^vq{dV2^&&SKo{`tP{_Wimy{cQqH9EvT-#G4uMTMUcd
V2NnOD2`o+-JYD@<);T3K0RT{sc98%8
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/repo.png b/resources/builtin/repo/repo.png
new file mode 100644
index 0000000000000000000000000000000000000000..6908849e07931697a67e7082d3a6cdf504568b00
GIT binary patch
literal 1950
zc%17D@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxVAm>ehPlzj!n_b*HibeurlFq0D
z#`ltvAirP+UXA$eA3yC))#m54-16T+Zq7<&wM%#PC2u`Fd_jmYuaQaWt$J+E#rqQS
z|D65=6x7XKb>!a5qtj>fZ~Xc7wfFB=zCjOJ+0F|aJQFo~C#H4w#bYiLM{64%D>rAo
zAKyhxW!h#=4b%;L^!H1laoUGq*<b0JF*hGv-Fm1iI?M2zD*L>(0?pHymvFOmOtN<u
zcUio~$M(RJS%L|EJ3Oa+e(&W!+oPW2WOb$o0|U!mPZ!6K3dT2gnm0Z5VraWqd+g1|
z+}qpwbEDtK?>TmF<*BDGwb#D0tPJ(J^!NHA|4AyIK$I1=z3%Wa->EsDr>(vHY00g9
z$>}SKW|x~jP1{=SzoM%8`_q)I{~cD;vGYGoD*fTnv2gM4;tjXzbdFs7C_FQIu8nBY
z%P%w6Y&<uQd*hamHP<4<oor&y+*tK8sAKu*@J&Z|Rq481S(vkN-F*(hQsd|~(bt_^
z?w%8S?boq#_syic+=iu^(QAGyE|W{?{;KdNmS5hsD(2ign_4lc>Up}?x<8cfT{Cst
zU3cf?^;t8&S^bI4Kh?eUYf;9V$cqvAr@KpE$m&FFNI2NU$}I+EXsfN6{N7&0ic_06
z`}Ohby|RB<w0U2Do<8A)_8OJ2U&@DoN=#Ao{JJJ1wDo}3;jCQi>v8v+`}{Xt+F-SN
zSM{sccR$L7@!Wrqh-^NT@#?kwj=1{|)_n&mZtLUezhb^8QzT64+Vj2(H+t7^_`}tV
zq~%&U2auh7-D#0FQ28-+HF<NBtL&%KQ_<WGVz3GEsvI(!@Zvomn$J=dE;=k~biwW%
zqX`*6X(gTghtLgV?qn0H4Qs>D(eyR?^3$WUG-a>7X}@&MG~8@W?|Sd(&ozk=f-D$n
zMcJ<%im48rbvwl1+M!25{-Lj;;xxrxzt|O3DrFy`6ISi7J9ED^s%KW0fMUaP!Vi9_
zoXFJ?CmWB{U-)o#YuDGE%70#mUDpcxB>3MmAI&ps<Zo|gSG8`^=y@D(@>KY?r{XqX
z3ZA@m?dpo$_sz#-%2)kL%Rm3Ux+(a7V!5<r_BlzGlQR`h={Yh#SJ`<XYx|$Gr=+bf
z$JZUy4BYna#+mvBHYfcuOx<%faq<6}y*K2_UAu^qfVrPkA}_3p@CjmB>vcqB>4jB3
zKA#w(rrHZPhd8YETAbwD5~jZDh|Kv_3qyU^&RCqs^JSOPvm5+pUv2Nu?3(Vpy<7XJ
zfcb*EkJt>I-w1r^RzJdGJ;|f}O7_W`{7D{@w@a&To?F}grSkv7#VPBKEmQSa{p8BC
zJrSoJv(p#cnYt+Fy`S#9?dNh=&xo*P`+xA^>bK>7EVC-&rj*XP@aWthLsN;X=R`U;
z`OWY>{Ic(-ME6Dr+T~{$b|Yfr;=8*gv}4vp@NPIJ6yEbRht+12gtkSPKi7SmSG-+E
zBltgFo~83YqUUP!eXHMpk_@jo|H-VMR<3jGR@eTwFTa9RBwXKn+Ey&tw=MX8?slL`
zHuLH-t7OA#*Nzrk-FaHBdt*}j!$jZr_cuythcSn5o64X3^KSSzAmy3EShIGfg1tc)
ze-qCa!)dv_kCW@gl7DX5l(|X5J4O1?%lk(onmJbQ*Lt;4O?l71+kt(dD*Ou;z1(Kg
zm80V+(=@4Z6_d-A3k5=5o7U^QnZ(+%q$+bexB!9RCrPE8xgqSym!*LPFN3G6pUXO@
GgeCxPgOW7>
literal 0
Hc$@<O00001
diff --git a/resources/builtin/repo/servers.png b/resources/builtin/repo/servers.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b9f2c3d85b52dfe01e2b29216dfea90b14cc915
GIT binary patch
literal 1800
zc%17D@N?(olHy`uVBq!ia0y~yVAKI&4rZW;-{LxV1_maU0G|+7AUC_XcNC3eRHvLV
z3z!bplmz(&Graoo?f=Ikt)&I+Cx1;h<L0%P`}=~G<MnL<`%e^=lqYT7$;`U9D)ZW%
zY8&6WMH`&Cgm2HB(AZqlRXeF|-6MJR#MJZm3mdwb{yMxrb>`f`C!a0fdIiZT_uQN6
z!r}4r)};lj*k5+eb`um?e9`X4dcHmTHnaUPw4J!{Y+rrv<bD(L8JeaQX~(j5En(a=
zf35L9`<A=2=7b7KT$!?kh4WB4&yM5YjVh1kC(K)OSpRf~o%$sP1{QWt7srqa#<zEy
z%Zz;_TpwOev%9@57m9YBxbI<Q?3td*`u5Fpp)$ce+UiUUI6zmNXQqnRl)WvTE>1UB
zCn*KCMjTNR+t}f%lO)&;WQI*#8MU^mSL$l^HKj1Mt*@`FUB3TH{)G*K8!u(vaq*mG
zraUeFbCuV{MX7R0TeI#i%RRU?JD;ia#R?;<(sQ+I^t9MweP`r-O<8&0_W8!D6%t#_
z601%v3_q9rHOw$0x#`Qq;P@m<lc~Y>NjIauPQTpHcw`gLq~i)nk!+`vIX3DzKQ-)$
zn5OsXg`>{tg32C+X{k$W+yqZwa+h1&nJQ@<=J$A&z-hBMKVhDYIl|T_7ye%ob3AKx
zQo!MsnL6#7YS%X|^SaFCchz^sOWV|$7d4)5OglHrcKL&6=ZqVl>2HWqt>C|x{!nRY
z#2kYopQN|C{Eyt#6C6=>I(*HWCH8BgV$*vR!_=~`t;@bsarb~*%#y?4FcI6RB@YRm
zX`OAGw%0kUT;qm>=F|hnGBm31n!7IAz3KW1mqmi?-0Q4S!}F-=@^jC!uA1>jxv%Nj
zmUDO6{+#%|%@LVz?<`gMTPA!u|9sq1i4FSv8>RTyZrl0b)*JIiKA&Jo_V2Sjrrq2%
z%Rrd_)TULDDzod?`c80ee_GHYX+3>$k(HZHJ6lnflTP&M%%WBGb0VgRev<IiIn7x)
zM`hYm72~p}*Jn%a{$zc0e&Wx$(~e6fMOvL$8>gKVnKggvWlLwB+i8|_)A{c${L&<&
zH!J4&t|dtYH(PcZ`A+i_E|$wKo1PfV_3o9a@QYoib`?(EKD9PaHl(X+JMYFltL_C(
zVmr>e@zRdnKjYm0rY2urJm-+nt@1^;{{Fst?#$B@r+&^uNl}lKOC05Lx{ffX=09HL
zks|^LIDzS%%*uv=H;peo*mYR52SvxK9ev*`Eix_~e%;$S_2S~A)nBLQ_OBP#UOV^i
zl$5VgNk6~VE)wy#ey(_JvvBi#@jFvisa@!vuJ!n8w(v=#+tR{mceNw$txG+2F7=nJ
z<(s5q=brAIvrhQ*!sT<y1W#Yvw0O?9bBfcRS{j#~x$(68*gE!&I(w)7eI{>Qwzo4i
z@tEEL>z!Zg{dMkVY=62)aoXBtbHWUgpMOZ4BVz{)s9zz9`!gSG&bi$8+~(SE{k5yb
z?_3vGyI>fZ_j%i<^V>7MHh$c#IPH4>e6ON!(-p&{mImvuyA=QHy6nzl0@}@goo`?H
zacS8t{=PL2p}w8U5AnBlqSC~GZ(d%?fl9ctE<?xF_iryhJosO(cpr%C>FVdQ&MBb@
E05<|fzyJUM
literal 0
Hc$@<O00001
diff --git a/resources/sql/autopatches/20170612.repository.image.01.sql b/resources/sql/autopatches/20170612.repository.image.01.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20170612.repository.image.01.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_repository.repository
+ ADD profileImagePHID VARBINARY(64);
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -850,6 +850,7 @@
'DiffusionRepositoryManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryManagementPanel.php',
'DiffusionRepositoryPath' => 'applications/diffusion/data/DiffusionRepositoryPath.php',
'DiffusionRepositoryPoliciesManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryPoliciesManagementPanel.php',
+ 'DiffusionRepositoryProfilePictureController' => 'applications/diffusion/controller/DiffusionRepositoryProfilePictureController.php',
'DiffusionRepositoryRef' => 'applications/diffusion/data/DiffusionRepositoryRef.php',
'DiffusionRepositoryRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRepositoryRemarkupRule.php',
'DiffusionRepositorySearchConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRepositorySearchConduitAPIMethod.php',
@@ -5820,6 +5821,7 @@
'DiffusionRepositoryManagementPanel' => 'Phobject',
'DiffusionRepositoryPath' => 'Phobject',
'DiffusionRepositoryPoliciesManagementPanel' => 'DiffusionRepositoryManagementPanel',
+ 'DiffusionRepositoryProfilePictureController' => 'DiffusionController',
'DiffusionRepositoryRef' => 'Phobject',
'DiffusionRepositoryRemarkupRule' => 'PhabricatorObjectRemarkupRule',
'DiffusionRepositorySearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
diff --git a/src/applications/diffusion/application/PhabricatorDiffusionApplication.php b/src/applications/diffusion/application/PhabricatorDiffusionApplication.php
--- a/src/applications/diffusion/application/PhabricatorDiffusionApplication.php
+++ b/src/applications/diffusion/application/PhabricatorDiffusionApplication.php
@@ -140,6 +140,8 @@
$this->getEditRoutePattern('edit/') =>
'DiffusionCommitEditController',
),
+ 'picture/(?P<id>[0-9]\d*)/'
+ => 'DiffusionRepositoryProfilePictureController',
),
);
}
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryController.php b/src/applications/diffusion/controller/DiffusionRepositoryController.php
--- a/src/applications/diffusion/controller/DiffusionRepositoryController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryController.php
@@ -274,7 +274,9 @@
->setHeader($repository->getName())
->setUser($viewer)
->setPolicyObject($repository)
- ->setHeaderIcon('fa-code');
+ ->setProfileHeader(true)
+ ->setImage($repository->getProfileImageURI())
+ ->setImageEditURL('/diffusion/picture/'.$repository->getID().'/');
if (!$repository->isTracked()) {
$header->setStatus('fa-ban', 'dark', pht('Inactive'));
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryProfilePictureController.php b/src/applications/diffusion/controller/DiffusionRepositoryProfilePictureController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/controller/DiffusionRepositoryProfilePictureController.php
@@ -0,0 +1,244 @@
+<?php
+
+final class DiffusionRepositoryProfilePictureController
+ extends DiffusionController {
+
+ public function handleRequest(AphrontRequest $request) {
+ $viewer = $this->getViewer();
+ $id = $request->getURIData('id');
+
+ $repository = id(new PhabricatorRepositoryQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($id))
+ ->needProfileImage(true)
+ ->needURIs(true)
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->executeOne();
+
+ if (!$repository) {
+ return new Aphront404Response();
+ }
+
+ $supported_formats = PhabricatorFile::getTransformableImageFormats();
+ $e_file = true;
+ $errors = array();
+ $done_uri = $repository->getURI();
+
+ if ($request->isFormPost()) {
+ $phid = $request->getStr('phid');
+ $is_default = false;
+ if ($phid == PhabricatorPHIDConstants::PHID_VOID) {
+ $phid = null;
+ $is_default = true;
+ } else if ($phid) {
+ $file = id(new PhabricatorFileQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($phid))
+ ->executeOne();
+ } else {
+ if ($request->getFileExists('picture')) {
+ $file = PhabricatorFile::newFromPHPUpload(
+ $_FILES['picture'],
+ array(
+ 'authorPHID' => $viewer->getPHID(),
+ 'canCDN' => true,
+ ));
+ } else {
+ $e_file = pht('Required');
+ $errors[] = pht(
+ 'You must choose a file when uploading a new profile picture.');
+ }
+ }
+
+ if (!$errors && !$is_default) {
+ if (!$file->isTransformableImage()) {
+ $e_file = pht('Not Supported');
+ $errors[] = pht(
+ 'This server only supports these image formats: %s.',
+ implode(', ', $supported_formats));
+ } else {
+ $xform = PhabricatorFileTransform::getTransformByKey(
+ PhabricatorFileThumbnailTransform::TRANSFORM_PROFILE);
+ $xformed = $xform->executeTransform($file);
+ }
+ }
+
+ if (!$errors) {
+ if ($is_default) {
+ $repository->setProfileImagePHID(null);
+ } else {
+ $repository->setProfileImagePHID($xformed->getPHID());
+ $xformed->attachToObject($repository->getPHID());
+ }
+ $repository->save();
+ return id(new AphrontRedirectResponse())->setURI($done_uri);
+ }
+ }
+
+ $title = pht('Edit Picture');
+
+ $form = id(new PHUIFormLayoutView())
+ ->setUser($viewer);
+
+ $default_image = PhabricatorFile::loadBuiltin(
+ $viewer, 'repo/code.png');
+
+ $images = array();
+
+ $current = $repository->getProfileImagePHID();
+ $has_current = false;
+ if ($current) {
+ $files = id(new PhabricatorFileQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($current))
+ ->execute();
+ if ($files) {
+ $file = head($files);
+ if ($file->isTransformableImage()) {
+ $has_current = true;
+ $images[$current] = array(
+ 'uri' => $file->getBestURI(),
+ 'tip' => pht('Current Picture'),
+ );
+ }
+ }
+ }
+
+ $builtins = array(
+ 'repo/commit.png',
+ 'repo/database.png',
+ 'repo/desktop.png',
+ 'repo/gears.png',
+ 'repo/globe.png',
+ 'repo/locked.png',
+ 'repo/microchip.png',
+ 'repo/mobile.png',
+ 'repo/repo.png',
+ 'repo/servers.png',
+ );
+ foreach ($builtins as $builtin) {
+ $file = PhabricatorFile::loadBuiltin($viewer, $builtin);
+ $images[$file->getPHID()] = array(
+ 'uri' => $file->getBestURI(),
+ 'tip' => pht('Builtin Image'),
+ );
+ }
+
+ $images[PhabricatorPHIDConstants::PHID_VOID] = array(
+ 'uri' => $default_image->getBestURI(),
+ 'tip' => pht('Default Picture'),
+ );
+
+ require_celerity_resource('people-profile-css');
+ Javelin::initBehavior('phabricator-tooltips', array());
+
+ $buttons = array();
+ foreach ($images as $phid => $spec) {
+ $style = null;
+ if (isset($spec['style'])) {
+ $style = $spec['style'];
+ }
+ $button = javelin_tag(
+ 'button',
+ array(
+ 'class' => 'button-grey profile-image-button',
+ 'sigil' => 'has-tooltip',
+ 'meta' => array(
+ 'tip' => $spec['tip'],
+ 'size' => 300,
+ ),
+ ),
+ phutil_tag(
+ 'img',
+ array(
+ 'height' => 50,
+ 'width' => 50,
+ 'src' => $spec['uri'],
+ )));
+
+ $button = array(
+ phutil_tag(
+ 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'phid',
+ 'value' => $phid,
+ )),
+ $button,
+ );
+
+ $button = phabricator_form(
+ $viewer,
+ array(
+ 'class' => 'profile-image-form',
+ 'method' => 'POST',
+ ),
+ $button);
+
+ $buttons[] = $button;
+ }
+
+ if ($has_current) {
+ $form->appendChild(
+ id(new AphrontFormMarkupControl())
+ ->setLabel(pht('Current Picture'))
+ ->setValue(array_shift($buttons)));
+ }
+
+ $form->appendChild(
+ id(new AphrontFormMarkupControl())
+ ->setLabel(pht('Use Picture'))
+ ->setValue($buttons));
+
+ $form_box = id(new PHUIObjectBoxView())
+ ->setHeaderText($title)
+ ->setFormErrors($errors)
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
+ ->setForm($form);
+
+ $upload_form = id(new AphrontFormView())
+ ->setUser($viewer)
+ ->setEncType('multipart/form-data')
+ ->appendChild(
+ id(new AphrontFormFileControl())
+ ->setName('picture')
+ ->setLabel(pht('Upload Picture'))
+ ->setError($e_file)
+ ->setCaption(
+ pht('Supported formats: %s', implode(', ', $supported_formats))))
+ ->appendChild(
+ id(new AphrontFormSubmitControl())
+ ->addCancelButton($done_uri)
+ ->setValue(pht('Upload Picture')));
+
+ $header = id(new PHUIHeaderView())
+ ->setHeader(pht('Edit Repository Picture'))
+ ->setHeaderIcon('fa-camera-retro');
+
+ $crumbs = $this->buildApplicationCrumbs();
+ $crumbs->addTextCrumb($repository->getName(), $repository->getURI());
+ $crumbs->addTextCrumb(pht('Edit Picture'));
+ $crumbs->setBorder(true);
+
+ $upload_box = id(new PHUIObjectBoxView())
+ ->setHeaderText(pht('Upload New Picture'))
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
+ ->setForm($upload_form);
+
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->setFooter(array(
+ $form_box,
+ $upload_box,
+ ));
+
+ return $this->newPage()
+ ->setTitle($title)
+ ->setCrumbs($crumbs)
+ ->appendChild($view);
+ }
+}
diff --git a/src/applications/diffusion/request/DiffusionRequest.php b/src/applications/diffusion/request/DiffusionRequest.php
--- a/src/applications/diffusion/request/DiffusionRequest.php
+++ b/src/applications/diffusion/request/DiffusionRequest.php
@@ -143,6 +143,7 @@
$query = id(new PhabricatorRepositoryQuery())
->setViewer($viewer)
->withIdentifiers(array($identifier))
+ ->needProfileImage(true)
->needURIs(true);
if ($need_edit) {
diff --git a/src/applications/repository/query/PhabricatorRepositoryQuery.php b/src/applications/repository/query/PhabricatorRepositoryQuery.php
--- a/src/applications/repository/query/PhabricatorRepositoryQuery.php
+++ b/src/applications/repository/query/PhabricatorRepositoryQuery.php
@@ -36,6 +36,7 @@
private $needCommitCounts;
private $needProjectPHIDs;
private $needURIs;
+ private $needProfileImage;
public function withIDs(array $ids) {
$this->ids = $ids;
@@ -160,6 +161,11 @@
return $this;
}
+ public function needProfileImage($need) {
+ $this->needProfileImage = $need;
+ return $this;
+ }
+
public function getBuiltinOrders() {
return array(
'committed' => array(
@@ -374,6 +380,36 @@
}
}
+ if ($this->needProfileImage) {
+ $default = null;
+
+ $file_phids = mpull($repositories, 'getProfileImagePHID');
+ $file_phids = array_filter($file_phids);
+ if ($file_phids) {
+ $files = id(new PhabricatorFileQuery())
+ ->setParentQuery($this)
+ ->setViewer($this->getViewer())
+ ->withPHIDs($file_phids)
+ ->execute();
+ $files = mpull($files, null, 'getPHID');
+ } else {
+ $files = array();
+ }
+
+ foreach ($repositories as $repository) {
+ $file = idx($files, $repository->getProfileImagePHID());
+ if (!$file) {
+ if (!$default) {
+ $default = PhabricatorFile::loadBuiltin(
+ $this->getViewer(),
+ 'repository/repository1.png');
+ }
+ $file = $default;
+ }
+ $repository->attachProfileImageFile($file);
+ }
+ }
+
return $repositories;
}
diff --git a/src/applications/repository/query/PhabricatorRepositorySearchEngine.php b/src/applications/repository/query/PhabricatorRepositorySearchEngine.php
--- a/src/applications/repository/query/PhabricatorRepositorySearchEngine.php
+++ b/src/applications/repository/query/PhabricatorRepositorySearchEngine.php
@@ -15,7 +15,8 @@
return id(new PhabricatorRepositoryQuery())
->needProjectPHIDs(true)
->needCommitCounts(true)
- ->needMostRecentCommits(true);
+ ->needMostRecentCommits(true)
+ ->needProfileImage(true);
}
protected function buildCustomSearchFields() {
@@ -165,7 +166,8 @@
->setObject($repository)
->setHeader($repository->getName())
->setObjectName($repository->getMonogram())
- ->setHref($repository->getURI());
+ ->setHref($repository->getURI())
+ ->setImageURI($repository->getProfileImageURI());
$commit = $repository->getMostRecentCommit();
if ($commit) {
diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php
--- a/src/applications/repository/storage/PhabricatorRepository.php
+++ b/src/applications/repository/storage/PhabricatorRepository.php
@@ -57,6 +57,7 @@
protected $viewPolicy;
protected $editPolicy;
protected $pushPolicy;
+ protected $profileImagePHID;
protected $versionControlSystem;
protected $details = array();
@@ -69,6 +70,7 @@
private $mostRecentCommit = self::ATTACHABLE;
private $projectPHIDs = self::ATTACHABLE;
private $uris = self::ATTACHABLE;
+ private $profileImageFile = self::ATTACHABLE;
public static function initializeNewRepository(PhabricatorUser $actor) {
@@ -110,6 +112,7 @@
'credentialPHID' => 'phid?',
'almanacServicePHID' => 'phid?',
'localPath' => 'text128?',
+ 'profileImagePHID' => 'phid?',
),
self::CONFIG_KEY_SCHEMA => array(
'callsign' => array(
@@ -478,6 +481,20 @@
}
}
+ public function getProfileImageURI() {
+ return $this->getProfileImageFile()->getBestURI();
+ }
+
+ public function attachProfileImageFile(PhabricatorFile $file) {
+ $this->profileImageFile = $file;
+ return $this;
+ }
+
+ public function getProfileImageFile() {
+ return $this->assertAttached($this->profileImageFile);
+ }
+
+
/* -( Remote Command Execution )------------------------------------------- */

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 15, 1:16 AM (3 w, 2 d ago)
Storage Engine
amazon-s3
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
phabricator/secure/5d/ju/okocn47vwftht5fo
Default Alt Text
D18116.id43578.diff (54 KB)

Event Timeline