From 8d98d0dd3abaacdeaf183b9ea39a292ea52cae45 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 24 Aug 2023 15:08:26 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- app/helpers/routing/projects_helper.rb | 5 + doc/ci/mobile_devops.md | 3 +- doc/development/internal_api/index.md | 2 +- doc/policy/experiment-beta-support.md | 2 +- .../reviews/img/suggested_reviewers_v15_9.png | Bin 9184 -> 0 bytes .../reviews/img/suggested_reviewers_v16_3.png | Bin 0 -> 18574 bytes .../project/merge_requests/reviews/index.md | 11 +- .../content_security_policy/config_loader.rb | 2 +- lib/quality/seeders/issues.rb | 4 +- spec/factories/issues.rb | 6 + .../config_loader_spec.rb | 18 +++ .../gitaly_client/operation_service_spec.rb | 105 +++++++++++++++--- 12 files changed, 135 insertions(+), 23 deletions(-) delete mode 100644 doc/user/project/merge_requests/reviews/img/suggested_reviewers_v15_9.png create mode 100644 doc/user/project/merge_requests/reviews/img/suggested_reviewers_v16_3.png diff --git a/app/helpers/routing/projects_helper.rb b/app/helpers/routing/projects_helper.rb index 9b4aafe49b4..89536b9760d 100644 --- a/app/helpers/routing/projects_helper.rb +++ b/app/helpers/routing/projects_helper.rb @@ -35,6 +35,11 @@ module Routing end def issue_url(entity, *args) + # TODO: we do not have a route to access group level work items yet. + # That is to be done as part of view group level work item issue: + # see https://gitlab.com/gitlab-org/gitlab/-/work_items/393987 + return unless entity.project.present? + if use_work_items_path?(entity) work_item_url(entity, *args) else diff --git a/doc/ci/mobile_devops.md b/doc/ci/mobile_devops.md index 6969b3d4ef4..3c6052d8a3e 100644 --- a/doc/ci/mobile_devops.md +++ b/doc/ci/mobile_devops.md @@ -189,8 +189,7 @@ fastlane init ``` This command creates a `fastlane` folder in the project with an `Appfile` and a stubbed-out `fastfile`. -This process asks you for login credentials to App Store Connect -to generate an app identifier and App Store app if they don't already exist. +During this process, you are prompted for App Store Connect login credentials to generate an app identifier and an App Store app if they don't already exist. The next step sets up fastlane match to manage code signing files for the project. Run the following command to generate a `Matchfile` with the configuration: diff --git a/doc/development/internal_api/index.md b/doc/development/internal_api/index.md index 538b66124ba..b83ed3d49bd 100644 --- a/doc/development/internal_api/index.md +++ b/doc/development/internal_api/index.md @@ -1365,7 +1365,7 @@ Example request: ```shell curl --verbose --request PATCH "https://gitlab.example.com/api/scim/v2/groups/test_group/Users/f0b1d561c-21ff-4092-beab-8154b17f82f2" \ - --data '{ "Operations": [{"op":"Update","path":"name.formatted","value":"New Name"}] }' \ + --data '{ "Operations": [{"op":"replace","path":"id","value":"1234abcd"}] }' \ --header "Authorization: Bearer " --header "Content-Type: application/scim+json" ``` diff --git a/doc/policy/experiment-beta-support.md b/doc/policy/experiment-beta-support.md index 68cc96f118b..a327baa3132 100644 --- a/doc/policy/experiment-beta-support.md +++ b/doc/policy/experiment-beta-support.md @@ -20,7 +20,7 @@ Support is not provided for features listed as "Experimental" or "Alpha" or any - Can be removed at any time. - Data loss may occur. - Documentation may not exist or just be in a blog format. -- Offer an easy way to choose to opt-in to experimental features with minimal friction. For example, needing to flip a feature flag is too much friction, but a group or project-level setting that is in the UI is not. +- Offer a way to opt-in with minimal friction. For example, needing to flip a feature flag is too much friction, but a group or project-level setting in the UI is not. - Link out to the [GitLab Testing Agreement](https://about.gitlab.com/handbook/legal/testing-agreement/) in the opt-in. - Documentation reflects that the feature is subject to the [GitLab Testing Agreement](https://about.gitlab.com/handbook/legal/testing-agreement/). - [UI reflects experiment status](https://design.gitlab.com/usability/feature-management#highlighting-feature-versions). diff --git a/doc/user/project/merge_requests/reviews/img/suggested_reviewers_v15_9.png b/doc/user/project/merge_requests/reviews/img/suggested_reviewers_v15_9.png deleted file mode 100644 index 70db0d79eaf14a955b9e7373c6a6c814f36abdd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9184 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 diff --git a/doc/user/project/merge_requests/reviews/img/suggested_reviewers_v16_3.png b/doc/user/project/merge_requests/reviews/img/suggested_reviewers_v16_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3ecebd395378b1dae4222f9391124ae8b2621c GIT binary patch literal 18574 zcmaI7V{j!*@aP?E%#C?sY;2y`w#|)gW8-8`Y;3f#?F~0eDXqLdY-P!I_aAs`@7WTeGaAs`^p{#zaJ(En*p%eNi>+rIr2Q4oQEr~@Ir zo51{chICbx5{0OqBszhBfQC?(SC^1-l7D-9e|>$sy1M%K`25f2<>lq;>+Agd>htsS z^73+LXYcIn>hbaE@bKvT{Bmn+=koIA{r%(QFN3I_7)5t`~3Ra-8;R`{rc)+czBG$Z|3;;dnn|-AjHAJxvs8ZYHB(!FTbm+J1s3UGc!9P zB04%Mc4A^OJS;LEl+e-MSy)iKzkhIWa9mVWVrXa@8xvPvUeVCd92XaVfB$s7Ql6BU z;_BjMYwM5@pRA>&dwy~I)5>;ucvwzW@$~dUQc~8!!iq0s?pJ8|=jYes;|m=ftDdfb zs+txRB?B*yz))$y;=-(efG9B`O=|tViHXJCM%~5f(cJ8$i;J6*lA5T9oTo&YJyAm9ziaQv*Ew#o6-W!aIwz^+Nj`Bsq8pQFg#NtC1G9 z1)1fsA@Urwik{87;`~uohLZt$1Es-DsZmb)Dpl#A)6MbRP@l!!>$d6=OJ%vqmHp?J z_m0%WzaB~#hZ~Wqz(jq)u3Y!Si{}6*tMkkI>%xG>_@A36_f&j(*-o|*(lCD`-K0dg z+J5mo@3#eTKrD=ahsGASW_k*GPPO9}f+G_eyT0VL{^9xdZ1|MHTx4|`OFAA z|1E3iU-}bqc6#Y%DuDApf#IgAs0JZ?xNHdlK?)%wE~4(WdY-waL_UTI#?9W%8WJ8S zO&b`1>xV`#R#q0TMuJsgqAxJNNvvg137H{HXV?*$m=cc)91?u?{A`z+?j6hBNJ<*! zoko*aQcz;Q%P2psuKxVxtdgc=_RS3NzvYVqjasHsD@ELdVj{FG08YGcB($f4nSdi| z4?jCtSdb*kYb8}Ai7D%=D?Pp7QFRLz56>3_7g{YW9>;5FrcJ3*&HaM%j=ErQX?q*_ z+wh^Nk^hVyn^5+^w1>ifw@!rS1;vJNutH%g_h*PsJ11SWcxM$<$_TAu3~H_gBCgE) zXb5}}7_o?K9yR?pv}^F*`(8uc1or+DCv(*O#o#&_iSi$mo0pOwRL~`jup1%==09TH zB8)gRM_<>Q2{Yl-GHUg1dz0x1otyyTJSy$)mHo0K9j*dVP3G2XLUuq(^U}5B&&t!} zn$osBiQN)RBLiq*!G~pq<}B232&&c;1i&l>h)9EezVTcchvyHzYtGsjGAF&dtGE@e zt+#V8_$L`VKEj=ShuxwzHVWKiTE45O96$8vd)X3~c$($) zQ`^jS(n-YWs`Kt|AX)oNuN=N@g{4F`j{6bH5f&9=_Qda~#9@qshxr7{6Lz94X(1W+ zJXj;1;gRwC=^O11*C)S&+Xe4?Ka!a%%#^nZN7RL+#|H{=DOACM>E?0AY@3!}LK8?O zsyzC|SIgu^>GW}Tod@H}CADcqP-h&`Wl5{mpjqwWtS-^GcL}=d&D1jAb~6$#5S`a` zuW&4^MdpKH67D8azoHp)sc*kwEH18}pTQm<^ZSVyd(VxsyKx?$QDT_*H*eka68QDv zR8CPUrZLI*zo8N1hIDeQeuWQn=G8=*`;S8cN~GR$SVV%p`4ttGp1Ab-SuZ6|yMIs{ zLmZ#c6e*e1KNHym0ud|c*nYpf^(HO#>+>l>@ZGpFC-2ehT=1VxYKMcsN)@ViGt}q-jkpT@uc&D07q6T9;`P^cu=Rrs!C@Dc z62S~OtUGLat*^DUGvvB9D1Ll}oU|JmaR5bWw&P@`br0z9>AYFLSTGquo9l(=ATKD6 zB;Ix{={5_vtmnGg@+tl;)|kFL1ty<=G?u#6hfZD`h24OGPqth_V$|5KY0IIZv#`B~ zIaW~5k-GX>Sl2=0cSh!;GlHdT`((L4Jby?sgQos0SPT6*7QFm&D_E}(sKc`~gekor32YxG&?_Z*J;I5Ord6Ogi4Y3Lr&&+s>c1us90s*$?R zg!sruEaRMFq71k&skaZ~k=Sx(yF){-s|@WG%>JrWM1P>uR>RRn)Q)R{*jOrSL?i_d zkdvF@DT))9LhiL39Hq#N$xyz5%Gn);+lB)?39>2{u697*`U2F1W|LWI7Zg^b=L3%G zCcV9^Ei)XP*}bRQOfljD_!vJ2*&va^onUj=k2}ERRjHWv~>@$Cnlg&>(#Sy8~1h@e^r$BwmqQU6e?$CFPDgj3lDRwVDx+(b0|gva%ASTvWxP=K-H-R zB>Td6eQ8^9Mw&G9OxGJXn%0<>qQpL!VdkmsRh`v#cBvDybBRbK!sox9du6z&fv$uP{%;~gB=FmoWW#DOQ zK1;NU4>ucd1=p)5#rE$GiOJDWL5k04X|?d_+ua7+;AO;m0bdm_BA`AN8GOKHtDY9e$^AH*tKk>?;}##a6lhYrE0WQU8-K5!l9drXDXRq>@6z%HaQ@w zRNIUrx7K)?LY{T--&!S=In)WWW@1<130U0Izun8#1UoC5PB))K*S>78zQmj6l6sIQ zhnhsInb~v)K4Mnpj%Fl5==>mgrS^Br)Lor`jatfDb8;~gW5##eC6q-(_ceT`F_oCk zpsxGYCA;W8Q#gf>d;`#pY|vS9>_H+-E~X8Kcs0Lo4S2vmWC{6fzUxj@_Tm;(DO=Yw z1C$+9w-w{~GSg05Ki9ddquz|iOKmPabONSqqS@E1U!ksOrR1kNu&Xa^)j7m+(4=W5 z9T}9N!mh?_dBE6s{E@E?+i=VCS7xk-KG%%7pZ{@}$7?JvYB@qt>5FCaXK2(3_+N3} z;3dhFdg~;fFE&xd+$Qt~irL~@8gS@L#0;?a&{r4m4vBWAEtKoc(yC8UO%iYClM--j z7el}`I+%dlyWkqIg^`6hXo)G*wQ9EUclcF81J~t&s`zG4p}B1-?G-Mo{PSK*Np($4 z>VwA1ruvhAEl8Ux@bteAyvEPw?tffPX)fxsE2keMe0Q{Io7D3+pMQF352C>Mgb!?1 z%*eA}EBrlq9LRxYxQ*T_Al|yTZSRt@XC-Jomd|b7i zLf-0)L$w`rSJU-n|h@qa{?sWwui7rlz*umG5++58&U;8Muys70Zj^CjG z_%iZq&T5vRec0mp3%rl9bS0KNTQpI;7x>V0@&-b^oY=Z2L)GMf)2|H!dl;Zj(Ot5e zcrR%nB>)30Dq>)da4+A^bGaGx@$Vxg@ZBNLpLR`S_mQ|*4Cu2SLVCRR4BwZcw(ivq z_-S`QulnKwkk$Wbves;8%2CfAH>`nVmDttrv$1fHJ#H_f+rXPFzK$sLaMj6CexL~v zy)1&yHnEqUkZiAeeRH+9@LSn_mxi|RhJvKO#^5Bl_b#~L+LSr;3wEOegBV?HtI}_) z^+U#%jZcMtDDIefu+j<%4bmB=fQ=(IqC)~uieWiou$F|?DL(#46(>2Ype_uu@d~Bzfwb3zGM6l*mj*4( zl)%K1qxGk#(c)Q=CBaR*eTt4CR_@Z~s^~EMPj-fIoE8k$Kx}{meBll&5DKq1mysvf zes~8GuhtX)wiQAztJZuFLAwe9{te7e1A}wR2%}^&$p%wVfiA{hgf14Znim29@0`$i z&A`AAg_xme{u3$5=R2X9q zlv+5n*)4Caaf@kOSO}C47xp;Flztz#TB#lwE{K&Y8A8uM$|RD6szuJ+cLaGrO#ofw z?+rD#@hbDHCZYBALjamCP_r9QEWA*7^*}?*Xk?_@XcP2 z#pCe@>8$@Mppb1uHJ<5xFB|S}^lyy!9#H@M;e}lo-qlv6YTuJNJgzcC=hE7qt2Mu< zEwnKZ`kM#S2TJCa1O-rr<3*c6PfSYU0we9~)vDtzP^)|cu`4jV#UE0PvCw|A4X+9} zZw2M7yGJDaMextL0FB186aobRL{x$Rz>etg1%#@Y1MiQwiYzdJNJFOs!4`BaUcK&< zp;Bjne>2~rflyVq{|reU7=X}yO>aIM3?&RHIFHs3XA+w}jCn6WbWr@8^5D(VbnK4+uetj@QPbTRtL(_^;* z*kfXYWX#<4ajk1w1ybia+RSD)R}WygrRccz455RX>Na3k<0H<_=Bl?X_>2I`1%K=D z?ZbB9f`MTZijMixe3I%~tK0N$mR^T5u+6P@48wu(SMgsnH=tRo?JDWA{B2mAy=FT3rtqpPhhqRJVPHx5!O2kEE#?dLikzBi6t1heP75=ck8vB^i0YggyU})! zy5mzBuAJpD&rrv&a6;}oQlg%ouaiNvrw)p)fVVu)9=~JkGJm! zXcA~ike(8|toNXwUw+~5QeNvVIvtkBd?2x&?q^ESKlksiRDeW({T@JlG zU~+33F7a8_?>j~y`T$y|ur07YvnQTVrNEn#Q-HINGp&RZ0OvDrD*&Cxrz-rVu#LX! z`lG{jiJk+}Iu6`Ub`mFf6p=L_qA+(iBhxIZR-|XK2Y3yIR6`*)jv&C@@lrMJTk^B6 zJ~?2lx=A;Z?^w9)AJxgeJ^NMAIC}7^Zr1f;KoSUu&tTAitr0iiV|ud_dZR(hZ$Nz}(HZT|SvzL|Qk~qTmx{m1 z7g4@4@T;4h*$y4>GN`+d@2lk+fXKKCzHcn7PJQ&s$$yYwxAZ_7nKdN=_~2f6%e5!F zrGD^yC(KjuzAJe48n+dZ|BIdNO6}dUE23a$jY)t%J}SQOys-*a=CH$gWg^2|~1#-AgWsB)I`ZIY2v5EFAU2@(8q!0>Xv zKc>RxOOcL&Cs}zCd7kO9^bVpqN(cUgDOm!6*0eQc>mSWEa{B+saY5X;)hQ1n2U;&NU|z zh(MpzUsHC>aOZJY?Fn9j=&pw@Z3SrTn~k=nd0yxQa?K=zOGP+nKYCz6b?!rjs}beK zWk837s}h&CjzRbg`MhKKzhhB~->5YU{Op6HmAD&uQVs;?^8VuLpqs>ax{$6;5mnTC z@|B94wN8dsC{By2L7-)MJs0k~hiZiVrhd_mTmwyWS%wWmV_T}*^o!-N#!nwcAB#wm zaKts)&g5yz2DFV}FK+jBYhHj9OcypQT)ZU!z}HcShGw8|l+>T>MxI4AK6~%VB{7yn z6_Jf3Vk$saq?w7x&Xc0YaU64X&gpWkV}Qd;^*Q^R+^WC!q+|nXeVD2DrY(CRf2N`5 zC#b6-%9_3ds`mV7uQ1}lFh1@Bi`C`7cf-*@`duhB zyB2~nnIwO_vOF@@a!&l0J;#_lE^*m~Ij%TuVo=7GXDNZhb%EByJ`7hp zdHkClC&?m5DlMhla1|+;+p0;cf-@fIx>xo`Zx)*h@87wL`_B-IX?{yW^AZshnbMOE zhO9I>HUY4912T{-9JzZwU}!!syh_hTPJM1!-&B~?P;QR-Q@~K0%Wr$icW@fm-KueL zzHR92z^%94fsav`&JItpOu+O)q#wryvVqslZbVaE`jaH+(6OWgv;0&B<(IqXFE18y5|$ezq?A{IfE~XTZSjXd zUZA|1cPUUEK!=tRF}f#qt*z```uWS^r1r~R%(topr%qpxvZ1&+Y0)DxLUJMP^tz|& z*r$GVt99I|Y`$^tcc+Ar6Jwx1(vizE;nz5A31xEqP zSTNlMIiUf$j|BjpR>{?JSTn#}?LHCqEb*pV05ggAfR_3DPl4B1*uMC7qY}iwgP;Da z1Bd<~sob|X4O{f8pgii7oQ`2t(%dp2PbD}Z((F^iQ=ocHIC5mzJK2+jxH^mRIknw| zV$Z-pbQCT(a_Vi|_7>WEwxHUdXpp7b2$P*G6xy@wki^IyyA_9QAfUQ;i^po%`m?!9 zSP_IDl+Lpri<=pdp9*tOuKJa+G9pECL@YZfNbn3`b$Zw#U&-QyP&qr`iW3Q_H5STV zJ00fJ3y&(8Zp1+@HxGN`{6K`t)Sx0MA^g|3#|wd2d-;jc{ViiqmcS&fV+L+5`Kh2f zsk*85XLsU^9GxmgGXxU!f}EdIQgT@64xMtk+8RiZZgLeJ6sO+fB3RfYT4@dc?<7=# zsTHN3L{(SKa*e1^GM{(og^WSvV~iO6kZ6q*#zd1S$X;<-8v&h<{qSy&N02aL!ziARwN>%eF=9uUy~oWTQF+e!oY!ic-{e? zVE~?mi9f-rF?t=GykdGvExvI>1!^6n>Ko8*@Y$*psadJmkCL!^goT8Z={u zD5*AOH5{kYV>+(3H!|y`+^1t@mD{ib2IYv^7_k*6_<)-`L)6t zncOBp7{tk0#H`DV)T;e($4hLKT|)=$ND)V)V;nb z>O_zL0L(0i3uU09noqF{kA5J?MkN1w?d&MX&uL!3Gz0TkcMkd)(Y~jZm`zyjqvd&m z_iCh&dB9xt&rj}$8&ebgkj3WoDZWD9E0&LB6%@^HEJ)iD6pQ^7PFNFn+PpQiThkO> zpFxRdPUx^s#)W4BT$DmB-N)dA?S}=Nq+zohFI1I!R@Wa#t<`cXrR*_WC@HF`tp5~Y zuwHR-=k9T-O+K6R%0h-w<FjJ4ws0eCf#fN>97&i0R1b>jvA8Ht-si0*Cg!RoIw9jr}Sq>jweVnoX;cxarbe9= z^ifROowSotn=I9v+v0ANwN}SDcRFp6D5VR!kyOcu8nuHh)2E zr|i|+@C_b#P@wpXG;9QP%XCh|_s7WpvK8d_q`7HvNWAbfxXwG-#n_s9N0;&(`CV7K z;Z8bb0*tp#4U%Qu^+2!2ualdr?w6e`A>cb4bYJBASqBBV=~SO5Asn`U-nsD@e!!Vp&~sG##n2bK4lBbr}6Sjq~M6M;eg>&{=e_X z0r4~PA)xyMwv!lWMlBK!^<+3u9#!|pjo$9fQ3UAAJMZTCbtLfXqookFikxBX3%s!~ zSd{X22LiA~L|6-%(5z_5HPlG?{!JEb8#4bLOF2MXolYH7I8@TCg~!6ZQ`t<+{&e2F zp)13#J|Xi&gR|W=-$16Z_tZ;+hU~Aais^hQt^(hQ{F*$Q!XrOvbTfa)S+nL7@~YMj3DdH=#>f})kRIVRlv(n2o0+7)7bT6gy>4mWfi-&oPE@8;B0`-|BtH7P% z@uTCTZiD&_6twVu%pIramFKJ@{vd{PcCw7gwRu=LW=RcVOG{GzH|l!9_J%CemN3t9 z2&ApI$4gYicmF43esf@T-}Idph39ty6U6wanUN|E0DSz`=KGD2herMgf&Km0dyK$+ zUp(}#Gxle#%hADdsM9N6ZmZl*0_6VE(zW92uCZ3s9vB)l7ys<@aj<{9z0F0AMy-_> z7!y*@K^izkJ-m577|72IMr)ya`12~N$Lo2yum=VWkua))2SVYh^CqimvOlQ9h8>Z7 z#|t9+6N(68wi~k zJhVOVCr^^Lyvb=gS5um@bx4zNzA;cD*2iGpY^5FFeVC#z81lfrw{oOCn>zWCzwY%% z+|32Pof#F#)oD#7z{s48bN4XRda{d}GsaArm%f`~#biWhv_eQ!(54y}wb0E{#bQa# zV*GK^yQQMFqPMe>JU0yuLh~-5hy`1x`+oSC+|O*wGw^k>K05gX*Z_ZDdv({l997gz zGU>O=k0DQ;EkPO%ZM!T4aEIElAY?1D{eQgxT5~o;2RIGNl}mCN5LB?Uloscs(Xg}X zzZDCXCE8{4rz@axbx`=E+BPc-iA@5=85tOWggMzO+J>mil4*PFNjv7ImuDnQ6F(AN z)0k+wr;r`*>R|+D56Yq2u;wqy{Yq~LsSb)#T!Ymi3lp8_4Lr7siy+q_QN$E*LT8QW zFy5%_X!=6cLnjJG=uwG=V8=sW*Ti>6lwI7M%y`>*cv`=&Eqejev-v}nRWn*P$t&5i z7+i@6;xWmiy5O-Ec*88of`-81z%PWLNUT`PB3LTX>C7L$;a#nyS)$&H&XuOL=ddAMEZ(znuQSOcTc0Rft) zzuoKYiAJLu)t}GkMvK(j?>nn|2l9DaZb+xKGkn#E6@1%s)AgoNg>rrmrJ2>8ywp9f z>JG^AAiED<3h5l|j`O&MqQK)%!}FJ(la5|ffaLEAwT+-i=Y_Gu&=Lvw`Ow6^C1YE$ zRn!>sXQ@46-9Z0l6LMAWs}oif{+bM?)pbrpPjf>B}a%E9Y}-V(Anq&oEX*#}n1^hxx^z zkN!x9Kly$L$6h83KB6#-8SZCr97r9n`254WyeM`$V(k0JlIGmyj2Q}C`Um&;*Ku)D z6RL;?O3H9NDKT3C4O?EX^i~3|u2`XVtYHl)a?@~8E{#pAy92FcAQacd_s5p&$Ad9$ z<|Ro*<*W1V6a%J?=fSfcb!~61}7*t}uGKiQkb6%;@7Z z^(66B>IWzQ+C+wV(kIsto|I%R%o;pU92Z>-9OhgPOd^!7* z{1HAQYRS^mUCnOb}*kZE*4DlhL?q?kEehbwZJT^M&(TXJHnc$L0B|ATe- ziH)YVOBO2zW@4!w!mv$)aBN_=)5a%ZFY^WmldNSjs#K7FFVuEc?F;07-!~p@6u{b) z#0g1eFXN-_07%1ylAVo7AQsye(n=uNkQ$rmyidTiv}Qvhuv~WVLW{yy)P(!?Yw4&5g=_CxlO%dD) z^^aMOj7vDoQJQ(%ueK^06FIVXBl@~E>^XQIltkZd;N%53q*%f&c)19Ypzn4F*9V=L zZ}{Wj@r7~XA(X$-dH%~#r6RO+q%M_ozju&_0>na(X1)CTH*Y*cud(d?8ByxWOYWt7 zK(cwcjm=THFR2FMTsS>_mMrs~445w|^U5dpk(+Bd%56&&?~}~yP3rXHYh<&nyRpdv zGTW>|t&N=6-n~}fqkxjzoQ2sZ zOfT_%^WJnQ!+4JoRV|z=p|>wb^yhKO%O94oPw4*29Cd})ZB!qri=5{j@u`)!^bda9 znyw{5+nO-_v+HzJi=~DDUSND6A%D0ad*SL~mBC<$S~3CL1E8Uo0`H z@SM1yCe=*ZFh%P0`lS1Oq>{uLGZ%cL00n%ZXZc16wJHVhqN0UpX5l!a%@PHXmR-y~4(U*F!)YYm@2@e^x4d9bwN-1}6LQImqW zxSDeZA*`Xy0`NO*NwNpW>Eeg=bYDwM)Eyv{xq9JibkYgzyI>`>(U3y#wt|8)`CS9j zqrQP;*jbiyMH`4G@Xm)4 zcU}$uhhoY0%H|_%s7TF{E%raCGd)7R>itkteeQ?AN8=iFka?<3OnW~EXY?4W@z6j> zcvibw_=Qsrf!0_(3+J#2PiRfe5`v5561i{_Q=04XQ_;r5s%0$onMRK`?XLiw-(Ai0>~7}RlH)`-+E zIF%C%86iaQ-yz(37Zc@Z44dv$^Iw^|x=@8fQ6|e{Y9%&W(51+3E*^M8bIIQUJ~*yr z!qD!(XdB_;kg;^dpLFpg1!v%?(1HGkK2uk|53;Asv~XOIv1=xD@WESUzuh?kJZQz6 z0Yi~j;8Re!Eh&tplJJf^k%zwhpy`ADx*d9ew^NMSGQ;*;%qfBFSs`+!I9c#Kd zCoLgpq_SAV1ljO_U_7bil;O+}oe6OIH1;iVAHBw}Mx@%_A1k36d|eB6#vIBMXETL= zbuM4y3~ah3p-Pm{pBEEMGPX^m+A`Zf)b0oM|@w@11I;eh(vV2m~*0ku7Tu(uJb!8qu? zEb$~rHuZP4H6Hn7#EBNfsies}vUNIhX6&>$%wI&G{2T-Y!u*`hfHWI*VHA<$B6h#0 znOP!0D){eM6Dn60BRV2dz}sn0zcD*+pQb9=wUxE?Nd@#z+zr1aY5FzODq=i(MuI)n z)58V!Q&wmX0>{Vf3b~P7Ygx%bX^K?EIkhGCCbCm0NjUmK{Pfu~+gSIHvU9=E!cg7s zbk%qdS{bh80R_mcH4Yx}Zc#SZK-W%!Ns(@=_VZ^jF2JZQ;95^Qk5AO{uKa4|5%m`^ z_YXH#ZU0{JR*yIO*=*iRLfpWJ3<Uu<{>ly4-vm1$Z<)0Nd8xZ?aiVV z>uczj|D&$MSWy7>Gk1kA~dX< z-F2cIOR<2Y6)TFHI!SUhjo7|RdMK5ZrwLLnB9YxEEWfSVIeY zd%^EN$~27@qgcY2QqY>F78Wsc~kleQML8=}4ZMe#mE=~L~YxlG`E zeN5Y_=|FVb-dL=!Hh{s`B?wlZ|5+^ePgd2Rb^&?c!n*vjh4@{HEt2&{CV+g$wo<}Z{c1`fNQG)S0_>d9)P90 zBq~(CSrJ zz!TNf-UxD&vH+qHWX-E7@Hcg#(s+YiBxk6A|I6^ zLmj*|@$y3p`~6XPF;#x<5d53Vf6Oc zy~G^7`{z$=!rbG=+h&)){}Y(^DA#pumhgIG)zS0fDBXp(pgQsWmccnMHfh4SaKOXy^@Q|Ek0m{)=s9)>snyD*Kdjb z31{7D24-APL36uu$I#8T0&l_|M9vsxy)Wbk7?h?mi&T^ZdrR~+vtE2OniSCDz zp7)KG_V(8~r6+13Z)Zy1Vt@amvE9kYML!CmU7SM<2I~Z zAfa!zzyL~Wr*O|Uz)|7oTFtwc2IlP=3T}z(d8+3Tg4xTv^SX_~FcXYKjIz|%kH9gV z&n}f6Jd}i1y@19$`B4kAc5uT62;i+7qX+?42b|w7H>DYTc!6I<&hYb3TKvl1wZ>{B zg`8qbOG)7|N*)~15C|NG=)*4R=Uzozo%I8i-MVk>61B?*;q|`~6<=AXd&s*G;%pqi z%liYJnz>Q5jr6CXKKq7Cz)J zY6}Pf6=d{GEdTz`S!WD3_ShkoWC0UA0*>;0q+WcbUwe3J7LcrQkVMIfwBlmT%UrH<)E!F8)<1g&VS7i zFzE@TK-Nr;t2L`2xIKIg26NKL6cZGy&Ss|5s(7xlf1SIv#Z4!P&f1Psl~?oQBEG*S zm|iYkmOT>{EoaQOHg^x1tsLgMLcN@DS(vrwqsK52C?6WIV-v{5ux844_*Kb_54OFZ zzA>N<^gm6T>AAtb;jf9H$yycD60eosRYW>?lz2_=@7Ny9_N%)8{Q1+?wnY3#%8;Q) zhXE4}hjkq~dZu(3J-L|@BHu4B{hGOfBYj8d-wq^1=S&HBWDSstdvwy;$|C;q_+miuq;pQIo-!3an9 z%-d&RY_*qW$xM-`H*qowqz@sGi#Txl*SLQhr3Q7<3cjxh8f;W0arOk~g9B}!=tp#L zMg+>Cc;e$5Xb6TiyU?~f0Ua3)<7SxZ6?PK!ucaq;@V682_gHbDspP3f`Fm@kS1jRS zom*DDVvSd&90TaUdJFNkIu{$nZN>D#Uqr%@3S$s`e?PC=5xx^FFKJfOlm{)QF~VNb zrhuW0PCy@YJAXfKCrx@EDdpNitDA+Ec3duk5M>aILC#Bfi-Yl}TQ7@aIh&DYAQH}0 z9mn9O`sG3zvE)&L5ZaCKr&#MRHa2?=2i3Go}QnD~t5-TjK1EBkBG*~f=CY&=6e60b59cxJOH`0pbisQ*>9h#-9x zLI)+@J6oP8sB%a>h=S5Ogfey*#<>tGbIPOFn))67Z7!mDZ4(>hFmiTNy=pfc#)Ff< zZs4pP21zufbRqsJis{W+a)yaz9SJ_(AHNy)uV>>KoXQLq z=R_e_1r7dO;%L;u9+kEi`LRkiVPu zDH(C7m+wBabd;4|o!5CR|kH>fDpS80jOQH<)%AAwgH#_vv$6HSncbWrMm&Ba5 z8y%d;c$BX6$ecDL6@`eus{up7-@2@?G#5f+YK}x4qoqbPJf~EgbNY! z_L7pC9#z{INA3m#JI;tPkRw-X=5IsVN9-$id29Y!^; zqKB$v)QJ1>cinnKgM}vQ?vO-bqlSy%TaqJ^d`UEI}vKnDU#d2!@(bgz=z#93W7VmL1tsfzl#1Qy#aIiqE$6Pd0 zxb0yP$mfl#z$Df$gvuV09y?VbiAMnXBE*zEL66%DF=qs1J1GM~i}$T%WGac|xFz;X zxW6-a2O|b_@&ID2ieA=(RA=%F&+@u3&%$W+BWR48s6O5w=4%IUKZF9`^9R|0CipoS z40ztL_h$P)@Q28Tf3&Jjr@aL}P6{no{dHSbA8aDQ90*`S;W>FV=L_lLCuF6oe-rs`rCBfmC3 zn_7LdRZ(3WsjZuGN89wO-S~}Gi|!65;-5yImO8!XYA|XhZjzl#Rz_Da87>hTlF=m> z`w&RnMo4By-E{Yyvj3LHi6@l{e9I9Py*}K#4KL)*kXrjXSL#T++JM<4xiaweI~|=Z zES4&{1hzZv^l80)-E73*GI#4q&z<4Agl z{V(}Wg2~A}geasZ>mF%dKkKn8|96jL(I{~=IfPdgb&nb?AT#UrvIL=|zY0s=|%Q>T$z$oKEJJX6wUp zIEo>3ib*A_TH{)-M05bG%u2zJG<;c@ri@;qCJkT_uieXC@tLvR>+Eh0SZ*KV@KLJ; zpx^yI@M>=HzXBBq>i2cE^z;K2pIeY2MNMp8iExPL!N$!)OdyitOnEDv%(T;b9m2VN zseDn{DDbco9)lz_`@?+bSm(j>p%g=UWJA4P=Xg&r6t)eiBX-R5pm-iJU5H`SowhC0 z58kDEz^B(I4$WP`v2EN0?S;u{Mmy z(U6wdOC!f*l5ZnHrvufn+mDT5budqYF%As~r^-g74DXceIu@~E zfBnFi&`_xm2Y0 zS|~hD=P1l)p6y2Az9f|+1S&HN$ktfqb4#RX&AsydR)&V8t@8D`X;f}yQDwG>dO5{Z z9Y&6Hq&E9{?tRxglqtF~6g&;UpYDFSxOjGd`-dy5E5v`SuB?=v)(8ee$&@>@6F)p2X=r8>7k(VVb82%(4brI+&UctZsN!Wdy1 zNw?j!k%!1bc_4(R5noT{qHtO^^7fh-cs0E z(()VNQ4fRBdRSMf`BJHg(*h3yEvz-}5?bo2WlGz;CyYXcq;Mg?SKz9v93Z@t-+CxJ z;(#p`RIluOd5Z1ABX+dzbqm>RF+xvaSG7t|r3_T<39z4UFfIT`wGRBoTF`A1%&UzX z-s`s!kN!R=Ii|8Qz4g#)A}U`OSJpdK#(W{&2%$0LXsFc9QXQWjIY2-hUYM|uO=Z$V zY|3U*IYI|u+^&T1z@$gPm?V5}YqGNoLXAmv%tTJ%Q8#P>kYCIra|GIE`=-Z;jaUFd zpa7l&ppyZU6KUuGg{i4t-aMe{#L&VqqB?02Ky*em(lGUJxW4;slNl8h}m)yUwNH zo`ijy@t6xi*aTXkZnOp->W7*s2V^GO;Ng?jCXEFg6nIQn;-CqhHETY1K;Kb~u_1E4 zCIB>0azalaj!I;cVRE*}8Q6cE?ChA@+e^Ab+2~Pa4cun-qM7CG9CSk~=xzeNRURrB znH!s&9Gy}MJkEP0Al(HzyMP6nXQ!tp$EItYb2iw;^YD*JWCcIm1^tDFLBQ`UXm}oV zP!~^xaAwLun$Z>#`Uy%6oUjUjw`P^hC`*qqWnp>rRJg^^F - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/368356) in GitLab 15.6. > - Beta designation [removed from the UI](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113058) in GitLab 15.10. -GitLab can suggest reviewers. Using the changes in a merge request and a project's contribution graph, machine learning suggestions appear in the reviewer section of the right sidebar. +GitLab uses machine learning to suggest reviewers for your merge request. -![Suggested Reviewers](img/suggested_reviewers_v15_9.png) +To suggest reviewers, GitLab uses: + +- The changes in the merge request +- The project's contribution graph + +Suggested Reviewers also integrates with Code Owners, profile status, and merge request rules, helping you make a more informed decision when choosing reviewers that can meet your review criteria. + +![Suggested Reviewers](img/suggested_reviewers_v16_3.png) For more information, see [Data usage in Suggested Reviewers](data_usage.md). diff --git a/lib/gitlab/content_security_policy/config_loader.rb b/lib/gitlab/content_security_policy/config_loader.rb index 9fb3c7d362f..59a4e425b85 100644 --- a/lib/gitlab/content_security_policy/config_loader.rb +++ b/lib/gitlab/content_security_policy/config_loader.rb @@ -84,7 +84,7 @@ module Gitlab end def allow_lfs(directives) - return unless Gitlab.config.lfs.enabled && LfsObjectUploader.direct_download_enabled? + return unless Gitlab.config.lfs.enabled && LfsObjectUploader.object_store_enabled? && LfsObjectUploader.direct_download_enabled? lfs_url = build_lfs_url return unless lfs_url.present? diff --git a/lib/quality/seeders/issues.rb b/lib/quality/seeders/issues.rb index d43b91167ef..813ff0bf097 100644 --- a/lib/quality/seeders/issues.rb +++ b/lib/quality/seeders/issues.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require './spec/support/sidekiq_middleware' - # rubocop:disable CodeReuse/ActiveRecord module Quality module Seeders @@ -85,7 +83,7 @@ module Quality 3.times do |i| params = { project: project, - title: "Sprint #{i}", + title: "Sprint #{i + suffix}", description: FFaker::Lorem.sentence, state: [:active, :closed].sample } diff --git a/spec/factories/issues.rb b/spec/factories/issues.rb index 3f17d4d5a97..b0db17875c5 100644 --- a/spec/factories/issues.rb +++ b/spec/factories/issues.rb @@ -65,6 +65,12 @@ FactoryBot.define do end end + trait :group_level do + project { nil } + association :namespace, factory: :group + association :author, factory: :user + end + trait :issue do association :work_item_type, :default, :issue end diff --git a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb index dd633820ad9..6d24ced138e 100644 --- a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb +++ b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb @@ -205,6 +205,24 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader, feature_category: :s context 'when LFS is enabled' do let(:lfs_enabled) { true } + context 'and object storage is not in use' do + let(:lfs_config) do + { + enabled: false, + remote_directory: 'lfs-objects', + connection: {}, + direct_upload: false, + proxy_download: true, + storage_options: {} + } + end + + it 'is expected to be skipped' do + expect(described_class.send(:allow_lfs, directives)).to be_nil + expect(connect_src).not_to include('lfs-objects') + end + end + context 'and direct downloads are enabled' do let(:provider) { LfsObjectUploader.object_store_options.connection.provider } diff --git a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb index 9055b284119..bd0341d51bf 100644 --- a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb @@ -567,20 +567,58 @@ RSpec.describe Gitlab::GitalyClient::OperationService, feature_category: :source end end - describe '#user_cherry_pick' do + describe '#user_cherry_pick', :freeze_time do let(:response_class) { Gitaly::UserCherryPickResponse } + let(:sha) { '54cec5282aa9f21856362fe321c800c236a61615' } + let(:branch_name) { 'master' } + let(:cherry_pick_message) { 'Cherry-pick message' } + let(:time) { Time.now.utc } + + let(:branch_update) do + Gitaly::OperationBranchUpdate.new( + commit_id: sha, + repo_created: false, + branch_created: false + ) + end + + let(:request) do + Gitaly::UserCherryPickRequest.new( + repository: repository.gitaly_repository, + user: gitaly_user, + commit: repository.commit.to_gitaly_commit, + branch_name: branch_name, + start_branch_name: branch_name, + start_repository: repository.gitaly_repository, + message: cherry_pick_message, + timestamp: Google::Protobuf::Timestamp.new(seconds: time.to_i) + ) + end + + let(:response) { Gitaly::UserCherryPickResponse.new(branch_update: branch_update) } subject do client.user_cherry_pick( user: user, commit: repository.commit, - branch_name: 'master', - message: 'Cherry-pick message', - start_branch_name: 'master', + branch_name: branch_name, + message: cherry_pick_message, + start_branch_name: branch_name, start_repository: repository ) end + it 'sends a user_cherry_pick message and returns a BranchUpdate' do + expect_any_instance_of(Gitaly::OperationService::Stub) + .to receive(:user_cherry_pick).with(request, kind_of(Hash)) + .and_return(response) + + expect(subject).to be_a(Gitlab::Git::OperationService::BranchUpdate) + expect(subject.newrev).to be_present + expect(subject.repo_created).to be(false) + expect(subject.branch_created).to be(false) + end + context 'when AccessCheckError is raised' do let(:raised_error) do new_detailed_error( @@ -641,27 +679,68 @@ RSpec.describe Gitlab::GitalyClient::OperationService, feature_category: :source end end - describe '#user_revert' do - let(:response_class) { Gitaly::UserRevertResponse } + describe '#user_revert', :freeze_time do + let(:sha) { '54cec5282aa9f21856362fe321c800c236a61615' } + let(:branch_name) { 'master' } + let(:revert_message) { 'revert message' } + let(:time) { Time.now.utc } + + let(:branch_update) do + Gitaly::OperationBranchUpdate.new( + commit_id: sha, + repo_created: false, + branch_created: false + ) + end + + let(:request) do + Gitaly::UserRevertRequest.new( + repository: repository.gitaly_repository, + user: gitaly_user, + commit: repository.commit.to_gitaly_commit, + branch_name: branch_name, + start_branch_name: branch_name, + start_repository: repository.gitaly_repository, + message: revert_message, + timestamp: Google::Protobuf::Timestamp.new(seconds: time.to_i) + ) + end + + let(:response) { Gitaly::UserRevertResponse.new(branch_update: branch_update) } subject do client.user_revert( user: user, commit: repository.commit, - branch_name: 'master', - message: 'Revert message', - start_branch_name: 'master', + branch_name: branch_name, + message: revert_message, + start_branch_name: branch_name, start_repository: repository ) end - before do + it 'sends a user_revert message and returns a BranchUpdate' do expect_any_instance_of(Gitaly::OperationService::Stub) - .to receive(:user_revert).with(kind_of(Gitaly::UserRevertRequest), kind_of(Hash)) - .and_return(response) + .to receive(:user_revert).with(request, kind_of(Hash)) + .and_return(response) + + expect(subject).to be_a(Gitlab::Git::OperationService::BranchUpdate) + expect(subject.newrev).to be_present + expect(subject.repo_created).to be(false) + expect(subject.branch_created).to be(false) end - it_behaves_like 'cherry pick and revert errors' + context 'when errors are raised' do + let(:response_class) { Gitaly::UserRevertResponse } + + before do + expect_any_instance_of(Gitaly::OperationService::Stub) + .to receive(:user_revert).with(kind_of(Gitaly::UserRevertRequest), kind_of(Hash)) + .and_return(response) + end + + it_behaves_like 'cherry pick and revert errors' + end end describe '#rebase' do