From ccf45e7e3f330ee7b1ae6a0bfff66d17d7214868 Mon Sep 17 00:00:00 2001 From: Caesar Schinas <caesar@caesarschinas.com> Date: Sat, 17 Dec 2022 00:20:38 -1000 Subject: [PATCH 01/16] [BRANDING] add Forgejo logo (cherry picked from commit 04869eb95d7d21de6610d1873945437312d783ed) --- README.md | 2 +- assets/favicon.svg | 56 +++++++++++++++----------------- assets/logo.svg | 56 +++++++++++++++----------------- public/img/apple-touch-icon.png | Bin 3162 -> 2709 bytes public/img/avatar_default.png | Bin 4889 -> 3189 bytes public/img/favicon.png | Bin 4351 -> 2968 bytes public/img/favicon.svg | 2 +- public/img/forgejo.svg | 1 + public/img/gitea-original.svg | 1 + public/img/gitea.svg | 2 +- public/img/logo.png | Bin 14354 -> 6747 bytes public/img/logo.svg | 2 +- 12 files changed, 58 insertions(+), 64 deletions(-) create mode 100644 public/img/forgejo.svg create mode 100644 public/img/gitea-original.svg diff --git a/README.md b/README.md index d61bdd0ec9..fa21427674 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ <div align="center"> - <img src="https://codeberg.org/forgejo/meta/raw/branch/readme/logo/forgejo.svg" alt="" width="192" align="center" /> + <img src="./assets/logo.svg" alt="" width="192" align="center" /> <h1 align="center">Welcome to Forgejo</h1> </div> diff --git a/assets/favicon.svg b/assets/favicon.svg index 9df6b83b56..bcacdc0200 100644 --- a/assets/favicon.svg +++ b/assets/favicon.svg @@ -1,31 +1,27 @@ -<?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" - y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve"> -<g> - <path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8 - c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4 - c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/> - <g> - <g> - <path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2 - c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5 - c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5 - c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3 - c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1 - C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4 - c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7 - S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55 - c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8 - l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/> - <path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4 - c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1 - c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9 - c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3 - c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3 - c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29 - c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8 - C343.2,346.5,335,363.3,326.8,380.1z"/> - </g> - </g> -</g> +<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg"> + <style type="text/css"> + circle { + fill: none; + stroke: #000; + stroke-width: 15; + } + path { + fill: none; + stroke: #000; + stroke-width: 25; + } + .orange { + stroke:#ff6600; + } + .red { + stroke:#d40000; + } + </style> + <g transform="translate(6,6)"> + <path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" /> + <path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" /> + <circle cx="142" cy="20" r="18" class="orange" /> + <circle cx="142" cy="88" r="18" class="red" /> + <circle cx="58" cy="180" r="18" class="red" /> + </g> </svg> diff --git a/assets/logo.svg b/assets/logo.svg index 9df6b83b56..bcacdc0200 100644 --- a/assets/logo.svg +++ b/assets/logo.svg @@ -1,31 +1,27 @@ -<?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" - y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve"> -<g> - <path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8 - c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4 - c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/> - <g> - <g> - <path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2 - c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5 - c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5 - c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3 - c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1 - C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4 - c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7 - S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55 - c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8 - l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/> - <path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4 - c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1 - c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9 - c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3 - c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3 - c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29 - c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8 - C343.2,346.5,335,363.3,326.8,380.1z"/> - </g> - </g> -</g> +<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg"> + <style type="text/css"> + circle { + fill: none; + stroke: #000; + stroke-width: 15; + } + path { + fill: none; + stroke: #000; + stroke-width: 25; + } + .orange { + stroke:#ff6600; + } + .red { + stroke:#d40000; + } + </style> + <g transform="translate(6,6)"> + <path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" /> + <path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" /> + <circle cx="142" cy="20" r="18" class="orange" /> + <circle cx="142" cy="88" r="18" class="red" /> + <circle cx="58" cy="180" r="18" class="red" /> + </g> </svg> diff --git a/public/img/apple-touch-icon.png b/public/img/apple-touch-icon.png index 0c803d35dc34c01281a52c460cee9e65e29ad60f..1f6c1544f80bcd94adfa05ef4683537266de020c 100644 GIT binary patch delta 2702 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 IM6N<$f-tASLI3~& delta 3158 zcmV-c45{;#71|h(BYy(rP)t-s|NsC0|NsC0|LybU)8oUr(x9Qkf0es#j<#fqv|x<2 zVx7Qwq{V})$&Izon!nbk$lJ5f;lJ7E%i`?U>hk0C`0@V!{q_0r!`Q5sy>fA+K46(9 zXPz){qda-3NP@3ap22#i#)hxVlDN^H!PlzF-M7@^#NFx8<$vzm?DOUR|Nidu=jQL- z-s;lT<i*V1xy0G8z15|v$%~`Jft$Z~le%nyu2XucNot=oWSlI_-@5z!`N-U~k-2GS zoiA>pI(DZ-fUQx8vs{n2XP3Njpu&Br$cnJdl)u)f(c;12>(%P<;_vn9{Qdj={rvIv z>*ep<-|N)c=YPz`+Of6Jo3PB2s>q6&zI2qjZG*2?eXLG(r$cR_IJD20_WAO&&X;ea zI%%IXYoIlFs798%Z>YzJ&)~gvrb26=G-;nQVVNh`=E|kTgo?CZhq7CLtx@Um;JVYH zWt=Vj{`~p-_l~z^Vwx$R!F<~1&FApngs@k0r9i>gtAF6@)cgJVqr`&6+OTGwFWl+R z#@n)Ys6}F%DWb!G%ig$hr9aT&zJRV$^Y`z|-MFU4h2iYhcBe(n-@9y~Hqqh0n7wnH zzj(6FmVK*D?)2znn=7ctiF&F^*5$~QyKU0q!iKS0uFH_;@7}}Nt&O&0VVWrV{P@7v zsiDJubbqEnzSX99sYi*kUBub0tI3S>_wKFAkG#~Q+vv`TvtFLTd}f_4ZlXD8oiMM< zk&CrqvCWnE`t@U*DyPSX$=$Z!>eG?9Xo9a*^7rkUzIBDMS&z47w$PjC@Zfx_Oyus` znZ0v+s!O24ew@I0$=tQp<;Q5AG2`votjdn@_J8bqt4qApq;R7<x6z$!p*Q&Z_RinD z*yhQ{+p^;A*nh21@b&BK^5pdR@b>xh_xkj*&6SqCaOv^kail%@`}W=G(UQ4p!q}|N z;Jv%kqO{MM)#S#9vRv2Y$>i<Ykho}*xoexhc7?H6eymUL_34gKC+q+K00MMUPE)<y zsDGV<G5`PxB1uF+RCodG&I5BJKmdl}crUhX+qQA8lG^s~FNU?<?;Wl8p-`xwFAA0R z`2refpn(P&XrO@x8fc(_1{!Fffd(3ApuYqfXrO@x8fc(_rZbo<@`KGGTpnK_6p1BL znOyOa(MpwCqrEAe-e6=Cli6am*&R-oTYv6(HJZ}v^9O>VupknR#o39ZCY3g3ZbfHv z`Ly=I6^f;DrCO^un%0)RE$MW7^8TZ61NqPHuit+H!N0A4|Hta%6YR;U;i#a!vFV%9 zGqZErXE(nvTr3;e>^xbj*XzrX^H$DZxAD&AH9`oR%}$hut844pN42qe19}i1X@6g- zt@HP{wa;wlI@-0X)qZTWcJC^B|3LfU(ag)}!>CsK@zLZG`si5u8PKQH+GTVTSp&xL zbDni~>_OId8{8?yWd(P4Z3Am9Z}6Zk?(UM})_rkzcXxMpKJQ6tcP2NTJISOc{Juf$ ze{PbQE7Mqv?(`mCi)csH)aZym7=L6RS`*E`Q=>bRug6HUOG@-7<m)ohpCw0kjiy{= z_OjjHbA(iM?WAa1IeP2<c8{J;xV5JhdRY|RBPqH!_4;(|YeTa4LMpmnVsy3s)QXL( z0zt))iXM;{osU`rYeAz<NJS4yj2=vl!9$=mlvXHcQFI<pbR}w(%?O=JA%7KJ%M(3} zqS85`*DR!>hkK$&P&5+WMuk#z6?b$EipoJEM+imRo$lyQC>jlkF|<IOHPJ2Mjvh-v z`wWm67edh^JkjGR7zUZVAr#%s9c}AFK|9FQ2%+c(?&zEpO@K_*i45G^)<jQoM-QhU z5^|G6Cpy17dI|;EAvZO2qJO8kql;589da{5CwitkdKLw<Ay*<~qFwRs=sEhGGAl11 zkyAUi8NozzEs357cXV$G%0ezf6#dX=z7qh3$3<HgUEUM@0|g7<!$O)D{W+3UX<Lfy zzNo4N(ThFNgD42E2Dy4PFB4KNS=y59zN}Ng(X~C%2^8gm+)$eKuYV1qjQ?Lwu4usk z4fjNcQ8W~CVKnV0XuZ$nD;cQRcu%y`MZqfgu!1J7hSpCcqt|3%V8+7}jqbWNfZYFR zQU}Q|_z=!~tr>{UNztn*n79^l%}t+;X!W#{>%st3%a@)0`z<MYJw+QJw~^-j2(3*d zE5ai~yR!7x7fI2xD1RypxeP04Mh<8Vx08;)ku1+<`lU~`r0ALyMQ?%JR+`ZcT7^lD zg<#q?`e7TAqN|pos5#{N(S$}e2%LkOx=6=NXw)iC)0QSjV>LxtoRHe$qPia-_%R#Z zDnPIAc00{^GbMTlHNJyf5h^R1K^)OodX$8>N)22zA$Dy_^nXrjL=J(}uVy9)f?eV; zdD*?kVfy3kj>cYUjDgf{swz`WIu+jsslWFtXHOEM>rm?eq!v(74+sv5I~H;YBd8{i z5M6y8H4Yty%n_;?=!D>B;hK`K8l;XMql!`yLNwl?R{IH%s7W=)A+m|XSY}ZSWF{1& zf|3xUd)lcr;(rZzv(2N56Y<bEK+%Gskf}=rziFbei8}3f!rOYPI0>yu^!RhCiyr^( z_V-nMLmOSwMV(@w!Ak-aoH`ASC8bDaUV6}mofV_$7P~YCdRu607sP1!(fB)GLC4mf z#+pOxh%kMsGB=iP6>R>jj0)(Zo1LJSCLc#YYcUPA%zp@tucAl}Lb92K?IhV0I%jC? ztUem&DA9hA6Qc7pv`X>`yC4p1hwdboUxZdg8fsb9D;ghArp2mD5bULaLzkg(C6Z)b zh;p_dxeOXtBWdUzct^*VrIdZ!@h_3=8V%HgR#TG4Y|!|J<aKDAq_GW>Xk0o)Ult5& zR|Rf2?0-yCpX$&!-GpQb$sS5Kh@3ZRsMIZ4G;SYa8gAbC_S2qgb0|DLqZ`5OG4LMg z_aM4UV-+Bc#=&SBnaH$+=Y&S56C`^>XR3b2mmxcijr0+Xd&?P+ebBm}G*8vIbx8l& zEKXxBBYZ{Urxpyrx-X#-kwu)RitmMN5fE&qv42AF8I7><^j{%peL}LkQ?_h-0Kr2l z_&tqibSmJYpY+S^TkT2Chh$H$)MW@B(O4^|BwCQrpZ>`VL556|9VBl?$UcT~rl(;A zk#;mrugOY(Y(y$sA$m-O&J73Y>I%VXDyS)s7FC}+k)}<CV2-aPcpS-1+P8~>M$kt~ zvwy!GMUy_1?i-BJ{odsyA49O63hpaK18YC&X8Qa$MFtm>H1?j{UVxyIoyNk47(@$p z&e%nD;&mdz!6e5Z${3};MHZ%lHZYDBT)JPr7}dNDK{qD34$(OM4#N`{75u0cEr_YK ztn=oqG}Pjj<gpf4UkH{o(Y=jOfeNzQ)PJKzwj0Hp$36Y4g`K{|c^^EwmI({5#qMNg zi9o8E4%Lkm^U;E}ODZRXQ|?!BMA|Jpb)s;BaNRgYkG7_F>RYZ2EZX3y_GfRvr|V3V zRahSGbWp)CSP^~0K_Av_?FzX|E+!G)F@>nW-qn(5w4qP2&u1Dua5fgnZp2c-9e-F8 z{e_*rxytv1w>*-$&j(bIU{N&6GcB%X-q}}T_1lQ}avc@?0jr{)IG85;_P)M8z1gk` z|D)icWzpDABQM%PW9>G&wd#u`VH2rfI;@MH(1&KTtKQ!n+5f|wNVbnE5-f~H0V;U; zgAKmC5l#gqVP$l)6I5{_ZwAQ4QGbEsiKWrlKs9^ir$beitIr&*i^e7@YW!POc<Dt2 zr-oP^9hQ~K*>jxGdKFCt`CxT4{-L^o%i<yWnhGA-tdEY#K@(1VcN!@M*=cOuZdf0U z%8@jqNz*GxH02N#6hJVdG1^5_BEK1K1OD#lpn|>e!HLGVG^<bJQ&cjs5`TgeouMRy zr740Hjnfwx9NS`o7mZh07z`~YAc)cE8Aa=bCm^WN=&+oY`yN4##*g8&*fj(_8Y3;P zo`iIWMxIi%P(53^L?hu8t>StMNS|ngm8CTzizD5l5&r?LFg*;xj}}a8%s@q*j6wQF zqtlud3`EwpM*;O{t3+g)9ZyC7L_O`d7Eq72RLsvc{ZZNWUpsd!00000Ak5!7hweo% wg8cHJp`oFnp`oFnp`oFnp`oFnp`mBc0nY$c{Co{INdN!<07*qoM6N<$f`|@<WB>pF diff --git a/public/img/avatar_default.png b/public/img/avatar_default.png index 129967112d13ef602f6ec42f28b264c4666be2e0..f335e51dad13df7ceb19701a71f8efe192173286 100644 GIT binary patch literal 3189 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 I1NZ2E0VOn}g8%>k literal 4889 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 BTF?Lh diff --git a/public/img/favicon.png b/public/img/favicon.png index dcd4edb1a30bf93049fd24c31317e3344e08d95b..eda0347effabb1b681c3816cfd3580b82227c063 100644 GIT binary patch literal 2968 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 literal 4351 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 diff --git a/public/img/favicon.svg b/public/img/favicon.svg index afeeacb77c..804b05e284 100644 --- a/public/img/favicon.svg +++ b/public/img/favicon.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg> \ No newline at end of file diff --git a/public/img/forgejo.svg b/public/img/forgejo.svg new file mode 100644 index 0000000000..804b05e284 --- /dev/null +++ b/public/img/forgejo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg> \ No newline at end of file diff --git a/public/img/gitea-original.svg b/public/img/gitea-original.svg new file mode 100644 index 0000000000..dca9b4f4db --- /dev/null +++ b/public/img/gitea-original.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="32" height="32"><path d="M395.9 484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z" fill="#fff"/><g fill="#609926"><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></g></svg> \ No newline at end of file diff --git a/public/img/gitea.svg b/public/img/gitea.svg index dca9b4f4db..804b05e284 100644 --- a/public/img/gitea.svg +++ b/public/img/gitea.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="32" height="32"><path d="M395.9 484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z" fill="#fff"/><g fill="#609926"><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></g></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg> \ No newline at end of file diff --git a/public/img/logo.png b/public/img/logo.png index c7971f91835e889ed15a0e5252734400c5c65cae..1b2d9b4023427395448912e39a9883c279dc1618 100644 GIT binary patch literal 6747 zcmb_=XEa=G*!3Bsj6Q0#ks(6#HcE7cgs4%1Bzn|DGP;N`>JXhogkTW8MhOyK^g4QU zB8U=1j1uMbJl<qI-}n9f&brri_PzJM_I01LX3dWiuBUU8l8l86002r2bya-;AUKBv z00ew~Yt7;61OPCgr)8*i6Qy-#3!K>j|64D>IrD#!e+?IsJ#cou&dI<01-_^k(%+B^ zkM*C-zs?8$XZvH|?61e+k8~e61O5#9+xXw)bMo&=E(Tqw=k>zx|L<Izf9r+xckbWD zzr4ktL;el902j%B>qWvvzSEzhUa0>L!U4d@f7b9Hd=4(wg<A0M_P@>x{9n)i%luV` z{<NPn7ZWd}zlQTycaF~!M*jtUe~xj^obz)4FbM$N|B@HB3x51x^>4@pc@c8%KL;1< zJhKr1#{O(CY!^8fz2}At=YPp_<}ZKIa$b)ufN6RFuM2!31AfQ?qXfXI4e<2}aAXQh z(*g&Ez^_}tI1#Xh_$P3I9hhSQW-kHrY``+_KM%5v{D+^S0=|m?KW_rt%K!V44~&6d z+W)AVGQf%uuzU@efB;KZfJtg#@iH*S27Dn0B%<`+000PZ*Vi!sXs=uOhbQM&H1vEb zdl%+wilF3nNd3Hiwwz=R<H(%4WOqWWRd94*1bx1__=uDqz0DYpCkKgkUVC+VrCs2Q zlCZAav5M60_i1K=x4c8uOW;UVn<qgf1D7E!UQe;V(^lO>=KT8fZ;WbCG_lmq2*nU_ zs~TB2dWVGFzpZ=)EM)uQ{lwAP!AP-P=F&<5Tq0qLm*oj=l(F`-P`tB^z_?kYjymob zkA_f@&h+n6(6G#J!g>;~Z_$%fKFU=mlnQKg_tgGwjTKllHD`L0y{@Ma<M&MVZ0qbl zm;b-`#@X9{?wXOgB_HZK`VMfrW0RX<)$novU?kH}RW|enZOp8wupF`wZ+C>Y-*VYo zn7B%20wu(mZCHwMP(F*oS(dJxDn8mO6l?8mI!@j90*^R834yk78jVU+d6XQ58b@jO z36_jWR(FsuP&DATWMmF4PL0pj*FwE<K2AO-zB=hWGt@g`MwIS)LCw)1;m?|M-tq{o z;y}s_z#K}$&YZ1a^OdF!YR$=#<(G;RF$YAMb;}T0RR+)(nw}oz?x#YKZ0&);B;z^c zwVvOt@F=n|V)zJR=B79TuauX^uk7|&1=_tcHjK#k22=zqo+E~*34?DfpCHCnq=ID_ zZ4fE`q$&(O%E`isp?X2GNPaFx4#P6qcM{gaQ2ai(W?|70e51em)_UD0rmWh_rc&RA zu%+KsyK?LqL^fi`$qb6GO3D~5zYO1S8q!^V9;q}j!jp((!*i(!L^Mm4U0FEk{prx# z8v2=~CmWXeHs@n*;rRG#WJXkgy{fptYn%q8CnWc^)YrXI1wX1G&->7^uHP#6resAY zC$@!x8Sq0XTdZ`IjnctiTGnwna0VJ*601zq>Ip$lvD@6J4+=GLWXpYHW)0pe=C5~p z<t#5_2BY{bQF7m4<mx>ltH7r9(hdRHGY!Sl;+1=mK9NYKSGpatrhciLAh~wgc&w*5 zG<50C{j4JN%R(~UFV0xcIpoWdvw1;&PDZi940rNO)!Mxbt2;O51k(0%5?B~qq1j2& zFq`bR+L=ri0W8@W=}A#MCZf+1?#?cVR)wnw$FX;pxgO69TFYo^<2l?l(xl4c#rOx? zwY38cpfW{L<>ixDBVmbJv>j*t0NE!BrNROoCmdNu?|`n5$|sN$4y3K>CCpz+Dzo%E zPnm)xEZ-qkvW!5UIIoRMRkW+bX0lm@)<@NvmP{-pHx7@2Ja5nsq71WFyDMH9Zo2BG zMmYvgOEAZp(PM}AL?RxBdf%ORmFfITrId=%3%v90o6Te==`Yv!HR54Bs*9Dc#s}Af z+XUxbS}K&DnFgA#2=vEvge}>{N)ChTg-q@<#z3p3DpUPdjrtb#uZNwfUmo^*oMD{Y z22(!nXcBSmB&j#AsJR{HUt5wZXoM^kVw57@(QSyS%oSR#YFiZIIJLTZBjt#=KJ=Zu zR&@z{vw+lx!DJft*&-fC@61nwR;Z8>r{Emal)Z;h_<FP!sdf<h0Z(+)dppQ2Y)<>f z;B2}1>VoF&pr>JTzx?0Lz>?A^mgm_&mwNtoc-BGVFb*5JZO7$nW2i(wIcgB$9A?pb z*?_3o)S-&gEz^A)W<V(pa-b86y}Jcc^9m?13F7Xub8>wf+~ge4t?sN8amUGkIv`w= zkIOB3Q8FI~sCr{=U0+iX%^kVsM&2>Cj<wdWx-Q4_Gwtq7^G>{=p{{{q8vZ1@2s)Y( z&G*82d8bAlq25<Mj`~Q+x0WRvb2iC(Ig3i49Oa>EJClx|Pfr|+&hL?7d#s?DZPt#| zq&aR`|L!_tkekZ&R&cuG5*&Xxn{Laig8Hx|33KKku`kR{=n|jz361tl$7F3r4}F<N zRW>pA*r6UZdKJo79-vsMR(9St5%kz9^3pVkF*)B|Po`3;AW!VV$+0=R#3u6pqUv42 z4omhZ<pg6o9EvT614y!0`^(wdOBNiEmHO7Qh!Fj#3JQH=R3*z@`|bYC5SpnG&9NI( zD~R>8F>p{zi0cTW>|L<n&}x6Hv~KJe%S=dCtz)>M8_V*<yKMa)RAqtD-3&*TobcgW zJg5)mcjx=Tbl)%zsh8&;@$)7>ULad0L*V!XuS-vw2iUQ~23jA@!tQ4A0`{`+zBCv% z6Kn}Nh8P>5KAbZ38P%XAT7Dxe+z6@mLvn7l<yyXKlI+7vP-9Zq-@UnG(W>(F^#edV zaRd8?h1)WJNj-E~!@XIH7To)m%c@FEv9Ej^=;#q1luKQ|78I_FxVa^vO4;W&7FFI^ z1;f=mqJ$IdBl>uRyW7T9vsgSqVV=p{X~qsu4^J5Uxbf`{@gv;b{Kv@9Y_c2saIL;_ zdr3V{`5m}sT-4m6G3WN1Wog$eTF<ZHw0@_4$2#sfw$_!r*eMysJ@02s?dhMXwBuZ| zTwNWF6DL3Wj3+>I_U~sC>zU4$gfc~#7AsQEU;fOKY|ZxS^*)>2E>EW<%sc+zl4!b* z>0xD4rR-h*#BXzLc0Sa|-KSwUeY2TEUCUk<q+!+~^o$+qef*>%dBRbF+^Z8oC=_({ zfU%`{0Nv_%?Uvy%;ilfJgXs1>6{D7vY%3z+;2?5PbU}uI3$is+FL8BXFfRrKAt3>Y zvFB;J59UdnSLz|G3gH?p4`PjtjLr?QN=!ya7lg1I1TQRw4sKz^a4I%|@_I>~#WFqx z$=*ntz!|+a(%GUe5FSNBJ0Gl=sD~;t6pMJTVpEWTz}-OFVI^H|BAu{^xCmU>1pP~H zb}k6lH!QI?{OvT|BuQJiILmvYs&L=f8v@GCi$V86w|Ls%XPCv$QY<bYo&?zYa0opQ z83GG>K^G92B~|pow2Scd1`qy+lW4IJ<<|poR|awWuN_y|qUM@v*1Kv*!u+mQ$*DqI zveYRSKhr_>B=2~Q510vCPV@0T3#pQd__6Or+Li9y^FXYL$5t8D_1lvJbPUPX@!jXO zpt--ici6+vS6EQU$M2N(g(fd#&`a+aV<j@sZ}w?_qxfr3;2x!sg!wV%05^Oc3Uzoy z=JK#_p`9^IMG@?~m?fhB@SgbY!_qZCmE%+E2{G~7##)Y%{HuCY?PW&yL7B*}>k)ct zC=2=$JSNxa+Tf+Ek2Tan_*W_f2UJ?|t6R%>ii0KO{0CnKV&+J<-=TG=d|mmgbb*)z zUPkK&?pn*i{J%jI3;B+A8Tg|I{?bP2LCo!~BN>haKXwyT+6k;eSGo3*$eKJ9Oq2i% z3=K=r$kiEP0~H2eQsSh?SRLmo)axgV<%)7Io^b2b<F%TM6bzJrMpay&r$KdqRZSO$ z3^GrC?L+kSHRCy6`;b?i!DXv*n<BOFhpn2{m~AETP24Q`t_D!QS=qCQ(Bc6_>f#iT zwjwEnB9cn75>G7=q?Y0MwZJYeK+*Y5HHDi75J0gh`8p(@3;l|BQg|gGgA2`-T6Wnk z9?0aC;g}(%(*VMmQe6P<cmO}lOR|6<ogeJgvWJ(6f0VFD)^WTX1m;4|ww{>XOl-ON z38|c%P3svC$WXK2>)wkTG}#?43n3I4`^f*)J*{1qYV+JXipzj&woVedpWDWzCcjr& z4&d%fOAV&Qmny4KVkKohGG(-mC3n|X9lS2@dw~jd(s`*&LJI#>$f2F9#&U;xL79#x zMqfjbj2qPZwtE!k5|=|I*T0~^*O?(g+q9j3KUQt9KC-x|A6Gu&NUuZ?md0!)sv2)Q zG5O1sXPH<75Rcjui2lWwR>Y|m!T4T~7Tr-T+{t;}i|Oz!^-v~NUINg493hb0tFz=) z*8kxdnowlcBe0FG4&Zm<#MhCi1LR$Z2**oBU$ixcFjysm)ncmhy#AKVa%sWq6g^z% zM|+TnhYI9{b;|V>1YGDhIEn~o*qG7q3k4HS&`VfP*(#pfa>hH9G1xMMaDF`l<b+*> z6f@m4r$tNMq$_%*toGyuqiP(6P-HqWlSW8ITc^WFjlhHw2QAifi)UnOPEZGO_i^;Q zq<P<?=xbEf3AW!R=Zdmm3(^iLtu$$sEYZZZghtxE!lA|Lz$u0HBBr3Hx0ED?2Skyc zZJMb!+IS+YOxqL<rTiLF5Y#Jt1tixWQ*Z^L&0}b0<;NRCxSdxx?vOV8fe;!8uzQ>k zJKLNJDiPE?jlhfVap)1$JjdAmL>gt+5f^-V78ClB!ie=Jhx(TjR)i7Q(4!~U(r7^8 zrVTGOvF(*!VFA#p|FQTIuU=@7k-To!W@xg!7>8;fEV=j)YWN_CuR@CpJ>})_F+p#K zpqMEUIQ@o?K$z<ijA^H55%t9ar{D3K0w9S=`w(gk;LLr`HZib@*@OWy^rDAWiS*>G zi_*m10i7tI36PEZgI~5L^WBXXI{#5lm6kn-6lf*$4}M9>N#T7u{-gnXxCt3bwm}o3 zFjs8_U-(kxIO4du(8i|LVx<dRW9tq$dM@;eqe6BRCr^B3ktTt6YPN&ui(<A%uZyi2 z2x|NyuJZ2P0Aj>zFk}xZRzFFZ6zJPOCzW&f_U3*tpUy{lbm5comm#y#wP=4$!m$)F zL%O>z&w$dhrR?0J7VU+MAMjC+=5L@nHRF_Y&!@nX;TfUU8PN3e=#oTcPcOiDtBa^< z6f~U?w8o7|7BVl{E<N(aWVw1*l7i}x_U~-$@fId|A!=ss-JekRfPO`w^2x^9wvxss zed>Ga5~_K8Po*h$okE1OL)0MY6~P}=^MaFnFY8c{sY+EI_vT{Igd!ng&XXfxlQkvt z#FgEP*zydjw6xmAK;NE{F{5HyBZD?}OmI)R6tbS%r*Ayp0&FybilX|JBBUHjzoI;V z>Ma~q#tShAF`C>|D(`7n({5#RZ8zzv__X$KHnV_2aE*V&WK^V%Qepq~$?RuL=SQ$z zW4!(en5lbM+3`U5ykmW&*pFFK`fUbGr?Tn%=^K>m*9wd+Bl@6w>!#=)uy>kIn~de_ z#QG7z#E>5Fpd2KrKq%;Wx#-%c6lFCD3M12JhAz%=8~NVLQ6rCDAIZ03liYP5z5P1Q z480Ea4nKN#gRabCoojFPOEBTKz}}nvW|}W-9uCO>7y5O6-@8jxJ4NX>8QjJob>N9X ziZ^5b8;u;3u#Za!Kpoi6>j_|x=41Jahiw8}K=CECIH`0Ie#HE-?y;E?!QeBHy3c&w z=QYmJHe(Q}(k{Oe!;97m8KtZF(_(PY>MS`te9<)TQLd4Emf*o<(s_kF@75sepZBl3 zMIZLnSJN%7NcIxWs$*9Pq82EsJ%y$j+K^o6!s<Na90yaz2M_;ybN7R(Z&j_#KAiqF zf19@H-bjWY6ZadY`|@ABk2~AMKi!Oxz&B3a4#lVgK0E{=jC#pj=<$4Ikr%XAL3OH> zW14%^9H8lMa}%;8OCqg6*la<^cbL<s8EX^%56-g8szDPUio0N^QJxLYZ+h?g`7J8H zDT0ucQKgyG8Viu1;!4p^_aDehqbaxLM)u}`cBNfY;~?;AdP5kP)z$?_!9Il-HG_Hs zvM0qt!1Emee10Z5C?Lhs@q^|!U|H$sW{DXYiHHnk{GCEWDoZd|mn1K&iB_HEk-iLC z0##R`{vBv<-VyHN%my>z;Yt%A0pergdEg+XN!po+$`Z;}KS{>cBy!Dlv5G+&EvhHS zXgm*uHpSk_b8Z4fVooSm0ZHZCJdc||0s$Gh=F@1f34nb45kw+F8G31vfUQZIY0^BL z90jmiuIgQy2ke?+u|nsa0q|mdvvV`~Gx#7V5{<<XkAj&<TFWU5NJJok{=AZT>`mMd zKU1tPAU;dSw*e$7ZMPA811FIv*AjJ;l!dMy_mnFg0y#9PY`+s$Bq67h>2k8C5J-xd zE`&NoK86U>*U(7Nx(pBsZwhY!a`f*8I5Ky)5>JR=O>ukQ-8KL=B}1Je-E;#Is0dZl zTMilUm{-3L408T8695hyB~^kzEZF}KYiQOiTcX^<iY?t}Ib=O3^b%#IRS43Hs3Djz zcj$-E4zsUR$G5ebPkIlLn?7UxPyN9rm(ErhTb@2>Xgz#h+kuXL7T-oRkMfM7gn3p5 zN647l-LR+3adGkM>yrX?HzE=2<~CX+W-z2-TEoEGer7f`_hY9(wV9!C2W`oUeB{v_ zr&G09?^<NaaM<jv04rFWKZLcth6#n-<=kNU+FnLZn^0zZwYBcZ$Z}v?9zR+_oWfmu z89Pl!eWy?Cz0*xh*~6umaSRX5L!3$OlU=(L@Vxb?k$9UNZB)&CH~*M^F*eQ0DU~m* zL)xJ5mo=g2VdQ&;TSc5gUtr5)E6j@(ebZ}*%W#ESf}l^ohzAdzfJV|)-v+L0mGsE; zUrFlLA!4^IN$4`t=xx^f={(?iy22U^c9vR}OM04Y<*q%8i8I_EZKO!bx3hW>h?96q z0{#-7a`sEm`Z*Qx9cHt*vuuvU*@i=5gE8|<9OH`*cuPQDzx$JR?c(^AdE|pfy86UP zijCwUwsadMZE+;brHnF#GZ?+pg{sxCpSSEwsoy*f9k-SlirHkR=H#a+Rn3INIWE)< za4hnFp~?Y;J;<h>s5c6ev+{x2aV)%Q1K+#Bar=A|%CR$Txd>M86|JWtfil(GiHPpf z6ZnZwJ&fIfqpT4X70sSOhp@qQaoPKw%Gl2bES1WZt*BKlLUz#xVk6d${Vn7?(w=2U zs3~q?F!i?a55hsl7TaR2`j!KhBKWlI*ZdjC{>vSSq?<Koth&xOYY<-_ZqqK9GwT*3 z=h@f!q3~(5uldFt*af**-(Y@LUHS6&AK>I;a>23^?4N)Dg=J$n236c{@EfjY`J6}} zGX7A`gN}fC%y|CAtIG!h9B&5>ST;DP!(W|UrxR%)W`$HceG6V_dZk)NBk6SPDBmV) zRdT>aur)P7!eZ}B$^D3J#+YNU?SSPa2b9T=n2TdOc}Kz<9Il-8rZ~1{;DC=1+BqBH zV+-1NUr)v#>&<w`s`TQ!2UFl@D`mN|>%7M{1`Ml0oTpP|&SCB%^;Cy6@NVHv+jK>` zZ;3`>ONna3cKXma*4~02;RY}3?8r4bwZ!TeZ6UDA;4Qull|0Nsm5D4`PxR4N&Q<aZ z_q2u4)xZ&T`^6&VdeFOB(NFBg99|EX=M+!Vkw1hg_+2S#-S^T<ckS)Ko!LjGW^q#@ zH12yR&Mj5_^jg0CtH~SREI&_qSJvV&F|kt-4GZYP$dYboBvD7gOjUpX4{Bp-4(t&d znsF#>R4jqtjoF384&@wugC@&>*my;7v7&SOh@Oh(_3bE4U=6KyR2noqNw&BnHZZ{_ z_`58+5!#cDoxBR)+-PaYeZq9NIFaqq?%g-0?>#2&*gP0j2sWekumEFwMIUtwiM)3W z;o9K+AX4Td&N~sm%p6N@PFQBM^t|0e<vJznu}6-_=M&CMsmb=T{+c7&+dVGe&a1!O z!tOXF+)mXuQF|FLuC<o*Y>J&z+%HvmW_JmSV@kEv;(--&l68S{+zs6%q9T4iSz;bC zdtQwa?Rd?EbJnFo`898_kbe}ikpFzRq#!I}aiw!Wr}_R5V&OB1$kZtk5rZO^?{j)% zYfs!_e^#5@ClxI`n0$N)P1;(jFTG*pJ@kBIfg=Aq>5n6+nyj>hV%}pjm#?kO3d@Hv yox+U;9_d=qPhd|d8=p;?J#1|3xTc!uOU<fLvFJt?tMbpktcIG7YKe+v;Qs)Z$1?r^ literal 14354 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 diff --git a/public/img/logo.svg b/public/img/logo.svg index afeeacb77c..804b05e284 100644 --- a/public/img/logo.svg +++ b/public/img/logo.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg> \ No newline at end of file From 1224b202bf6c55c040dab8b6159d0e4148e22088 Mon Sep 17 00:00:00 2001 From: Gusted <gusted@noreply.codeberg.org> Date: Sun, 18 Dec 2022 19:03:34 +0000 Subject: [PATCH 02/16] [BRANDING] Rebrand systemd service (#137) - We can rebrand this quite safely, as only new installations would likely look into this file and configure the correct folders(to use forgejo instead of gitea). Co-authored-by: Gusted <postmaster@gusted.xyz> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/137 (cherry picked from commit 43e6d3cdf0d0ed74f0f0629e4684ee5314a819ac) --- .../{gitea.service => forgejo.service} | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) rename contrib/systemd/{gitea.service => forgejo.service} (59%) diff --git a/contrib/systemd/gitea.service b/contrib/systemd/forgejo.service similarity index 59% rename from contrib/systemd/gitea.service rename to contrib/systemd/forgejo.service index d205c6ee8b..04ef69adc0 100644 --- a/contrib/systemd/gitea.service +++ b/contrib/systemd/forgejo.service @@ -1,5 +1,5 @@ [Unit] -Description=Gitea (Git with a cup of tea) +Description=Forgejo (Beyond coding. We forge.) After=syslog.target After=network.target ### @@ -25,21 +25,21 @@ After=network.target # If using socket activation for main http/s ### # -#After=gitea.main.socket -#Requires=gitea.main.socket +#After=forgejo.main.socket +#Requires=forgejo.main.socket # ### -# (You can also provide gitea an http fallback and/or ssh socket too) +# (You can also provide forgejo an http fallback and/or ssh socket too) # -# An example of /etc/systemd/system/gitea.main.socket +# An example of /etc/systemd/system/forgejo.main.socket ### ## ## [Unit] -## Description=Gitea Web Socket -## PartOf=gitea.service +## Description=Forgejo Web Socket +## PartOf=forgejo.service ## ## [Socket] -## Service=gitea.service +## Service=forgejo.service ## ListenStream=<some_port> ## NoDelay=true ## @@ -55,28 +55,28 @@ RestartSec=2s Type=simple User=git Group=git -WorkingDirectory=/var/lib/gitea/ -# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file -# (manually creating /run/gitea doesn't work, because it would not persist across reboots) -#RuntimeDirectory=gitea -ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini +WorkingDirectory=/var/lib/forgejo/ +# If using Unix socket: tells systemd to create the /run/forgejo folder, which will contain the forgejo.sock file +# (manually creating /run/forgejo doesn't work, because it would not persist across reboots) +#RuntimeDirectory=forgejo +ExecStart=/usr/local/bin/forgejo web --config /etc/forgejo/app.ini Restart=always -Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea +Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/forgejo # If you install Git to directory prefix other than default PATH (which happens # for example if you install other versions of Git side-to-side with # distribution version), uncomment below line and add that prefix to PATH # Don't forget to place git-lfs binary on the PATH below if you want to enable # Git LFS support #Environment=PATH=/path/to/git/bin:/bin:/sbin:/usr/bin:/usr/sbin -# If you want to bind Gitea to a port below 1024, uncomment -# the two values below, or use socket activation to pass Gitea its ports as above +# If you want to bind Forgejo to a port below 1024, uncomment +# the two values below, or use socket activation to pass Forgejo its ports as above ### #CapabilityBoundingSet=CAP_NET_BIND_SERVICE #AmbientCapabilities=CAP_NET_BIND_SERVICE ### # In some cases, when using CapabilityBoundingSet and AmbientCapabilities option, you may want to -# set the following value to false to allow capabilities to be applied on gitea process. The following -# value if set to true sandboxes gitea service and prevent any processes from running with privileges +# set the following value to false to allow capabilities to be applied on Forgejo process. The following +# value if set to true sandboxes Forgejo service and prevent any processes from running with privileges # in the host user namespace. ### #PrivateUsers=false From 2baac9684e5a4691f4e62c9cdd19ade73eb2b6fe Mon Sep 17 00:00:00 2001 From: Caesar Schinas <caesar@caesarschinas.com> Date: Sun, 18 Dec 2022 23:03:28 -1000 Subject: [PATCH 03/16] [BRANDING] Rebrand footer "powered by" links (cherry picked from commit 02890c31f2eb0b08076bf2175040a0de0679b7a8) --- templates/base/footer_content.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/base/footer_content.tmpl b/templates/base/footer_content.tmpl index 89be609225..81505c43dc 100644 --- a/templates/base/footer_content.tmpl +++ b/templates/base/footer_content.tmpl @@ -1,7 +1,7 @@ <footer> <div class="ui container"> <div class="ui left"> - <a target="_blank" rel="noopener noreferrer" href="https://gitea.io">{{.locale.Tr "powered_by" "Gitea"}}</a> + <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org">{{.locale.Tr "powered_by" "Forgejo"}}</a> {{if (or .ShowFooterVersion .PageIsAdmin)}} {{.locale.Tr "version"}}: {{if .IsAdmin}} @@ -17,7 +17,7 @@ </div> <div class="ui right links"> {{if .ShowFooterBranding}} - <a target="_blank" rel="noopener noreferrer" href="https://github.com/go-gitea/gitea">{{svg "octicon-mark-github"}}<span class="sr-only">GitHub</span></a> + <a target="_blank" rel="noopener noreferrer" href="https://codeberg.org/forgejo/forgejo">{{svg "octicon-git-branch"}}<span class="sr-only">Codeberg</span></a> {{end}} <div class="ui language bottom floating slide up dropdown link item"> {{svg "octicon-globe"}} From 9bc830f1b453ad087e6f043604af07114599a89a Mon Sep 17 00:00:00 2001 From: Caesar Schinas <caesar@caesarschinas.com> Date: Mon, 19 Dec 2022 00:05:51 -1000 Subject: [PATCH 04/16] [BRANDING] Add `forgejo` emoji (cherry picked from commit 00603b03fe0daada4c4be6113870ce2b617f943f) --- modules/setting/setting.go | 4 ++-- public/img/emoji/forgejo.png | Bin 0 -> 3189 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 public/img/emoji/forgejo.png diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 8217d07722..d9be3147ce 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -290,8 +290,8 @@ var ( DefaultTheme: `auto`, Themes: []string{`auto`, `gitea`, `arc-green`}, Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`}, - CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`}, - CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:"}, + CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`}, + CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"}, Notification: struct { MinTimeout time.Duration TimeoutStep time.Duration diff --git a/public/img/emoji/forgejo.png b/public/img/emoji/forgejo.png new file mode 100644 index 0000000000000000000000000000000000000000..f335e51dad13df7ceb19701a71f8efe192173286 GIT binary patch literal 3189 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 I1NZ2E0VOn}g8%>k literal 0 HcmV?d00001 From 5f47458a28cae32861d3ad7878e09072b329b91a Mon Sep 17 00:00:00 2001 From: Caesar Schinas <caesar@noreply.codeberg.org> Date: Mon, 19 Dec 2022 20:01:46 +0000 Subject: [PATCH 05/16] [BRANDING] Rebrand default config settings for new installs (#140) Replaces `Gitea` with `Forgejo` in the default config settings for new installs. This will not affect existing installs. Co-authored-by: Caesar Schinas <caesar@caesarschinas.com> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/140 Co-authored-by: Caesar Schinas <caesar@noreply.codeberg.org> Co-committed-by: Caesar Schinas <caesar@noreply.codeberg.org> (cherry picked from commit bd7c0766239a98bbef5f61d986fb5e6c6da158cd) --- custom/conf/app.example.ini | 2 +- modules/setting/database.go | 2 +- modules/setting/repository.go | 2 +- modules/setting/setting.go | 2 +- routers/install/install.go | 2 +- web_src/js/features/install.js | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 3ca49cf730..244ae96e9c 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -331,7 +331,7 @@ USER = root ;; SQLite Configuration ;; ;DB_TYPE = sqlite3 -;PATH= ; defaults to data/gitea.db +;PATH= ; defaults to data/forgejo.db ;SQLITE_TIMEOUT = ; Query timeout defaults to: 500 ;SQLITE_JOURNAL_MODE = ; defaults to sqlite database default (often DELETE), can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode ;; diff --git a/modules/setting/database.go b/modules/setting/database.go index 4e55457395..d8d4d12d7a 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -90,7 +90,7 @@ func InitDBConfig() { log.Error("Deprecated database mysql charset utf8 support, please use utf8mb4 or convert utf8 to utf8mb4.") } - Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db")) + Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "forgejo.db")) Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500) Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("") diff --git a/modules/setting/repository.go b/modules/setting/repository.go index 0947cc00cf..b6aa89909a 100644 --- a/modules/setting/repository.go +++ b/modules/setting/repository.go @@ -276,7 +276,7 @@ func newRepository() { Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool() Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1) Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch) - RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "gitea-repositories")) + RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "forgejo-repositories")) forcePathSeparator(RepoRootPath) if !filepath.IsAbs(RepoRootPath) { RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index d9be3147ce..fff2452ce7 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -663,7 +663,7 @@ func loadFromConf(allowEmpty bool, extraConfig string) { forcePathSeparator(LogRootPath) sec := Cfg.Section("server") - AppName = Cfg.Section("").Key("APP_NAME").MustString("Gitea: Git with a cup of tea") + AppName = Cfg.Section("").Key("APP_NAME").MustString("Forgejo: Beyond coding. We Forge.") Domain = sec.Key("DOMAIN").MustString("localhost") HTTPAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0") diff --git a/routers/install/install.go b/routers/install/install.go index 25b272b854..d205102389 100644 --- a/routers/install/install.go +++ b/routers/install/install.go @@ -186,7 +186,7 @@ func checkDatabase(ctx *context.Context, form *forms.InstallForm) bool { if err = db.InitEngine(ctx); err != nil { if strings.Contains(err.Error(), `Unknown database type: sqlite3`) { ctx.Data["Err_DbType"] = true - ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "https://docs.gitea.io/en-us/install-from-binary/"), tplInstall, form) + ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "https://forgejo.org/download#installation-from-binary"), tplInstall, form) } else { ctx.Data["Err_DbSetting"] = true ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), tplInstall, form) diff --git a/web_src/js/features/install.js b/web_src/js/features/install.js index 9468ba9c42..51255fd99a 100644 --- a/web_src/js/features/install.js +++ b/web_src/js/features/install.js @@ -5,8 +5,8 @@ export function initInstall() { return; } - const defaultDbUser = 'gitea'; - const defaultDbName = 'gitea'; + const defaultDbUser = 'forgejo'; + const defaultDbName = 'forgejo'; const defaultDbHosts = { mysql: '127.0.0.1:3306', From 97b9024336282dc6dd14f04b3ecc39168d2bf60a Mon Sep 17 00:00:00 2001 From: Caesar Schinas <caesar@caesarschinas.com> Date: Sun, 25 Dec 2022 02:35:04 -1000 Subject: [PATCH 06/16] [BRANDING] Custom loading animation for Forgejo (cherry picked from commit 6372a5b1c1edef41562d796272cb8ff4829153b2) --- public/img/failed.png | Bin 11009 -> 0 bytes public/img/forgejo-loading.svg | 14 ++++++++++++++ public/img/loading.png | Bin 12629 -> 0 bytes templates/install.tmpl | 2 +- templates/post-install.tmpl | 2 +- templates/repo/migrate/migrating.tmpl | 4 ++-- 6 files changed, 18 insertions(+), 4 deletions(-) delete mode 100644 public/img/failed.png create mode 100644 public/img/forgejo-loading.svg delete mode 100644 public/img/loading.png diff --git a/public/img/failed.png b/public/img/failed.png deleted file mode 100644 index b37545f90ca3b304357516661efb9e1431fa96aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11009 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 diff --git a/public/img/forgejo-loading.svg b/public/img/forgejo-loading.svg new file mode 100644 index 0000000000..919552ebb5 --- /dev/null +++ b/public/img/forgejo-loading.svg @@ -0,0 +1,14 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212"> + <style> + @keyframes draw-orange{0%{stroke-dashoffset:200}25%{stroke-dashoffset:200;stroke-width:0}50%{stroke-dashoffset:0;stroke-width:25}to{stroke-dashoffset:0}}@keyframes draw-red{0%{stroke-dashoffset:130;stroke-width:0}25%{stroke-dashoffset:0;stroke-width:25}50%,to{stroke-dashoffset:0}}@keyframes red-circle{0%{opacity:0}20%{opacity:0;stroke-width:0}25%{opacity:1;stroke-width:15}to{opacity:1}}@keyframes orange-circle{0%{opacity:0}45%{opacity:0;stroke-width:0}50%{opacity:1;stroke-width:15}to{opacity:1}}@keyframes fade{0%,90%{opacity:1}to{opacity:0}}circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000} + </style> + <g transform="translate(6 6)"> + <g style="animation:fade 2000ms ease-in-out 5ms infinite"> + <path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange" style="stroke-dasharray:200;stroke-dashoffset:200;animation:draw-orange 2000ms ease-out 5ms infinite"/> + <path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red" style="stroke-dasharray:130;stroke-dashoffset:130;animation:draw-red 2000ms ease-out 5ms infinite"/> + <circle cx="142" cy="20" r="18" class="orange" style="opacity:0;animation:orange-circle 2000ms ease-out 5ms infinite"/> + <circle cx="142" cy="88" r="18" class="red" style="opacity:0;animation:red-circle 2000ms ease-out 5ms infinite"/> + </g> + <circle cx="58" cy="180" r="18" class="red"/> + </g> +</svg> diff --git a/public/img/loading.png b/public/img/loading.png deleted file mode 100644 index c5ba3d9cd79960a3990d5c61fa68c98c632a1a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12629 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 M1x@*SxepQl5Au-}zW@LL diff --git a/templates/install.tmpl b/templates/install.tmpl index 36f58218d4..8f577ed02f 100644 --- a/templates/install.tmpl +++ b/templates/install.tmpl @@ -339,5 +339,5 @@ </div> </div> </div> -<img style="display: none" src="{{AssetUrlPrefix}}/img/loading.png"/> +<img style="display: none" src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" /> {{template "base/footer" .}} diff --git a/templates/post-install.tmpl b/templates/post-install.tmpl index 4abfe171dd..134c8bcf37 100644 --- a/templates/post-install.tmpl +++ b/templates/post-install.tmpl @@ -7,7 +7,7 @@ <div class="ui stackable middle very relaxed page grid"> <div id="repo_migrating" class="sixteen wide center aligned centered column"> <div> - <img src="{{AssetUrlPrefix}}/img/loading.png"/> + <img src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" /> </div> </div> </div> diff --git a/templates/repo/migrate/migrating.tmpl b/templates/repo/migrate/migrating.tmpl index c06f4b5729..3c729b7750 100644 --- a/templates/repo/migrate/migrating.tmpl +++ b/templates/repo/migrate/migrating.tmpl @@ -9,12 +9,12 @@ <div class="ui stackable middle very relaxed page grid"> <div id="repo_migrating" class="sixteen wide center aligned centered column" task="{{.MigrateTask.ID}}"> <div> - <img src="{{AssetUrlPrefix}}/img/loading.png"/> + <img src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" /> </div> </div> <div id="repo_migrating_failed_image" class="sixteen wide center aligned centered column" style="display: none;"> <div> - <img src="{{AssetUrlPrefix}}/img/failed.png"/> + <span class="red">{{svg "octicon-git-pull-request-closed" 256 "ui red icon"}}</span> </div> </div> </div> From 1d6499c888e618759696fb57d154b9c22fc94742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dachary?= <loic@dachary.org> Date: Sun, 25 Dec 2022 16:25:25 +0100 Subject: [PATCH 07/16] [BRANDING] container images: set APP_NAME (cherry picked from commit 7f4e98d3ab173dcdac15f418a53ffe7123e20c46) --- docker/root/etc/s6/gitea/setup | 2 +- docker/rootless/usr/local/bin/docker-setup.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/root/etc/s6/gitea/setup b/docker/root/etc/s6/gitea/setup index d8f6a3b319..958d50a798 100755 --- a/docker/root/etc/s6/gitea/setup +++ b/docker/root/etc/s6/gitea/setup @@ -24,7 +24,7 @@ if [ ! -f ${GITEA_CUSTOM}/conf/app.ini ]; then fi # Substitute the environment variables in the template - APP_NAME=${APP_NAME:-"Gitea: Git with a cup of tea"} \ + APP_NAME=${APP_NAME:-"Forgejo: Beyond coding. We forge."} \ RUN_MODE=${RUN_MODE:-"prod"} \ DOMAIN=${DOMAIN:-"localhost"} \ SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \ diff --git a/docker/rootless/usr/local/bin/docker-setup.sh b/docker/rootless/usr/local/bin/docker-setup.sh index feab02a379..b480685863 100755 --- a/docker/rootless/usr/local/bin/docker-setup.sh +++ b/docker/rootless/usr/local/bin/docker-setup.sh @@ -26,7 +26,7 @@ if [ ! -f ${GITEA_APP_INI} ]; then fi # Substitute the environment variables in the template - APP_NAME=${APP_NAME:-"Gitea: Git with a cup of tea"} \ + APP_NAME=${APP_NAME:-"Forgejo: Beyond coding. We forge."} \ RUN_MODE=${RUN_MODE:-"prod"} \ RUN_USER=${USER:-"git"} \ SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \ From 2716d78a43b0c93f28a9849af0e95c49bbe62c47 Mon Sep 17 00:00:00 2001 From: Caesar Schinas <caesar@caesarschinas.com> Date: Sun, 25 Dec 2022 01:44:04 -1000 Subject: [PATCH 08/16] [BRANDING] Add Forgejo light, dark, and auto themes (cherry picked from commit 009bb07ad80a328bc9a1b50a949fbb4f14d5e6a9) --- modules/setting/setting.go | 4 +- web_src/less/_home.less | 4 +- web_src/less/themes/theme-forgejo-auto.less | 5 + web_src/less/themes/theme-forgejo-dark.less | 294 +++++++++++++++++++ web_src/less/themes/theme-forgejo-light.less | 277 +++++++++++++++++ 5 files changed, 580 insertions(+), 4 deletions(-) create mode 100644 web_src/less/themes/theme-forgejo-auto.less create mode 100644 web_src/less/themes/theme-forgejo-dark.less create mode 100644 web_src/less/themes/theme-forgejo-light.less diff --git a/modules/setting/setting.go b/modules/setting/setting.go index fff2452ce7..6d82d20d6a 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -287,8 +287,8 @@ var ( ReactionMaxUserNum: 10, ThemeColorMetaTag: `#6cc644`, MaxDisplayFileSize: 8388608, - DefaultTheme: `auto`, - Themes: []string{`auto`, `gitea`, `arc-green`}, + DefaultTheme: `forgejo-auto`, + Themes: []string{`forgejo-auto`, `forgejo-light`, `forgejo-dark`, `auto`, `gitea`, `arc-green`}, Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`}, CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`}, CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"}, diff --git a/web_src/less/_home.less b/web_src/less/_home.less index fb31bedfa9..fb6b2d2a35 100644 --- a/web_src/less/_home.less +++ b/web_src/less/_home.less @@ -25,7 +25,7 @@ } .svg { - color: var(--color-green); + color: var(--color-primary); height: 40px; width: 50px; vertical-align: bottom; @@ -45,7 +45,7 @@ } a { - color: var(--color-green); + color: var(--color-primary); } } diff --git a/web_src/less/themes/theme-forgejo-auto.less b/web_src/less/themes/theme-forgejo-auto.less new file mode 100644 index 0000000000..903b4eae8e --- /dev/null +++ b/web_src/less/themes/theme-forgejo-auto.less @@ -0,0 +1,5 @@ +@import "theme-forgejo-light.less"; + +@media (prefers-color-scheme: dark) { + @import "theme-forgejo-dark.less"; +} diff --git a/web_src/less/themes/theme-forgejo-dark.less b/web_src/less/themes/theme-forgejo-dark.less new file mode 100644 index 0000000000..8a03fda40b --- /dev/null +++ b/web_src/less/themes/theme-forgejo-dark.less @@ -0,0 +1,294 @@ +@import "../chroma/dark.less"; +@import "../codemirror/dark.less"; + +:root { + --steel-900: #10161D; + --steel-850: #131A21; + --steel-800: #171E26; + --steel-750: #1D262F; + --steel-700: #242D38; + --steel-650: #2B3642; + --steel-600: #374351; + --steel-550: #445161; + --steel-500: #515F70; + --steel-450: #5F6E80; + --steel-400: #6D7D8F; + --steel-350: #7C8C9F; + --steel-300: #8C9CAF; + --steel-250: #9DADC0; + --steel-200: #AEBED0; + --steel-150: #C0CFE0; + --steel-100: #D2E0F0; + + --is-dark-theme: true; + --color-primary: #fb923c; + --color-primary-contrast: #000; + --color-primary-dark-1: #fdba74; + --color-primary-dark-2: #fdba74; + --color-primary-dark-3: #fed7aa; + --color-primary-dark-4: #fed7aa; + --color-primary-dark-5: #ffedd5; + --color-primary-dark-6: #ffedd5; + --color-primary-dark-7: #fff7ed; + --color-primary-light-1: #f97316; + --color-primary-light-2: #ea580c; + --color-primary-light-3: #c2410c; + --color-primary-light-4: #9a3412; + --color-primary-light-5: #9a3412; + --color-primary-light-6: #7c2d12; + --color-primary-light-7: #7c2d12; + --color-primary-alpha-10: #ea580c19; + --color-primary-alpha-20: #ea580c33; + --color-primary-alpha-30: #ea580c4b; + --color-primary-alpha-40: #ea580c66; + --color-primary-alpha-50: #ea580c80; + --color-primary-alpha-60: #ea580c99; + --color-primary-alpha-70: #ea580cb3; + --color-primary-alpha-80: #ea580ccc; + --color-primary-alpha-90: #ea580ce1; + --color-secondary: var(--steel-700); + --color-secondary-dark-1: var(--steel-550); + --color-secondary-dark-2: var(--steel-500); + --color-secondary-dark-3: var(--steel-450); + --color-secondary-dark-4: var(--steel-400); + --color-secondary-dark-5: var(--steel-350); + --color-secondary-dark-6: var(--steel-300); + --color-secondary-dark-7: var(--steel-250); + --color-secondary-dark-8: var(--steel-200); + --color-secondary-dark-9: var(--steel-150); + --color-secondary-dark-10: var(--steel-100); + --color-secondary-dark-11: var(--steel-100); + --color-secondary-dark-12: var(--steel-100); + --color-secondary-dark-13: var(--steel-100); + --color-secondary-light-1: var(--steel-650); + --color-secondary-light-2: var(--steel-700); + --color-secondary-light-3: var(--steel-750); + --color-secondary-light-4: var(--steel-800); + --color-secondary-alpha-10: #2B364219; + --color-secondary-alpha-20: #2B364233; + --color-secondary-alpha-30: #2B36424b; + --color-secondary-alpha-40: #2B364266; + --color-secondary-alpha-50: #2B364280; + --color-secondary-alpha-60: #2B364299; + --color-secondary-alpha-70: #2B3642b3; + --color-secondary-alpha-80: #2B3642cc; + --color-secondary-alpha-90: #2B3642e1; + + /* colors */ + --color-red: #b91c1c; + --color-orange: #ea580c; + --color-yellow: #ca8a04; + --color-olive: #91a313; + --color-green: #15803d; + --color-teal: #0d9488; + --color-blue: #2563eb; + --color-violet: #7c3aed; + --color-purple: #9333ea; + --color-pink: #db2777; + --color-brown: #a47252; + --color-grey: var(--steel-500); + --color-black: #111827; + + /* light variants */ + --color-red-light: #dc2626; + --color-orange-light: #f97316; + --color-yellow-light: #eab308; + --color-olive-light: #839311; + --color-green-light: #16a34a; + --color-teal-light: #14b8a6; + --color-blue-light: #3b82f6; + --color-violet-light: #8b5cf6; + --color-purple-light: #a855f7; + --color-pink-light: #ec4899; + --color-brown-light: #94674a; + --color-grey-light: var(--steel-300); + --color-black-light: #1f2937; + + /* other colors */ + --color-gold: #b1983b; + --color-white: #ffffff; + --color-diff-removed-word-bg: #783030; + --color-diff-added-word-bg: #255C39; + --color-diff-removed-row-bg: #432121; + --color-diff-moved-row-bg: #825718; + --color-diff-added-row-bg: #1B3625; + --color-diff-removed-row-border: #783030; + --color-diff-moved-row-border: #A67A1D; + --color-diff-added-row-border: #255C39; + --color-diff-inactive: var(--steel-650); + --color-error-border: #783030; + --color-error-bg: #5F2525; + --color-error-bg-active: #783030; + --color-error-bg-hover: #783030; + --color-error-text: #fef2f2; + --color-success-border: #1F6E3C; + --color-success-bg: #1D462C; + --color-success-text: #f0fdf4; + --color-warning-border: #A67A1D; + --color-warning-bg: #644821; + --color-warning-text: #fefce8; + --color-info-border: #2E50B0; + --color-info-bg: #2A396B; + --color-info-text: var(--steel-100); + --color-red-badge: #B91C1C; + --color-red-badge-bg: #B91C1C22; + --color-red-badge-hover-bg: #B91C1C44; + --color-green-badge: #16a34a; + --color-green-badge-bg: #16a34a22; + --color-green-badge-hover-bg: #16a34a44; + --color-yellow-badge: #ca8a04; + --color-yellow-badge-bg: #ca8a0422; + --color-yellow-badge-hover-bg: #ca8a0444; + --color-orange-badge: #ea580c; + --color-orange-badge-bg: #ea580c22; + --color-orange-badge-hover-bg: #ea580c44; + --color-git: #f05133; + + /* target-based colors */ + --color-body: var(--steel-800); + --color-box-header: var(--steel-700); + --color-box-body: var(--steel-750); + --color-box-body-highlight: var(--steel-650); + --color-text-dark: #fff; + --color-text: var(--steel-100); + --color-text-light: var(--steel-150); + --color-text-light-1: var(--steel-150); + --color-text-light-2: var(--steel-200); + --color-text-light-3: var(--steel-200); + --color-footer: var(--steel-900); + --color-timeline: var(--steel-650); + --color-input-text: var(--steel-100); + --color-input-background: var(--steel-650); + --color-input-toggle-background: var(--steel-650); + --color-input-border: var(--steel-550); + --color-input-border-hover: var(--steel-450); + --color-navbar: var(--steel-850); + --color-navbar-transparent: #242D3800; + --color-light: #00000028; + --color-light-mimic-enabled: rgba(0, 0, 0, calc(40 / 255 * 222 / 255 / var(--opacity-disabled))); + --color-light-border: #ffffff28; + --color-hover: var(--steel-600); + --color-active: var(--steel-650); + --color-menu: var(--steel-700); + --color-card: var(--steel-700); + --color-markup-table-row: #ffffff06; + --color-markup-code-block: var(--steel-800); + --color-button: var(--steel-600); + --color-code-bg: var(--steel-750); + --color-code-sidebar-bg: var(--steel-600); + --color-shadow: #00000060; + --color-secondary-bg: var(--steel-700); + --color-text-focus: #fff; + --color-expand-button: #3c404d; + --color-placeholder-text: var(--steel-450); + --color-editor-line-highlight: var(--steel-700); + --color-project-board-bg: var(--color-secondary-light-3); + --color-project-board-dark-label: var(--color-text-light-3); + --color-caret: var(--color-text); /* should ideally be --color-text-dark, see #15651 */ + --color-reaction-bg: #ffffff12; + --color-reaction-active-bg: var(--color-primary-alpha-30); + --color-header-bar: var(--steel-900); + --color-label-active-bg: #4c525e; + --color-accent: var(--color-primary-light-1); + --color-small-accent: var(--color-primary-light-5); + --color-active-line: #534d1b; + + accent-color: var(--color-accent); + color-scheme: dark; +} + +/* invert emojis that are hard to read otherwise */ +.emoji[aria-label="check mark"], +.emoji[aria-label="currency exchange"], +.emoji[aria-label="TOP arrow"], +.emoji[aria-label="END arrow"], +.emoji[aria-label="ON! arrow"], +.emoji[aria-label="SOON arrow"], +.emoji[aria-label="heavy dollar sign"], +.emoji[aria-label="copyright"], +.emoji[aria-label="registered"], +.emoji[aria-label="trade mark"], +.emoji[aria-label="multiply"], +.emoji[aria-label="plus"], +.emoji[aria-label="minus"], +.emoji[aria-label="divide"], +.emoji[aria-label="curly loop"], +.emoji[aria-label="double curly loop"], +.emoji[aria-label="wavy dash"], +.emoji[aria-label="paw prints"], +.emoji[aria-label="musical note"], +.emoji[aria-label="musical notes"] { + filter: invert(100%) hue-rotate(180deg); +} + +.following.bar.light{ + border-bottom-color: #ffffff11 !important; +} +.text.green.svg { + color: #16a34a !important; +} +i.grey.icon.icon.icon.icon { + color: var(--steel-350) !important; +} + +.ui.red.button, +.ui.negative.button { + background-color: #7f1d1d !important; + color: #fff !important; + border-color: var(--color-light-border) !important; + &:hover { + background-color: #991b1b !important; + } +} + +.ui.secondary.vertical.menu { + border-radius: 0.28571429rem !important; + overflow: hidden; +} +.ui.secondary.vertical.menu > .item { + border-radius: 0 !important; +} +.ui.basic.primary.button.item { + background-color: var(--color-active) !important; + color: var(--color-text) !important; + box-shadow: none !important; +} + +.ui.red.label.notification_count, +.ui.primary.label, .ui.primary.labels .label { + background-color: var(--color-primary-light-3) !important; +} + +.repository.view.issue .comment-list .code-comment + .code-comment { + margin: 1.25rem 0 !important; + padding-top: 1.25rem !important; + border-top-color: var(--steel-650) !important; +} + +.ui.labeled.icon.buttons > .button > .icon, .ui.labeled.icon.button > .icon { + background-color: rgba(0, 0, 0, 0.05) !important; +} + +#review-box .review-comments-counter { + background-color: #00000088 !important; + color: #fff !important; + margin-left: 0.5em; +} + +.ui.tabs .ui.primary.label, +.ui.menu .ui.primary.label { + background-color: rgba(192,192,255, 0.2) !important; + // background-color: var(--zinc-300) !important; + color: var(--color-text-dark) !important; +} + +.ui.basic.yellow.label.pending-label { + background: var(--color-light) !important; +} + +.ui.tertiary.button { + color: #fff9; + &:hover { + color: #ccc; + } +} diff --git a/web_src/less/themes/theme-forgejo-light.less b/web_src/less/themes/theme-forgejo-light.less new file mode 100644 index 0000000000..e9124ca804 --- /dev/null +++ b/web_src/less/themes/theme-forgejo-light.less @@ -0,0 +1,277 @@ +// @import "../chroma/light.less"; +// @import "../codemirror/light.less"; + +:root { + --steel-900: #10161D; + --steel-850: #131A21; + --steel-800: #171E26; + --steel-750: #1D262F; + --steel-700: #242D38; + --steel-650: #2B3642; + --steel-600: #374351; + --steel-550: #445161; + --steel-500: #515F70; + --steel-450: #5F6E80; + --steel-400: #6D7D8F; + --steel-350: #7C8C9F; + --steel-300: #8C9CAF; + --steel-250: #9DADC0; + --steel-200: #AEBED0; + --steel-150: #C0CFE0; + --steel-100: #D2E0F0; + + --zinc-50: #FAFAFA; + --zinc-100: #F4F4F5; + --zinc-150: #ECECEE; + --zinc-200: #E4E4E7; + --zinc-250: #DCDCE0; + --zinc-300: #D4D4D8; + --zinc-350: #BABAC1; + --zinc-400: #A1A1AA; + --zinc-450: #898992; + --zinc-500: #71717A; + --zinc-550: #61616A; + --zinc-600: #52525B; + --zinc-650: #484850; + --zinc-700: #3F3F46; + --zinc-750: #333338; + --zinc-800: #27272A; + --zinc-850: #1F1F23; + --zinc-900: #18181B; + + // --is-dark-theme: true; + --color-primary: #c2410c; + --color-primary-contrast: #ffffff; + --color-primary-dark-1: #c2410c; + --color-primary-dark-2: #9a3412; + --color-primary-dark-3: #9a3412; + --color-primary-dark-4: #7c2d12; + --color-primary-dark-5: #7c2d12; + --color-primary-dark-6: #7c2d12; + --color-primary-dark-7: #7c2d12; + --color-primary-light-1: #ea580c; + --color-primary-light-2: #f97316; + --color-primary-light-3: #fb923c; + --color-primary-light-4: #fdba74; + --color-primary-light-5: #fed7aa; + --color-primary-light-6: #ffedd5; + --color-primary-light-7: #fff7ed; + --color-primary-alpha-10: #c2410c19; + --color-primary-alpha-20: #c2410c33; + --color-primary-alpha-30: #c2410c4b; + --color-primary-alpha-40: #c2410c66; + --color-primary-alpha-50: #c2410c80; + --color-primary-alpha-60: #c2410c99; + --color-primary-alpha-70: #c2410cb3; + --color-primary-alpha-80: #c2410ccc; + --color-primary-alpha-90: #c2410ce1; + --color-secondary: var(--zinc-200); + --color-secondary-dark-1: var(--zinc-200); + --color-secondary-dark-2: var(--zinc-300); + --color-secondary-dark-3: var(--zinc-300); + --color-secondary-dark-4: var(--zinc-400); + --color-secondary-dark-5: var(--zinc-400); + --color-secondary-dark-6: var(--zinc-500); + --color-secondary-dark-7: var(--zinc-500); + --color-secondary-dark-8: var(--zinc-600); + --color-secondary-dark-9: var(--zinc-600); + --color-secondary-dark-10: var(--zinc-700); + --color-secondary-dark-11: var(--zinc-700); + --color-secondary-dark-12: var(--zinc-800); + --color-secondary-dark-13: var(--zinc-800); + --color-secondary-light-1: var(--zinc-200); + --color-secondary-light-2: var(--zinc-100); + --color-secondary-light-3: var(--zinc-100); + --color-secondary-light-4: var(--zinc-50); + --color-secondary-alpha-10: #d4d4d819; + --color-secondary-alpha-20: #d4d4d833; + --color-secondary-alpha-30: #d4d4d84b; + --color-secondary-alpha-40: #d4d4d866; + --color-secondary-alpha-50: #d4d4d880; + --color-secondary-alpha-60: #d4d4d899; + --color-secondary-alpha-70: #d4d4d8b3; + --color-secondary-alpha-80: #d4d4d8cc; + --color-secondary-alpha-90: #d4d4d8e1; + + /* colors */ + --color-red: #dc2626; + --color-orange: #ea580c; + --color-yellow: #ca8a04; + --color-olive: #91a313; + --color-green: #15803d; + --color-teal: #0d9488; + --color-blue: #2563eb; + --color-violet: #7c3aed; + --color-purple: #9333ea; + --color-pink: #db2777; + --color-brown: #a47252; + --color-grey: #4b5563; + --color-black: #000000; + + /* light variants */ + --color-red-light: #ef4444; + --color-orange-light: #f97316; + --color-yellow-light: #eab308; + --color-olive-light: #839311; + --color-green-light: #16a34a; + --color-teal-light: #14b8a6; + --color-blue-light: #3b82f6; + --color-violet-light: #8b5cf6; + --color-purple-light: #a855f7; + --color-pink-light: #ec4899; + --color-brown-light: #94674a; + --color-grey-light: #6b7280; + --color-black-light: #181818; + + /* other colors */ + --color-gold: #b1983b; + --color-white: #ffffff; + --color-diff-removed-word-bg: #fca5a5; + --color-diff-added-word-bg: #86efac; + --color-diff-removed-row-bg: #fee2e2; + --color-diff-moved-row-bg: #fef9c3; + --color-diff-added-row-bg: #dcfce7; + --color-diff-removed-row-border: #fca5a5; + --color-diff-moved-row-border: #fde047; + --color-diff-added-row-border: #86efac; + --color-diff-inactive: var(--zinc-100); + --color-error-border: #fecaca; + --color-error-bg: #fee2e2; + --color-error-bg-active: #fca5a5; + --color-error-bg-hover: #fecaca; + --color-error-text: #7f1d1d; + --color-success-border: #bbf7d0; + --color-success-bg: #dcfce7; + --color-success-text: #14532d; + --color-warning-border: #fde047; + --color-warning-bg: #fef3c7; + --color-warning-text: #78350f; + --color-info-border: #bae6fd; + --color-info-bg: #e0f2fe; + --color-info-text: #0c4a6e; + --color-red-badge: #B91C1C; + --color-red-badge-bg: #B91C1C22; + --color-red-badge-hover-bg: #B91C1C44; + --color-green-badge: #16a34a; + --color-green-badge-bg: #16a34a22; + --color-green-badge-hover-bg: #16a34a44; + --color-yellow-badge: #ca8a04; + --color-yellow-badge-bg: #ca8a0422; + --color-yellow-badge-hover-bg: #ca8a0444; + --color-orange-badge: #ea580c; + --color-orange-badge-bg: #ea580c22; + --color-orange-badge-hover-bg: #ea580c44; + --color-git: #f05133; + + /* target-based colors */ + --color-body: #fff; + --color-box-header: var(--zinc-100); + --color-box-body: var(--zinc-50); + --color-box-body-highlight: var(--zinc-200); + --color-text-dark: #000; + --color-text: var(--zinc-900); + --color-text-light: var(--zinc-700); + --color-text-light-1: var(--zinc-650); + --color-text-light-2: var(--zinc-600); + --color-text-light-3: var(--zinc-550); + --color-footer: var(--zinc-100); + --color-timeline: var(--zinc-200); + --color-input-text: var(--zinc-800); + --color-input-background: #fff; + --color-input-toggle-background: #fff; + --color-input-border: var(--zinc-300); + --color-input-border-hover: var(--zinc-400); + --color-navbar: var(--zinc-50); + --color-navbar-transparent: #D2E0F000; + --color-light: #ffffffcc; + --color-light-mimic-enabled: rgba(0, 0, 0, calc(6 / 255 * 222 / 255 / var(--opacity-disabled))); + --color-light-border: #0000001d; + --color-hover: #e4e4e4aa; + --color-active: #d4d4d8aa; + --color-menu: var(--zinc-100); + --color-card: var(--zinc-50); + --color-markup-table-row: #ffffff06; + --color-markup-code-block: var(--zinc-150); + --color-button: var(--zinc-150); + --color-code-bg: var(--zinc-50); + --color-code-sidebar-bg: var(--zinc-100); + --color-shadow: #00000060; + --color-secondary-bg: var(--zinc-100); + --color-text-focus: #fff; + --color-expand-button: var(--zinc-200); + --color-placeholder-text: var(--zinc-400); + --color-editor-line-highlight: var(--zinc-100); + --color-project-board-bg: var(--color-secondary-light-2); + --color-project-board-dark-label: var(--color-text-light-3); + --color-caret: var(--color-text); /* should ideally be --color-text-dark, see #15651 */ + --color-reaction-bg: #0000000a; + --color-reaction-active-bg: var(--color-primary-alpha-20); + --color-header-bar: var(--zinc-100); + --color-label-active-bg: #4c525e; + --color-accent: var(--color-primary-light-1); + --color-small-accent: var(--color-primary-light-5); + --color-active-line: #534d1b; + + accent-color: var(--color-accent); + color-scheme: light; +} + +.text.green.svg { + color: #16a34a !important; +} +// .ui.red.button, +// .ui.negative.button { +// background-color: var(--color-red) !important; +// color: #fff !important; +// border-color: var(--color-light-border) !important; +// &:hover { +// background-color: var(--color-red-light) !important; +// } +// } + +.ui.secondary.vertical.menu { + border-radius: 0.28571429rem !important; + overflow: hidden; +} +.ui.secondary.vertical.menu > .item { + border-radius: 0 !important; +} +.ui.basic.primary.button.item { + background-color: var(--color-active) !important; + color: var(--color-text) !important; + box-shadow: none !important; +} + +.ui.red.label.notification_count, +.ui.primary.label, .ui.primary.labels .label { + background-color: var(--color-primary-dark-1) !important; +} + +.repository.view.issue .comment-list .code-comment + .code-comment { + margin: 1.25rem 0 !important; + padding-top: 1.25rem !important; + border-top-color: var(--zinc-250) !important; +} + +.ui.labeled.icon.buttons > .button > .icon, .ui.labeled.icon.button > .icon { + background-color: rgba(0, 0, 0, 0.05) !important; +} + +#review-box .review-comments-counter { + background-color: #ffffffaa !important; + color: #000 !important; + margin-left: 0.5em; +} + +.ui.tabs .ui.primary.label, +.ui.menu .ui.primary.label { + background-color: rgba(0, 0, 0, 0.15) !important; + // background-color: var(--zinc-300) !important; + color: var(--color-text-dark) !important; +} + +.ui.basic.yellow.label.pending-label { + background: var(--color-warning-bg) !important; + color: var(--color-warning-text) !important; + border-color: #eab308 !important; +} From 9578a1d83a612c78634fb20849f027505233d218 Mon Sep 17 00:00:00 2001 From: Caesar Schinas <caesar@caesarschinas.com> Date: Wed, 28 Dec 2022 00:28:39 -1000 Subject: [PATCH 09/16] [BRANDING] Rebrand default meta tags (cherry picked from commit fedeadb738a960d920256eddc5b03bc2ac4ad8b2) --- modules/setting/setting.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 6d82d20d6a..e32e3fc679 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -334,9 +334,9 @@ var ( Description string Keywords string }{ - Author: "Gitea - Git with a cup of tea", - Description: "Gitea (Git with a cup of tea) is a painless self-hosted Git service written in Go", - Keywords: "go,git,self-hosted,gitea", + Author: "Forgejo – Beyond coding. We forge.", + Description: "Forgejo is a self-hosted lightweight software forge. Easy to install and low maintenance, it just does the job.", + Keywords: "git,forge,forgejo", }, } From 2b59a901464dc33b50061d0aef02ee71b5e24d0a Mon Sep 17 00:00:00 2001 From: TomZ <tom@flowee.org> Date: Mon, 9 Jan 2023 14:01:00 +0100 Subject: [PATCH 10/16] [BRANDING] Rename usage of Gitea in user-visible places As the docs of codeberg refer to the strings printed by the Forgejo ssh servers, this is user-facing and is nice to update to the new product name. (cherry picked from commit 9c65f0d2ef44ae9a44960b827aee23a1a91192a9) --- cmd/serv.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/serv.go b/cmd/serv.go index 06561f348a..d19020e5c3 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -149,13 +149,13 @@ func runServ(c *cli.Context) error { } switch key.Type { case asymkey_model.KeyTypeDeploy: - println("Hi there! You've successfully authenticated with the deploy key named " + key.Name + ", but Gitea does not provide shell access.") + println("Hi there! You've successfully authenticated with the deploy key named " + key.Name + ", but Forgejo does not provide shell access.") case asymkey_model.KeyTypePrincipal: - println("Hi there! You've successfully authenticated with the principal " + key.Content + ", but Gitea does not provide shell access.") + println("Hi there! You've successfully authenticated with the principal " + key.Content + ", but Forgejo does not provide shell access.") default: - println("Hi there, " + user.Name + "! You've successfully authenticated with the key named " + key.Name + ", but Gitea does not provide shell access.") + println("Hi there, " + user.Name + "! You've successfully authenticated with the key named " + key.Name + ", but Forgejo does not provide shell access.") } - println("If this is unexpected, please log in with password and setup Gitea under another user.") + println("If this is unexpected, please log in with password and setup Forgejo under another user.") return nil } else if c.Bool("debug") { log.Debug("SSH_ORIGINAL_COMMAND: %s", os.Getenv("SSH_ORIGINAL_COMMAND")) From 5c4cd14c4f785c9a12ee85dd7732114f0e6bce67 Mon Sep 17 00:00:00 2001 From: Gusted <postmaster@gusted.xyz> Date: Mon, 9 Jan 2023 22:28:04 +0100 Subject: [PATCH 11/16] [BRANDING] Replace branding in Swagger - "Gitea" is automatically being determined in Swagger and cannot be overridden, therefor we override it after `swagger generate spec` is run. - Resolves https://codeberg.org/forgejo/forgejo/issues/226 (cherry picked from commit ffc2db3d693e92cf48f95f8b722242a1c03ee01a) --- Makefile | 2 ++ templates/swagger/v1_json.tmpl | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 8745cd8d16..d92ebe93dd 100644 --- a/Makefile +++ b/Makefile @@ -157,6 +157,7 @@ SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEs SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g SWAGGER_EXCLUDE := code.gitea.io/sdk SWAGGER_NEWLINE_COMMAND := -e '$$a\' +SWAGGER_SPEC_BRANDING := s|Gitea API|Forgejo API|g TEST_MYSQL_HOST ?= mysql:3306 TEST_MYSQL_DBNAME ?= testgitea @@ -331,6 +332,7 @@ $(SWAGGER_SPEC): $(GO_SOURCES_NO_BINDATA) $(GO) run $(SWAGGER_PACKAGE) generate spec -x "$(SWAGGER_EXCLUDE)" -o './$(SWAGGER_SPEC)' $(SED_INPLACE) '$(SWAGGER_SPEC_S_TMPL)' './$(SWAGGER_SPEC)' $(SED_INPLACE) $(SWAGGER_NEWLINE_COMMAND) './$(SWAGGER_SPEC)' + $(SED_INPLACE) '$(SWAGGER_SPEC_BRANDING)' './$(SWAGGER_SPEC)' .PHONY: swagger-check swagger-check: generate-swagger diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 5df9f2bd2b..9ce8a02e9d 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -13,8 +13,8 @@ ], "swagger": "2.0", "info": { - "description": "This documentation describes the Gitea API.", - "title": "Gitea API.", + "description": "This documentation describes the Forgejo API.", + "title": "Forgejo API.", "license": { "name": "MIT", "url": "http://opensource.org/licenses/MIT" From b032259089a0b5a0eff6592ce9c1038f15e6a551 Mon Sep 17 00:00:00 2001 From: Earl Warren <contact@earl-warren.org> Date: Thu, 12 Jan 2023 22:56:56 +0100 Subject: [PATCH 12/16] [BRANDING] parse FORGEJO__* in the container environment Add the FORGEJO__ prefix as equivalent to GITEA__ when interpreted by environment-to-ini. It is used when running the Forgejo container like so: docker run --name forgejo -e FORGEJO__security__INSTALL_LOCK=true \ -d codeberg.org/forgejo/forgejo:1.18 Signed-off-by: Earl Warren <contact@earl-warren.org> (cherry picked from commit b4665b0796cf582d761797df2be45e3574839dda) --- .woodpecker/testing-amd64.yml | 8 ++++ .../environment-to-ini/environment-to-ini.go | 48 ++++++++++--------- .../environment-to-ini_test.go | 21 ++++++++ 3 files changed, 55 insertions(+), 22 deletions(-) create mode 100644 contrib/environment-to-ini/environment-to-ini_test.go diff --git a/.woodpecker/testing-amd64.yml b/.woodpecker/testing-amd64.yml index 6c0ba08196..c321a4bd78 100644 --- a/.woodpecker/testing-amd64.yml +++ b/.woodpecker/testing-amd64.yml @@ -75,6 +75,14 @@ pipeline: commands: - ./build/test-env-prepare.sh + environment-to-ini: + image: *golang_image + environment: + GOPROXY_OVERRIDE: *goproxy_override + commands: + - *goproxy_setup + - go test contrib/environment-to-ini/environment-to-ini.go contrib/environment-to-ini/environment-to-ini_test.go + build: image: *test_image environment: diff --git a/contrib/environment-to-ini/environment-to-ini.go b/contrib/environment-to-ini/environment-to-ini.go index ccda03fa92..0baba5902b 100644 --- a/contrib/environment-to-ini/environment-to-ini.go +++ b/contrib/environment-to-ini/environment-to-ini.go @@ -1,3 +1,4 @@ +// Copyright 2023 The Forgejo Authors. All rights reserved. // Copyright 2019 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -19,17 +20,17 @@ import ( ) // EnvironmentPrefix environment variables prefixed with this represent ini values to write -const EnvironmentPrefix = "GITEA" +const prefixRegexpString = "^(FORGEJO|GITEA)" func main() { app := cli.NewApp() app.Name = "environment-to-ini" app.Usage = "Use provided environment to update configuration ini" - app.Description = `As a helper to allow docker users to update the gitea configuration + app.Description = `As a helper to allow docker users to update the forgejo configuration through the environment, this command allows environment variables to be mapped to values in the ini. - Environment variables of the form "GITEA__SECTION_NAME__KEY_NAME" + Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME" will be mapped to the ini section "[section_name]" and the key "KEY_NAME" with the value as provided. @@ -47,9 +48,8 @@ func main() { ... """ - You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false" - and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found - on the configuration cheat sheet.` + You would set the environment variables: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false" + and "FORGEJO__LOG_0x2E_CONSOLE__STDERR=false".` app.Flags = []cli.Flag{ cli.StringFlag{ Name: "custom-path, C", @@ -77,7 +77,7 @@ func main() { }, cli.StringFlag{ Name: "prefix, p", - Value: EnvironmentPrefix, + Value: prefixRegexpString, Usage: "Environment prefix to look for - will be suffixed by __ (2 underscores)", }, } @@ -90,6 +90,19 @@ func main() { } } +func splitEnvironmentVariable(prefixRegexp *regexp.Regexp, kv string) (string, string) { + idx := strings.IndexByte(kv, '=') + if idx < 0 { + return "", "" + } + k := kv[:idx] + loc := prefixRegexp.FindStringIndex(k) + if loc == nil { + return "", "" + } + return k[loc[1]:], kv[idx+1:] +} + func runEnvironmentToIni(c *cli.Context) error { providedCustom := c.String("custom-path") providedConf := c.String("config") @@ -112,19 +125,13 @@ func runEnvironmentToIni(c *cli.Context) error { changed := false - prefix := c.String("prefix") + "__" + prefixRegexp := regexp.MustCompile(c.String("prefix") + "__") for _, kv := range os.Environ() { - idx := strings.IndexByte(kv, '=') - if idx < 0 { + eKey, value := splitEnvironmentVariable(prefixRegexp, kv) + if eKey == "" { continue } - eKey := kv[:idx] - value := kv[idx+1:] - if !strings.HasPrefix(eKey, prefix) { - continue - } - eKey = eKey[len(prefix):] sectionName, keyName := DecodeSectionKey(eKey) if len(keyName) == 0 { continue @@ -164,14 +171,11 @@ func runEnvironmentToIni(c *cli.Context) error { } if c.Bool("clear") { for _, kv := range os.Environ() { - idx := strings.IndexByte(kv, '=') - if idx < 0 { + eKey, _ := splitEnvironmentVariable(prefixRegexp, kv) + if eKey == "" { continue } - eKey := kv[:idx] - if strings.HasPrefix(eKey, prefix) { - _ = os.Unsetenv(eKey) - } + _ = os.Unsetenv(eKey) } } return nil diff --git a/contrib/environment-to-ini/environment-to-ini_test.go b/contrib/environment-to-ini/environment-to-ini_test.go new file mode 100644 index 0000000000..6abbb67eff --- /dev/null +++ b/contrib/environment-to-ini/environment-to-ini_test.go @@ -0,0 +1,21 @@ +// Copyright 2023 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package main + +import ( + "regexp" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_splitEnvironmentVariable(t *testing.T) { + prefixRegexp := regexp.MustCompile(prefixRegexpString + "__") + k, v := splitEnvironmentVariable(prefixRegexp, "FORGEJO__KEY=VALUE") + assert.Equal(t, k, "KEY") + assert.Equal(t, v, "VALUE") + k, v = splitEnvironmentVariable(prefixRegexp, "nothing=interesting") + assert.Equal(t, k, "") + assert.Equal(t, v, "") +} From fd245037ea9b3114a902e3964ad28a6c4a89431d Mon Sep 17 00:00:00 2001 From: Earl Warren <contact@earl-warren.org> Date: Sat, 14 Jan 2023 08:16:30 +0100 Subject: [PATCH 13/16] [BRANDING] add X-Forgejo-* headers (cherry picked from commit de86c5e6ef57cf8fb9dd36abe1d83d3ade4cb12f) --- modules/httpcache/httpcache.go | 1 + modules/httpcache/httpcache_test.go | 3 +++ routers/api/v1/api.go | 2 +- routers/api/v1/repo/file.go | 7 ++++++- services/mailer/mail.go | 10 ++++++++++ services/webhook/deliver.go | 4 ++++ 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/modules/httpcache/httpcache.go b/modules/httpcache/httpcache.go index 750233d4a7..882f207ef7 100644 --- a/modules/httpcache/httpcache.go +++ b/modules/httpcache/httpcache.go @@ -31,6 +31,7 @@ func AddCacheControlToHeader(h http.Header, maxAge time.Duration, additionalDire // to remind users they are using non-prod setting. h.Add("X-Gitea-Debug", "RUN_MODE="+setting.RunMode) + h.Add("X-Forgejo-Debug", "RUN_MODE="+setting.RunMode) } h.Set("Cache-Control", strings.Join(append(directives, additionalDirectives...), ", ")) diff --git a/modules/httpcache/httpcache_test.go b/modules/httpcache/httpcache_test.go index 49e54d147e..e7965d6af8 100644 --- a/modules/httpcache/httpcache_test.go +++ b/modules/httpcache/httpcache_test.go @@ -30,6 +30,9 @@ func countFormalHeaders(h http.Header) (c int) { if strings.HasPrefix(k, "X-Gitea-") { continue } + if strings.HasPrefix(k, "X-Forgejo-") { + continue + } c++ } return c diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index b0a864d199..38cd8e87bd 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -611,7 +611,7 @@ func Routes(ctx gocontext.Context) *web.Route { // setting.CORSConfig.AllowSubdomain // FIXME: the cors middleware needs allowSubdomain option AllowedMethods: setting.CORSConfig.Methods, AllowCredentials: setting.CORSConfig.AllowCredentials, - AllowedHeaders: []string{"Authorization", "X-Gitea-OTP"}, + AllowedHeaders: []string{"Authorization", "X-Gitea-OTP", "X-Forgejo-OTP"}, MaxAge: int(setting.CORSConfig.MaxAge.Seconds()), })) } diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index aba5b1f9e7..3dcd28ccd0 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -33,7 +33,10 @@ import ( files_service "code.gitea.io/gitea/services/repository/files" ) -const giteaObjectTypeHeader = "X-Gitea-Object-Type" +const ( + giteaObjectTypeHeader = "X-Gitea-Object-Type" + forgejoObjectTypeHeader = "X-Forgejo-Object-Type" +) // GetRawFile get a file by path on a repository func GetRawFile(ctx *context.APIContext) { @@ -80,6 +83,7 @@ func GetRawFile(ctx *context.APIContext) { } ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry))) + ctx.RespHeader().Set(forgejoObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry))) if err := common.ServeBlob(ctx.Context, blob, lastModified); err != nil { ctx.Error(http.StatusInternalServerError, "ServeBlob", err) @@ -129,6 +133,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { } ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry))) + ctx.RespHeader().Set(forgejoObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry))) // LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file if blob.Size() > 1024 { diff --git a/services/mailer/mail.go b/services/mailer/mail.go index eece83ca43..23de3dc531 100644 --- a/services/mailer/mail.go +++ b/services/mailer/mail.go @@ -373,6 +373,16 @@ func generateAdditionalHeaders(ctx *mailCommentContext, reason string, recipient "X-Gitea-Issue-ID": strconv.FormatInt(ctx.Issue.Index, 10), "X-Gitea-Issue-Link": ctx.Issue.HTMLURL(), + "X-Forgejo-Reason": reason, + "X-Forgejo-Sender": ctx.Doer.DisplayName(), + "X-Forgejo-Recipient": recipient.DisplayName(), + "X-Forgejo-Recipient-Address": recipient.Email, + "X-Forgejo-Repository": repo.Name, + "X-Forgejo-Repository-Path": repo.FullName(), + "X-Forgejo-Repository-Link": repo.HTMLURL(), + "X-Forgejo-Issue-ID": strconv.FormatInt(ctx.Issue.Index, 10), + "X-Forgejo-Issue-Link": ctx.Issue.HTMLURL(), + "X-GitHub-Reason": reason, "X-GitHub-Sender": ctx.Doer.DisplayName(), "X-GitHub-Recipient": recipient.DisplayName(), diff --git a/services/webhook/deliver.go b/services/webhook/deliver.go index 74a69c297c..af45369d53 100644 --- a/services/webhook/deliver.go +++ b/services/webhook/deliver.go @@ -116,6 +116,10 @@ func Deliver(ctx context.Context, t *webhook_model.HookTask) error { event := t.EventType.Event() eventType := string(t.EventType) + req.Header.Add("X-Forgejo-Delivery", t.UUID) + req.Header.Add("X-Forgejo-Event", event) + req.Header.Add("X-Forgejo-Event-Type", eventType) + req.Header.Add("X-Forgejo-Signature", signatureSHA256) req.Header.Add("X-Gitea-Delivery", t.UUID) req.Header.Add("X-Gitea-Event", event) req.Header.Add("X-Gitea-Event-Type", eventType) From 0f12ca9222243e05ae992515125f13f2b39ca7da Mon Sep 17 00:00:00 2001 From: Earl Warren <contact@earl-warren.org> Date: Sat, 14 Jan 2023 10:07:01 +0100 Subject: [PATCH 14/16] [BRANDING] define the forgejo webhook type templates/swagger/v1_json.tmpl updated with `make generate-swagger` (cherry picked from commit 0f9842fc582057068e907ef2c7b3129848288f56) --- models/webhook/webhook.go | 1 + modules/setting/webhook.go | 2 +- modules/structs/hook.go | 2 +- routers/web/repo/webhook.go | 28 +++++++++++++ routers/web/web.go | 6 +++ services/webhook/webhook.go | 4 +- templates/admin/hook_new.tmpl | 7 +++- templates/org/settings/hook_new.tmpl | 6 ++- .../repo/settings/webhook/base_list.tmpl | 5 ++- templates/repo/settings/webhook/forgejo.tmpl | 40 +++++++++++++++++++ templates/repo/settings/webhook/new.tmpl | 7 +++- templates/swagger/v1_json.tmpl | 1 + tests/integration/links_test.go | 38 ++++++++++++++++++ 13 files changed, 136 insertions(+), 11 deletions(-) create mode 100644 templates/repo/settings/webhook/forgejo.tmpl diff --git a/models/webhook/webhook.go b/models/webhook/webhook.go index aebe0d6e72..108330bca2 100644 --- a/models/webhook/webhook.go +++ b/models/webhook/webhook.go @@ -155,6 +155,7 @@ type HookType = string // Types of webhooks const ( + FORGEJO HookType = "forgejo" GITEA HookType = "gitea" GOGS HookType = "gogs" SLACK HookType = "slack" diff --git a/modules/setting/webhook.go b/modules/setting/webhook.go index 0bfd7dcb4d..be78066a3d 100644 --- a/modules/setting/webhook.go +++ b/modules/setting/webhook.go @@ -36,7 +36,7 @@ func newWebhookService() { Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5) Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool() Webhook.AllowedHostList = sec.Key("ALLOWED_HOST_LIST").MustString("") - Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"} + Webhook.Types = []string{"forgejo", "gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"} Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) Webhook.ProxyURL = sec.Key("PROXY_URL").MustString("") if Webhook.ProxyURL != "" { diff --git a/modules/structs/hook.go b/modules/structs/hook.go index 8321a15a8f..503f983151 100644 --- a/modules/structs/hook.go +++ b/modules/structs/hook.go @@ -40,7 +40,7 @@ type CreateHookOptionConfig map[string]string // CreateHookOption options when create a hook type CreateHookOption struct { // required: true - // enum: dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist + // enum: forgejo,dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist Type string `json:"type" binding:"Required"` // required: true Config CreateHookOptionConfig `json:"config" binding:"Required"` diff --git a/routers/web/repo/webhook.go b/routers/web/repo/webhook.go index ee980333b7..f37454a42c 100644 --- a/routers/web/repo/webhook.go +++ b/routers/web/repo/webhook.go @@ -297,6 +297,34 @@ func editWebhook(ctx *context.Context, params webhookParams) { ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID)) } +// ForgejoHooksNewPost response for creating Forgejo webhook +func ForgejoHooksNewPost(ctx *context.Context) { + createWebhook(ctx, forgejoHookParams(ctx)) +} + +// ForgejoHooksEditPost response for editing Forgejo webhook +func ForgejoHooksEditPost(ctx *context.Context) { + editWebhook(ctx, forgejoHookParams(ctx)) +} + +func forgejoHookParams(ctx *context.Context) webhookParams { + form := web.GetForm(ctx).(*forms.NewWebhookForm) + + contentType := webhook.ContentTypeJSON + if webhook.HookContentType(form.ContentType) == webhook.ContentTypeForm { + contentType = webhook.ContentTypeForm + } + + return webhookParams{ + Type: webhook.FORGEJO, + URL: form.PayloadURL, + ContentType: contentType, + Secret: form.Secret, + HTTPMethod: form.HTTPMethod, + WebhookForm: form.WebhookForm, + } +} + // GiteaHooksNewPost response for creating Gitea webhook func GiteaHooksNewPost(ctx *context.Context) { createWebhook(ctx, giteaHookParams(ctx)) diff --git a/routers/web/web.go b/routers/web/web.go index 7757e9c30c..3f41592a17 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -534,6 +534,7 @@ func RegisterRoutes(m *web.Route) { m.Get("", repo.WebHooksEdit) m.Post("/replay/{uuid}", repo.ReplayWebhook) }) + m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost) m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost) m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost) m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost) @@ -549,6 +550,7 @@ func RegisterRoutes(m *web.Route) { m.Group("/{configType:default-hooks|system-hooks}", func() { m.Get("/{type}/new", repo.WebhooksNew) + m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost) m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost) m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost) m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost) @@ -712,6 +714,7 @@ func RegisterRoutes(m *web.Route) { m.Get("", org.Webhooks) m.Post("/delete", org.DeleteWebhook) m.Get("/{type}/new", repo.WebhooksNew) + m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost) m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost) m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost) m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost) @@ -726,6 +729,7 @@ func RegisterRoutes(m *web.Route) { m.Get("", repo.WebHooksEdit) m.Post("/replay/{uuid}", repo.ReplayWebhook) }) + m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost) m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost) m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost) m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost) @@ -835,6 +839,7 @@ func RegisterRoutes(m *web.Route) { m.Get("", repo.Webhooks) m.Post("/delete", repo.DeleteWebhook) m.Get("/{type}/new", repo.WebhooksNew) + m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost) m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost) m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost) m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost) @@ -851,6 +856,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/test", repo.TestWebhook) m.Post("/replay/{uuid}", repo.ReplayWebhook) }) + m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost) m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost) m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost) m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost) diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go index 342e764f4d..5205cbcdc8 100644 --- a/services/webhook/webhook.go +++ b/services/webhook/webhook.go @@ -74,7 +74,7 @@ func RegisterWebhook(name string, webhook *webhook) { // IsValidHookTaskType returns true if a webhook registered func IsValidHookTaskType(name string) bool { - if name == webhook_model.GITEA || name == webhook_model.GOGS { + if name == webhook_model.FORGEJO || name == webhook_model.GITEA || name == webhook_model.GOGS { return true } _, ok := webhooks[name] @@ -170,7 +170,7 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook // Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.). // Integration webhooks (e.g. drone) still receive the required data. if pushEvent, ok := p.(*api.PushPayload); ok && - w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS && + w.Type != webhook_model.FORGEJO && w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS && len(pushEvent.Commits) == 0 { return nil } diff --git a/templates/admin/hook_new.tmpl b/templates/admin/hook_new.tmpl index c5196fce4e..f197dda55f 100644 --- a/templates/admin/hook_new.tmpl +++ b/templates/admin/hook_new.tmpl @@ -14,8 +14,10 @@ {{.locale.Tr "admin.defaulthooks.update_webhook"}} {{end}} <div class="ui right"> - {{if eq .HookType "gitea"}} - <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg"> + {{if eq .HookType "forgejo"}} + <img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg"> + {{else if eq .HookType "gitea"}} + <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg"> {{else if eq .HookType "gogs"}} <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico"> {{else if eq .HookType "slack"}} @@ -40,6 +42,7 @@ </div> </h4> <div class="ui attached segment"> + {{template "repo/settings/webhook/forgejo" .}} {{template "repo/settings/webhook/gitea" .}} {{template "repo/settings/webhook/gogs" .}} {{template "repo/settings/webhook/slack" .}} diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl index 7308cafa20..a30ed6dfd9 100644 --- a/templates/org/settings/hook_new.tmpl +++ b/templates/org/settings/hook_new.tmpl @@ -9,8 +9,10 @@ <h4 class="ui top attached header"> {{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}} <div class="ui right"> - {{if eq .HookType "gitea"}} - <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg"> + {{if eq .HookType "forgejo"}} + <img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg"> + {{else if eq .HookType "gitea"}} + <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg"> {{else if eq .HookType "gogs"}} <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico"> {{else if eq .HookType "slack"}} diff --git a/templates/repo/settings/webhook/base_list.tmpl b/templates/repo/settings/webhook/base_list.tmpl index fa68e12ce9..c9f0a3bd7b 100644 --- a/templates/repo/settings/webhook/base_list.tmpl +++ b/templates/repo/settings/webhook/base_list.tmpl @@ -4,8 +4,11 @@ <div class="ui floating1 jump dropdown"> <div class="ui primary tiny button">{{.locale.Tr "repo.settings.add_webhook"}}</div> <div class="menu"> + <a class="item" href="{{.BaseLinkNew}}/forgejo/new"> + <img width="20" height="20" src="{{AssetUrlPrefix}}/img/forgejo.svg">{{.locale.Tr "repo.settings.web_hook_name_forgejo"}} + </a> <a class="item" href="{{.BaseLinkNew}}/gitea/new"> - <img width="20" height="20" src="{{AssetUrlPrefix}}/img/gitea.svg">{{.locale.Tr "repo.settings.web_hook_name_gitea"}} + <img width="20" height="20" src="{{AssetUrlPrefix}}/img/gitea-original.svg">{{.locale.Tr "repo.settings.web_hook_name_gitea"}} </a> <a class="item" href="{{.BaseLinkNew}}/gogs/new"> <img width="20" height="20" src="{{AssetUrlPrefix}}/img/gogs.ico">{{.locale.Tr "repo.settings.web_hook_name_gogs"}} diff --git a/templates/repo/settings/webhook/forgejo.tmpl b/templates/repo/settings/webhook/forgejo.tmpl new file mode 100644 index 0000000000..0d733f3362 --- /dev/null +++ b/templates/repo/settings/webhook/forgejo.tmpl @@ -0,0 +1,40 @@ +{{if eq .HookType "forgejo"}} + <p>{{.locale.Tr "repo.settings.add_web_hook_desc" "https://docs.gitea.io/en-us/webhooks/" (.locale.Tr "repo.settings.web_hook_name_forgejo") | Str2html}}</p> + <form class="ui form" action="{{.BaseLink}}/forgejo/{{or .Webhook.ID "new"}}" method="post"> + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + <div class="required field {{if .Err_PayloadURL}}error{{end}}"> + <label for="payload_url">{{.locale.Tr "repo.settings.payload_url"}}</label> + <input id="payload_url" name="payload_url" type="url" value="{{.Webhook.URL}}" autofocus required> + </div> + <div class="field"> + <label>{{.locale.Tr "repo.settings.http_method"}}</label> + <div class="ui selection dropdown"> + <input type="hidden" id="http_method" name="http_method" value="{{if .Webhook.HTTPMethod}}{{.Webhook.HTTPMethod}}{{else}}POST{{end}}"> + <div class="default text"></div> + {{svg "octicon-triangle-down" 14 "dropdown icon"}} + <div class="menu"> + <div class="item" data-value="POST">POST</div> + <div class="item" data-value="GET">GET</div> + </div> + </div> + </div> + <div class="field"> + <label>{{.locale.Tr "repo.settings.content_type"}}</label> + <div class="ui selection dropdown"> + <input type="hidden" id="content_type" name="content_type" value="{{if .Webhook.ContentType}}{{.Webhook.ContentType}}{{else}}1{{end}}"> + <div class="default text"></div> + {{svg "octicon-triangle-down" 14 "dropdown icon"}} + <div class="menu"> + <div class="item" data-value="1">application/json</div> + <div class="item" data-value="2">application/x-www-form-urlencoded</div> + </div> + </div> + </div> + <div class="field {{if .Err_Secret}}error{{end}}"> + <label for="secret">{{.locale.Tr "repo.settings.secret"}}</label> + <input id="secret" name="secret" type="password" value="{{.Webhook.Secret}}" autocomplete="off"> + </div> + {{template "repo/settings/webhook/settings" .}} + </form> +{{end}} diff --git a/templates/repo/settings/webhook/new.tmpl b/templates/repo/settings/webhook/new.tmpl index ea5a3eca3c..066d0045d0 100644 --- a/templates/repo/settings/webhook/new.tmpl +++ b/templates/repo/settings/webhook/new.tmpl @@ -7,8 +7,10 @@ <h4 class="ui top attached header"> {{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}} <div class="ui right"> - {{if eq .HookType "gitea"}} - <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg"> + {{if eq .HookType "forgejo"}} + <img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg"> + {{else if eq .HookType "gitea"}} + <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg"> {{else if eq .HookType "gogs"}} <img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico"> {{else if eq .HookType "slack"}} @@ -33,6 +35,7 @@ </div> </h4> <div class="ui attached segment"> + {{template "repo/settings/webhook/forgejo" .}} {{template "repo/settings/webhook/gitea" .}} {{template "repo/settings/webhook/gogs" .}} {{template "repo/settings/webhook/slack" .}} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 9ce8a02e9d..7080e7e794 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -14465,6 +14465,7 @@ "type": { "type": "string", "enum": [ + "forgejo", "dingtalk", "discord", "gitea", diff --git a/tests/integration/links_test.go b/tests/integration/links_test.go index 4eb29f0cee..d40419a018 100644 --- a/tests/integration/links_test.go +++ b/tests/integration/links_test.go @@ -174,3 +174,41 @@ func TestLinksLogin(t *testing.T) { testLinksAsUser("user2", t) } + +func TestRedirectsWebhooks(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + // + // A redirect means the route exists but not if it performs as intended. + // + for _, kind := range []string{"forgejo", "gitea"} { + { + redirects := map[string]string{ + "/user2/repo1/settings/hooks/" + kind + "/new": "/user/login", + "/admin/system-hooks/" + kind + "/new": "/user/login", + "/admin/default-hooks/" + kind + "/new": "/user/login", + } + for link, redirectLink := range redirects { + req := NewRequest(t, "GET", link) + resp := MakeRequest(t, req, http.StatusSeeOther) + assert.EqualValues(t, path.Join(setting.AppSubURL, redirectLink), test.RedirectURL(resp)) + } + } + + { + redirects := map[string]string{ + "/user2/repo1/settings/hooks/" + kind + "/new": "/", + "/admin/system-hooks/" + kind + "/new": "/", + "/admin/default-hooks/" + kind + "/new": "/", + + "/user2/repo1/settings/hooks/" + kind + "/1": "/", + "/admin/hooks/" + kind + "/1": "/", + } + for link, redirectLink := range redirects { + req := NewRequest(t, "POST", link) + resp := MakeRequest(t, req, http.StatusSeeOther) + assert.EqualValues(t, path.Join(setting.AppSubURL, redirectLink), test.RedirectURL(resp)) + } + } + } +} From 7eb46fbc6b94ea8ac142d2eb6ae45670bcad7c73 Mon Sep 17 00:00:00 2001 From: Gusted <postmaster@gusted.xyz> Date: Sat, 4 Feb 2023 11:20:21 +0100 Subject: [PATCH 15/16] [BRANDING] Update nodeinfo branding - Change the values for the nodeinfo API, to use branded values. - Resolves https://codeberg.org/forgejo/forgejo/issues/257 (cherry picked from commit fa5130a6633d1ae41e0d717f2d94b7f28a618954) --- routers/api/v1/misc/nodeinfo.go | 6 +++--- tests/integration/api_nodeinfo_test.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/routers/api/v1/misc/nodeinfo.go b/routers/api/v1/misc/nodeinfo.go index bd629b87ca..9a4bd36203 100644 --- a/routers/api/v1/misc/nodeinfo.go +++ b/routers/api/v1/misc/nodeinfo.go @@ -66,10 +66,10 @@ func NodeInfo(ctx *context.APIContext) { nodeInfo := &structs.NodeInfo{ Version: "2.1", Software: structs.NodeInfoSoftware{ - Name: "gitea", + Name: "forgejo", Version: setting.AppVer, - Repository: "https://github.com/go-gitea/gitea.git", - Homepage: "https://gitea.io/", + Repository: "https://codeberg.org/forgejo/forgejo.git", + Homepage: "https://forgejo.org/", }, Protocols: []string{"activitypub"}, Services: structs.NodeInfoServices{ diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go index 2446acec94..669bccad23 100644 --- a/tests/integration/api_nodeinfo_test.go +++ b/tests/integration/api_nodeinfo_test.go @@ -31,7 +31,7 @@ func TestNodeinfo(t *testing.T) { var nodeinfo api.NodeInfo DecodeJSON(t, resp, &nodeinfo) assert.True(t, nodeinfo.OpenRegistrations) - assert.Equal(t, "gitea", nodeinfo.Software.Name) + assert.Equal(t, "forgejo", nodeinfo.Software.Name) assert.Equal(t, 24, nodeinfo.Usage.Users.Total) assert.Equal(t, 17, nodeinfo.Usage.LocalPosts) assert.Equal(t, 2, nodeinfo.Usage.LocalComments) From f1f7c119f3332ce1dc662cefa284a4cf083b627a Mon Sep 17 00:00:00 2001 From: crystal <crystal@noreply.codeberg.org> Date: Sun, 19 Feb 2023 12:41:04 -0700 Subject: [PATCH 16/16] [BRANDING] Change Swagger title to Forgejo API (cherry picked from commit 79f6a70b53421be9984a9ad96ebd0d06ab5af02e) --- templates/swagger/ui.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/swagger/ui.tmpl b/templates/swagger/ui.tmpl index d4d0889f9d..1a3a18b12b 100644 --- a/templates/swagger/ui.tmpl +++ b/templates/swagger/ui.tmpl @@ -2,7 +2,7 @@ <html lang="en"> <head> <meta charset="UTF-8"> - <title>Gitea API</title> + <title>Forgejo API</title> <link href="{{AssetUrlPrefix}}/css/swagger.css?v={{AssetVersion}}" rel="stylesheet"> </head> <body>