From acb79329e5ab48539584354b129e97d5bf7cb06c Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 21 Jun 2017 08:27:45 +0200 Subject: [PATCH 001/166] add blog by @grahamrobbo --- docs/other-articles-and-presentations.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/other-articles-and-presentations.md b/docs/other-articles-and-presentations.md index 8e3946e89..ceeec5749 100644 --- a/docs/other-articles-and-presentations.md +++ b/docs/other-articles-and-presentations.md @@ -40,5 +40,8 @@ order: 30 Mastering SAP Technologies, Melbourne, May 23rd -Graham Robinson +[abapGit – so easy](https://blogs.sap.com/2017/06/21/abapgit-so-easy/) +-Graham Robinson + SAP Teched Las Vegas --Graham Robinson \ No newline at end of file +-Graham Robinson From ee07a0edc61ffd38f3615fed8348c0dfe080bf23 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Fri, 23 Jun 2017 10:12:07 +0200 Subject: [PATCH 002/166] SOTS added --- docs/ref-supported.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index ad881886f..e61cac915 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -47,6 +47,7 @@ SFSW | Switch + Assignment of Objects to the Switch | Yes SHI3 | General structure storage: Definition of a structure | Yes SHLP | Search Help | Yes SICF | ICF Service | Yes +SOTS | All Concepts (OTR) of a Package - Long Texts | [#792](https://github.com/larshp/abapGit/issues/792) SPLO | Format Types | Yes SRFC | RFC Service | [#155](https://github.com/larshp/abapGit/issues/155) SSFO | SAP Smart Form | Yes From 0f26b932717f0466c49f48d88bdf679b7bca8c71 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 24 Jun 2017 06:24:29 +0000 Subject: [PATCH 003/166] docs: update screenshots, import zip --- docs/guide-import-zip.md | 2 +- docs/img/offline1.png | Bin 16307 -> 6496 bytes docs/img/offline2.png | Bin 4353 -> 6862 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-import-zip.md b/docs/guide-import-zip.md index bd985afea..e51f708e6 100644 --- a/docs/guide-import-zip.md +++ b/docs/guide-import-zip.md @@ -6,7 +6,7 @@ order: 10 1: Run report ZABAPGIT via SE38 or SA38 -2: Click "New Offline Repo" +2: Click "+ Offline" ![](img/offline1.png) 3: Enter project name eg. "abapOpenChecks", and an empty package eg. "$AOC" diff --git a/docs/img/offline1.png b/docs/img/offline1.png index 1f12d9bcc63a7b92eaa833ce7c7ec4d883d7ab29..bb7a52f27a59f8d8157f8927eafd472ec5bb5036 100644 GIT binary patch literal 6496 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 literal 16307 zcmdVBcRbtQ`!`Nov_-Ym61$~E?U+STRaz9K_HJWuwP(C(X$fj8wQG;qD`r*fRm6Zt^+@=S<0%&5)qX}l3%rB=cJFrL3l>F$OJV#h^D!fYK6J+l^{#$!T?*8A?7-8Wg<`6Zxqp7b;>` z7JLu<^SVWtX|--IO{*RCo6z>3*V*N7Ke?iG$0;;G0~E`ievdf&I;Z?|K8?KVGMaYt ztn&D@ArD_y*A-bd>#f)O=RKSIA`&hudJ+AWugYmQ9QBWCFvt*x&EfSiev>DmnVi7O zCU~=FY zE#tPq7~KUVV;by6z!j)FpZ^^89G-6W$WuR>?8_1fFBK}f_*i?m*uQ|ClFLt)fVPoz zWVgv^80wvRiQNQ+DI18@P_bwi3`A^ngs&j9Hz5dI{_xj7?bb^sxgLU2t@)ySp04$| zq4z`S$iuN1PRNfR)snfzF?m&|8HIlp*IR&1IZHks>OrOoA_ow*VugE8CHoerrV7WX z#0W+9c&&j0OBM9UDFfeAcKM>sI8M_GOD$r^0Ww0hr!~uFSr4~XtLKCEF&IWfsOo#t zlfQL;8))Sxq1CeH+AOLz@<(rwkZG7f=RHjh0$6Q?2dpqXWEhsa0a6+%4z z%}kAPYwkPfm#u3TFbjDme|Wx2>D=Vens!(BDB5-Gc;um5E4cb;{6@hQF8`8UjY{f=*t#69n~01*Hzb?ZT@5bg4(&qF{Fz(;{B0W z%0DSjO)r`dP(tbc(%PDQBffsZb4ps7minpkZ6)eZx*;`l3T0Ywg4o}=a)v5`hsdZ3 zx?-Je|gj&$eFfEi0cD z{?KdaFzbj+8lN6Hi5NWlQX@%p%ENq(96#9uvbiAN6)drzFNAP*XSC@#Z`3JB6moxhVRGV1}w7qKyJ0w&AwFxI*M1}L%A)~28`R2_&-#}EuMGD zV8tEet4_o4o1ZYvvYo3z=C5LpQ{hs78pPyB69SN#~^xuFUdI$5`Hdw$X3C-7~A=i6U_nM^%Hm;9Qd zNv|S@0a-$61o%AjSlVI3pP!y|J(`rrJxT7$R33j}xa zoD*x0JwzXOSkFxm!nkGaH!<5YUfR|HkV!}8y*rgB`>U#JhC2AZKJ1W@sG$lG5nm!{ z4H}vSQ?G(KyYVw7rLCiFp6Xt_H;_A>_h0i9W<3iy5z`fLb#qiCUTkJ?ZaFEW6)+w( zpb=naScD%yA;Q~@n?#~DO&UeFVxA6qJIh1ZFckq4e{1Xy8HG~OkHz$FOvW(qg zVPuw)v3W_%c1FK*qvJSxgv1;c75q*fWlDuhE74#mzCd1>haCSX)fl4@CY|DSCM(yD ztG|l>#8o)(D6T$wNg)Ou?PvIywrl;F@nfCn>AY^o5jCj8V9aGGkoQrU&B&aBvI*FN zYz$|@=-5HEY78}LmfmR>5i@j0IPF+Iyodby0-y~C^mNIyk`dz(dPjOpBxZXx|2n83 ztP=#G_*wa7QQz)YH}jc{QMRc5X?S~riv5q$%IW}-NyEZ)aH6E*Y2lyBGHct)k5sth zB5CS))Z%XyOKuNdJWrvSrA}*k!H@pMIPGXN463!;@lDF5veZY!wPL{%Dafgn?#NBx z2$IZ+70!frO?`Km8uCAWnX!QAYbQAH;9m`WaGQt5$MTtBHqP*kL2Cxb#;7F6WK4{4 z%hQz5fDDNQ*qtwyFoSAR=;xfyqVx;oh=X{z=$&4AgvMA*z0sI1Do3kJi)5-?3GJ$# zc9(nHq4a3({WCYw9?Ni1oj4IG_s2R5qV&6#^0- zIK(CZf(mkzkFfs96z1-@+?~nuY9~1Kg*?B`1ysijFs{up(PR7!{8`CMmKM+Zem%xJ zjw7n-EpOw}z)J9u*6*W(da|eC`8_Mb^*5O#bn>|s(cf%&%n{oEb7>!`WyuQ7#I&?S zM*6d~KR!l9*YA($Dn`iB_M*ohM4iQ-OUtuY7S*GM~dW4HhVcu(pq#t<387h9v;%WxF(fn27st)~{ zyR;jygI6U~Z4BEit1s`iW-w06BscB7}b@5ZG4B(Cyfh0+s)=)T^bFFXppsxl@o!8YnyJJsNcvagz$(pY=>9Vx zGfyxKCVM%&*jNvAt!8#+do>HP+xS*I%-0n1>_$#6_acFc`sd#CR&+& zj=a8-5_z0^+*ouN9FLi=l))EimJ zjH;vrwG$Iv?H3H@0>kZ0ntjnw_flsMztyhEnVwOcPE;dpp=9LPNM2b|@XuCOy#?4_ z<>c9GWa38X%)s#>qmaUpmVr#ram%1XcqDpq>fvH!S6ZV<^AC6CZCAYRmbCuG*~h)j zSlS)aT-d1Vih95|gyR5pi8Zc9WndA5{>9 z)DnVArFU-q`A>Cm1Iy*ws)L_pA9L%S39p#~okBbpU7rZc7#iqrLl=kG z4$Wb zzPcpiGn%J|h&*;}Xbn`oCxD+>!@JP%UV+mhur!ibQI{8i{_i%$Pz+=7lg;o-N8TDo zo_3EH!WkjWa4YRaY=cPWAe%`3)prb~G;|f+pKi#q8@3IyX>pZ$extt|%DA;;E1>6h zv!vBc`MB4HYAKET{7Bq)f}U%$#%^CEF=I^g^!+Kk8;MK$(~dt_>0d-1XVqK1paK@P z@$J5l-EiM$lGUxTXXU#dZO$pgL|zxL4B~F_38?#R${|vuWmz#@Swv1DT7A6-SZ zjbhFv)f-OF+|FD3&rBFn22xD-ct$PFVAgO>$g^Y&Eb3tE=p~qKbHc~_&&I_a1#$>6 zn}qrpt)xd*-fq?KEt-Vw5DUOedjsBkgBRD%+lOOfMH0z7L1($YgB#+>gfm`0@DF=Q zSa=jK5(AeFwxEC%ex!4jzX9(Wl$BC3KU3eYfoiyQ}h@!&UJ$cd0MAAAE)FQEnX00=1J8%9D!?cSNJ5M)Tzc6iA+6evY+Q zRJANC>lvgy&p_{Y@aYZA1W1@k`D7)7B7eC)rQzY!WmzQfg@&+X~Pv* zrHM-VECad@`zjzatsTz+@|?G!6|f;6sEq*pWiqxJYh1D|Z8GCs%9S)IGa;##Ft%e? zDJ{=WS{#D{)T(}duvV>5>KV_r4e`w?Xm)Uzo{pUU)|k3B-=ETL`uoc^WKEESmTxqV zSnf~|zMJl>h%s7$){XJFB|d_TSBPQRgS&i>s|mUoXs0Bbsjj^EJa*aCIp4@2TzVNPsl3XAa1i&31Dpf`6FC z^IMi!sHB2JJN4!Eg&xY1aaghhTfj~x^wKq;J;4+mWVTzg!`V~!ecDD_!%*A9IoagN zr6M{J2Im7wsQ2rUu>=~^WOfMAb3IZa2pZqn41+t0zA)&ur z{nyQn=N}UIAvW<6zvC@cF4t|}|@zZQ>_al2;dhCVulCqg9{KAs|a6u_mr(?BG zZP&ydG8M8^DwU|Xzm*TXaAD&v;hBK37N0@HHIueI?}$e{BNarf^AewwQ{uj1gYvfLn& zu+%hq1bHJZF~-B;pj3Dv@+MJ3lbSu7bydmj?8CbSGP<}kgB3A%1iEiCIUYR8@dWDS z3mC`eDt9~7AS=Z8pgb|^zJMmJ6H6QAlaFtr!CMoyJ8|^%0vbENvYT|2 z9?DisOXeI7e+ZVMC^+u1*|az@ej=l6rb4F02^pW04mxs`Bba5gfBJE3mVL}41+mg2 z2gyMc@Fz{Lmy2X8nod)`Wvp%-;(v{)x#3)?_h2uVVQ4K(Og}2TxNlap#?c`m6&z0} zVr&4N6noIgQJ)Vi20Yxz=@;#R{{S-LpZ!3*mr!PieA=80DhOH)InJK|jwVSe52I9T zKO6Y$x*tVW0{AQ~iB}ugx$`y-6tr93-tPq!fIkEqukb&B)LQQB1~|j99SPK$2&%~8p?-WFjx{AHgq<)A2K8=b?lQ}X?Ks; zni&c$LkV~fMS5O^H075 z)Q)9Zl2Z(_^{m8E3MPGk@!!O$nb#_~y%hue;J{}6_&v_=6+xRK+hK!|UjYbqvr+A4 zF!$U>=H~fFXXDuIEU9)1dr!bb{U`txzl7or`W12wghjuBbDBdfDMs_aZ3CdB{>-|K zoUfi`FP9^YrYpo`Ozos}2YioHD<{R`10&6@5w|Jvrc|DLqN$22BF!kKyRUx;&dF*v znmU)fnGdM(USZLG>Wv(yGb~uF}E99ecV^s>1qk~p%Wji=5Uq<=fMsJXBnZ|1ppI9(rKOh$y z8#~UEzFbA_m0Q?Lf#%tRLz|5xaoObeaG1%1{Lcm<2sQd+6TYKgEH$^{Cq+D>VHxF? z@YJ+ZFxy#{2HkyhckLKU_Sd^Fp22B(7xG)Jo0Fhveq^(KPc6*Q9ab~pP5d%d!LUF5 z(rHGYBs#(<<1HRjzfkolFZZ^Io%Ws$jYcNVygW|V6FE#Os3aAWh)n)t6J4jB@0VGu z=FV@vFQRLtiyXhOuQ<+(kD<_txk$B{ZuZ}K{bXVHDKCWa6|o$Xd+NP#vSawGei{Bt z7A=4QZ{^c4{-xE}4{iic^VRk4eriNeSy713zi}11>>^;PqOv|c#2Q5dhgS7)8L-FNo&(| zo>tWF{Z1!O{DjWfcaph>l5-q*NIV1pA*`o|GOmA$i@RMu86$E^uSp^lOf8l@`pBiY z{EU;QeJ}kL)gs+jiDr?!;IzW%8SZSqaU4XqwGeDiU>%>o}5aD5Qa2 zGVwT65ZQCk4dSA`sunH)^a*7iQ}Id+(4xGS`fU%Aor%x>0jLt6KlA9F}3 zfNzwIH`PtoA?EeH{e}y1OS@|!*+~AL;^ZDaWvhj?^A}K^g3c(LEoseZkz!#nB_hjZ z3Ck)D+kKI|o5t^S=HhvBNp@gYM$CKC&vDWhf0$pK@IuG=rLYS9)f!>ZIl zr97bk`y+X78FX@^>+W3q+*4HUqWGD6Dw+|6?J`00v~-ZO%?6?1?hnDF#B%NAZ{8kn zp=%M=LoW`m%|N~9m@Q^HoJOrZ(zZRei#pPZPW-aZ?FgHzYp1h*4TUtg$_PETvwU=Y zvq^K4L){Buzq9<|281n@%M7>H&!n~)aP}?dvC5k?9w`-nHEU70zaw)mziaI6&rC5D zFUP2x{&l~b!q`(WT6nSXlX8@RO_e0N(K39rxln(80VAif_Ws;u1{agAA(NPa^b`eB zZ>@Ab2}rC)%I7tipQD+C5b381jW4dC;!RhM;;f^ z^@GCKsFrFF=yw>IoVVE7VW3RYh*fa$OD?0|dmLxk1pFPkmU&yk?4e_8g8v4Fv;fwvh2@Wiy_PzYJ8 z1=RY-dC|Z0NHCY(`)|-?G45HAa*K-{T|&tMYB`(`VQF_I+Q?;En!w|`?F^lH>1rEt zmjqJZs31>#Cr<{S=sf#2_Es8P$g@Z49cPC%U`)=wISDK_;55AqXJ-lXY}wZOs4ajA zGiX%mznK%mr0I`v4oAr@tDT#p0a5{{0=#rteyMb9oMR8G)cS!UE7@2y*Y?OJjT&YA z>}7=|(T#peO%b_eX`*7nKqK;r(3BKhDK&L{!)c2FywJX3U~pG z(2?~i&$ZoSFe1TprOHX_X1j;6cq(7Y(8a<=P{DEub|(@=eZN=bn2MP+Zc=>WuFS5) z&*~1UVBSjrtCunylgkciu%)G?8Wqvy-*vJIIgy=je`gRKz8ADLdO6v_s)iZtm>zh$!TdpxYhfSN>vOe1gb;r|-Xk zf%X7r6+i>RygPB1YZ15std|v1`B&L3hJ)k&HiF3Hf5FyQ|1tLbE)WMgOU(X~Y6W01 zf`2XX&l_c=RrFtqb%4TLr#nvm^^TQRO<(54wb~&Z_8u^z#dq*JlnZdNpX9(VQ&iOD z5Te+xuuGYyzxiucMCPoJ%T`Wmx~ss)^Y8!D-Pr$~QSkpaLvyVEf@?%8U1I$p^uS+V z8!q&b;QE&lJ0r?-EqWZS>|X(Yy)AdR$Dkm%LzgwYE)93z!MM!||Iz~#3b{dAo5|cNl!SqV&gHhVU--p*rV)@s;-uYn;Q_Y<^8&u8KJ4gn5J4S8b%Taz)07Cm4*zE*L zOh4HKN++teYPkeDaCW0RPOzIRn8rQ>$&4wVB#~UYwsQ*P^WGCFB_@Cuqk5+=bgKo! z>yjfT9gO90F1110y9l|aNB1|XlnYG7{;=)Mla?rTu7*pz!>UQ7L|kc`$2Fp5fTXF&5no>J=ch7E zhIKDgyH(-v&JI_-!LmQYk}OL`M3h4Z89r@s;|WOs|6~#Rb0xS}9@%*vbk`i#nkq}S zdhr2?pOwVFo$6IWuK8|gGBep38r?jGws??-GFH*PYAv^&HQ7Vh8ynpCzZXg>6s%kM zni3>I7w`e{^!h?&6IPRHPEk zry06{Z7RUJZQNDbiK)j~Pf%e#;Gr|pQ-kg#sG62R$buWPH8XRF)h2!}{%{R)A@=gI zkV4b3;uMSf(gMC2-%?%52iTX2VG_Z)Ex+W{Bj-i~G z@S$?=5^qeCRhp0A$z}_Y6Z3xr!Y7YhgWVSR4M6de?G(i?g-eym8PFYZ_?2=u2_{Mw zgPlxxz@V$ZSV9bVOZm}0tw$!Wzm+v?3jfqBOnkp)+;?p7%k1n_QNTmV8kA8@lwh!g zqlt-2Pf0{F*p&+@O(iX6EGEw8W8~ayDKIt^Q73)#QLCYeKl1vdAFyRS)%lM+)sdXc zLaLTRkY|OYQ4iA6z?mVTbolH0wJY8d=rkR~1OcNLG`W!#l#;w@JDWxs<%5D6PU9dI zdlKf;-+MtfZ=8Eni@|xP0{k)O+y>3XD3f4lN>|>&ybQvixx|WRTRW3Ptb~tgdWteQ zv1(PT7?sEk9 z&Bf@GiIciny`lDEE)(HSf337<)<7&%Xw22w6qnI5SFb2AR(8u-v$F~P@RUxj+&vgZ z+#8NMpTP5`9^nRljk}^Igj^Khiz7IFx2$o2Xu4hy_BinMH~6{L1ISBWyl3UGcw_a7 zh4|2_m?29f=`O~AT# zuU`Jk4+NR>^|GH)QQ+yuTVhcM{OyCV4Bi}O;0#G*FoUfNXF=XQHG>IG_+$&O3|JnS zE6j2qvEvF4%dcU)#6;`)ZHLe>oulpI->YDM+CBNtHjm*>Z^qGWB#f?)97FRBp~7xvRTnL;ZgsrS#G!Nwm*3VZ+M>$V28 zhF5>h(jQrBmoA-z@-DJOSw8zH80=rqz~1#>e#b?CJW<>Lo4n~k|4%sL`}{Mf-3Ifp zEh)Oyw4wlag+L@@_0iJI_A?uO2+rPsX{0Z0lK~>2E)_vFv6hj%Tecia)Md3F>i_vDt#Nze!|H@vb#6&&8tUn>*6V$22i^Ku z!M)>No{vl+_~={N0Jind_E^Oslx9oZf?fREn?{(k>-3thGzOnM=;NZ9n~Tdg@S8}S zfIa*SQ4oau{xicG$09JvVnCmc;2)Vfx1H)Mkb)n->LpOl?%xBd^|k2YtCXKT2%r;5 z)j!V|oNcN?S+|2&ZVI9JTFE%3Z}zn|8bKXO+Z$!t5a9U7_r6~st9EFRwH&6gUKd(* zu=x`cmJ&)57xHph_j>i{U>V~Y&2QeD>3b6NXEid_E`q_l%x;^XZ(^P^iVI4grlf(V z7tZJy$?2{hJaW^8>vRVO-96%YY?L^X()Au!Mb-KmdqGNFEsh;j__j?^i!n}IIG5R| zW3rJD3WkdJo|;ogUd69z54Vc%9RxLV_#-(Jn&lzQB(jTM6_yrJn@;A^Q&UN>g+&X_WOh?r4p{A3$=|u<`iAwbVI9r zh66tg=(5OQR-dr@d1q^LyZD(_bjln~HOm4v7c_Ye-MPjjEbY)_JCdqXwKXr}vmvmH zyPIVRo5N@vk7Y-vby!V~ef124+<0S+6qrzC1HlbGUGKmFa{kElduOhO%wQ;I6jU^L z&6%}I-L^txE!RK@@S~Uf^R2I61m5{-EMk;qYL#tWHD1{`j>z7Mn_-ctO)!Q&!T#bG zEp@68PC2l_Xeau9_t@m|6UYd8fC zOuZ+J)am83cY(GunhV`O9uB)5V24%6&?6-w4*F6eckIB{Td+HZ<$ny3u!nl!#mOWE zOPm7-X1K8MJqz7qQ&(v>;m+fZj(mkaPzZtI&hs!L3~aNu4&f@!|~)G;=?2o@Fhc=}aM zRjR3W6zrixSW+pCAnD3inO{zaf^;z63muh4RRnRUMV)okdErfz9UP}0*~o>E4XBMP zY^J;dLv6_%lCXU>Z9M?Jxn}TYxjK1^aVuKVI@8@J5nAvrJQiHJ|ENaXzLR+)_ZUTQ zpKx(?h;PD>01}zs$%Q`H*pZ=}_7bQThvITN$A!Bv!PN`yEfGBuR%#b1WpZ!Dpkjx^ z{c%zw3wYKDNh(DfkFXQ;h13nzsG~C6URnttN;?7WZ_{8&iLtz|Mat>uW6KHrc#&xp zzDN^*tq7lNfvbJ}iMF(oJ_|d^66ax48r5mrEkV5O;ZfkNE9;hn8H@?Skk<;mUz)n6 zj=a9_yZL01z*H^IkuB&T9>A(`&F>U0{&>$C62QyJ!qI^6Tf=D)kq?ubi%u|z=8oBv zgr61j*b)CTmt0YZ)m$oLEJw$t``9mB@YL;DKUP)|$dWHZaPocMoEJAOD8@M5`9H({ z@yZ;7Gzybmw0`mlSF=~Q#Fo>;UI=r0-uK|$ptEbgwivWj+dWh+YAAqz{VUC2!Susg zy3(|JjE_T@Ei@YOQ+|ulX79(ll!6mH*{W!qgw^bYR1NhebLiA#j~5yPF#YK&6l)2Z z$xb!w-sP^5<)D>RjXQ*Yp5pG9Rr9zHTo{n`d5*z5pI#KMcpPAVs}`kF_@^y>cSYph zCrwta1{JF)lU&HXW{$E|EP2;sL#6?ZjNaUv5US{OqtM>&4<4#ad9xWmO?iU`>|Pz7 zqH(0Irt*_H0)7J5D&?B8>bIsFUhV@$(+Jf=?L07Wc$57j!W;WTznQECd9E)v=^xu# z8AH8Be5b4$=sXjKKBaXy&HB>%&Za4B#F3pJ=~S&C6iWL6vtB6H-U9+>Cg6@d0?$%+ zv)2$g2$HgWn#u?#%V3RQ4035_MuuC8aqm9@&R%McK;)WnD4Jv4Fa25FK+D#j&6>tf z42`6lB7dar^=T=$7#GM7Z4(rVQ95!hM5?=#WJnh0D zZS%P6sP-TpFypvnaHY;SWBttxMBYEc__x=u?um zt-mD0QAOqMU)d%>BX!T<(Np29{w}mAo`y0wlkU3HU-xOtT&yZBBnME##au^DzA+aSrUse_ z+b6Br{h(+!vBfimLDno%iV3iwRWjr;Rp#&PWVG@&|F zQTl)hXO!QHeJL{g8#22_Wk%UQ*;E$q8xk3t2>yvHTib~qAf1p~{z)Fg2=DM<_Ktes znHBrff`Xh#j>Jdf8RW}U348Q8MK51CS721A@dF&~kr`Q<1j0F(pd@psH9f>yVp+-y zeX~+=Jf}5{TFg;qdGiJJT_W!z+4iMW#r9usM;kmNXy$T>L99Apk~P&+B|%m?_EMKZ zHDn=x&_i@pxv6c>qspu`NNy_`Z^Q3Ch{KYuDzA{0%@$=_lwSA|4 z(Uuxim@k3DiEL}uua-=_Yx*C#kymH-PmTh|Tm`duE^IzeU73VKAdyCLz+DMlph49k zrid)1A+W~Jm0MDD;jY&TDYSg+v&HexQDY~rS~uCBRQ!VNnLdDU7M^4s&t09R$4vzo zeEpD)JLgtnbI6a{hHT;LM)#WPo}CCFk!s2}DI6SjWyy#B;gGqIdXK!WYOz0XMDspq zi&1X)vmz7Rz~Zg4lbT#Kog9HiR~fakkgma_`csr1k(KGkP%m#9Y^6CLDf8Pn4!zdO z0-}T7X|~+mV1Cx?W#qwq!=1g(I!lD?oJUl;;wY`d^u<>1Pf^k!&=ei?M^uIK_RHn8 z4b65ebgiJ0s@l!1!stF>4Q4UXz8|Shy>0!VIyORcczf;5N3lS2mA^vek{m_q2d3O8 z`J5v%CNa)~DVUW>ztttB1FaF?tI6wk(B62WByB&=+kY-JYgZRU_4hvQ1Vz0E zLmC1ewkCKv&gvGjjM2kwLI_*8d~MwpAQY`%Oi)n$ky-*!lGt_NoDe@p*@r6y>2;I# zi5*Rb6~t3IywoJy34c^m>+EK|1GfsB68ptlP|;jeT{v>*Q2p0LQ&SGpU~qxjt+=E> z&bwx?2M_FV^$P=Wm{yro#NI*qG4I(sqe!aCH2;+@Kp&d)>9j1qg}J=T{2zAw{tV1j z&nIiI_wbew+JG;X#^KeBCD4r|9Cdc&G`i}>JJi-+jBCq=6|F06)j*q zN|Ko052{Y9qhNHWhDfU>TcBKY{kXy7g*L7^p^AWQK_@@oty$@!C=Izc|htP4Tcs1{KczQzHh|Wu&c~|(F_k1Ny^H6==ov&vn zL06sOdkc>3jJpA?)7#CC2CGe@>DpsKXM%+q!+vr+ds&tKEacWO%!WV~C@IApIAz8n%K+vZh|d4q`18iGp8+ zUR5$IxFM+El-xc<69Y{_RnCY6?X36YzWG3oifrTGcX2&F+awI$l>WRRSHo>cDcLMI{&< zep12u&j9b5sIUU^c1;_;fT)*KP(fM{nf(GO02Gb-LHo6tR(D8Xwze^36j@J)yvK^9 z;LK8mocHftEIltc4v9y-gL=ghbmA(%t|Xrg4Tnn5GWwFywav)gFV4l9&wD@JXwk&o ze;un8k;<%K`?SPb4S5cE+hmn6BU&jVAyMoy()j1P&o9^a)8C}ViN~1jehq-Ouill% ziw}AiRrF9Tnp3Q=vIvq2EOvrUJ3$FI>Dqt`EYgt94tK11@g`0yyXS!jq&KZ=n1smJ z<-dilghvp=+k&LMk1w&8A2D=H$*e#{n~d%%`-!r4*Ul*b4v7D!aM}sVYs_=F__1$k zIR+FW8>$=p{K9K?t`Z5{`?n4bjQS4UK7MnM!slBHpjf+L(G)7fj*s8KPC((w%U=A| zCQjT}2tc$BK9{Zg&Pl`vUBWj4;>etXe>Qb*UE(q=OaFT|00N1D*h#R|MlAn@SKdVY ze;h=P%(?5@@@9_pU;1xDO+C3}$=+1VO@2?O3jGV3#j=7@C1l0kB+q%D2Bva`UasS9 zyy++U>k^B}FgP%f*o);7`a1H&DMa1$jix{_5xe^_}(}@6!>cTeCA&eQ6TvL(brl5L}XI32ZJo+N#*2` zq+d9eNo;dhe#&v8Y1Z`;_Y6?Hc6A@H=Fj4hu=jU95UhKutn_(pJa{9nkp9Kb%x?e; zC5S?R|M5BA**@orwA#eHkfj0h+q~nvBn-m_^-dmlh3D@EDqrc+i|3n0WC&wE1Y4W}x7C|1ic$7| zQQfzIdJs!=axy6w$iP4!@>lT8hfVUgdO!~GX$para~#xt`$7Mt(FxC&zXB3ZV6J|} zzZwmOdoI2etrg>gT$8(43cud-5NS>!^I8|UePUw$D{a|vsPC`w%>B5O);8qnX*h`< zsesazRzFw~Y`){F6vZ~=kx+240G&GH(ZfrNm@_2#+w~+=%;E-ePfjTKF){6p-a*)V zEV%MTpIe2m!{@&+;*S_W*ByQo9L;6vb2EXIdq&8?%H-ugfhxKz5Gf<%ZqPr)gE=we z5;kfUFtbiT%0x&Siq7-e$a(IWMBo}tJh34~sot5j3vPE#&4BB60(hFm&Qcm;WNQIqv{zvO(U6 u|CQ~3eqB-l$^Cus|L`kf4(9BAM!2ffv$(OPULAW$T2Ws0WyuTE!2bp1r{>Y$3ms2Nm6>^*DO2({H7 zRboc$Ad+~aJ>PTAb*}RVygy`op8L7?c<$%^ynm#t&dkWo2mk<>K^hPB0RS2{>i-XC zPE)_bC>OM-Kc~F()$aoedoQg}AO3Q>r*jVgD2ZYs+0s&<8J=lCya0f6ttX#T9UeIj z006f==;1v>KdbfWBVQwIYRA?N%XgNt+FFJAq(mQ!+6e`_0_GdbrmIgntc>fm^VkdS zeim)J?JaM7S@EMm!HAt@!C!3mBpCjZVige7U~N%t{Q+oy2CAm@yefAln(697+O1iq zjbH+_*GocPSndwysLo0hzk}P@NkJg${Zw3$R~mTmq}f2^`18>VllXvN7pQ_h+#W*t zP93iGz*B>&RKBj_kEeW=rV6MKM2B1B_u9R=?<==V)UGlQvMW80a1fr|=aW3B8t(bM zp=!g@uV)z5@WQ?;I!h;MuLhoK2qjYH!+t|e8kFT$mLl+hwLe3g&99u++gsE+u&2}{b?1a&}P00Iy(ADifHZ&6uDGW ztA0K^qC!Vl|GO@g`rC(@lTNTZ^Ct43eU#2&bHp#jeG)d%%k%Z6F#%6a?kt_#^x*wz zS=ah|tnZ{V5hRBXcdV3**Y-!<$Fh~5`n4%5-jCqMJrTqzx8?5@#Rjm{+xxG!+k4@P zLV6EOXSLGpC=$aFAJ)ugDr>iXt#U+Cy(_gS$U03}o`9vsrS9@E9Y?Qo7~r9Y@qrYP zg(lvZ6XA2^{c1NxtQR>2Z*mGq`_E|<9NW3slSOA*o3=W?_tq`%$BT?#Jul)>=Ka;* zXui!za%_I0M9F(TW?c8U_=%*I^3fTS2n`q+0I(rx2qsZFkE$p)U5Ns&xN^Y;|BjuO z;OnUTH~U}4KjD)Jn`WU4!t=JV+X^rfy|to1e_Km8tC;C)_R zqVg7&3?+{x;`O|I#fH@!3M)#JmJI_7${Gv<7hA$7+QT8+r%zkoO6_ebqmO6iI@@pk zH4rDx=J!O>rYPMi&Tzp){z?CaNB-no{bPSq>F$+N0D!$N|A4PkVG?0;b>XeCcCgfR zkG2F??B6~VI{pA6%Vg}sjlrv!!!T}w&)^N4J!34q~`N-!^sBJuJ2-{bP?dT}I8*z;u z0GL!AdQb6JaV|BG31V7HWpP5AaB4ZoXeu}c zJPJFJ>9V>XNP-+VK)?6pD;=aKz{NvqifB7BYz+heIDxG1v!{0OI{OmDb{5L=_^1DX~(_;YP9=iZ!3ou>9+j1&t!y92=7Xf z2O2FI+_{b}(u8#>u;DUN*nQE-_;Gz4OMZ6Rm$t-AzPvaszQM+Tz8q!CWi3w->gWS8 zy)Jf-nZ42Zaw7y=)lmVl9jTf{z{LqRKMifpQ?T7jl1^t(kqjnGRJAzIGa2*qWcsz4m$3%Z{0193%1mfDDA zQ5wKY>1#2|wRJPq6nfaca+KcOu5R(Q{`?a{ALvL1)C{ z#LS|fb%Z0>UjV=-LpY!5O?yIa9dCE-S_w;L7hKj^Hv6a{;OOMUe3!bx=MhY;9DtG? z%bn?CIso7P@PCns)WHCSUuPF;kWll+Ux`~ct8T$OXiI( zUrr6asH%7Ic7sq|6z*Q>1+KuM*XmGBzZEV~-L%{lJbuf73Lid*$Eo}$f5-gqO8&W( zDAZ_8{9dkh-QGyK=2G(yO96j0!>*hDMOB@A__R9V%J};aRC$;ZkXB1wFPEn zi-vnEC7od7Zy@n!ylBDOW;fa_AR|J5kT7_Gz-ZjV_8FNu)h_T2i2RLS@tnKR2}O@2 zuezpsMaR^D+fpi`OP(W_j-E~AITBpnTI=NUSKDugbl#$h zuJ_rv^r(|pP%)-NPRB212NA9^;)d!!0=sWjg9=< zzw%!WASz_*vMaAHQxKXQ#!rjw-lT?1Nf%{Sp+Bb|EMU`$$pK=XQRTfq@7ZI|q}q;_ zp9^J=u33#Gn3X#__X>t*UU%8m^5Gi~br8Nu$Yzk#gz9Ige?j(>vNDaX0Bg|Kzdy%| zd1PMlVsg=bjRA+;ouiC$-7?UsmX!;5y~45(Urb(YS|4S9t~hP)`^L&vv9*v(=1JTt zSm(!%?HDTkdU&Q1ZQVLR)UQWsie$DX!s()dR9~jA?3o(e& zfwh=IlF4%`wQ6z5uNJIlu7n&b*b~M%C(8v;Q}5@FurD6fiF_WCkJt5;d30W}wZQqT z0(nMmF@BZVU*tspa?OA1?~y}VAf2ub$Z=Qc!7$5wgComlVfq~oXz7^L9X-onghjJe z;WLBK3u1;VbHbX*z9TAx)9=liR>J#>Ix=4kHz8^sw2K8haz*uXJ=U?WjGg53i;Qzd z&ji&YGOveo|M-u%=D7)6sY>;98b`hpM12omp&%|zZgq<&2HKWm^UbYipHUN}?;}g@ zup|v6q(zfkw?eig*mcn!_O3I zPO3(F{zp`Yb%QmouX%d$aQ8tDovYbmP3&^~j&4v*%3$^%QMZ74ose9WvGx5h&1(C? zNoLRdS7!V3c_n-mDkWVsEHBQ_a7yjfjvEcMGwI z-Wg*5c0XwrdgMm7qkH-7K2+1j2ddd;s%KIDvwtRx4Jk?2o@n7WDJN;#pj5xEUt|$2 ze!2dE!t6+y^Zt8UkNPjx-vQC4)Ef7_7pxU84*cq?H~(JM&AZ9ZRcWix0_u6*3cr%T zR9XeI(YS0GoUD=;;51i9YhA4ZC8!ja0wl;@v}4}N^pR=<>RYF=AHsfM(`k6Y!6 zW-3L03DiiaCCbGaN(TAHK&5H!+Fhkq+uaXrac_s}k`vBVexdmrBbGG$ETh{vuyVea zYnE9{*V|{GBhIj~&adRT5Y64wTt7%z#}`^SCAmazMUrBHPHGL6t*7iedcmIOeO~PS zNU3?MsPCu)`NI(kG$shaF8*0Wsmu1`@iYxZ~;j(?9 z@S-9RqdMkUQk7ZzqrUHAS1%aJ=cY6{C~)Y!Qi^SlI}2bC)Q5W74bAuu1(m4tpJ2N5 zBq6X|x=^Cs;tSye&6rH7#f26`H&~*D=w%srPEPZ_Cq*a!r{~U4A&s{%kAe_TT+7Rq2gINalziDB*I$`2OkfG1 z_xZGysnSNDPLiN9wt^!N~`3^{}jT0}&uvFzd^grW;Q2P~%sz zRk61|Ay_*uOLm%9$<`5oZA94@v?3@sMTuH%om7R^(-6Lrn$xNL zz^m@=PzA&3251N7`XT0;a-FEeQzC95_qOW?Q7!;$=Og57jo?1Db>9$#I6QO|0I4=W z3oJVd9G{gC1juwAVy|^3I^?pi)>KNJ#MLb8VBdFxM_#6@3qS%&-MN z@o>!!b|pw z&P;MzUql0+B@rGrYsrUln)TN1dB<(!k+R&c`C|nIeWm=>a)XaSbVl)|T8&E%s@Lnz z=)a4!@bf&xsQMMx_Vj{dI>$2y%j`_r4oR1><7*>azkU4d(0S^KKT~U^gj^NHFg^~M zA|81RyVm|U>ZYOVOyMfkKnc+5Td`zJYAVu)*S+^>;pf}6kv~FaeR@A;x z_CvjPWMzyCgn)D5(SP)9yfYxi;m|AGQC7vvEHn>C%0i8WRmAi9#>>I{3BLZT90>&VaEz{q%MT-)BBro9=v`2Cg<#PdA+hB80L0#O{vvhq1IxW=4N)JHaL{B-I{ zNi>r6Qz~+siHQYPQu}2t^y8w1O-hAq&?Bo#7yEm2wUInVP@TiZj~ zJ?7D-4t4ONwzf9fjRyQHdg{tiW^{)`KwP60C;&2jik1?zaBuT?e9C5Lk0lgipqlU|5HGdgP~XU zo{eK`8jWxS5NKSE3L;kydYc33?H*DU(B{9bQ-I_{PnWN4j?}9Y;!OAo+;iQOV3l7! zqpD#28~@zKh(&Qn5Mp7a8>WYtHzOarX+lHm$utRpL$?$t)!6?>9BsIQb$60B27O zDRn9i=`ytqIn3yK(_5HE32FXVX!ZFNCj<2cVRK*JEYQal6GK*anUwTKq)4g#=9XEC zpQ@xveo4tcquv010XbreJ8=-hhT(jeTVNDkEKg}@a6m4dVw^ev_#ia3uNS!;p1;o~t{g+HZV5sxLA^JLbIr=CQ&#di-`MnP~=c-2AmU%>}lx!U-y);#SAt&s!8_B>I%~PIy5iax)aHJN3n%VhT+}-q$_!6z*q>rqay$AMeMU%N zkV={L6WzI~^A4l4y5VQMmoY0CurYV&XW`ufADAgCT(>8cf2!Q!t+1~Yj*(8Kkp^IM zCq=wwsk+hL^}3uA8B76ojwU)+VbW!Ik^`2>sOyF~jQ;$V*fqI>)3?ccaqZ({`6(=Tb7bh$!OQ0Blww@Y3sQz8lj41h$x#LZ*;4S^K~k4W%PKMPQ#Bp4 zX--lth)a2W8xuQOknH8;+ARK~Gz6$ofbB{Tv5ZsXc-I@bfj_-8r-e4)%Ny=(f4W6N zTO+L>pZyq8+L6t&!`3eNTay5rQh``#K3*fty!kFQ@@?)oIJqg;dluU#JAAg5^wXTS zb?ITvm~)+)W){y%U4Fa04QW-(Lzc=S#Q5tjYJh7xXy8QlRBlo8_ zw+(h78Q}BIkl@P^Nq$Z)PyF;xml;Mg1`{%@;6ee=Uli(q!Q>4tpTp%QouVw)e#$Gn zQia3vZyyCr9p3P}2PT|FdZ>j+n<{t(41U+#AER`3qg|I0a<{rh3%%)5Vt{>MPhHhS z>;N(oTZN8^H(L9vQOOrO-snx=1KHLIlTcaEDt+DXgTSJt8#d!V7-jUDvFdjkHa+X? z4JZ@|E)Gt`Rm=e^nPvvUWV$Z~8}L<-vK%?0xZLlbj!&qa8oQW+Z0Q|b0cXG?e_X1~ z5A4Ef$Lzk0ddyMB_T37z5}5iCp(gl=Ea_a`r7Q-$^9loT+(fbd!U6 zj>a5FqfC21Zf~F)Oz7c}GbPCy!POs8I*Xxh%Y7mCKhW7@RWQSb=XQv4`H*WZV*9a~ z%3*b8)s8}}w9_uz*K+^aw-{}TejvcbGENeg8dsO&aCJI9uRZBo3;z}Mvb^R>{fi62 zw(8gS6u}|qLw~E~yKV3^b4l1%^*YKB*WVJ^#whJ0uct`|k$tal}pHw%W;f3^ez#wZU5XC{3FBp6aDW8u7v6F-=QH Wa(UDehc*=z08-U`Sa{#&)&BvP=!;bV literal 4353 zcmb_fc|4SD_rFUeM7@Zo1y911B`Vo7PnL%XGclIPmQW-UF}93^rzd5bvBYF`NO%mc}ynB}0v@Gr}-<@9BA;_w&C0y}!@r_s4x-=UUEno$H+QJ=ZypuON*C`H%7g z03e7kHn0Eyp2HCRbpLMXAGIxF0yVqtSs3X7g`LM4P-oB0OJT7BYj}vfUoNTkNmY_US(Qq}lcpRMujrPv|M5S_1Hn>Kkkw4xqCNk2%=85`#*jE#djR0Ky&|cO2V}MV zCAWH6{g9k$W0_w=5tnR2#?~;LJX#Rbxu0FTz}~Lk9J8=M;*3tDN1W+xnjmZoD7dW}M)XC965im8Ial?@}y z-pZ{gRzcfv7wAOnE6&yZ#N6c)E2Y8Te%<8#E09SQCedzDG zh(IC&hk9ZusKE~FDURjGJu!1Jv=F4@hZ_Pd>O13a)}8DN`z{^<085pGR?esvOMOmN zDRuvk4wLJ-SbcNcM&9DtN5NP-^98jKe{HSeX(g+t?OJ+7UnPZrxLWi_`E-~YF`3qz z7t$B5L`GMpVRACF<|F~&u7Hg29atmDdDG}01D{+G=;TlPI#7ed+SDJdK8|NA_{r5B z_j8MF)y{n1Kde}1!@HUv!NJpBe;cUv8W*a|6XLh2&yn}q4LqTbwx22ER;!Vm&eFfR6TXEYj6e31 zi=v2Nd1gVW(y_{?vDKQ~EqdO@-X&^P+7$7x4HV?oFbads);tGuY!*nIeZzk010~vh z;r8{uYgPP20C4VuZX_G=CO5=Mr-73SGfA6)wYf#i| zU0T5BVVPSBEu06_Ue3My{xDMns4#1z*y<`@s& z6_kN+Zf79<`CXAyzhykQ5^);x+z^-Vn+yGAw1W*pNzQ&1MOe48kuSP0roxaA@QWFh zVFx6)s3FphD+L@X;ZEsbZ9QvgSph;vFD+<&(FP)36-{kLib6zw0to%n826XgWg%kr z`}?owp|;lu2gR9Ne{dkgb{}9vddxV&6oJrto(_WqaBt-zu_OK`?+JLtm~+^nI)NHY zEdY$@YDUmyn4LK>MmW#*BvQ9-0l~Xw@yljLWB1j@2x`KMm4R?7gs+`)7mk+&Vq1Cs2 zVODOU0$gX`foNnqVDW?hxcjH{u%OIert-CWf0f3=fKV zAd0+=cx!k;tZo@KpAeDGl_@7NVZ;X^) z^co7>oBDevsWd!Wf(%N91O%ZKP5g1xykzyH{DI_gMXRu|t(<-{@2)jg$f@X;uaZRB z6nt6BvEkSQUe#M~O9m5_YIm8?XL45r(i4$p0p{4W*SXWH75qfIzRmhllS+ti(}oD| zL0K|C5z=5U{t3sGk~bAIdb?o}J5n;-Ji8*!Ml?(?hUe%9(>3L zoi{WWt@w1AN%+ft{L-<_-HlPnVs{ z^CKmyCs8ljc_`$STWyvMeGX67Hp6CTqvvlAdX$oqv00E+wE7wn=WlrsUY?4!vr6TN z62NZVtwvroxIt3bJV#X)4%yEFNhZ;lOl=n%6p z=O7NlQMDDN^r9tH}YN=?=cfsPk9N$8&jpDEpb*$(9pCxBOI&-ap<}D*!Y} z#J~II>^k-SV)Iv&l9<1iB!;KhV(dGtP7o;0TW1x1&?qdn4m`1IM2Ztca|yN=T;*-9 z&Dg9I7~u=rqRY-TFxmu8)6#+$7e*WVg`5fTpq(iTz0{z-F_3=T9|rE8sFd)Z{vj~N zTQ;Z@bmFW3frI*wuPn450Os{@o+XC3b2qQ9RBLPVcoXXanH#Abzw1o&hIpES2|k&E z!cb6v-BV7lOA4ETR(bL;sLnKO{(!Ul%pO2{9@~=6~YXxjaQ@~3E&tMg~|ucvCuHK#vZcb`nxXF%(zWS z%dmd}c;(4VE{DscSeZbk1(ZMeq_q^e+2l->^N-L^L zAA!TCsOW;Xz2r059`}Vm_~5}Y0(8PvA6))3>tErckH^6JCHgryWk! z3JMlp7x~#wO)FOBL^fQOq(lT=QNMKHIqw&hfo>N;CffHD(Kp45(d$skqZB}SbH8W7 zK*Ae`FCqo>g(o9NV=Zk7oJcz{_UY%B2-kjZb;?#&f~00z&TzM1V)2soG@#72ChbrU@qz0gxg`^j*Xo=ai84!e>BCe9s6e?PMs00lZoQW$nC>3SDIp0y@?Th&lQ=J&B&*9N|HHMW0a3kIXS)IvT2M zM4@nXo%#{LF6-B-R`Xf^$l+ce9C4n`i=Fdlc5p=dHo_ccU~KAPN2>;O|4#|JIV-e2 zcHWwgbcx4ZQOM^GU8Xa~T!C8&53{6=@@VE%vem%n0!ZiA9CL$@aj$LM_~+n&Yr$&* z1`l2_IRj5h=$p*FD#P}WCI@290p+a{j}B|**9)c1?p*v6DbNrWpihVOO0yZ|Fy%?Q zD!XuGTVq|Nt!Hs0o6XRWe4{MvHG=_4axF6{tT%Vt)+H*6RyP+GY1h%yUGs4XGhnklR zm$NE%NfC)t)7kpOAj!ZCxr*tCG{--W)ju*$re|@t$|yXAK%PV(eV8wLwoH)G+%&0B z%xvm2jHRuTY3N&1-*{ELWi+6<^U3J%bg^n54^*o(d>8OQ{cHIm-i|pDopkzbeeRdKj45vs#Hbv(|%w@Rlp`$NMVW~N6 z1o%Ak;Ulgt`|Z+j?wM?M(^M4f2ytrD=R;@i=^3 z8g^_h4fX5`>C}Fd(G3TDhwl?2xWZR6Yxv4EkUD%1wZzRJ##G;ePUl1iYIO}hh{~E<43q!&(#U766qMdcOXhjh zlP0?6V!M(zt`yZ>?)r`(f6E=5IKlO+3U_K3g4ThuA*|e^LKP43V)IW#-!{`T4det% zsw3b&PToGO9>KpE91pc zh;=<&t4|lNjcJ8OsigRy==iTPAr)!KjJXI^2Xq8>))aZ8NC2uA&JoJ0dUiBcYoPH{ p=QW=BVR6daANE1L*5NJ8;!eJR|GwB8CEN-GKo}wo3iX^H{u5d0bFlyb From bb9ba2091135d8efccf53494eeed6285994b61eb Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 24 Jun 2017 06:29:45 +0000 Subject: [PATCH 004/166] docs: update screenshot --- docs/img/offline3.png | Bin 6645 -> 4445 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/img/offline3.png b/docs/img/offline3.png index ca37533afd3c407411ee6233ce51b903afb7af77..b72a2991548412a183557e0fef72e696e473d2cc 100644 GIT binary patch literal 4445 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 From 6e13d92a7a9861ad05f3bdf08c45fb78d3478742 Mon Sep 17 00:00:00 2001 From: Christian Pfisterer Date: Mon, 26 Jun 2017 17:28:47 +0200 Subject: [PATCH 005/166] 702 support enhanced Coding for objects SAMC and SAPC updated to avoid syntax errors on 702 systems. --- src/zabapgit_object_samc.prog.abap | 36 ++++++++++++++++++------------ src/zabapgit_object_samc.prog.xml | 7 ------ src/zabapgit_object_sapc.prog.abap | 30 ++++++++++++++++--------- src/zabapgit_object_sapc.prog.xml | 7 ------ 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/zabapgit_object_samc.prog.abap b/src/zabapgit_object_samc.prog.abap index 166d48a1c..64d4eb578 100644 --- a/src/zabapgit_object_samc.prog.abap +++ b/src/zabapgit_object_samc.prog.abap @@ -14,13 +14,13 @@ CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_super FINAL. METHODS: get_data_object RETURNING - VALUE(ro_amc_appl_obj_data) TYPE REF TO if_wb_object_data_model + value(ro_amc_appl_obj_data) TYPE REF TO if_wb_object_data_model RAISING lcx_exception, get_persistence RETURNING - VALUE(ro_persistence) TYPE REF TO if_wb_object_persist + value(ro_persistence) TYPE REF TO if_wb_object_persist RAISING lcx_exception, @@ -77,7 +77,7 @@ CLASS lcl_object_samc IMPLEMENTATION. rv_user = . - ENDMETHOD. + ENDMETHOD. "lif_object~changed_by METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). @@ -257,7 +257,7 @@ CLASS lcl_object_samc IMPLEMENTATION. METHOD lif_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. - ENDMETHOD. + ENDMETHOD. "lif_object~compare_to_remote_version METHOD get_data_object. @@ -274,7 +274,7 @@ CLASS lcl_object_samc IMPLEMENTATION. ro_amc_appl_obj_data = mo_amc_appl_obj_data. - ENDMETHOD. + ENDMETHOD. "get_data_object METHOD get_persistence. @@ -292,20 +292,24 @@ CLASS lcl_object_samc IMPLEMENTATION. ro_persistence = mo_persistence. - ENDMETHOD. + ENDMETHOD. "get_persistence METHOD lock. - DATA: objname TYPE trobj_name, - object_key TYPE seu_objkey, - objtype TYPE trobjtype. + DATA: objname TYPE trobj_name, + object_key TYPE seu_objkey, + objtype TYPE trobjtype. objname = ms_item-obj_name. object_key = ms_item-obj_name. objtype = ms_item-obj_type. - get_persistence( )->lock( + IF mo_persistence IS NOT BOUND. + get_persistence( ). + ENDIF. + + mo_persistence->lock( EXPORTING p_objname_tr = objname p_object_key = object_key @@ -319,7 +323,7 @@ CLASS lcl_object_samc IMPLEMENTATION. lcx_exception=>raise( `Error occured while locking SAMC ` && objname ). ENDIF. - ENDMETHOD. + ENDMETHOD. "lock METHOD unlock. @@ -335,7 +339,7 @@ CLASS lcl_object_samc IMPLEMENTATION. p_object_key = object_key p_objtype_tr = objtype ). - ENDMETHOD. + ENDMETHOD. "unlock METHOD get_data. @@ -344,7 +348,11 @@ CLASS lcl_object_samc IMPLEMENTATION. object_key = ms_item-obj_name. TRY. - get_persistence( )->get( + IF mo_persistence IS NOT BOUND. + get_persistence( ). + ENDIF. + + mo_persistence->get( EXPORTING p_object_key = object_key p_version = 'A' @@ -359,7 +367,7 @@ CLASS lcl_object_samc IMPLEMENTATION. IMPORTING p_data = p_data ). - ENDMETHOD. + ENDMETHOD. "get_data ENDCLASS. "lcl_object_samc IMPLEMENTATION diff --git a/src/zabapgit_object_samc.prog.xml b/src/zabapgit_object_samc.prog.xml index 861bd3b6b..5bf661e5b 100644 --- a/src/zabapgit_object_samc.prog.xml +++ b/src/zabapgit_object_samc.prog.xml @@ -10,13 +10,6 @@ E X - - - R - Include ZABAPGIT_OBJECT_SAMC - 28 - - diff --git a/src/zabapgit_object_sapc.prog.abap b/src/zabapgit_object_sapc.prog.abap index f05010fa7..02c5c25f1 100644 --- a/src/zabapgit_object_sapc.prog.abap +++ b/src/zabapgit_object_sapc.prog.abap @@ -14,13 +14,13 @@ CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_super FINAL. METHODS: get_data_object RETURNING - VALUE(ro_apc_appl_obj_data) TYPE REF TO if_wb_object_data_model + value(ro_apc_appl_obj_data) TYPE REF TO if_wb_object_data_model RAISING lcx_exception, get_persistence RETURNING - VALUE(ro_persistence) TYPE REF TO if_wb_object_persist + value(ro_persistence) TYPE REF TO if_wb_object_persist RAISING lcx_exception, @@ -77,7 +77,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. rv_user = . - ENDMETHOD. + ENDMETHOD. "lif_object~changed_by METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). @@ -257,7 +257,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. METHOD lif_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. - ENDMETHOD. + ENDMETHOD. "lif_object~compare_to_remote_version METHOD get_data_object. @@ -274,7 +274,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. ro_apc_appl_obj_data = mo_apc_appl_obj_data. - ENDMETHOD. + ENDMETHOD. "get_data_object METHOD get_persistence. @@ -292,7 +292,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. ro_persistence = mo_persistence. - ENDMETHOD. + ENDMETHOD. "get_persistence METHOD lock. @@ -305,7 +305,11 @@ CLASS lcl_object_sapc IMPLEMENTATION. object_key = ms_item-obj_name. objtype = ms_item-obj_type. - get_persistence( )->lock( + IF mo_persistence IS NOT BOUND. + get_persistence( ). + ENDIF. + + mo_persistence->lock( EXPORTING p_objname_tr = objname p_object_key = object_key @@ -319,7 +323,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. lcx_exception=>raise( `Error occured while locking SAPC ` && objname ). ENDIF. - ENDMETHOD. + ENDMETHOD. "lock METHOD unlock. @@ -335,7 +339,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. p_object_key = object_key p_objtype_tr = objtype ). - ENDMETHOD. + ENDMETHOD. "unlock METHOD get_data. @@ -344,7 +348,11 @@ CLASS lcl_object_sapc IMPLEMENTATION. object_key = ms_item-obj_name. TRY. - get_persistence( )->get( + IF mo_persistence IS NOT BOUND. + get_persistence( ). + ENDIF. + + mo_persistence->get( EXPORTING p_object_key = object_key p_version = 'A' @@ -359,7 +367,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. IMPORTING p_data = p_data ). - ENDMETHOD. + ENDMETHOD. "get_data ENDCLASS. "lcl_object_sAPC IMPLEMENTATION diff --git a/src/zabapgit_object_sapc.prog.xml b/src/zabapgit_object_sapc.prog.xml index 061aed07b..c779ee053 100644 --- a/src/zabapgit_object_sapc.prog.xml +++ b/src/zabapgit_object_sapc.prog.xml @@ -10,13 +10,6 @@ E X - - - R - Include ZABAPGIT_OBJECT_SAPC - 28 - - From 910dc686b40d20d5dc8bf353aa7c1ccf332b8560 Mon Sep 17 00:00:00 2001 From: Christian Pfisterer Date: Mon, 26 Jun 2017 21:27:17 +0200 Subject: [PATCH 006/166] Implemented suggestions from Lars Suggestions mentioned by Lars in PR have been implemented. --- src/zabapgit_object_samc.prog.abap | 9 +++------ src/zabapgit_object_sapc.prog.abap | 8 ++------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/zabapgit_object_samc.prog.abap b/src/zabapgit_object_samc.prog.abap index 64d4eb578..c575e3578 100644 --- a/src/zabapgit_object_samc.prog.abap +++ b/src/zabapgit_object_samc.prog.abap @@ -305,9 +305,8 @@ CLASS lcl_object_samc IMPLEMENTATION. object_key = ms_item-obj_name. objtype = ms_item-obj_type. - IF mo_persistence IS NOT BOUND. - get_persistence( ). - ENDIF. + + get_persistence( ). mo_persistence->lock( EXPORTING @@ -348,9 +347,7 @@ CLASS lcl_object_samc IMPLEMENTATION. object_key = ms_item-obj_name. TRY. - IF mo_persistence IS NOT BOUND. - get_persistence( ). - ENDIF. + get_persistence( ). mo_persistence->get( EXPORTING diff --git a/src/zabapgit_object_sapc.prog.abap b/src/zabapgit_object_sapc.prog.abap index 02c5c25f1..b30a96586 100644 --- a/src/zabapgit_object_sapc.prog.abap +++ b/src/zabapgit_object_sapc.prog.abap @@ -305,9 +305,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. object_key = ms_item-obj_name. objtype = ms_item-obj_type. - IF mo_persistence IS NOT BOUND. - get_persistence( ). - ENDIF. + get_persistence( ). mo_persistence->lock( EXPORTING @@ -348,9 +346,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. object_key = ms_item-obj_name. TRY. - IF mo_persistence IS NOT BOUND. - get_persistence( ). - ENDIF. + get_persistence( ). mo_persistence->get( EXPORTING From ae74f7612208935db67729c93b741e73c5eac4c5 Mon Sep 17 00:00:00 2001 From: Christian Pfisterer Date: Mon, 26 Jun 2017 21:29:52 +0200 Subject: [PATCH 007/166] Update zabapgit_object_samc.prog.xml --- src/zabapgit_object_samc.prog.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_samc.prog.xml b/src/zabapgit_object_samc.prog.xml index 5bf661e5b..5fd2cf13f 100644 --- a/src/zabapgit_object_samc.prog.xml +++ b/src/zabapgit_object_samc.prog.xml @@ -1,4 +1,4 @@ - + @@ -10,6 +10,13 @@ E X + + + R + Include ZABAPGIT_OBJECT_SAMC + 28 + + From ea82f9404037970c56229d3d06fe975b9a030e97 Mon Sep 17 00:00:00 2001 From: Christian Pfisterer Date: Mon, 26 Jun 2017 21:31:13 +0200 Subject: [PATCH 008/166] Update zabapgit_object_sapc.prog.xml --- src/zabapgit_object_sapc.prog.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_sapc.prog.xml b/src/zabapgit_object_sapc.prog.xml index c779ee053..c466ed750 100644 --- a/src/zabapgit_object_sapc.prog.xml +++ b/src/zabapgit_object_sapc.prog.xml @@ -1,4 +1,4 @@ - + @@ -10,6 +10,13 @@ E X + + + R + Include ZABAPGIT_OBJECT_SAPC + 28 + + From 37a95ec8438726e9cdcdd1c7d98a5db12428fad9 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Tue, 27 Jun 2017 19:11:13 +0200 Subject: [PATCH 009/166] added ABAP-Logger by @epeterson320 --- docs/repos.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/repos.json b/docs/repos.json index 7169fc7cc..98ecc70b4 100644 --- a/docs/repos.json +++ b/docs/repos.json @@ -14,6 +14,11 @@ "title": "abap-log", "description": "Logging library for ABAP" }, + "https://github.com/epeterson320/ABAP-Logger.git": + { + "title": "ABAP-Logger", + "description": "ABAP Logging as painless as any other language" + }, "https://github.com/sbcgua/mockup_loader.git": { "title": "mockup_loader", From a2a5006e8c9bfd0961e5e856d4998fc1caf3dd60 Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 29 Jun 2017 06:02:15 +0000 Subject: [PATCH 010/166] fix #798 --- src/zabapgit_definitions.prog.abap | 4 ++-- src/zabapgit_object_samc.prog.xml | 2 +- src/zabapgit_object_sapc.prog.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 07bf82a56..d2110d066 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -7,7 +7,7 @@ TYPE-POOLS seop. INTERFACE lif_defs. CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.37.2'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.37.3'. "#EC NOTEXT TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, @@ -197,7 +197,7 @@ INTERFACE lif_defs. CONSTANTS: gc_root_dir TYPE string VALUE '/', gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT, - gc_author_regex TYPE string VALUE '^([\w\s\.@\-_1-9]+) <(.*)> (\d{10})\s?.\d{4}$' ##NO_TEXT. + gc_author_regex TYPE string VALUE '^([\\\w\s\.@\-_1-9]+) <(.*)> (\d{10})\s?.\d{4}$' ##NO_TEXT. CONSTANTS: BEGIN OF gc_action, repo_clone TYPE string VALUE 'repo_clone', diff --git a/src/zabapgit_object_samc.prog.xml b/src/zabapgit_object_samc.prog.xml index 5fd2cf13f..861bd3b6b 100644 --- a/src/zabapgit_object_samc.prog.xml +++ b/src/zabapgit_object_samc.prog.xml @@ -1,4 +1,4 @@ - + diff --git a/src/zabapgit_object_sapc.prog.xml b/src/zabapgit_object_sapc.prog.xml index c466ed750..061aed07b 100644 --- a/src/zabapgit_object_sapc.prog.xml +++ b/src/zabapgit_object_sapc.prog.xml @@ -1,4 +1,4 @@ - + From 5e420f25f3cbbc701582e1b1c5c5842eef464037 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 29 Jun 2017 08:03:40 +0200 Subject: [PATCH 011/166] Update changelog.txt --- changelog.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/changelog.txt b/changelog.txt index fb6f3f255..8c6c790ba 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,11 @@ Legend + : added - : removed +2017-06-29 v1.37.3 +------------------ +* fixed 702 compatibility +* fixed dump when calling branch overview page + 2017-06-10 v1.37.2 ------------------ * fixed unit tests From b268c85415154131fb9bd2d94aaf721a8339c06c Mon Sep 17 00:00:00 2001 From: bigld Date: Sun, 2 Jul 2017 20:20:34 +0200 Subject: [PATCH 012/166] Save Settings as single Record Settings are now saved as single record in XML format A migration is done on startup --- src/zabapgit_persistence.prog.abap | 478 ++++++++++++++++------------- 1 file changed, 265 insertions(+), 213 deletions(-) diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index a01d44b84..f15217588 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -2,6 +2,8 @@ *& Include ZABAPGIT_PERSISTENCE *&---------------------------------------------------------------------* +CLASS lcl_settings DEFINITION DEFERRED. + CLASS lcl_persist_migrate DEFINITION FINAL. PUBLIC SECTION. @@ -12,6 +14,8 @@ CLASS lcl_persist_migrate DEFINITION FINAL. c_text TYPE string VALUE 'Generated by abapGit' ##NO_TEXT. CLASS-METHODS: + migrate_settings + RAISING lcx_exception, migrate_repo RAISING lcx_exception, migrate_user @@ -113,7 +117,7 @@ CLASS lcl_persistence_repo DEFINITION FINAL. TYPES: BEGIN OF ty_repo, key TYPE lcl_persistence_db=>ty_value. - INCLUDE TYPE ty_repo_xml. + INCLUDE TYPE ty_repo_xml. TYPES: END OF ty_repo. TYPES: tt_repo TYPE STANDARD TABLE OF ty_repo WITH DEFAULT KEY. TYPES: tt_repo_keys TYPE STANDARD TABLE OF ty_repo-key WITH DEFAULT KEY. @@ -230,7 +234,7 @@ CLASS lcl_persist_background DEFINITION FINAL. TYPES: BEGIN OF ty_background, key TYPE lcl_persistence_db=>ty_value. - INCLUDE TYPE ty_xml. + INCLUDE TYPE ty_xml. TYPES: END OF ty_background. TYPES: tt_background TYPE STANDARD TABLE OF ty_background WITH DEFAULT KEY. @@ -270,6 +274,99 @@ CLASS lcl_persist_background DEFINITION FINAL. ENDCLASS. "lcl_persistence_background DEFINITION + +CLASS lcl_settings DEFINITION FINAL. + + PUBLIC SECTION. + CONSTANTS: c_commitmsg_comment_length_dft TYPE i VALUE 50. + CONSTANTS: c_commitmsg_body_size_dft TYPE i VALUE 72. + CONSTANTS: c_dbtype_settings TYPE lcl_persistence_db=>ty_type VALUE 'SETTINGS' ##NO_TEXT. + + METHODS set_proxy_url + IMPORTING + iv_url TYPE string. + METHODS set_proxy_port + IMPORTING + iv_port TYPE string. + METHODS set_proxy_authentication + IMPORTING + iv_auth TYPE abap_bool. + METHODS get_proxy_url + RETURNING + VALUE(rv_proxy_url) TYPE string. + METHODS get_proxy_port + RETURNING + VALUE(rv_port) TYPE string. + METHODS get_proxy_authentication + RETURNING + VALUE(rv_auth) TYPE abap_bool. + METHODS set_run_critical_tests + IMPORTING + iv_run TYPE abap_bool. + METHODS + get_run_critical_tests + RETURNING VALUE(rv_run) TYPE abap_bool. + METHODS set_max_lines + IMPORTING iv_lines TYPE i. + METHODS get_max_lines + RETURNING + VALUE(rv_lines) TYPE i. + METHODS set_adt_jump_enanbled + IMPORTING iv_adt_jump_enabled TYPE abap_bool. + METHODS get_adt_jump_enabled + RETURNING + VALUE(rv_adt_jump_enabled) TYPE abap_bool. + METHODS set_commitmsg_comment_length + IMPORTING iv_length TYPE i. + METHODS get_commitmsg_comment_length + RETURNING + VALUE(rv_length) TYPE i. + METHODS set_commitmsg_body_size + IMPORTING iv_length TYPE i. + METHODS get_commitmsg_body_size + RETURNING + VALUE(rv_length) TYPE i. + METHODS get_settings_xml + RETURNING VALUE(ev_settings_xml) TYPE string + RAISING lcx_exception. + METHODS set_xml_settings + IMPORTING iv_settings_xml TYPE string + RAISING lcx_exception. + METHODS set_defaults. + + + + PRIVATE SECTION. + TYPES: BEGIN OF ty_s_settings, + proxy_url TYPE string, + proxy_port TYPE string, + proxy_auth TYPE string, + run_critical_tests TYPE abap_bool, + max_lines TYPE i, + adt_jump_enabled TYPE abap_bool, + commitmsg_comment_length TYPE i, + commitmsg_body_size TYPE i, + END OF ty_s_settings. + DATA: ms_settings TYPE ty_s_settings. + +ENDCLASS. + +CLASS lcl_persist_settings DEFINITION FINAL. + + PUBLIC SECTION. + METHODS modify + IMPORTING + io_settings TYPE REF TO lcl_settings + RAISING + lcx_exception. + METHODS read + RETURNING + VALUE(ro_settings) TYPE REF TO lcl_settings. + PRIVATE SECTION. + + +ENDCLASS. + CLASS lcl_persist_background IMPLEMENTATION. METHOD constructor. @@ -1284,10 +1381,111 @@ CLASS lcl_persist_migrate IMPLEMENTATION. migrate_repo( ). migrate_user( ). + migrate_settings( ). ENDIF. ENDMETHOD. + METHOD migrate_settings. + + DATA: lr_settings TYPE REF TO lcl_settings. + DATA: lr_persist_settings TYPE REF TO lcl_persist_settings. + DATA: lv_critical_tests_as_string TYPE string. + DATA: lv_critical_tests_as_boolean TYPE abap_bool. + DATA: lv_max_lines_as_string TYPE string. + DATA: lv_flag TYPE abap_bool. + DATA: lv_max_lines_as_integer TYPE i. + DATA: lv_s_param_value TYPE string. + DATA: lv_i_param_value TYPE i. + DATA: lv_adt_jump_enabled_as_string TYPE string. + DATA: lv_adt_jump_enabled_as_boolean TYPE abap_bool. + + + TRY. + lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = '' ). + CATCH lcx_not_found. + + CREATE OBJECT lr_persist_settings. + CREATE OBJECT lr_settings. + lr_settings->set_defaults( ). + + TRY. + lr_settings->set_proxy_url( + lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' ) ). + CATCH lcx_not_found. + ENDTRY. + + TRY. + lr_settings->set_proxy_port( + lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' ) ). + CATCH lcx_not_found. + ENDTRY. + + TRY. + lv_flag = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_AUTH' ). + lr_settings->set_proxy_authentication( lv_flag ). + CATCH lcx_not_found. + ENDTRY. + + TRY. + lv_critical_tests_as_string = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'CRIT_TESTS' ). + lv_critical_tests_as_boolean = lv_critical_tests_as_string. + lr_settings->set_run_critical_tests( lv_critical_tests_as_boolean ). + CATCH lcx_not_found. + ENDTRY. + + TRY. + lv_max_lines_as_string = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'MAX_LINES' ). + lv_max_lines_as_integer = lv_max_lines_as_string. + lr_settings->set_max_lines( lv_max_lines_as_integer ). + CATCH lcx_not_found cx_sy_conversion_no_number. + ENDTRY. + + TRY. + lv_adt_jump_enabled_as_string = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'ADT_JUMP' ). + lv_adt_jump_enabled_as_boolean = lv_adt_jump_enabled_as_string. + lr_settings->set_adt_jump_enanbled( lv_adt_jump_enabled_as_boolean ). + CATCH lcx_not_found. + ENDTRY. + + TRY. + lv_s_param_value = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'COMMENT_LEN' ). + lv_i_param_value = lv_s_param_value. + lr_settings->set_commitmsg_comment_length( lv_i_param_value ). + CATCH lcx_not_found cx_sy_conversion_no_number. + ENDTRY. + + TRY. + lv_s_param_value = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'BODY_SIZE' ). + lv_i_param_value = lv_s_param_value. + lr_settings->set_commitmsg_body_size( lv_i_param_value ). + CATCH lcx_not_found cx_sy_conversion_no_number. + ENDTRY. + + lr_persist_settings->modify( io_settings = lr_settings ). + + ENDTRY. + + ENDMETHOD. + METHOD migrate_repo. DATA: lt_repo TYPE lcl_persistence=>ty_repos_persi_tt, @@ -1531,148 +1729,115 @@ CLASS lcl_persist_migrate IMPLEMENTATION. ENDCLASS. -CLASS lcl_settings DEFINITION FINAL. - - PUBLIC SECTION. - CONSTANTS: c_commitmsg_comment_length_dft TYPE i VALUE 50. - CONSTANTS: c_commitmsg_body_size_dft TYPE i VALUE 72. - - METHODS set_proxy_url - IMPORTING - iv_url TYPE string. - METHODS set_proxy_port - IMPORTING - iv_port TYPE string. - METHODS set_proxy_authentication - IMPORTING - iv_auth TYPE abap_bool. - METHODS get_proxy_url - RETURNING - VALUE(rv_proxy_url) TYPE string. - METHODS get_proxy_port - RETURNING - VALUE(rv_port) TYPE string. - METHODS get_proxy_authentication - RETURNING - VALUE(rv_auth) TYPE abap_bool. - METHODS set_run_critical_tests - IMPORTING - iv_run TYPE abap_bool. - METHODS - get_run_critical_tests - RETURNING VALUE(rv_run) TYPE abap_bool. - METHODS set_max_lines - IMPORTING iv_lines TYPE i. - METHODS get_max_lines - RETURNING - VALUE(rv_lines) TYPE i. - METHODS set_adt_jump_enanbled - IMPORTING iv_adt_jump_enabled TYPE abap_bool. - METHODS get_adt_jump_enabled - RETURNING - VALUE(rv_adt_jump_enabled) TYPE abap_bool. - METHODS set_commitmsg_comment_length - IMPORTING iv_length TYPE i. - METHODS get_commitmsg_comment_length - RETURNING - VALUE(rv_length) TYPE i. - METHODS set_commitmsg_body_size - IMPORTING iv_length TYPE i. - METHODS get_commitmsg_body_size - RETURNING - VALUE(rv_length) TYPE i. - - PRIVATE SECTION. - DATA: mv_proxy_url TYPE string, - mv_proxy_port TYPE string, - mv_proxy_auth TYPE string, - mv_run_critical_tests TYPE abap_bool, - mv_lines TYPE i, - mv_adt_jump_enabled TYPE abap_bool, - mv_commitmsg_comment_length TYPE i, - mv_commitmsg_body_size TYPE i. - -ENDCLASS. - CLASS lcl_settings IMPLEMENTATION. METHOD set_proxy_authentication. - mv_proxy_auth = iv_auth. + ms_settings-proxy_auth = iv_auth. ENDMETHOD. METHOD get_proxy_authentication. - rv_auth = mv_proxy_auth. + rv_auth = ms_settings-proxy_auth. ENDMETHOD. METHOD set_proxy_url. - mv_proxy_url = iv_url. + ms_settings-proxy_url = iv_url. ENDMETHOD. METHOD get_proxy_url. - rv_proxy_url = mv_proxy_url. + rv_proxy_url = ms_settings-proxy_url. ENDMETHOD. METHOD set_proxy_port. - mv_proxy_port = iv_port. + ms_settings-proxy_port = iv_port. ENDMETHOD. METHOD get_proxy_port. - rv_port = mv_proxy_port. + rv_port = ms_settings-proxy_port. ENDMETHOD. METHOD set_run_critical_tests. - mv_run_critical_tests = iv_run. + ms_settings-run_critical_tests = iv_run. ENDMETHOD. METHOD get_run_critical_tests. - rv_run = mv_run_critical_tests. + rv_run = ms_settings-run_critical_tests. ENDMETHOD. METHOD get_max_lines. - rv_lines = mv_lines. + rv_lines = ms_settings-max_lines. ENDMETHOD. METHOD set_max_lines. - mv_lines = iv_lines. + ms_settings-max_lines = iv_lines. ENDMETHOD. METHOD get_adt_jump_enabled. - rv_adt_jump_enabled = mv_adt_jump_enabled. + rv_adt_jump_enabled = ms_settings-adt_jump_enabled. ENDMETHOD. METHOD set_adt_jump_enanbled. - mv_adt_jump_enabled = iv_adt_jump_enabled. + ms_settings-adt_jump_enabled = iv_adt_jump_enabled. ENDMETHOD. METHOD get_commitmsg_comment_length. - rv_length = mv_commitmsg_comment_length. + rv_length = ms_settings-commitmsg_comment_length. ENDMETHOD. METHOD set_commitmsg_comment_length. - mv_commitmsg_comment_length = iv_length. + ms_settings-commitmsg_comment_length = iv_length. ENDMETHOD. METHOD get_commitmsg_body_size. - rv_length = mv_commitmsg_body_size. + rv_length = ms_settings-commitmsg_body_size. ENDMETHOD. METHOD set_commitmsg_body_size. - mv_commitmsg_body_size = iv_length. + ms_settings-commitmsg_body_size = iv_length. ENDMETHOD. -ENDCLASS. + METHOD get_settings_xml. -CLASS lcl_persist_settings DEFINITION FINAL. + DATA: lr_output TYPE REF TO lcl_xml_output. - PUBLIC SECTION. - METHODS modify - IMPORTING - io_settings TYPE REF TO lcl_settings - RAISING - lcx_exception. - METHODS read - RETURNING - VALUE(ro_settings) TYPE REF TO lcl_settings. + CREATE OBJECT lr_output. + + lr_output->add( iv_name = lcl_settings=>c_dbtype_settings + ig_data = ms_settings ). + + ev_settings_xml = lr_output->render( ). + + ENDMETHOD. + + METHOD set_xml_settings. + + DATA: lr_input TYPE REF TO lcl_xml_input. + + CREATE OBJECT lr_input EXPORTING iv_xml = iv_settings_xml. + + CLEAR ms_settings. + + lr_input->read( EXPORTING iv_name = lcl_settings=>c_dbtype_settings + CHANGING cg_data = ms_settings ). + + ENDMETHOD. + + METHOD set_defaults. + + CLEAR ms_settings. + + set_proxy_authentication( abap_false ). + + set_run_critical_tests( abap_false ). + + set_max_lines( 500 ). + + set_adt_jump_enanbled( abap_false ). + + set_commitmsg_comment_length( lcl_settings=>c_commitmsg_comment_length_dft ). + + set_commitmsg_body_size( lcl_settings=>c_commitmsg_body_size_dft ). + + ENDMETHOD. ENDCLASS. @@ -1680,140 +1845,27 @@ CLASS lcl_persist_settings IMPLEMENTATION. METHOD modify. -* todo, refactor this class to use XML and only 1 row in the database? - lcl_app=>db( )->modify( - iv_type = 'SETTINGS' - iv_value = 'PROXY_URL' - iv_data = io_settings->get_proxy_url( ) ). - - lcl_app=>db( )->modify( - iv_type = 'SETTINGS' - iv_value = 'PROXY_PORT' - iv_data = io_settings->get_proxy_port( ) ). - - lcl_app=>db( )->modify( - iv_type = 'SETTINGS' - iv_value = 'PROXY_AUTH' - iv_data = io_settings->get_proxy_authentication( ) ). - - lcl_app=>db( )->modify( - iv_type = 'SETTINGS' - iv_value = 'CRIT_TESTS' - iv_data = io_settings->get_run_critical_tests( ) ). - - lcl_app=>db( )->modify( - iv_type = 'SETTINGS' - iv_value = 'MAX_LINES' - iv_data = |{ io_settings->get_max_lines( ) }| ). - - lcl_app=>db( )->modify( - iv_type = 'SETTINGS' - iv_value = 'ADT_JUMP' - iv_data = io_settings->get_adt_jump_enabled( ) ). - - lcl_app=>db( )->modify( - iv_type = 'SETTINGS' - iv_value = 'COMMENT_LEN' - iv_data = |{ io_settings->get_commitmsg_comment_length( ) }| ). - - lcl_app=>db( )->modify( - iv_type = 'SETTINGS' - iv_value = 'BODY_SIZE' - iv_data = |{ io_settings->get_commitmsg_body_size( ) }| ). + iv_type = lcl_settings=>c_dbtype_settings + iv_value = '' + iv_data = io_settings->get_settings_xml( ) ). ENDMETHOD. METHOD read. - DATA: lv_critical_tests_as_string TYPE string, - lv_critical_tests_as_boolean TYPE abap_bool, - lv_max_lines_as_string TYPE string, - lv_flag TYPE abap_bool, - lv_max_lines_as_integer TYPE i, - lv_s_param_value TYPE string, - lv_i_param_value TYPE i, - lv_adt_jump_enabled_as_string TYPE string, - lv_adt_jump_enabled_as_boolean TYPE abap_bool. - - CREATE OBJECT ro_settings. TRY. - ro_settings->set_proxy_url( - lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'PROXY_URL' ) ). - CATCH lcx_not_found. - ro_settings->set_proxy_url( '' ). - ENDTRY. - TRY. - ro_settings->set_proxy_port( - lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'PROXY_PORT' ) ). - CATCH lcx_not_found. - ro_settings->set_proxy_port( '' ). - ENDTRY. + ro_settings->set_xml_settings( + lcl_app=>db( )->read( iv_type = lcl_settings=>c_dbtype_settings + iv_value = '' ) ). - TRY. - lv_flag = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'PROXY_AUTH' ). - ro_settings->set_proxy_authentication( lv_flag ). - CATCH lcx_not_found. - ro_settings->set_proxy_authentication( abap_false ). - ENDTRY. + CATCH lcx_not_found lcx_exception. - TRY. - lv_critical_tests_as_string = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'CRIT_TESTS' ). - lv_critical_tests_as_boolean = lv_critical_tests_as_string. - ro_settings->set_run_critical_tests( lv_critical_tests_as_boolean ). - CATCH lcx_not_found. - ro_settings->set_run_critical_tests( abap_false ). - ENDTRY. + ro_settings->set_defaults( ). - TRY. - lv_max_lines_as_string = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'MAX_LINES' ). - lv_max_lines_as_integer = lv_max_lines_as_string. - ro_settings->set_max_lines( lv_max_lines_as_integer ). - CATCH lcx_not_found cx_sy_conversion_no_number. - ro_settings->set_max_lines( 500 ). " default - ENDTRY. - - TRY. - lv_adt_jump_enabled_as_string = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'ADT_JUMP' ). - lv_adt_jump_enabled_as_boolean = lv_adt_jump_enabled_as_string. - ro_settings->set_adt_jump_enanbled( lv_adt_jump_enabled_as_boolean ). - CATCH lcx_not_found. - ro_settings->set_adt_jump_enanbled( abap_false ). - ENDTRY. - - TRY. - lv_s_param_value = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'COMMENT_LEN' ). - lv_i_param_value = lv_s_param_value. - ro_settings->set_commitmsg_comment_length( lv_i_param_value ). - CATCH lcx_not_found cx_sy_conversion_no_number. - ro_settings->set_commitmsg_comment_length( lcl_settings=>c_commitmsg_comment_length_dft ). " default - ENDTRY. - - TRY. - lv_s_param_value = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'BODY_SIZE' ). - lv_i_param_value = lv_s_param_value. - ro_settings->set_commitmsg_body_size( lv_i_param_value ). - CATCH lcx_not_found cx_sy_conversion_no_number. - ro_settings->set_commitmsg_body_size( lcl_settings=>c_commitmsg_body_size_dft ). " default ENDTRY. ENDMETHOD. From 6b3376c88bad48646fef07e70a30a81c3c93fadc Mon Sep 17 00:00:00 2001 From: bigld Date: Sun, 2 Jul 2017 21:28:59 +0200 Subject: [PATCH 013/166] Delete old Setting records Delete old records in DB an separate migration check --- src/zabapgit_persistence.prog.abap | 201 +++++++++++++++++++---------- 1 file changed, 133 insertions(+), 68 deletions(-) diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index f15217588..2bb48a4d6 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -27,6 +27,8 @@ CLASS lcl_persist_migrate DEFINITION FINAL. lock_create RAISING lcx_exception, lock_exists + RETURNING VALUE(rv_exists) TYPE abap_bool, + settings_exists RETURNING VALUE(rv_exists) TYPE abap_bool. ENDCLASS. @@ -1381,11 +1383,26 @@ CLASS lcl_persist_migrate IMPLEMENTATION. migrate_repo( ). migrate_user( ). + ENDIF. + + IF settings_exists( ) = abap_false. migrate_settings( ). ENDIF. ENDMETHOD. + METHOD settings_exists. + + TRY. + lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = '' ). + rv_exists = abap_true. + CATCH lcx_not_found. + rv_exists = abap_false. + ENDTRY. + ENDMETHOD. + METHOD migrate_settings. DATA: lr_settings TYPE REF TO lcl_settings. @@ -1401,87 +1418,135 @@ CLASS lcl_persist_migrate IMPLEMENTATION. DATA: lv_adt_jump_enabled_as_boolean TYPE abap_bool. + CREATE OBJECT lr_persist_settings. + CREATE OBJECT lr_settings. + lr_settings->set_defaults( ). + TRY. - lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = '' ). + lr_settings->set_proxy_url( + lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' ) ). CATCH lcx_not_found. + ENDTRY. - CREATE OBJECT lr_persist_settings. - CREATE OBJECT lr_settings. - lr_settings->set_defaults( ). + TRY. + lr_settings->set_proxy_port( + lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' ) ). + CATCH lcx_not_found. + ENDTRY. - TRY. - lr_settings->set_proxy_url( - lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'PROXY_URL' ) ). - CATCH lcx_not_found. - ENDTRY. + TRY. + lv_flag = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'PROXY_AUTH' ). + lr_settings->set_proxy_authentication( lv_flag ). + CATCH lcx_not_found. + ENDTRY. - TRY. - lr_settings->set_proxy_port( - lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'PROXY_PORT' ) ). - CATCH lcx_not_found. - ENDTRY. + TRY. + lv_critical_tests_as_string = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'CRIT_TESTS' ). + lv_critical_tests_as_boolean = lv_critical_tests_as_string. + lr_settings->set_run_critical_tests( lv_critical_tests_as_boolean ). + CATCH lcx_not_found. + ENDTRY. - TRY. - lv_flag = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'PROXY_AUTH' ). - lr_settings->set_proxy_authentication( lv_flag ). - CATCH lcx_not_found. - ENDTRY. + TRY. + lv_max_lines_as_string = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'MAX_LINES' ). + lv_max_lines_as_integer = lv_max_lines_as_string. + lr_settings->set_max_lines( lv_max_lines_as_integer ). + CATCH lcx_not_found cx_sy_conversion_no_number. + ENDTRY. - TRY. - lv_critical_tests_as_string = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'CRIT_TESTS' ). - lv_critical_tests_as_boolean = lv_critical_tests_as_string. - lr_settings->set_run_critical_tests( lv_critical_tests_as_boolean ). - CATCH lcx_not_found. - ENDTRY. + TRY. + lv_adt_jump_enabled_as_string = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'ADT_JUMP' ). + lv_adt_jump_enabled_as_boolean = lv_adt_jump_enabled_as_string. + lr_settings->set_adt_jump_enanbled( lv_adt_jump_enabled_as_boolean ). + CATCH lcx_not_found. + ENDTRY. - TRY. - lv_max_lines_as_string = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'MAX_LINES' ). - lv_max_lines_as_integer = lv_max_lines_as_string. - lr_settings->set_max_lines( lv_max_lines_as_integer ). - CATCH lcx_not_found cx_sy_conversion_no_number. - ENDTRY. + TRY. + lv_s_param_value = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'COMMENT_LEN' ). + lv_i_param_value = lv_s_param_value. + lr_settings->set_commitmsg_comment_length( lv_i_param_value ). + CATCH lcx_not_found cx_sy_conversion_no_number. + ENDTRY. - TRY. - lv_adt_jump_enabled_as_string = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'ADT_JUMP' ). - lv_adt_jump_enabled_as_boolean = lv_adt_jump_enabled_as_string. - lr_settings->set_adt_jump_enanbled( lv_adt_jump_enabled_as_boolean ). - CATCH lcx_not_found. - ENDTRY. + TRY. + lv_s_param_value = lcl_app=>db( )->read( + iv_type = 'SETTINGS' + iv_value = 'BODY_SIZE' ). + lv_i_param_value = lv_s_param_value. + lr_settings->set_commitmsg_body_size( lv_i_param_value ). + CATCH lcx_not_found cx_sy_conversion_no_number. + ENDTRY. - TRY. - lv_s_param_value = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'COMMENT_LEN' ). - lv_i_param_value = lv_s_param_value. - lr_settings->set_commitmsg_comment_length( lv_i_param_value ). - CATCH lcx_not_found cx_sy_conversion_no_number. - ENDTRY. + lr_persist_settings->modify( io_settings = lr_settings ). - TRY. - lv_s_param_value = lcl_app=>db( )->read( - iv_type = 'SETTINGS' - iv_value = 'BODY_SIZE' ). - lv_i_param_value = lv_s_param_value. - lr_settings->set_commitmsg_body_size( lv_i_param_value ). - CATCH lcx_not_found cx_sy_conversion_no_number. - ENDTRY. + TRY. + lcl_app=>db( )->delete( + iv_type = 'SETTINGS' + iv_value = 'PROXY_URL' ). + CATCH lcx_exception. + ENDTRY. - lr_persist_settings->modify( io_settings = lr_settings ). + TRY. + lcl_app=>db( )->delete( + iv_type = 'SETTINGS' + iv_value = 'PROXY_PORT' ). + CATCH lcx_exception. + ENDTRY. + TRY. + lcl_app=>db( )->delete( + iv_type = 'SETTINGS' + iv_value = 'PROXY_AUTH' ). + CATCH lcx_exception. + ENDTRY. + + TRY. + lcl_app=>db( )->delete( + iv_type = 'SETTINGS' + iv_value = 'CRIT_TESTS' ). + CATCH lcx_exception. + ENDTRY. + + TRY. + lcl_app=>db( )->delete( + iv_type = 'SETTINGS' + iv_value = 'MAX_LINES' ). + CATCH lcx_exception. + ENDTRY. + + TRY. + lcl_app=>db( )->delete( + iv_type = 'SETTINGS' + iv_value = 'ADT_JUMP' ). + CATCH lcx_exception. + ENDTRY. + + TRY. + lcl_app=>db( )->delete( + iv_type = 'SETTINGS' + iv_value = 'COMMENT_LEN' ). + CATCH lcx_exception. + ENDTRY. + + TRY. + lcl_app=>db( )->delete( + iv_type = 'SETTINGS' + iv_value = 'BODY_SIZE' ). + CATCH lcx_exception. ENDTRY. ENDMETHOD. From aac17f6bba60aa0db8bd6a53ab1b00ff22fdc65a Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 3 Jul 2017 08:29:13 +0200 Subject: [PATCH 014/166] docs: added CHDO --- docs/ref-supported.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index e61cac915..32f356be2 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -10,6 +10,7 @@ Type | Description | Supported ACID | Checkpoint Group | Yes AUTH | Authorization Check Fields | Yes BOBF | BOPF: Business Object Model | [Plugin](https://github.com/larshp/abapGit-Plugins) +CHDO | Change Document Object | [#802](https://github.com/larshp/abapGit/issues/802) CLAS | Class (ABAP Objects) | Yes CMOD | Customer enhancement projects | [#151](https://github.com/larshp/abapGit/issues/151) DCLS | ABAP Data Control Language Sources | Yes From ed995c3c056030d300097a8bbc66489fb00bce22 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 3 Jul 2017 08:47:14 +0200 Subject: [PATCH 015/166] docs: fix link --- docs/ref-supported.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 32f356be2..10ea45f2b 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -79,4 +79,4 @@ WDYN | Web Dynpro Component | Yes WEBI | Virtual End Point | Yes XSLT | Transformation | Yes -Also see https://github.com/larshp/abapGit-Plugins +Also see [https://github.com/larshp/abapGit-Plugins](https://github.com/larshp/abapGit-Plugins) From 5e4e1c08e3923029c4268722545a13af8cd8c767 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Tue, 4 Jul 2017 11:05:20 +0200 Subject: [PATCH 016/166] docs: add AOBJ --- docs/ref-supported.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 10ea45f2b..95425885c 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -8,6 +8,7 @@ order: 20 Type | Description | Supported :------------ | :------------ | ------------: ACID | Checkpoint Group | Yes +AOBJ | Archiving Object | [#804](https://github.com/larshp/abapGit/issues/804) AUTH | Authorization Check Fields | Yes BOBF | BOPF: Business Object Model | [Plugin](https://github.com/larshp/abapGit-Plugins) CHDO | Change Document Object | [#802](https://github.com/larshp/abapGit/issues/802) From c4519e3fdf95e7999c0f7b698404b0f5927a223e Mon Sep 17 00:00:00 2001 From: bigld Date: Tue, 4 Jul 2017 18:51:13 +0200 Subject: [PATCH 017/166] Smartforms Style only exists if active A Smartforms Style only exists if there is at least one active version --- src/zabapgit_object_ssst.prog.abap | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/zabapgit_object_ssst.prog.abap b/src/zabapgit_object_ssst.prog.abap index 70bb33c9e..b5de8c775 100644 --- a/src/zabapgit_object_ssst.prog.abap +++ b/src/zabapgit_object_ssst.prog.abap @@ -12,6 +12,7 @@ CLASS lcl_object_ssst DEFINITION INHERITING FROM lcl_objects_super FINAL. PUBLIC SECTION. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + CONSTANTS: c_style_active TYPE tdactivate VALUE 'A'. PRIVATE SECTION. METHODS validate_font @@ -51,8 +52,13 @@ CLASS lcl_object_ssst IMPLEMENTATION. DATA: lv_stylename TYPE stxsadm-stylename. - SELECT SINGLE stylename FROM stxsadm INTO lv_stylename - WHERE stylename = ms_item-obj_name. + SELECT SINGLE adm~stylename + FROM stxsadm AS adm + INNER JOIN stxshead AS hdr + ON hdr~active = c_style_active + AND hdr~stylename = adm~stylename + INTO lv_stylename + WHERE adm~stylename = ms_item-obj_name. rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. "lif_object~exists @@ -85,7 +91,7 @@ CLASS lcl_object_ssst IMPLEMENTATION. CALL FUNCTION 'SSF_READ_STYLE' EXPORTING i_style_name = lv_style_name - i_style_active_flag = 'A' + i_style_active_flag = c_style_active i_style_variant = '%MAIN' i_style_language = mv_language IMPORTING From dd7a6bf89d92dc5848575bf2759d7177ee8ce5e1 Mon Sep 17 00:00:00 2001 From: bigld Date: Tue, 4 Jul 2017 19:00:51 +0200 Subject: [PATCH 018/166] Check STXSHEAD w/o JOIN --- src/zabapgit_object_ssst.prog.abap | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/zabapgit_object_ssst.prog.abap b/src/zabapgit_object_ssst.prog.abap index b5de8c775..b63fb2382 100644 --- a/src/zabapgit_object_ssst.prog.abap +++ b/src/zabapgit_object_ssst.prog.abap @@ -51,14 +51,11 @@ CLASS lcl_object_ssst IMPLEMENTATION. DATA: lv_stylename TYPE stxsadm-stylename. - - SELECT SINGLE adm~stylename - FROM stxsadm AS adm - INNER JOIN stxshead AS hdr - ON hdr~active = c_style_active - AND hdr~stylename = adm~stylename - INTO lv_stylename - WHERE adm~stylename = ms_item-obj_name. + SELECT SINGLE stylename + FROM stxshead INTO lv_stylename + WHERE active = c_style_active + AND stylename = ms_item-obj_name + AND vari = ''. rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. "lif_object~exists From 72836670b987c5e45602366869f33f7fd707b638 Mon Sep 17 00:00:00 2001 From: larshp Date: Tue, 4 Jul 2017 17:03:14 +0000 Subject: [PATCH 019/166] fix #806 --- src/zabapgit_tadir.prog.abap | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/zabapgit_tadir.prog.abap b/src/zabapgit_tadir.prog.abap index 8b678d823..b99a3bbe6 100644 --- a/src/zabapgit_tadir.prog.abap +++ b/src/zabapgit_tadir.prog.abap @@ -126,9 +126,9 @@ CLASS lcl_tadir IMPLEMENTATION. METHOD build. - DATA: lt_tadir TYPE lif_defs=>ty_tadir_tt, - lt_tdevc TYPE STANDARD TABLE OF tdevc, - lv_path TYPE string. + DATA: lt_tadir TYPE lif_defs=>ty_tadir_tt, + lt_tdevc TYPE STANDARD TABLE OF tdevc, + lv_path TYPE string. FIELD-SYMBOLS: LIKE LINE OF lt_tdevc, LIKE LINE OF rt_tadir. @@ -137,6 +137,7 @@ CLASS lcl_tadir IMPLEMENTATION. SELECT * FROM tadir INTO CORRESPONDING FIELDS OF TABLE rt_tadir WHERE devclass = iv_package + AND pgmid = 'R3TR' AND object <> 'DEVC' AND object <> 'SOTR' AND object <> 'SFB1' From 4071e74ef3e7428f83618bfa39d802ab65eccf66 Mon Sep 17 00:00:00 2001 From: larshp Date: Tue, 4 Jul 2017 18:20:42 +0000 Subject: [PATCH 020/166] fix #803 --- src/zabapgit_page_stage.prog.abap | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index 3a207cb33..625e57825 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -235,6 +235,8 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. CREATE OBJECT ro_html. lv_filename = is_file-path && is_file-filename. +* make sure whitespace is preserved in the DOM + REPLACE ALL OCCURRENCES OF ` ` IN lv_filename WITH ' '. ro_html->add( || ). From 2fb678021e779a6b0f6f1a76c889e79f7cc27f04 Mon Sep 17 00:00:00 2001 From: bigld Date: Tue, 4 Jul 2017 21:17:12 +0200 Subject: [PATCH 021/166] #794 SSST: package popup It's not possible to suppress popup completely but package is prefilled also fixed master language bug (was always sy-langu) --- src/zabapgit_object_ssst.prog.abap | 48 ++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/zabapgit_object_ssst.prog.abap b/src/zabapgit_object_ssst.prog.abap index b63fb2382..10d31542b 100644 --- a/src/zabapgit_object_ssst.prog.abap +++ b/src/zabapgit_object_ssst.prog.abap @@ -136,10 +136,11 @@ CLASS lcl_object_ssst IMPLEMENTATION. * see fm SSF_UPLOAD_STYLE DATA: ls_header TYPE ssfcats, + ls_new_header TYPE ssfcats, lt_paragraphs TYPE TABLE OF ssfparas, lt_strings TYPE TABLE OF ssfstrings, lt_tabstops TYPE TABLE OF stxstab. - + FIELD-SYMBOLS: TYPE spras. io_xml->read( EXPORTING iv_name = 'HEADER' CHANGING cg_data = ls_header ). @@ -152,26 +153,47 @@ CLASS lcl_object_ssst IMPLEMENTATION. validate_font( ls_header-tdfamily ). + CALL FUNCTION 'SSF_READ_STYLE' "Just load FG + EXPORTING + i_style_name = ls_header-stylename + i_style_active_flag = 'A' + EXCEPTIONS + OTHERS = 0. + IF sy-subrc <> 0. + ENDIF. + + SET PARAMETER ID 'EUK' FIELD iv_package. + ASSIGN ('(SAPLSTXBS)MASTER_LANGUAGE') TO . + IF sy-subrc = 0. + = ls_header-masterlang. + ENDIF. + CALL FUNCTION 'SSF_SAVE_STYLE' EXPORTING i_header = ls_header + IMPORTING + e_header = ls_new_header TABLES i_paragraphs = lt_paragraphs i_strings = lt_strings i_tabstops = lt_tabstops. - CALL FUNCTION 'SSF_ACTIVATE_STYLE' - EXPORTING - i_stylename = ls_header-stylename - EXCEPTIONS - no_name = 1 - no_style = 2 - cancelled = 3 - no_access_permission = 4 - illegal_language = 5 - OTHERS = 6. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SSF_ACTIVATE_STYLE' ). + IF ls_new_header IS NOT INITIAL. + + CALL FUNCTION 'SSF_ACTIVATE_STYLE' + EXPORTING + i_stylename = ls_header-stylename + EXCEPTIONS + no_name = 1 + no_style = 2 + cancelled = 3 + no_access_permission = 4 + illegal_language = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SSF_ACTIVATE_STYLE' ). + ENDIF. + ENDIF. ENDMETHOD. "deserialize From addcdf158e000c218ef885d7a8519cc348dd35c1 Mon Sep 17 00:00:00 2001 From: bigld Date: Wed, 5 Jul 2017 09:44:21 +0200 Subject: [PATCH 022/166] #812 Sort Order for Class Component texts --- src/zabapgit_object_oo_functions.prog.abap | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/zabapgit_object_oo_functions.prog.abap b/src/zabapgit_object_oo_functions.prog.abap index fe6c1da0b..ba0fe5da8 100644 --- a/src/zabapgit_object_oo_functions.prog.abap +++ b/src/zabapgit_object_oo_functions.prog.abap @@ -603,8 +603,9 @@ CLASS lcl_oo_base IMPLEMENTATION. METHOD lif_oo_object_fnc~read_descriptions. SELECT * FROM seocompotx INTO TABLE rt_descriptions - WHERE clsname = iv_obejct_name. "#EC CI_SUBRC - DELETE rt_descriptions WHERE descript IS INITIAL. + WHERE clsname = iv_obejct_name + AND descript <> '' + ORDER BY PRIMARY KEY. "#EC CI_SUBRC ENDMETHOD. METHOD lif_oo_object_fnc~delete. From e1d998e28bb9bcfc80b2f1de6dc0fc4c71b9d162 Mon Sep 17 00:00:00 2001 From: bigld Date: Thu, 6 Jul 2017 09:02:40 +0200 Subject: [PATCH 023/166] #811 progress indicator for encoding objects --- src/zabapgit_git.prog.abap | 41 ++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 3075bba11..d57b5c25a 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -251,7 +251,7 @@ CLASS lcl_git_transport IMPLEMENTATION. lcl_git_utils=>get_null( ) && ` ` && lv_cap_list && - lif_defs=>gc_newline. "#EC NOTEXT + lif_defs=>gc_newline. "#EC NOTEXT lv_cmd_pkt = lcl_git_utils=>pkt_string( lv_line ). lv_buffer = lv_cmd_pkt && '0000'. @@ -347,17 +347,17 @@ CLASS lcl_git_transport IMPLEMENTATION. lv_capa = 'side-band-64k no-progress multi_ack agent=' && lcl_http=>get_agent( ) ##NO_TEXT. lv_line = 'want' && ` ` && -sha1 - && ` ` && lv_capa && lif_defs=>gc_newline. "#EC NOTEXT + && ` ` && lv_capa && lif_defs=>gc_newline. "#EC NOTEXT ELSE. lv_line = 'want' && ` ` && -sha1 - && lif_defs=>gc_newline. "#EC NOTEXT + && lif_defs=>gc_newline. "#EC NOTEXT ENDIF. lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( lv_line ). ENDLOOP. IF iv_deepen = abap_true. lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( 'deepen 1' - && lif_defs=>gc_newline ). "#EC NOTEXT + && lif_defs=>gc_newline ). "#EC NOTEXT ENDIF. lv_buffer = lv_buffer @@ -682,17 +682,17 @@ CLASS lcl_git_pack IMPLEMENTATION. METHOD delta. - DATA: lv_delta TYPE xstring, - lv_base TYPE xstring, - lv_result TYPE xstring, + DATA: lv_delta TYPE xstring, + lv_base TYPE xstring, + lv_result TYPE xstring, * lv_bitbyte TYPE ty_bitbyte, - lv_offset TYPE i, - lv_sha1 TYPE lif_defs=>ty_sha1, - ls_object LIKE LINE OF ct_objects, - lv_len TYPE i, - lv_org TYPE x, + lv_offset TYPE i, + lv_sha1 TYPE lif_defs=>ty_sha1, + ls_object LIKE LINE OF ct_objects, + lv_len TYPE i, + lv_org TYPE x, * lv_i TYPE i, - lv_x TYPE x. + lv_x TYPE x. FIELD-SYMBOLS: LIKE LINE OF ct_objects. @@ -1030,10 +1030,10 @@ CLASS lcl_git_pack IMPLEMENTATION. lv_len TYPE i, lv_compressed TYPE xstring, lv_xstring TYPE xstring. - + DATA: lv_objects_total TYPE i. + DATA: lv_objects_processed TYPE i. FIELD-SYMBOLS: LIKE LINE OF it_objects. - rv_data = c_pack_start. CONCATENATE rv_data c_version INTO rv_data IN BYTE MODE. @@ -1043,7 +1043,18 @@ CLASS lcl_git_pack IMPLEMENTATION. iv_length = 4 ). CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE. + lv_objects_total = lines( it_objects ). + LOOP AT it_objects ASSIGNING . + + lv_objects_processed = sy-tabix. + + cl_progress_indicator=>progress_indicate( + EXPORTING + i_text = |encoding objects &1% ( &2 of &3 )| + i_processed = lv_objects_processed + i_total = lv_objects_total ). + lv_xstring = type_and_length( ). CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE. From 4a24144f099802f97a595c03ea292ef8b6831c7c Mon Sep 17 00:00:00 2001 From: bigld Date: Thu, 6 Jul 2017 09:09:32 +0200 Subject: [PATCH 024/166] fixed linter errors --- src/zabapgit_git.prog.abap | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index d57b5c25a..88aeb53e2 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -1049,11 +1049,9 @@ CLASS lcl_git_pack IMPLEMENTATION. lv_objects_processed = sy-tabix. - cl_progress_indicator=>progress_indicate( - EXPORTING - i_text = |encoding objects &1% ( &2 of &3 )| - i_processed = lv_objects_processed - i_total = lv_objects_total ). + cl_progress_indicator=>progress_indicate( i_text = |encoding objects &1% ( &2 of &3 )| + i_processed = lv_objects_processed + i_total = lv_objects_total ). lv_xstring = type_and_length( ). CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE. From 99868e1e2ce8c71166722f41f3e3c2d1912990f7 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 8 Jul 2017 06:28:29 +0000 Subject: [PATCH 025/166] SSFO, fix #813 --- src/zabapgit_object_ssfo.prog.abap | 60 ++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/src/zabapgit_object_ssfo.prog.abap b/src/zabapgit_object_ssfo.prog.abap index dfdd4aa39..c61e4cd04 100644 --- a/src/zabapgit_object_ssfo.prog.abap +++ b/src/zabapgit_object_ssfo.prog.abap @@ -13,6 +13,9 @@ CLASS lcl_object_ssfo DEFINITION INHERITING FROM lcl_objects_super FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + PRIVATE SECTION. + METHODS: fix_ids IMPORTING ii_xml_doc TYPE REF TO if_ixml_document. + ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* @@ -163,16 +166,11 @@ CLASS lcl_object_ssfo IMPLEMENTATION. li_node->set_value( 'DUMMY' ). ENDIF. -* remove IDs it seems that they are not used for anything -* the IDs are "random" so it caused diff files - IF lv_name = 'NODE' OR lv_name = 'WINDOW'. - li_attr = li_node->get_attributes( ). - li_attr->remove_named_item( 'ID' ). - ENDIF. - li_node = li_iterator->get_next( ). ENDWHILE. + fix_ids( li_xml_doc ). + li_element = li_xml_doc->get_root_element( ). li_element->set_attribute( name = 'sf' @@ -186,6 +184,54 @@ CLASS lcl_object_ssfo IMPLEMENTATION. ENDMETHOD. "serialize + METHOD fix_ids. +* makes sure ID and IDREF values are the same values for each serialization run +* the standard code has a counter that keeps increasing values + + DATA: lv_name TYPE string, + li_idref TYPE REF TO if_ixml_node, + li_node TYPE REF TO if_ixml_node, + li_attr TYPE REF TO if_ixml_named_node_map, + li_iterator TYPE REF TO if_ixml_node_iterator, + lt_idref TYPE STANDARD TABLE OF string WITH DEFAULT KEY. + + + li_iterator = ii_xml_doc->create_iterator( ). + li_node = li_iterator->get_next( ). + WHILE NOT li_node IS INITIAL. + lv_name = li_node->get_name( ). + IF lv_name = 'NODE' OR lv_name = 'WINDOW'. + li_idref = li_node->get_attributes( )->get_named_item( 'IDREF' ). + IF li_idref IS BOUND. + APPEND li_idref->get_value( ) TO lt_idref. + li_idref->set_value( |{ sy-tabix }| ). + ENDIF. + ENDIF. + li_node = li_iterator->get_next( ). + ENDWHILE. + + li_iterator = ii_xml_doc->create_iterator( ). + li_node = li_iterator->get_next( ). + WHILE NOT li_node IS INITIAL. + lv_name = li_node->get_name( ). + IF lv_name = 'NODE' OR lv_name = 'WINDOW'. + li_idref = li_node->get_attributes( )->get_named_item( 'ID' ). + IF li_idref IS BOUND. + lv_name = li_idref->get_value( ). + READ TABLE lt_idref WITH KEY table_line = lv_name TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + li_idref->set_value( |{ sy-tabix }| ). + ELSE. + li_attr = li_node->get_attributes( ). + li_attr->remove_named_item( 'ID' ). + ENDIF. + ENDIF. + ENDIF. + li_node = li_iterator->get_next( ). + ENDWHILE. + + ENDMETHOD. + METHOD lif_object~deserialize. * see function module FB_UPLOAD_FORM From 2d9ef055d57d289712e2fcc40520410fbf2d37d2 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 8 Jul 2017 11:07:10 +0000 Subject: [PATCH 026/166] adler32 optimization #818 --- src/zabapgit_util.prog.abap | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index a1e56414e..06e39421c 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -302,7 +302,8 @@ CLASS lcl_hash IMPLEMENTATION. METHOD adler32. - CONSTANTS: lc_adler TYPE i VALUE 65521. + CONSTANTS: lc_adler TYPE i VALUE 65521, + lc_max_b TYPE i VALUE 1800000000. DATA: lv_index TYPE i, lv_a TYPE i VALUE 1, @@ -316,10 +317,22 @@ CLASS lcl_hash IMPLEMENTATION. DO xstrlen( iv_xstring ) TIMES. lv_index = sy-index - 1. - lv_a = ( lv_a + iv_xstring+lv_index(1) ) MOD lc_adler. - lv_b = ( lv_b + lv_a ) MOD lc_adler. + lv_a = lv_a + iv_xstring+lv_index(1). + lv_b = lv_b + lv_a. + +* delay the MOD operation until the integer might overflow +* articles describe 5552 additions are allowed, but this assumes unsigned integers +* instead of allowing a fixed number of additions before running MOD, then +* just compare value of lv_b, this is 1 operation less than comparing and adding + IF lv_b > lc_max_b. + lv_a = lv_a MOD lc_adler. + lv_b = lv_b MOD lc_adler. + ENDIF. ENDDO. + lv_a = lv_a MOD lc_adler. + lv_b = lv_b MOD lc_adler. + lv_x = lv_a. lv_ca = lv_x. From 0492e35c25e8f43a62b0a6dce80fd86b8d3f0061 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sat, 8 Jul 2017 14:54:12 +0000 Subject: [PATCH 027/166] Unnecessary assertion removed --- src/zabapgit_html_action_utils.prog.abap | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index 905fb4b15..8eb3cd8f2 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -317,8 +317,6 @@ CLASS lcl_html_action_utils IMPLEMENTATION. ASSERT IS ASSIGNED. REPLACE ALL OCCURRENCES OF lc_replace IN WITH lif_defs=>gc_newline. - ASSERT es_fields IS NOT INITIAL. - ENDMETHOD. "parse_commit_request METHOD decode_bg_update. From 4e09d6e93f06cc215d0884f0d262b05c2e00c4ad Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 9 Jul 2017 08:12:59 +0000 Subject: [PATCH 028/166] v1.37.4 --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index d2110d066..e8b9b0480 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -7,7 +7,7 @@ TYPE-POOLS seop. INTERFACE lif_defs. CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.37.3'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.37.4'. "#EC NOTEXT TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, From 6e7f918f7957a2fb914d0e2c71b4fccb6c540198 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 9 Jul 2017 10:16:49 +0200 Subject: [PATCH 029/166] v1.37.4 --- changelog.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/changelog.txt b/changelog.txt index 8c6c790ba..4782beb8c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,15 @@ Legend + : added - : removed +2017-07-09 v1.37.4 +------------------ +* SSFO serialization fix +* Adler32 optimization +! progress indicator when encoding object pack +* CLAS diff fix, texts sorted +* SSST bug, only inactive exists +! Global settings persistence changed to XML + 2017-06-29 v1.37.3 ------------------ * fixed 702 compatibility From 8fe9d3b276f5210b77c701c56bfa242a70f1bc6e Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 9 Jul 2017 10:42:43 +0200 Subject: [PATCH 030/166] docs: update articles and presentations --- docs/other-articles-and-presentations.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/other-articles-and-presentations.md b/docs/other-articles-and-presentations.md index ceeec5749..2ae1ba8c9 100644 --- a/docs/other-articles-and-presentations.md +++ b/docs/other-articles-and-presentations.md @@ -45,3 +45,6 @@ Mastering SAP Technologies, Melbourne, May 23rd SAP Teched Las Vegas -Graham Robinson + +abapGit, [IT Conference on SAP Technologies](http://www.itconferencesap.com/), Cluj +-Lars Hvam From 964bbc08445ae64cdd61752b5cb605483ad4e855 Mon Sep 17 00:00:00 2001 From: Geert-Jan Klaps Date: Wed, 12 Jul 2017 14:02:14 +0200 Subject: [PATCH 031/166] Function groups with namespaces - not implemented Function groups with namespaces - not implemented #824 --- src/zabapgit_object_fugr.prog.abap | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_object_fugr.prog.abap b/src/zabapgit_object_fugr.prog.abap index 3fd94c39f..7fb10f6c9 100644 --- a/src/zabapgit_object_fugr.prog.abap +++ b/src/zabapgit_object_fugr.prog.abap @@ -206,9 +206,11 @@ CLASS lcl_object_fugr IMPLEMENTATION. METHOD deserialize_functions. - DATA: lv_include TYPE rs38l-include, - lv_area TYPE rs38l-area, - lt_source TYPE TABLE OF abaptxt255. + DATA: lv_include TYPE rs38l-include, + lv_area TYPE rs38l-area, + lv_namespace TYPE rs38l-namespace, + lt_source TYPE TABLE OF abaptxt255, + lv_dummy TYPE string. FIELD-SYMBOLS: LIKE LINE OF it_functions. @@ -219,6 +221,18 @@ CLASS lcl_object_fugr IMPLEMENTATION. lv_area = ms_item-obj_name. +* Determine the namespace of the imported function (if a namespace is used) + IF -funcname(1) EQ '/'. +* Get namespace from function name + lv_namespace = -funcname. + SHIFT lv_namespace BY 1 PLACES LEFT. + SPLIT lv_namespace AT '/' INTO lv_namespace lv_dummy. + CONCATENATE '/' lv_namespace '/' INTO lv_namespace. + +* Remove namespace from area (namespace and area are concatenated in RS_FUNCTIONMODULE_INSERT) + REPLACE ALL OCCURRENCES OF lv_namespace IN lv_area WITH ''. + ENDIF. + CALL FUNCTION 'FUNCTION_EXISTS' EXPORTING funcname = -funcname @@ -250,7 +264,7 @@ CLASS lcl_object_fugr IMPLEMENTATION. short_text = -short_text update_task = -update_task exception_class = -exception_classes -* NAMESPACE = ' ' todo + namespace = lv_namespace remote_basxml_supported = -remote_basxml IMPORTING function_include = lv_include From 7074deb6eb9dbd92f4bc2af78b940c027368ca5f Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Fri, 14 Jul 2017 11:11:36 +0200 Subject: [PATCH 032/166] docs: "index.html" not needed --- docs/_includes/header.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/header.html b/docs/_includes/header.html index 72b285bea..94151d45d 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -1,5 +1,5 @@
- abapGit documentation + abapGit documentation
From 3563c1ca5dc5716a63c6d150ed95d063ce760cd2 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Fri, 14 Jul 2017 13:38:06 +0200 Subject: [PATCH 033/166] docs: add link to presentation by @hendrik77 --- docs/other-articles-and-presentations.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/other-articles-and-presentations.md b/docs/other-articles-and-presentations.md index 2ae1ba8c9..32b2e296a 100644 --- a/docs/other-articles-and-presentations.md +++ b/docs/other-articles-and-presentations.md @@ -20,6 +20,9 @@ order: 30 [SAP Inside Track Hamburg](https://larshp.github.io/sithh2016/) -Lars Hvam +[SAP Inside Track Munich](https://www.slideshare.net/h_neumann/what-the-git-sap-inside-track-munich-2016) +-Hendrik Neumann + [SAP Teched Barcelona](https://larshp.github.io/teched-2016-emea/) -Lars Hvam From d58af5fafa878715ae99a867f838fe86902dc66b Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 16 Jul 2017 20:50:05 +0000 Subject: [PATCH 034/166] Remove unnecessary ASSERT #828 --- src/zabapgit_services_db.prog.abap | 1 - 1 file changed, 1 deletion(-) diff --git a/src/zabapgit_services_db.prog.abap b/src/zabapgit_services_db.prog.abap index 4bd7d8e24..380a48cb6 100644 --- a/src/zabapgit_services_db.prog.abap +++ b/src/zabapgit_services_db.prog.abap @@ -49,7 +49,6 @@ CLASS lcl_services_db IMPLEMENTATION. METHOD update. ASSERT is_content-type IS NOT INITIAL. - ASSERT is_content-value IS NOT INITIAL. lcl_app=>db( )->update( iv_type = is_content-type From 865951c2f673fdda102232426d0e5ef16727ae73 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 17 Jul 2017 16:02:33 +0200 Subject: [PATCH 035/166] background performance, #833 --- src/zabapgit_background.prog.abap | 46 +++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/zabapgit_background.prog.abap b/src/zabapgit_background.prog.abap index 252883901..545e4a5c1 100644 --- a/src/zabapgit_background.prog.abap +++ b/src/zabapgit_background.prog.abap @@ -113,25 +113,41 @@ CLASS lcl_background IMPLEMENTATION. METHOD push_auto. + TYPES: BEGIN OF ty_changed, + filename TYPE string, + path TYPE string, + changed_by TYPE xubname, + END OF ty_changed. + DATA: ls_comment TYPE lif_defs=>ty_comment, ls_files TYPE lif_defs=>ty_stage_files, + lt_changed TYPE STANDARD TABLE OF ty_changed WITH DEFAULT KEY, + lt_users TYPE STANDARD TABLE OF xubname WITH DEFAULT KEY, ls_user_files LIKE ls_files, + lv_changed_by TYPE xubname, lo_stage TYPE REF TO lcl_stage. - FIELD-SYMBOLS: LIKE LINE OF ls_files-local. - + FIELD-SYMBOLS: LIKE LINE OF lt_changed, + LIKE LINE OF ls_files-local. ls_files = lcl_stage_logic=>get( io_repo ). - DO. - READ TABLE ls_files-local INDEX 1 ASSIGNING . - IF sy-subrc <> 0. - EXIT. - ENDIF. + LOOP AT ls_files-local ASSIGNING . + lv_changed_by = lcl_objects=>changed_by( -item ). + APPEND lv_changed_by TO lt_users. + APPEND INITIAL LINE TO lt_changed ASSIGNING . + -changed_by = lv_changed_by. + -filename = -file-filename. + -path = -file-path. + ENDLOOP. + SORT lt_users ASCENDING. + DELETE ADJACENT DUPLICATES FROM lt_users. + + LOOP AT lt_users INTO lv_changed_by. CLEAR ls_comment. - ls_comment-committer-name = lcl_objects=>changed_by( -item ). + ls_comment-committer-name = lv_changed_by. ls_comment-committer-email = |{ ls_comment-committer-name }@localhost|. CREATE OBJECT lo_stage @@ -142,7 +158,12 @@ CLASS lcl_background IMPLEMENTATION. CLEAR ls_user_files. LOOP AT ls_files-local ASSIGNING . - IF lcl_objects=>changed_by( -item ) = ls_comment-committer-name. + READ TABLE lt_changed WITH KEY + path = -file-path + filename = -file-filename + changed_by = lv_changed_by + TRANSPORTING NO FIELDS. + IF sy-subrc = 0. WRITE: / 'stage' ##NO_TEXT, ls_comment-committer-name, -file-path, @@ -156,14 +177,11 @@ CLASS lcl_background IMPLEMENTATION. ENDIF. ENDLOOP. - ls_comment-comment = build_comment( ls_user_files ). + ls_comment-comment = build_comment( ls_user_files ). io_repo->push( is_comment = ls_comment io_stage = lo_stage ). - - ls_files = lcl_stage_logic=>get( io_repo ). - - ENDDO. + ENDLOOP. ENDMETHOD. From d7fb8d5bdc7f2dcd5ed5f4a5138d581622abf10c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=BCnter?= Date: Mon, 17 Jul 2017 19:54:43 +0200 Subject: [PATCH 036/166] Issue 795 (#820) * Add first unit tests for parse_fields * Fix Issue 795 - parse_fields with german umlauts * fix formatting issues * Refcatoring method renaming * Unchained method calls #795 * Fixed linter error and change usage of class... Fixed linter error. E.g. encoded umlauts as hex values. Replaced all usages of cl_http_utility%3D>if_http_utility~string_to_fields with lcl_html_action_utils%3D>parse_fields * add URL decoding logic --- src/zabapgit_html_action_utils.prog.abap | 56 ++++-- src/zabapgit_page_branch_overview.prog.abap | 2 +- src/zabapgit_page_repo_settings.prog.abap | 2 +- src/zabapgit_page_settings.prog.abap | 2 +- src/zabapgit_page_stage.prog.abap | 2 +- src/zabapgit_unit_test.prog.abap | 182 ++++++++++++++++++++ 6 files changed, 230 insertions(+), 16 deletions(-) diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index 905fb4b15..1e39986ac 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -15,6 +15,10 @@ CLASS lcl_html_action_utils DEFINITION FINAL. IMPORTING iv_string TYPE clike RETURNING VALUE(rt_fields) TYPE tihttpnvp. + CLASS-METHODS parse_fields_upper_case_name + IMPORTING iv_string TYPE clike + RETURNING VALUE(rt_fields) TYPE tihttpnvp. + CLASS-METHODS add_field IMPORTING name TYPE string iv TYPE any @@ -75,8 +79,8 @@ CLASS lcl_html_action_utils DEFINITION FINAL. RETURNING VALUE(rs_content) TYPE lcl_persistence_db=>ty_content. CLASS-METHODS parse_commit_request - IMPORTING it_postdata TYPE cnht_post_data_tab - EXPORTING es_fields TYPE any. + IMPORTING it_postdata TYPE cnht_post_data_tab + EXPORTING es_fields TYPE any. CLASS-METHODS decode_bg_update IMPORTING iv_getdata TYPE clike @@ -107,7 +111,32 @@ CLASS lcl_html_action_utils IMPLEMENTATION. METHOD parse_fields. - rt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ). + DATA: substrings TYPE stringtab, + field LIKE LINE OF rt_fields. + + FIELD-SYMBOLS: LIKE LINE OF substrings. + + SPLIT iv_string AT '&' INTO TABLE substrings. + + LOOP AT substrings ASSIGNING . + + CLEAR: field. + + field-name = substring_before( val = + sub = '=' ). + + field-value = substring_after( val = + sub = '=' ). + + INSERT field INTO TABLE rt_fields. + + ENDLOOP. + + ENDMETHOD. + + METHOD parse_fields_upper_case_name. + + rt_fields = parse_fields( iv_string ). field_keys_to_upper( CHANGING ct_fields = rt_fields ). ENDMETHOD. " parse_fields. @@ -175,8 +204,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION. DATA: lt_fields TYPE tihttpnvp. - - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ). + lt_fields = lcl_html_action_utils=>parse_fields( iv_string ). get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = ev_obj_type ). get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = ev_obj_name ). @@ -194,7 +222,8 @@ CLASS lcl_html_action_utils IMPLEMENTATION. METHOD dir_decode. DATA: lt_fields TYPE tihttpnvp. - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ). + + lt_fields = lcl_html_action_utils=>parse_fields( iv_string ). get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = rv_path ). ENDMETHOD. "dir_decode @@ -232,7 +261,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION. ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED. CLEAR: ev_key, eg_file, eg_object. - lt_fields = parse_fields( iv_string ). + lt_fields = parse_fields_upper_case_name( iv_string ). get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ). @@ -263,7 +292,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION. DATA: lt_fields TYPE tihttpnvp. - lt_fields = parse_fields( iv_string ). + lt_fields = parse_fields_upper_case_name( cl_http_utility=>unescape_url( |{ iv_string }| ) ). get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = rs_key-type ). get_field( EXPORTING name = 'VALUE' it = lt_fields CHANGING cv = rs_key-value ). @@ -277,9 +306,12 @@ CLASS lcl_html_action_utils IMPLEMENTATION. CONCATENATE LINES OF it_postdata INTO lv_string. + + lv_string = cl_http_utility=>unescape_url( lv_string ). + rs_content = dbkey_decode( lv_string ). - lt_fields = parse_fields( lv_string ). + lt_fields = parse_fields_upper_case_name( lv_string ). get_field( EXPORTING name = 'XMLDATA' it = lt_fields CHANGING cv = rs_content-data_str ). IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ??? @@ -304,7 +336,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION. CONCATENATE LINES OF it_postdata INTO lv_string. REPLACE ALL OCCURRENCES OF lif_defs=>gc_crlf IN lv_string WITH lc_replace. REPLACE ALL OCCURRENCES OF lif_defs=>gc_newline IN lv_string WITH lc_replace. - lt_fields = parse_fields( lv_string ). + lt_fields = parse_fields_upper_case_name( lv_string ). get_field( EXPORTING name = 'COMMITTER_NAME' it = lt_fields CHANGING cv = es_fields ). get_field( EXPORTING name = 'COMMITTER_EMAIL' it = lt_fields CHANGING cv = es_fields ). @@ -325,7 +357,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION. DATA: lt_fields TYPE tihttpnvp. - lt_fields = parse_fields( iv_getdata ). + lt_fields = parse_fields_upper_case_name( iv_getdata ). get_field( EXPORTING name = 'METHOD' it = lt_fields CHANGING cv = rs_fields ). get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = rs_fields ). @@ -342,7 +374,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION. DATA: lt_fields TYPE tihttpnvp. - lt_fields = parse_fields( iv_getdata ). + lt_fields = parse_fields_upper_case_name( iv_getdata ). get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ). get_field( EXPORTING name = 'SEED' it = lt_fields CHANGING cv = ev_seed ). diff --git a/src/zabapgit_page_branch_overview.prog.abap b/src/zabapgit_page_branch_overview.prog.abap index 6850e845f..719775c55 100644 --- a/src/zabapgit_page_branch_overview.prog.abap +++ b/src/zabapgit_page_branch_overview.prog.abap @@ -540,7 +540,7 @@ CLASS lcl_gui_page_boverview IMPLEMENTATION. CONCATENATE LINES OF it_postdata INTO lv_string. - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + lt_fields = lcl_html_action_utils=>parse_fields( lv_string ). READ TABLE lt_fields ASSIGNING WITH KEY name = 'source' ##NO_TEXT. ASSERT sy-subrc = 0. diff --git a/src/zabapgit_page_repo_settings.prog.abap b/src/zabapgit_page_repo_settings.prog.abap index 0b135fb55..95dc6cdc4 100644 --- a/src/zabapgit_page_repo_settings.prog.abap +++ b/src/zabapgit_page_repo_settings.prog.abap @@ -40,7 +40,7 @@ CLASS lcl_gui_page_repo_sett IMPLEMENTATION. DATA lv_serialized_post_data TYPE string. CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data. - rt_post_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_serialized_post_data ). + rt_post_fields = lcl_html_action_utils=>parse_fields( lv_serialized_post_data ). ENDMETHOD. diff --git a/src/zabapgit_page_settings.prog.abap b/src/zabapgit_page_settings.prog.abap index 687ba4b68..cf155e04a 100644 --- a/src/zabapgit_page_settings.prog.abap +++ b/src/zabapgit_page_settings.prog.abap @@ -219,7 +219,7 @@ CLASS lcl_gui_page_settings IMPLEMENTATION. DATA lv_serialized_post_data TYPE string. CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data. - rt_post_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_serialized_post_data ). + rt_post_fields = lcl_html_action_utils=>parse_fields( lv_serialized_post_data ). ENDMETHOD. diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index 625e57825..2ee7ad551 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -131,7 +131,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. LIKE LINE OF lt_fields. CONCATENATE LINES OF it_postdata INTO lv_string. - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ lv_string }| ). + lt_fields = lcl_html_action_utils=>parse_fields( lv_string ). IF lines( lt_fields ) = 0. lcx_exception=>raise( 'process_stage_list: empty list' ). diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index b093fc3d7..62de90170 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -1742,13 +1742,58 @@ CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS PUBLIC SECTION. + CLASS-METHODS class_constructor. METHODS add_field FOR TESTING. METHODS get_field FOR TESTING. + METHODS parse_fields_simple_case FOR TESTING. + METHODS parse_fields_advanced_case FOR TESTING. + METHODS parse_fields_german_umlauts FOR TESTING. + + PRIVATE SECTION. + + CONSTANTS: BEGIN OF co_german_umlaut_as_hex, + lower_case_ae TYPE xstring VALUE 'C3A4', + lower_case_oe TYPE xstring VALUE 'C3B6', + lower_case_ue TYPE xstring VALUE 'C3BC', + END OF co_german_umlaut_as_hex. + + CLASS-DATA: BEGIN OF ms_german_umlaut_as_char, + lower_case_ae TYPE string, + lower_case_oe TYPE string, + lower_case_ue TYPE string, + END OF ms_german_umlaut_as_char. + + DATA m_given_parse_string TYPE string. + DATA mt_parsed_fields TYPE tihttpnvp. + + METHODS _given_string_is + IMPORTING + i_string TYPE string. + METHODS _when_fields_are_parsed. + METHODS _then_fields_should_be + IMPORTING + index TYPE i + name TYPE string + value TYPE string. + + CLASS-METHODS _hex_to_char + IMPORTING + i_x TYPE xstring + RETURNING + VALUE(r_s) TYPE string. ENDCLASS. "ltcl_html_action_utils CLASS ltcl_html_action_utils IMPLEMENTATION. + METHOD class_constructor. + + ms_german_umlaut_as_char-lower_case_ae = _hex_to_char( co_german_umlaut_as_hex-lower_case_ae ). + ms_german_umlaut_as_char-lower_case_oe = _hex_to_char( co_german_umlaut_as_hex-lower_case_oe ). + ms_german_umlaut_as_char-lower_case_ue = _hex_to_char( co_german_umlaut_as_hex-lower_case_ue ). + + ENDMETHOD. + METHOD add_field. DATA: lt_fields TYPE tihttpnvp, @@ -1793,6 +1838,143 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. ENDMETHOD. "get_field + METHOD parse_fields_simple_case. + + _given_string_is( `committer_name=Gustav Gans` ). + + _when_fields_are_parsed( ). + + _then_fields_should_be( index = 1 name = `COMMITTER_NAME` value = `Gustav Gans` ). + + ENDMETHOD. + + METHOD parse_fields_advanced_case. + + _given_string_is( `committer_name=Albert Schweitzer&` + && `committer_email=albert.schweitzer@googlemail.com&` + && `comment=dummy comment&` + && `body=Message body<><>with line break<>&` + && `author_name=Karl Klammer&` + && `author_email=karl@klammer.com` ). + + _when_fields_are_parsed( ). + + _then_fields_should_be( index = 1 + name = `COMMITTER_NAME` + value = `Albert Schweitzer` ). + + _then_fields_should_be( index = 2 + name = `COMMITTER_EMAIL` + value = `albert.schweitzer@googlemail.com` ). + + _then_fields_should_be( index = 3 + name = `COMMENT` + value = `dummy comment` ). + + _then_fields_should_be( index = 4 + name = `BODY` + value = `Message body<><>with line break<>` ). + + _then_fields_should_be( index = 5 + name = `AUTHOR_NAME` + value = `Karl Klammer` ). + + _then_fields_should_be( index = 6 + name = `AUTHOR_EMAIL` + value = `karl@klammer.com` ). + + ENDMETHOD. + + METHOD parse_fields_german_umlauts. + + DATA: ae TYPE string, + oe TYPE string, + ue TYPE string, + ae_oe_ue TYPE string. + + ae = ms_german_umlaut_as_char-lower_case_ae. + oe = ms_german_umlaut_as_char-lower_case_oe. + ue = ms_german_umlaut_as_char-lower_case_ue. + + ae_oe_ue = ae && oe && ue. + + _given_string_is( |committer_name=Christian G{ ue }nter&| + && |committer_email=guenne@googlemail.com&| + && |comment={ ae_oe_ue }&| + && |body=Message body<><>with line break<>and umlauts. { ae_oe_ue }&| + && |author_name=Gerd Schr{ oe }der&| + && |author_email=gerd@schroeder.com| ). + + _when_fields_are_parsed( ). + + _then_fields_should_be( index = 1 + name = `COMMITTER_NAME` + value = |Christian G{ ue }nter| ). + + _then_fields_should_be( index = 2 + name = `COMMITTER_EMAIL` + value = `guenne@googlemail.com` ). + + _then_fields_should_be( index = 3 + name = `COMMENT` + value = ae_oe_ue ). + + _then_fields_should_be( index = 4 + name = `BODY` + value = |Message body<><>with line break<>and umlauts. { ae_oe_ue }| ). + + _then_fields_should_be( index = 5 + name = `AUTHOR_NAME` + value = |Gerd Schr{ oe }der| ). + + _then_fields_should_be( index = 6 + name = `AUTHOR_EMAIL` + value = `gerd@schroeder.com` ). + + ENDMETHOD. + + METHOD _given_string_is. + + m_given_parse_string = i_string. + + ENDMETHOD. + + METHOD _when_fields_are_parsed. + + mt_parsed_fields = lcl_html_action_utils=>parse_fields_upper_case_name( m_given_parse_string ). + + ENDMETHOD. + + METHOD _then_fields_should_be. + + FIELD-SYMBOLS: LIKE LINE OF mt_parsed_fields. + + READ TABLE mt_parsed_fields ASSIGNING + INDEX index. + + cl_abap_unit_assert=>assert_subrc( exp = 0 + msg = |No parsed field found at index { index }| ). + + cl_abap_unit_assert=>assert_equals( act = -name + exp = name + msg = |Name at index { index } should be { name }| ). + + cl_abap_unit_assert=>assert_equals( act = -value + exp = value + msg = |Value at index { index } should be { value }| ). + + ENDMETHOD. + + METHOD _hex_to_char. + + cl_abap_conv_in_ce=>create( )->convert( + EXPORTING + input = i_x + IMPORTING + data = r_s ). + + ENDMETHOD. + ENDCLASS. "ltcl_html_action_utils CLASS ltcl_path DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL From a6edffebc6bcb4ec0e1704e3786aec7a5e4c1678 Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 17 Jul 2017 17:58:30 +0000 Subject: [PATCH 037/166] v1.37.5 --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index e8b9b0480..b2f0f811c 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -7,7 +7,7 @@ TYPE-POOLS seop. INTERFACE lif_defs. CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.37.4'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.37.5'. "#EC NOTEXT TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, From 29ee28ffcac9f3b3f852ba63a5afa5f52a26dcc0 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 17 Jul 2017 20:00:41 +0200 Subject: [PATCH 038/166] v1.37.5 --- changelog.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.txt b/changelog.txt index 4782beb8c..24679ff86 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,12 @@ Legend + : added - : removed +2017-07-17 v1.37.5 +------------------ +* fix FUGR namespaces +* few ASSERTs removed +* decoding of non-7bit values from html gui + 2017-07-09 v1.37.4 ------------------ * SSFO serialization fix From a54d5779e92886117a34e1772d1a4c2cee5b65c3 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 19 Jul 2017 12:28:21 +0200 Subject: [PATCH 039/166] DOCT, changed_by #830 --- src/zabapgit_object_doct.prog.abap | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/zabapgit_object_doct.prog.abap b/src/zabapgit_object_doct.prog.abap index 6700ab155..0e7b928f7 100644 --- a/src/zabapgit_object_doct.prog.abap +++ b/src/zabapgit_object_doct.prog.abap @@ -65,6 +65,9 @@ CLASS lcl_object_doct IMPLEMENTATION. METHOD lif_object~changed_by. rv_user = read( )-head-tdluser. + IF rv_user IS INITIAL. + rv_user = c_user_unknown. + ENDIF. ENDMETHOD. "lif_object~changed_by METHOD lif_object~exists. From a9ae7991a228951f1e1b4d131af9babc41a31178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Nov=C3=A1k?= Date: Wed, 19 Jul 2017 13:22:13 +0200 Subject: [PATCH 040/166] Remove white space at end of line --- src/zabapgit_object_doct.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_object_doct.prog.abap b/src/zabapgit_object_doct.prog.abap index 0e7b928f7..08bff8fa9 100644 --- a/src/zabapgit_object_doct.prog.abap +++ b/src/zabapgit_object_doct.prog.abap @@ -67,7 +67,7 @@ CLASS lcl_object_doct IMPLEMENTATION. rv_user = read( )-head-tdluser. IF rv_user IS INITIAL. rv_user = c_user_unknown. - ENDIF. + ENDIF. ENDMETHOD. "lif_object~changed_by METHOD lif_object~exists. From 102e5f9858a3d54e7d7cc81122e58fc130525594 Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Thu, 20 Jul 2017 15:04:16 +0200 Subject: [PATCH 041/166] html_utils: URL unescape parameter fields For some strange reason even post data is URL escaped on our servers. How I discovered this issue: 1. go to stage 2. leave some files in the state ? 3. click the Commit link 4. get the error 'process_stage_list: unknown method %3F' URL decode '%3F' and see that the value is '?'. The value is set to the hidden input fields in its unescaped form in the function submitSapeventForm() but the value is escaped in the method lif_gui_page~on_event of the class lcl_gui_page_stage. --- src/zabapgit_html_action_utils.prog.abap | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index b7c0bacd8..6b29c2f35 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -124,9 +124,11 @@ CLASS lcl_html_action_utils IMPLEMENTATION. field-name = substring_before( val = sub = '=' ). + field-name = cl_http_utility=>unescape_url( field-name ). field-value = substring_after( val = sub = '=' ). + field-value = cl_http_utility=>unescape_url( field-value ). INSERT field INTO TABLE rt_fields. From fb56b725e46dfff2e9a94b2508897af9fe303449 Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 21 Jul 2017 15:28:11 +0000 Subject: [PATCH 042/166] SMIM, exists() performance #845 --- src/zabapgit_object_smim.prog.abap | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/zabapgit_object_smim.prog.abap b/src/zabapgit_object_smim.prog.abap index 4f13dda9e..2512a49d4 100644 --- a/src/zabapgit_object_smim.prog.abap +++ b/src/zabapgit_object_smim.prog.abap @@ -67,14 +67,16 @@ CLASS lcl_object_smim IMPLEMENTATION. METHOD lif_object~exists. - TRY. - get_url_for_io( ). - rv_bool = abap_true. - CATCH lcx_not_found. - rv_bool = abap_false. - ENDTRY. + DATA: lv_loio TYPE sdok_docid. - ENDMETHOD. "lif_object~exists + + lv_loio = ms_item-obj_name. + + SELECT SINGLE loio_id FROM smimloio INTO lv_loio + WHERE loio_id = lv_loio. + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. METHOD get_url_for_io. From 254a9c36803afc27b032ef16e3b5ce65d5a45ad8 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 23 Jul 2017 05:27:17 +0000 Subject: [PATCH 043/166] v1.37.6 --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index b2f0f811c..7ed8cdfad 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -7,7 +7,7 @@ TYPE-POOLS seop. INTERFACE lif_defs. CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.37.5'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.37.6'. "#EC NOTEXT TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, From d189e4eed9d277d11904f3a7e798a929a4508217 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 23 Jul 2017 07:28:38 +0200 Subject: [PATCH 044/166] v1.37.6 --- changelog.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.txt b/changelog.txt index 24679ff86..c835f91ac 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,12 @@ Legend + : added - : removed +2017-07-23 v1.37.6 +------------------ +* SMIM exists() performance +* Background mode performance improvements +* DOCT fix changed_by() dump + 2017-07-17 v1.37.5 ------------------ * fix FUGR namespaces From 72dfb59a0157ede6fd0dfb355dabaa7d36394caf Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 23 Jul 2017 07:55:23 +0000 Subject: [PATCH 045/166] user exit for overriding host #848 --- src/zabapgit.prog.abap | 1 + src/zabapgit_definitions.prog.abap | 2 ++ src/zabapgit_exit.prog.abap | 45 ++++++++++++++++++++++++++++++ src/zabapgit_exit.prog.xml | 22 +++++++++++++++ src/zabapgit_http.prog.abap | 4 ++- 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/zabapgit_exit.prog.abap create mode 100644 src/zabapgit_exit.prog.xml diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index fa7af4c0e..7ec348804 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -48,6 +48,7 @@ INCLUDE zabapgit_sap_package. INCLUDE zabapgit_folder_logic. INCLUDE zabapgit_requirements. INCLUDE zabapgit_authorizations. +INCLUDE zabapgit_exit. INCLUDE zabapgit_stage. INCLUDE zabapgit_git_helpers. diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 7ed8cdfad..6b1f96c55 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -33,6 +33,8 @@ INTERFACE lif_defs. TYPES: ty_string_tt TYPE STANDARD TABLE OF string WITH DEFAULT KEY. + TYPES: ty_icm_sinfo2_tt TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY. + TYPES: BEGIN OF ty_git_user, name TYPE string, diff --git a/src/zabapgit_exit.prog.abap b/src/zabapgit_exit.prog.abap new file mode 100644 index 000000000..b42ff300b --- /dev/null +++ b/src/zabapgit_exit.prog.abap @@ -0,0 +1,45 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_USER_EXITS +*&---------------------------------------------------------------------* + +INTERFACE lif_exit. + + METHODS: + change_local_host + CHANGING ct_hosts TYPE lif_defs=>ty_icm_sinfo2_tt. + +ENDINTERFACE. + +* add class LCL_USER_EXIT implementing LIF_EXIT in following include, +* place the include in a different package than ZABAPGIT +INCLUDE zabapgit_user_exit IF FOUND. + +******************* + +CLASS lcl_exit DEFINITION FINAL. + + PUBLIC SECTION. + CLASS-METHODS: get_instance RETURNING VALUE(ri_exit) TYPE REF TO lif_exit. + + INTERFACES: lif_exit. + +ENDCLASS. + +CLASS lcl_exit IMPLEMENTATION. + + METHOD get_instance. + + TRY. + CREATE OBJECT ri_exit TYPE ('LCL_USER_EXIT'). + CATCH cx_sy_create_object_error. + CREATE OBJECT ri_exit TYPE lcl_exit. + ENDTRY. + + ENDMETHOD. + + METHOD lif_exit~change_local_host. +* default behavior + RETURN. + ENDMETHOD. + +ENDCLASS. diff --git a/src/zabapgit_exit.prog.xml b/src/zabapgit_exit.prog.xml new file mode 100644 index 000000000..47417c874 --- /dev/null +++ b/src/zabapgit_exit.prog.xml @@ -0,0 +1,22 @@ + + + + + + ZABAPGIT_EXIT + A + X + I + E + X + + + + R + Include ZABAPGIT_USER_EXITS + 27 + + + + + diff --git a/src/zabapgit_http.prog.abap b/src/zabapgit_http.prog.abap index 72d64fc30..acfad0299 100644 --- a/src/zabapgit_http.prog.abap +++ b/src/zabapgit_http.prog.abap @@ -501,7 +501,7 @@ CLASS lcl_http IMPLEMENTATION. METHOD is_local_system. DATA: lv_host TYPE string, - lt_list TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY. + lt_list TYPE lif_defs=>ty_icm_sinfo2_tt. CALL FUNCTION 'ICM_GET_INFO2' @@ -516,6 +516,8 @@ CLASS lcl_http IMPLEMENTATION. RETURN. ENDIF. + lcl_exit=>get_instance( )->change_local_host( CHANGING ct_hosts = lt_list ). + FIND REGEX 'https?://([^/^:]*)' IN iv_url SUBMATCHES lv_host. From b1c2553740eb806a795170164170380ff1852b68 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 23 Jul 2017 08:14:24 +0000 Subject: [PATCH 046/166] allow sap objects, #738 --- src/zabapgit_exit.prog.abap | 8 +++++++- src/zabapgit_repo_impl.prog.abap | 11 ++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_exit.prog.abap b/src/zabapgit_exit.prog.abap index b42ff300b..2d1136d42 100644 --- a/src/zabapgit_exit.prog.abap +++ b/src/zabapgit_exit.prog.abap @@ -6,7 +6,9 @@ INTERFACE lif_exit. METHODS: change_local_host - CHANGING ct_hosts TYPE lif_defs=>ty_icm_sinfo2_tt. + CHANGING ct_hosts TYPE lif_defs=>ty_icm_sinfo2_tt, + allow_sap_objects + RETURNING VALUE(rv_allowed) TYPE abap_bool. ENDINTERFACE. @@ -42,4 +44,8 @@ CLASS lcl_exit IMPLEMENTATION. RETURN. ENDMETHOD. + METHOD lif_exit~allow_sap_objects. + rv_allowed = abap_false. + ENDMETHOD. + ENDCLASS. diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index eaedd802a..a639baafd 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -908,9 +908,14 @@ CLASS lcl_repo_srv IMPLEMENTATION. lcx_exception=>raise( 'not possible to use $TMP, create new (local) package' ). ENDIF. - SELECT SINGLE devclass FROM tdevc INTO lv_devclass - WHERE devclass = iv_package - AND as4user <> 'SAP'. "#EC CI_GENBUFF + IF lcl_exit=>get_instance( )->allow_sap_objects( ) = abap_true. + SELECT SINGLE devclass FROM tdevc INTO lv_devclass + WHERE devclass = iv_package. "#EC CI_GENBUFF + ELSE. + SELECT SINGLE devclass FROM tdevc INTO lv_devclass + WHERE devclass = iv_package + AND as4user <> 'SAP'. "#EC CI_GENBUFF + ENDIF. IF sy-subrc <> 0. lcx_exception=>raise( 'package not found or not allowed' ). ENDIF. From 5ff0cd958616dce1be0e61bf4ed53b7ee636b555 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 23 Jul 2017 12:20:29 +0000 Subject: [PATCH 047/166] refactoring rename METHOD int_to_xstring, and remove parameter change inputs for METHOD type_and_length and add unit tests --- src/zabapgit_git.prog.abap | 37 ++++++++++++++++--------------- src/zabapgit_unit_test.prog.abap | 38 +++++++++++++++++++++++++++++--- src/zabapgit_util.prog.abap | 8 +++---- 3 files changed, 57 insertions(+), 26 deletions(-) diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 88aeb53e2..c25960625 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -114,6 +114,12 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack. IMPORTING is_commit TYPE ty_commit RETURNING VALUE(rv_data) TYPE xstring. + CLASS-METHODS type_and_length + IMPORTING iv_type TYPE lif_defs=>ty_type + iv_length TYPE i + RETURNING VALUE(rv_xstring) TYPE xstring + RAISING lcx_exception. + PRIVATE SECTION. CONSTANTS: c_pack_start TYPE x LENGTH 4 VALUE '5041434B', " PACK c_zlib TYPE x LENGTH 2 VALUE '789C', @@ -124,11 +130,6 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack. CHANGING ct_objects TYPE lif_defs=>ty_objects_tt RAISING lcx_exception. - CLASS-METHODS type_and_length - IMPORTING is_object TYPE lif_defs=>ty_object - RETURNING VALUE(rv_xstring) TYPE xstring - RAISING lcx_exception. - CLASS-METHODS delta IMPORTING is_object TYPE lif_defs=>ty_object CHANGING ct_objects TYPE lif_defs=>ty_objects_tt @@ -430,7 +431,7 @@ CLASS lcl_git_pack IMPLEMENTATION. lv_x TYPE x LENGTH 1. - CASE is_object-type. + CASE iv_type. WHEN lif_defs=>gc_type-commit. lv_type = '001'. WHEN lif_defs=>gc_type-tree. @@ -443,7 +444,7 @@ CLASS lcl_git_pack IMPLEMENTATION. lcx_exception=>raise( 'Unexpected object type while encoding pack' ). ENDCASE. - lv_x4 = xstrlen( is_object-data ). + lv_x4 = iv_length. DO 32 TIMES. GET BIT sy-index OF lv_x4 INTO lv_c. CONCATENATE lv_bits lv_c INTO lv_bits. @@ -1025,22 +1026,20 @@ CLASS lcl_git_pack IMPLEMENTATION. METHOD encode. - DATA: lv_sha1 TYPE x LENGTH 20, - lv_adler32 TYPE lcl_hash=>ty_adler32, - lv_len TYPE i, - lv_compressed TYPE xstring, - lv_xstring TYPE xstring. - DATA: lv_objects_total TYPE i. - DATA: lv_objects_processed TYPE i. + DATA: lv_sha1 TYPE x LENGTH 20, + lv_adler32 TYPE lcl_hash=>ty_adler32, + lv_compressed TYPE xstring, + lv_xstring TYPE xstring, + lv_objects_total TYPE i, + lv_objects_processed TYPE i. + FIELD-SYMBOLS: LIKE LINE OF it_objects. rv_data = c_pack_start. CONCATENATE rv_data c_version INTO rv_data IN BYTE MODE. - lv_len = lines( it_objects ). - lv_xstring = lcl_convert=>int_to_xstring( iv_i = lv_len - iv_length = 4 ). + lv_xstring = lcl_convert=>int_to_xstring4( lines( it_objects ) ). CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE. lv_objects_total = lines( it_objects ). @@ -1053,7 +1052,9 @@ CLASS lcl_git_pack IMPLEMENTATION. i_processed = lv_objects_processed i_total = lv_objects_total ). - lv_xstring = type_and_length( ). + lv_xstring = type_and_length( + iv_type = -type + iv_length = xstrlen( -data ) ). CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE. cl_abap_gzip=>compress_binary( diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 62de90170..37b38afe9 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -62,6 +62,7 @@ ENDCLASS. "ltcl_convert DEFINITION CLASS ltcl_convert IMPLEMENTATION. METHOD convert_int. + DATA: lv_xstring TYPE xstring, lv_input TYPE i, lv_result TYPE i. @@ -69,8 +70,7 @@ CLASS ltcl_convert IMPLEMENTATION. DO 1000 TIMES. lv_input = sy-index. - lv_xstring = lcl_convert=>int_to_xstring( iv_i = lv_input - iv_length = 4 ). + lv_xstring = lcl_convert=>int_to_xstring4( lv_input ). lv_result = lcl_convert=>xstring_to_int( lv_xstring ). cl_abap_unit_assert=>assert_equals( @@ -1096,7 +1096,11 @@ CLASS ltcl_git_pack DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FI pack_multiple FOR TESTING RAISING lcx_exception, sort_tree1 FOR TESTING, - sort_tree2 FOR TESTING. + sort_tree2 FOR TESTING, + type_and_length01 FOR TESTING + RAISING lcx_exception, + type_and_length02 FOR TESTING + RAISING lcx_exception. METHODS: object_blob @@ -1113,6 +1117,34 @@ ENDCLASS. "test DEFINITION *----------------------------------------------------------------------* CLASS ltcl_git_pack IMPLEMENTATION. + METHOD type_and_length01. + + DATA: lv_result TYPE xstring. + + lv_result = lcl_git_pack=>type_and_length( + iv_type = lif_defs=>gc_type-commit + iv_length = 100 ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = '9406' ). + + ENDMETHOD. + + METHOD type_and_length02. + + DATA: lv_result TYPE xstring. + + lv_result = lcl_git_pack=>type_and_length( + iv_type = lif_defs=>gc_type-blob + iv_length = 90000 ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = 'B0F92B' ). + + ENDMETHOD. + METHOD sort_tree1. DATA: lt_tree TYPE lcl_git_pack=>ty_nodes_tt. diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index 06e39421c..cdd0ec32e 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -133,9 +133,8 @@ CLASS lcl_convert DEFINITION FINAL. RETURNING VALUE(rv_i) TYPE i RAISING lcx_exception. - CLASS-METHODS int_to_xstring + CLASS-METHODS int_to_xstring4 IMPORTING iv_i TYPE i - iv_length TYPE i RETURNING VALUE(rv_xstring) TYPE xstring. CLASS-METHODS split_string @@ -151,13 +150,12 @@ ENDCLASS. "lcl_convert DEFINITION *----------------------------------------------------------------------* CLASS lcl_convert IMPLEMENTATION. - METHOD int_to_xstring. + METHOD int_to_xstring4. +* returns xstring of length 4 containing the integer value iv_i DATA: lv_x TYPE x LENGTH 4. - ASSERT iv_length = 4. " other cases not implemented - lv_x = iv_i. rv_xstring = lv_x. From e84358ae2739da3f21b7fb057c8f67926193c2bd Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 23 Jul 2017 12:41:19 +0000 Subject: [PATCH 048/166] fix urlencoding --- src/zabapgit_html_action_utils.prog.abap | 18 ++++++++++++++++-- src/zabapgit_unit_test.prog.abap | 14 ++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index 6b29c2f35..bf81621fc 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -92,6 +92,11 @@ CLASS lcl_html_action_utils DEFINITION FINAL. ev_seed TYPE string RAISING lcx_exception. + PRIVATE SECTION. + CLASS-METHODS unescape + IMPORTING iv_string TYPE string + RETURNING VALUE(rv_string) TYPE string. + ENDCLASS. "lcl_html_action_utils DEFINITION *----------------------------------------------------------------------* @@ -124,11 +129,11 @@ CLASS lcl_html_action_utils IMPLEMENTATION. field-name = substring_before( val = sub = '=' ). - field-name = cl_http_utility=>unescape_url( field-name ). + field-name = unescape( field-name ). field-value = substring_after( val = sub = '=' ). - field-value = cl_http_utility=>unescape_url( field-value ). + field-value = unescape( field-value ). INSERT field INTO TABLE rt_fields. @@ -136,6 +141,15 @@ CLASS lcl_html_action_utils IMPLEMENTATION. ENDMETHOD. + METHOD unescape. +* do not use cl_http_utility as it does strange things with the encoding + rv_string = iv_string. + +* todo, more to be added here + REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'. + + ENDMETHOD. + METHOD parse_fields_upper_case_name. rt_fields = parse_fields( iv_string ). diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 37b38afe9..d187f05b5 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -1779,6 +1779,7 @@ CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS METHODS get_field FOR TESTING. METHODS parse_fields_simple_case FOR TESTING. METHODS parse_fields_advanced_case FOR TESTING. + METHODS parse_fields_unescape FOR TESTING. METHODS parse_fields_german_umlauts FOR TESTING. PRIVATE SECTION. @@ -1917,6 +1918,19 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. ENDMETHOD. + METHOD parse_fields_unescape. +* file status = '?', used in staging page + + _given_string_is( '/SRC/ZFOOBAR.PROG.ABAP=%3F' ). + + _when_fields_are_parsed( ). + + _then_fields_should_be( index = 1 + name = '/SRC/ZFOOBAR.PROG.ABAP' + value = '?' ). + + ENDMETHOD. + METHOD parse_fields_german_umlauts. DATA: ae TYPE string, From 0728e9d915ce17e229afe75001fd97264be6337e Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 23 Jul 2017 14:12:24 +0000 Subject: [PATCH 049/166] Bugfix access deleted branch in news page #834 Bugfix access deleted branch in news abapgit page. When the news page try to access a branch that doesn't exist anymore in the remote we catch the belonging exception and return. --- src/zabapgit_news.prog.abap | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/zabapgit_news.prog.abap b/src/zabapgit_news.prog.abap index 7a6f5a7d6..ceb19df72 100644 --- a/src/zabapgit_news.prog.abap +++ b/src/zabapgit_news.prog.abap @@ -112,8 +112,13 @@ CLASS lcl_news IMPLEMENTATION. lv_last_seen = lcl_app=>user( )->get_repo_last_change_seen( lv_url ). - " Find changelog - lt_remote = io_repo->get_files_remote( ). + TRY. + " Find changelog + lt_remote = io_repo->get_files_remote( ). + CATCH lcx_exception. + RETURN. + ENDTRY. + READ TABLE lt_remote ASSIGNING WITH KEY path = lc_log_path filename = lc_log_filename. From a73c67b846606c9daf0ef6f65e8d5a447f3dac3c Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 23 Jul 2017 15:26:12 +0000 Subject: [PATCH 050/166] add first operations for PRAG --- src/zabapgit_object_prag.prog.abap | 150 ++++++++++++++++++++++ src/zabapgit_object_prag.prog.xml | 25 ++++ src/zabapgit_object_serializing.prog.abap | 1 + 3 files changed, 176 insertions(+) create mode 100644 src/zabapgit_object_prag.prog.abap create mode 100644 src/zabapgit_object_prag.prog.xml diff --git a/src/zabapgit_object_prag.prog.abap b/src/zabapgit_object_prag.prog.abap new file mode 100644 index 000000000..1293e8384 --- /dev/null +++ b/src/zabapgit_object_prag.prog.abap @@ -0,0 +1,150 @@ +*&---------------------------------------------------------------------* +*& Include zabapgit_object_prag +*&---------------------------------------------------------------------* + +CLASS lcl_object_prag DEFINITION INHERITING FROM lcl_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + +ENDCLASS. + +CLASS lcl_object_prag IMPLEMENTATION. + + METHOD lif_object~changed_by. + + lcx_exception=>raise( 'PRAG not implemented' ). + + ENDMETHOD. + + METHOD lif_object~compare_to_remote_version. + + lcx_exception=>raise( 'PRAG not implemented' ). + + ENDMETHOD. + + METHOD lif_object~delete. + + lcx_exception=>raise( 'PRAG not implemented' ). + + ENDMETHOD. + + METHOD lif_object~deserialize. + + lcx_exception=>raise( 'PRAG not implemented' ). + + ENDMETHOD. + + METHOD lif_object~exists. + + lcx_exception=>raise( 'PRAG not implemented' ). + + ENDMETHOD. + + METHOD lif_object~get_metadata. + + rs_metadata = get_metadata( ). + rs_metadata-delete_tadir = abap_true. + + ENDMETHOD. + + METHOD lif_object~has_changed_since. + + rv_changed = abap_true. + + ENDMETHOD. + + METHOD lif_object~jump. + + call function 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' " Operation + object_name = ms_item-obj_name " Object Name + object_type = ms_item-obj_type " Object Type +* enclosing_object = " Program Name +* position = SPACE +* devclass = +* include = +* version = SPACE " 'A': Active, 'I': Inactive, SPACE: Corresponds to Work List +* monitor_activation = 'X' +* wb_manager = +* in_new_window = +* with_objectlist = SPACE +* with_worklist = SPACE +* IMPORTING +* new_name = " New Program Name (After Rename) +* wb_todo_request = +* TABLES +* objlist = +* CHANGING +* p_request = SPACE " Request/Task +* EXCEPTIONS +* not_executed = 1 +* invalid_object_type = 2 +* others = 3 + . + IF sy-subrc <> 0. +* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno +* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + +* DATA: object_data TYPE REF TO if_wb_object_data_model. +* +* DATA(persist) = NEW cl_wb_abpr_persist( ). +* +* TRY. +* persist->if_wb_object_persist~get( +* EXPORTING +* p_object_key = |{ ms_item-obj_name }| " Object Key +* p_version = 'A' " Version (Active/Inactive) +** p_language = SY-LANGU " Language Key (Important: must not trigger exception) +** p_if_none_match = +** p_existence_check_only = ABAP_FALSE " Perform Existence Check Only (no existence -> exception) +** p_data_selection = C_ALL_DATA " Selection (or Filter) of Object Data +** p_wb_rest = +** IMPORTING +** p_langu_is_not_maintained = " 'X': No data exists in specified language +** p_etag = +** p_other_existing_versions = +* CHANGING +* p_object_data = object_data +* ). +* +* CATCH cx_swb_object_does_not_exist cx_swb_exception INTO DATA(error). +* MESSAGE error TYPE 'S' DISPLAY LIKE 'E'. +* RETURN. +* ENDTRY. +* +* DATA(ui) = NEW cl_wb_abpr_ui( ). +* +* DATA(tool) = NEW cl_wb_abpr_tool( +* p_ui = ui +* p_persist = persist +* ). +* +* DATA(tool_data) = NEW cl_wb_generic_tool_data( ). +* +* tool_data->if_wb_tool_data_model~set_edit_mode( 'EDIT' ). +* +* ui->if_wb_tool_ui~set_data( +* EXPORTING +* p_object_data = object_data " Object Data +* p_tool_data = tool_data +* ). +* +* ui->if_wb_tool_ui~start( +* EXPORTING +* p_tool_ref = tool " Reference to WB Tool +* EXCEPTIONS +* error_occurred = 1 +* OTHERS = 2 ). + + ENDMETHOD. + + METHOD lif_object~serialize. + + lcx_exception=>raise( 'PRAG not implemented' ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zabapgit_object_prag.prog.xml b/src/zabapgit_object_prag.prog.xml new file mode 100644 index 000000000..04387e60c --- /dev/null +++ b/src/zabapgit_object_prag.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_OBJECT_PRAG + A + X + S + D$ + I + X + D$S + X + + + + R + ZABAPGIT_OBJECT_PRAG + 20 + + + + + diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap index 786367e50..baed8652b 100644 --- a/src/zabapgit_object_serializing.prog.abap +++ b/src/zabapgit_object_serializing.prog.abap @@ -28,6 +28,7 @@ INCLUDE zabapgit_object_msag. INCLUDE zabapgit_object_nrob. INCLUDE zabapgit_object_para. INCLUDE zabapgit_object_pinf. +INCLUDE zabapgit_object_prag. INCLUDE zabapgit_object_prog. INCLUDE zabapgit_object_samc. INCLUDE zabapgit_object_sapc. From 86e21c868740a194aca2dac33ee27a3c4105bc52 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 23 Jul 2017 15:45:24 +0000 Subject: [PATCH 051/166] add 'exists' implementation for PRAG --- src/zabapgit_object_prag.prog.abap | 85 ++++++++++++++---------------- 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/src/zabapgit_object_prag.prog.abap b/src/zabapgit_object_prag.prog.abap index 1293e8384..351c762a2 100644 --- a/src/zabapgit_object_prag.prog.abap +++ b/src/zabapgit_object_prag.prog.abap @@ -37,56 +37,21 @@ CLASS lcl_object_prag IMPLEMENTATION. METHOD lif_object~exists. - lcx_exception=>raise( 'PRAG not implemented' ). + DATA(persist) = NEW cl_wb_abpr_persist( ). - ENDMETHOD. + TRY. + persist->if_wb_object_persist~get( p_object_key = |{ ms_item-obj_name }| " Object Key + p_version = 'A' " Version (Active/Inactive) + p_existence_check_only = abap_true " Perform Existence Check Only (no existence -> exception) + ). - METHOD lif_object~get_metadata. + CATCH cx_swb_exception INTO DATA(error). + rv_bool = abap_false. + RETURN. + ENDTRY. - rs_metadata = get_metadata( ). - rs_metadata-delete_tadir = abap_true. + rv_bool = abap_true. - ENDMETHOD. - - METHOD lif_object~has_changed_since. - - rv_changed = abap_true. - - ENDMETHOD. - - METHOD lif_object~jump. - - call function 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' " Operation - object_name = ms_item-obj_name " Object Name - object_type = ms_item-obj_type " Object Type -* enclosing_object = " Program Name -* position = SPACE -* devclass = -* include = -* version = SPACE " 'A': Active, 'I': Inactive, SPACE: Corresponds to Work List -* monitor_activation = 'X' -* wb_manager = -* in_new_window = -* with_objectlist = SPACE -* with_worklist = SPACE -* IMPORTING -* new_name = " New Program Name (After Rename) -* wb_todo_request = -* TABLES -* objlist = -* CHANGING -* p_request = SPACE " Request/Task -* EXCEPTIONS -* not_executed = 1 -* invalid_object_type = 2 -* others = 3 - . - IF sy-subrc <> 0. -* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno -* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. * DATA: object_data TYPE REF TO if_wb_object_data_model. * @@ -141,6 +106,34 @@ CLASS lcl_object_prag IMPLEMENTATION. ENDMETHOD. + METHOD lif_object~get_metadata. + + rs_metadata = get_metadata( ). + rs_metadata-delete_tadir = abap_true. + + ENDMETHOD. + + METHOD lif_object~has_changed_since. + + rv_changed = abap_true. + + ENDMETHOD. + + METHOD lif_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' " Operation + object_name = ms_item-obj_name " Object Name + object_type = ms_item-obj_type " Object Type +* in_new_window = abap_true + EXCEPTIONS + not_executed = 1 + invalid_object_type = 2 + OTHERS = 3. + + ENDMETHOD. + METHOD lif_object~serialize. lcx_exception=>raise( 'PRAG not implemented' ). From 796529d3ef3c973abef43d03bef79d16ee07c4c6 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 23 Jul 2017 15:47:13 +0000 Subject: [PATCH 052/166] add implementation for compare_to_remote_version --- src/zabapgit_object_prag.prog.abap | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/zabapgit_object_prag.prog.abap b/src/zabapgit_object_prag.prog.abap index 351c762a2..18ab29bb6 100644 --- a/src/zabapgit_object_prag.prog.abap +++ b/src/zabapgit_object_prag.prog.abap @@ -19,7 +19,7 @@ CLASS lcl_object_prag IMPLEMENTATION. METHOD lif_object~compare_to_remote_version. - lcx_exception=>raise( 'PRAG not implemented' ). + CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. ENDMETHOD. @@ -126,7 +126,6 @@ CLASS lcl_object_prag IMPLEMENTATION. operation = 'SHOW' " Operation object_name = ms_item-obj_name " Object Name object_type = ms_item-obj_type " Object Type -* in_new_window = abap_true EXCEPTIONS not_executed = 1 invalid_object_type = 2 From 77922db475379b76e02374b324d431b01ec094bd Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 23 Jul 2017 21:29:29 +0000 Subject: [PATCH 053/166] add implementation of missing PRAG methods --- src/zabapgit_object_prag.prog.abap | 133 ++++++++++++++--------------- 1 file changed, 66 insertions(+), 67 deletions(-) diff --git a/src/zabapgit_object_prag.prog.abap b/src/zabapgit_object_prag.prog.abap index 18ab29bb6..ff42f2701 100644 --- a/src/zabapgit_object_prag.prog.abap +++ b/src/zabapgit_object_prag.prog.abap @@ -7,13 +7,21 @@ CLASS lcl_object_prag DEFINITION INHERITING FROM lcl_objects_super FINAL. PUBLIC SECTION. INTERFACES lif_object. + PRIVATE SECTION. + TYPES: BEGIN OF ty_pragma, + pragma TYPE c LENGTH 40, + extension TYPE c LENGTH 1, + signature TYPE c LENGTH 10, + description TYPE c LENGTH 255, + END OF ty_pragma. + ENDCLASS. CLASS lcl_object_prag IMPLEMENTATION. METHOD lif_object~changed_by. - lcx_exception=>raise( 'PRAG not implemented' ). + rv_user = sy-uname. ENDMETHOD. @@ -25,85 +33,61 @@ CLASS lcl_object_prag IMPLEMENTATION. METHOD lif_object~delete. - lcx_exception=>raise( 'PRAG not implemented' ). + TRY. + DATA(lo_pragma) = cl_abap_pragma=>get_ref( ms_item-obj_name ). + + lo_pragma->delete( ). + + CATCH cx_abap_pragma_not_exists + cx_abap_pragma_enqueue. + + lcx_exception=>raise( 'PRAG error' ). + + ENDTRY. ENDMETHOD. METHOD lif_object~deserialize. - lcx_exception=>raise( 'PRAG not implemented' ). + DATA: pragma TYPE ty_pragma. + + TRY. + io_xml->read( + EXPORTING + iv_name = 'PRAG' + CHANGING + cg_data = pragma ). + + DATA(lo_pragma) = cl_abap_pragma=>create( p_pragma = ms_item-obj_name + p_package = iv_package ). + + lo_pragma->set_info( p_description = pragma-description + p_signature = pragma-signature + p_extension = pragma-extension ). + + lo_pragma->save( ). + + CATCH cx_abap_pragma_not_exists + cx_abap_pragma_exists + cx_abap_pragma_enqueue. + + lcx_exception=>raise( 'PRAG error' ). + + ENDTRY. ENDMETHOD. METHOD lif_object~exists. - DATA(persist) = NEW cl_wb_abpr_persist( ). - TRY. - persist->if_wb_object_persist~get( p_object_key = |{ ms_item-obj_name }| " Object Key - p_version = 'A' " Version (Active/Inactive) - p_existence_check_only = abap_true " Perform Existence Check Only (no existence -> exception) - ). - - CATCH cx_swb_exception INTO DATA(error). + cl_abap_pragma=>get_ref( ms_item-obj_name ). + CATCH cx_abap_pragma_not_exists. rv_bool = abap_false. RETURN. ENDTRY. rv_bool = abap_true. - -* DATA: object_data TYPE REF TO if_wb_object_data_model. -* -* DATA(persist) = NEW cl_wb_abpr_persist( ). -* -* TRY. -* persist->if_wb_object_persist~get( -* EXPORTING -* p_object_key = |{ ms_item-obj_name }| " Object Key -* p_version = 'A' " Version (Active/Inactive) -** p_language = SY-LANGU " Language Key (Important: must not trigger exception) -** p_if_none_match = -** p_existence_check_only = ABAP_FALSE " Perform Existence Check Only (no existence -> exception) -** p_data_selection = C_ALL_DATA " Selection (or Filter) of Object Data -** p_wb_rest = -** IMPORTING -** p_langu_is_not_maintained = " 'X': No data exists in specified language -** p_etag = -** p_other_existing_versions = -* CHANGING -* p_object_data = object_data -* ). -* -* CATCH cx_swb_object_does_not_exist cx_swb_exception INTO DATA(error). -* MESSAGE error TYPE 'S' DISPLAY LIKE 'E'. -* RETURN. -* ENDTRY. -* -* DATA(ui) = NEW cl_wb_abpr_ui( ). -* -* DATA(tool) = NEW cl_wb_abpr_tool( -* p_ui = ui -* p_persist = persist -* ). -* -* DATA(tool_data) = NEW cl_wb_generic_tool_data( ). -* -* tool_data->if_wb_tool_data_model~set_edit_mode( 'EDIT' ). -* -* ui->if_wb_tool_ui~set_data( -* EXPORTING -* p_object_data = object_data " Object Data -* p_tool_data = tool_data -* ). -* -* ui->if_wb_tool_ui~start( -* EXPORTING -* p_tool_ref = tool " Reference to WB Tool -* EXCEPTIONS -* error_occurred = 1 -* OTHERS = 2 ). - ENDMETHOD. METHOD lif_object~get_metadata. @@ -123,9 +107,9 @@ CLASS lcl_object_prag IMPLEMENTATION. CALL FUNCTION 'RS_TOOL_ACCESS' EXPORTING - operation = 'SHOW' " Operation - object_name = ms_item-obj_name " Object Name - object_type = ms_item-obj_type " Object Type + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type EXCEPTIONS not_executed = 1 invalid_object_type = 2 @@ -135,7 +119,22 @@ CLASS lcl_object_prag IMPLEMENTATION. METHOD lif_object~serialize. - lcx_exception=>raise( 'PRAG not implemented' ). + TRY. + DATA(lo_pragma) = cl_abap_pragma=>get_ref( ms_item-obj_name ). + + DATA(pragma) = VALUE ty_pragma( pragma = lo_pragma->pragma + extension = lo_pragma->extension + signature = lo_pragma->signature + description = lo_pragma->description ). + + io_xml->add( + EXPORTING + iv_name = 'PRAG' + ig_data = pragma ). + + CATCH cx_abap_pragma_not_exists. + RETURN. + ENDTRY. ENDMETHOD. From d7b872a8ebd120efdb04a10e50f28c720de802bf Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 24 Jul 2017 18:21:20 +0000 Subject: [PATCH 054/166] PRAG refactoring --- src/zabapgit_object_prag.prog.abap | 197 +++++++++++++++++------------ 1 file changed, 116 insertions(+), 81 deletions(-) diff --git a/src/zabapgit_object_prag.prog.abap b/src/zabapgit_object_prag.prog.abap index ff42f2701..e79b062ef 100644 --- a/src/zabapgit_object_prag.prog.abap +++ b/src/zabapgit_object_prag.prog.abap @@ -15,81 +15,35 @@ CLASS lcl_object_prag DEFINITION INHERITING FROM lcl_objects_super FINAL. description TYPE c LENGTH 255, END OF ty_pragma. + METHODS: + _raise_pragma_not_exists + RAISING + lcx_exception, + + _raise_pragma_exists + RAISING + lcx_exception, + + _raise_pragma_enqueue + RAISING + lcx_exception. + ENDCLASS. CLASS lcl_object_prag IMPLEMENTATION. + METHOD lif_object~has_changed_since. + + rv_changed = abap_true. + + ENDMETHOD. + METHOD lif_object~changed_by. rv_user = sy-uname. ENDMETHOD. - METHOD lif_object~compare_to_remote_version. - - CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. - - ENDMETHOD. - - METHOD lif_object~delete. - - TRY. - DATA(lo_pragma) = cl_abap_pragma=>get_ref( ms_item-obj_name ). - - lo_pragma->delete( ). - - CATCH cx_abap_pragma_not_exists - cx_abap_pragma_enqueue. - - lcx_exception=>raise( 'PRAG error' ). - - ENDTRY. - - ENDMETHOD. - - METHOD lif_object~deserialize. - - DATA: pragma TYPE ty_pragma. - - TRY. - io_xml->read( - EXPORTING - iv_name = 'PRAG' - CHANGING - cg_data = pragma ). - - DATA(lo_pragma) = cl_abap_pragma=>create( p_pragma = ms_item-obj_name - p_package = iv_package ). - - lo_pragma->set_info( p_description = pragma-description - p_signature = pragma-signature - p_extension = pragma-extension ). - - lo_pragma->save( ). - - CATCH cx_abap_pragma_not_exists - cx_abap_pragma_exists - cx_abap_pragma_enqueue. - - lcx_exception=>raise( 'PRAG error' ). - - ENDTRY. - - ENDMETHOD. - - METHOD lif_object~exists. - - TRY. - cl_abap_pragma=>get_ref( ms_item-obj_name ). - CATCH cx_abap_pragma_not_exists. - rv_bool = abap_false. - RETURN. - ENDTRY. - - rv_bool = abap_true. - - ENDMETHOD. - METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). @@ -97,9 +51,87 @@ CLASS lcl_object_prag IMPLEMENTATION. ENDMETHOD. - METHOD lif_object~has_changed_since. + METHOD lif_object~exists. - rv_changed = abap_true. + TRY. + cl_abap_pragma=>get_ref( ms_item-obj_name ). + + CATCH cx_abap_pragma_not_exists. + rv_bool = abap_false. + RETURN. + ENDTRY. + + rv_bool = abap_true. + + ENDMETHOD. + + METHOD lif_object~serialize. + + DATA: lo_pragma TYPE REF TO cl_abap_pragma, + pragma TYPE lcl_object_prag=>ty_pragma. + + TRY. + lo_pragma = cl_abap_pragma=>get_ref( ms_item-obj_name ). + + pragma-pragma = lo_pragma->pragma. + pragma-extension = lo_pragma->extension. + pragma-signature = lo_pragma->signature. + pragma-description = lo_pragma->description. + + io_xml->add( iv_name = 'PRAG' + ig_data = pragma ). + + CATCH cx_abap_pragma_not_exists. + _raise_pragma_not_exists( ). + ENDTRY. + + ENDMETHOD. + + METHOD lif_object~deserialize. + + DATA: pragma TYPE ty_pragma, + lo_pragma TYPE REF TO cl_abap_pragma. + + TRY. + io_xml->read( + EXPORTING + iv_name = 'PRAG' + CHANGING + cg_data = pragma ). + + lo_pragma = cl_abap_pragma=>create( p_pragma = ms_item-obj_name + p_package = iv_package ). + + lo_pragma->set_info( p_description = pragma-description + p_signature = pragma-signature + p_extension = pragma-extension ). + + lo_pragma->save( ). + + CATCH cx_abap_pragma_not_exists. + _raise_pragma_not_exists( ). + CATCH cx_abap_pragma_exists. + _raise_pragma_exists( ). + CATCH cx_abap_pragma_enqueue. + _raise_pragma_enqueue( ). + ENDTRY. + + ENDMETHOD. + + METHOD lif_object~delete. + + DATA: lo_pragma TYPE REF TO cl_abap_pragma. + + TRY. + lo_pragma = cl_abap_pragma=>get_ref( ms_item-obj_name ). + + lo_pragma->delete( ). + + CATCH cx_abap_pragma_not_exists. + _raise_pragma_not_exists( ). + CATCH cx_abap_pragma_enqueue. + _raise_pragma_enqueue( ). + ENDTRY. ENDMETHOD. @@ -117,24 +149,27 @@ CLASS lcl_object_prag IMPLEMENTATION. ENDMETHOD. - METHOD lif_object~serialize. + METHOD lif_object~compare_to_remote_version. - TRY. - DATA(lo_pragma) = cl_abap_pragma=>get_ref( ms_item-obj_name ). + CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. - DATA(pragma) = VALUE ty_pragma( pragma = lo_pragma->pragma - extension = lo_pragma->extension - signature = lo_pragma->signature - description = lo_pragma->description ). + ENDMETHOD. - io_xml->add( - EXPORTING - iv_name = 'PRAG' - ig_data = pragma ). + METHOD _raise_pragma_enqueue. - CATCH cx_abap_pragma_not_exists. - RETURN. - ENDTRY. + lcx_exception=>raise( |Pragma { ms_item-obj_name } enqueue error| ). + + ENDMETHOD. + + METHOD _raise_pragma_exists. + + lcx_exception=>raise( |Pragma { ms_item-obj_name } exists| ). + + ENDMETHOD. + + METHOD _raise_pragma_not_exists. + + lcx_exception=>raise( |Pragma { ms_item-obj_name } doesn't exist| ). ENDMETHOD. From 258414aba6cb9341d59d44098f70eabab015c32e Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 24 Jul 2017 18:54:53 +0000 Subject: [PATCH 055/166] add SICF jump --- src/zabapgit_object_sicf.prog.abap | 34 +++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index 8fa11f59f..5fe090d7a 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -419,7 +419,39 @@ CLASS lcl_object_sicf IMPLEMENTATION. ENDMETHOD. "delete METHOD lif_object~jump. - lcx_exception=>raise( 'todo, SICF, jump' ). + + DATA: ls_bcdata TYPE bdcdata, + lt_bcdata TYPE STANDARD TABLE OF bdcdata. + + ls_bcdata-program = 'RSICFTREE'. + ls_bcdata-dynpro = '1000'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + ls_bcdata-dynpro = space. + ls_bcdata-dynbegin = space. + ls_bcdata-fnam = 'ICF_SERV'. + ls_bcdata-fval = ms_item-obj_name. + APPEND ls_bcdata TO lt_bcdata. + + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=ONLI'. + APPEND ls_bcdata TO lt_bcdata. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'SICF' + mode_val = 'E' + TABLES + using_tab = lt_bcdata + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SICF' ). + ENDIF. + ENDMETHOD. "jump METHOD lif_object~compare_to_remote_version. From 486d9afeb2574f41202f9612bb1572df616faca2 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 24 Jul 2017 19:37:09 +0000 Subject: [PATCH 056/166] Bugfix delete SICF which is managed by SAPC --- src/zabapgit_object_sicf.prog.abap | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index 8fa11f59f..86bd431f5 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -391,9 +391,16 @@ CLASS lcl_object_sicf IMPLEMENTATION. DATA: ls_icfservice TYPE icfservice. - read( IMPORTING es_icfservice = ls_icfservice ). + IF ls_icfservice IS INITIAL. + " It seems that the ICF service doesn't exist anymore. + " But that's ok, because some objects like SAPC manage + " the lifecycle of its ICF service by itself and already + " deleted the service. + RETURN. + ENDIF. + cl_icf_tree=>if_icf_tree~delete_node( EXPORTING icfparguid = ls_icfservice-icfparguid From ea1345d5e8b547a226adf3eefdf406c244cd957d Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 24 Jul 2017 20:08:11 +0000 Subject: [PATCH 057/166] refactoring SAPC --- src/zabapgit_object_sapc.prog.abap | 89 ++++++++++-------------------- 1 file changed, 28 insertions(+), 61 deletions(-) diff --git a/src/zabapgit_object_sapc.prog.abap b/src/zabapgit_object_sapc.prog.abap index b30a96586..47a1bbb88 100644 --- a/src/zabapgit_object_sapc.prog.abap +++ b/src/zabapgit_object_sapc.prog.abap @@ -7,20 +7,13 @@ CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_super FINAL. PUBLIC SECTION. INTERFACES lif_object. + PRIVATE SECTION. DATA: mo_persistence TYPE REF TO if_wb_object_persist, mo_apc_appl_obj_data TYPE REF TO if_wb_object_data_model. METHODS: - get_data_object - RETURNING - value(ro_apc_appl_obj_data) TYPE REF TO if_wb_object_data_model - RAISING - lcx_exception, - - get_persistence - RETURNING - value(ro_persistence) TYPE REF TO if_wb_object_persist + create_apc_objects RAISING lcx_exception, @@ -58,6 +51,8 @@ CLASS lcl_object_sapc IMPLEMENTATION. TYPE any, TYPE any. + create_apc_objects( ). + TRY. CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE'). ASSIGN lr_data->* TO . @@ -95,13 +90,6 @@ CLASS lcl_object_sapc IMPLEMENTATION. RETURN. ENDIF. - TRY. - get_data_object( ). - - CATCH lcx_exception. - RETURN. - ENDTRY. - rv_bool = abap_true. ENDMETHOD. "lif_object~exists @@ -114,6 +102,8 @@ CLASS lcl_object_sapc IMPLEMENTATION. TYPE any, TYPE any. + create_apc_objects( ). + TRY. CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE'). ASSIGN lr_data->* TO . @@ -168,11 +158,12 @@ CLASS lcl_object_sapc IMPLEMENTATION. METHOD lif_object~deserialize. - DATA: appl_obj_data TYPE REF TO if_wb_object_data_model, - lr_data TYPE REF TO data. + DATA: lr_data TYPE REF TO data. FIELD-SYMBOLS: TYPE any. + create_apc_objects( ). + TRY. CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE'). ASSIGN lr_data->* TO . @@ -191,8 +182,6 @@ CLASS lcl_object_sapc IMPLEMENTATION. lif_object~delete( ). ENDIF. - appl_obj_data = get_data_object( ). - TRY. lock( ). @@ -214,9 +203,9 @@ CLASS lcl_object_sapc IMPLEMENTATION. lcx_exception=>raise( 'Error occured while creating SAPC' ). ENDIF. - appl_obj_data->set_data( ). + mo_apc_appl_obj_data->set_data( ). - get_persistence( )->save( p_object_data = appl_obj_data ). + mo_persistence->save( p_object_data = mo_apc_appl_obj_data ). unlock( ). @@ -230,12 +219,14 @@ CLASS lcl_object_sapc IMPLEMENTATION. DATA: object_key TYPE seu_objkey. + create_apc_objects( ). + object_key = ms_item-obj_name. TRY. lock( ). - get_persistence( )->delete( p_object_key = object_key ). + mo_persistence->delete( p_object_key = object_key ). unlock( ). @@ -259,41 +250,22 @@ CLASS lcl_object_sapc IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. ENDMETHOD. "lif_object~compare_to_remote_version - METHOD get_data_object. + METHOD create_apc_objects. - IF mo_apc_appl_obj_data IS NOT BOUND. - - TRY. + TRY. + IF mo_apc_appl_obj_data IS NOT BOUND. CREATE OBJECT mo_apc_appl_obj_data TYPE ('CL_APC_APPLICATION_OBJ_DATA'). + ENDIF. - CATCH cx_root. - lcx_exception=>raise( 'SAPC not supported' ). - ENDTRY. - - ENDIF. - - ro_apc_appl_obj_data = mo_apc_appl_obj_data. - - ENDMETHOD. "get_data_object - - - METHOD get_persistence. - - IF mo_persistence IS NOT BOUND. - - TRY. + IF mo_persistence IS NOT BOUND. CREATE OBJECT mo_persistence TYPE ('CL_APC_APPLICATION_OBJ_PERS'). + ENDIF. - CATCH cx_root. - lcx_exception=>raise( 'SAPC not supported' ). - ENDTRY. - - ENDIF. - - ro_persistence = mo_persistence. - - ENDMETHOD. "get_persistence + CATCH cx_root. + lcx_exception=>raise( 'SAPC not supported' ). + ENDTRY. + ENDMETHOD. METHOD lock. @@ -305,8 +277,6 @@ CLASS lcl_object_sapc IMPLEMENTATION. object_key = ms_item-obj_name. objtype = ms_item-obj_type. - get_persistence( ). - mo_persistence->lock( EXPORTING p_objname_tr = objname @@ -333,21 +303,19 @@ CLASS lcl_object_sapc IMPLEMENTATION. object_key = ms_item-obj_name. objtype = ms_item-obj_type. - get_persistence( )->unlock( p_objname_tr = objname - p_object_key = object_key - p_objtype_tr = objtype ). + mo_persistence->unlock( p_objname_tr = objname + p_object_key = object_key + p_objtype_tr = objtype ). ENDMETHOD. "unlock METHOD get_data. - DATA: object_key TYPE seu_objkey. + DATA: object_key TYPE seu_objkey. object_key = ms_item-obj_name. TRY. - get_persistence( ). - mo_persistence->get( EXPORTING p_object_key = object_key @@ -365,5 +333,4 @@ CLASS lcl_object_sapc IMPLEMENTATION. ENDMETHOD. "get_data - ENDCLASS. "lcl_object_sAPC IMPLEMENTATION From b621fbaa3611e0cd4abb175510101b25eef1cca0 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 24 Jul 2017 20:48:52 +0000 Subject: [PATCH 058/166] Introduce common base class for SAPC/SAMC Introduce common base class lcl_objects_channel_super for SAPC / SAMC --- src/zabapgit_object_samc.prog.abap | 342 ++------------------------- src/zabapgit_object_sapc.prog.abap | 306 ++----------------------- src/zabapgit_objects.prog.abap | 357 +++++++++++++++++++++++++++++ 3 files changed, 386 insertions(+), 619 deletions(-) diff --git a/src/zabapgit_object_samc.prog.abap b/src/zabapgit_object_samc.prog.abap index c575e3578..ebbe36021 100644 --- a/src/zabapgit_object_samc.prog.abap +++ b/src/zabapgit_object_samc.prog.abap @@ -2,41 +2,16 @@ *& Include ZABAPGIT_OBJECT_SAMC *&---------------------------------------------------------------------* -CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_super FINAL. +CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_channel_super FINAL. PUBLIC SECTION. - INTERFACES lif_object. - - PRIVATE SECTION. - DATA: mo_persistence TYPE REF TO if_wb_object_persist, - mo_amc_appl_obj_data TYPE REF TO if_wb_object_data_model. + METHODS: lif_object~exists REDEFINITION. + PROTECTED SECTION. METHODS: - get_data_object - RETURNING - value(ro_amc_appl_obj_data) TYPE REF TO if_wb_object_data_model - RAISING - lcx_exception, - - get_persistence - RETURNING - value(ro_persistence) TYPE REF TO if_wb_object_persist - RAISING - lcx_exception, - - get_data - EXPORTING - p_data TYPE any - RAISING - lcx_exception, - - lock - RAISING - lcx_exception, - - unlock - RAISING - lcx_exception. + get_persistence_cls_name REDEFINITION, + get_appl_obj_cls_name REDEFINITION, + get_data_structure_name REDEFINITION. ENDCLASS. "lcl_object_samc DEFINITION @@ -47,43 +22,6 @@ ENDCLASS. "lcl_object_samc DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_samc IMPLEMENTATION. - METHOD lif_object~has_changed_since. - rv_changed = abap_true. - ENDMETHOD. "lif_object~has_changed_since - - METHOD lif_object~changed_by. - - DATA: lr_data TYPE REF TO data. - FIELD-SYMBOLS: TYPE any, - TYPE any, - TYPE any. - - TRY. - CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE'). - ASSIGN lr_data->* TO . - - CATCH cx_root. - lcx_exception=>raise( 'SAMC not supported' ). - ENDTRY. - - get_data( - IMPORTING - p_data = ). - - ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - - rv_user = . - - ENDMETHOD. "lif_object~changed_by - - METHOD lif_object~get_metadata. - rs_metadata = get_metadata( ). - rs_metadata-delete_tadir = abap_true. - ENDMETHOD. "lif_object~get_metadata. - METHOD lif_object~exists. DATA: ls_tadir TYPE tadir. @@ -95,276 +33,26 @@ CLASS lcl_object_samc IMPLEMENTATION. RETURN. ENDIF. - TRY. - get_data_object( ). - - CATCH lcx_exception. - RETURN. - ENDTRY. - rv_bool = abap_true. ENDMETHOD. "lif_object~exists - METHOD lif_object~serialize. + METHOD get_appl_obj_cls_name. - DATA: lr_data TYPE REF TO data. + r_data_class_name = 'CL_AMC_APPLICATION_OBJ_DATA'. - FIELD-SYMBOLS: TYPE any, - TYPE any, - TYPE any. + ENDMETHOD. - TRY. - CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE'). - ASSIGN lr_data->* TO . + METHOD get_data_structure_name. - CATCH cx_root. - lcx_exception=>raise( 'SAMC not supported' ). - ENDTRY. + r_data_structure_name = 'AMC_APPLICATION_COMPLETE'. - get_data( - IMPORTING - p_data = ). + ENDMETHOD. - ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO . - ASSERT sy-subrc = 0. + METHOD get_persistence_cls_name. - ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - io_xml->add( iv_name = 'SAMC' - ig_data = ). - - ENDMETHOD. "serialize - - METHOD lif_object~deserialize. - - DATA: li_appl_obj_data TYPE REF TO if_wb_object_data_model, - lr_data TYPE REF TO data. - - FIELD-SYMBOLS: TYPE any. - - TRY. - CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE'). - ASSIGN lr_data->* TO . - - CATCH cx_root. - lcx_exception=>raise( 'SAMC not supported' ). - ENDTRY. - - io_xml->read( - EXPORTING - iv_name = 'SAMC' - CHANGING - cg_data = ). - - IF lif_object~exists( ) = abap_true. - lif_object~delete( ). - ENDIF. - - li_appl_obj_data = get_data_object( ). - - TRY. - lock( ). - - CALL FUNCTION 'RS_CORR_INSERT' - EXPORTING - object = ms_item-obj_name - object_class = 'SAMC' - mode = 'I' - global_lock = abap_true - devclass = iv_package - master_language = mv_language - EXCEPTIONS - cancelled = 1 - permission_failure = 2 - unknown_objectclass = 3 - OTHERS = 4. - - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error occured while creating SAMC' ). - ENDIF. - - li_appl_obj_data->set_data( ). - - get_persistence( )->save( p_object_data = li_appl_obj_data ). - - unlock( ). - - CATCH cx_swb_exception. - lcx_exception=>raise( 'Error occured while creating SAMC' ). - ENDTRY. - - ENDMETHOD. "deserialize - - METHOD lif_object~delete. - - DATA: object_key TYPE seu_objkey. - - object_key = ms_item-obj_name. - - TRY. - lock( ). - - get_persistence( )->delete( p_object_key = object_key ). - - unlock( ). - - CATCH cx_swb_exception. - lcx_exception=>raise( 'Error occured while deleting SAMC' ). - ENDTRY. - - ENDMETHOD. "delete - - METHOD lif_object~jump. - - CALL FUNCTION 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' - object_name = ms_item-obj_name - object_type = ms_item-obj_type. - - ENDMETHOD. "jump - - METHOD lif_object~compare_to_remote_version. - CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. - ENDMETHOD. "lif_object~compare_to_remote_version - - METHOD get_data_object. - - IF mo_amc_appl_obj_data IS NOT BOUND. - - TRY. - CREATE OBJECT mo_amc_appl_obj_data TYPE ('CL_AMC_APPLICATION_OBJ_DATA'). - - CATCH cx_root. - lcx_exception=>raise( 'SAMC not supported' ). - ENDTRY. - - ENDIF. - - ro_amc_appl_obj_data = mo_amc_appl_obj_data. - - ENDMETHOD. "get_data_object - - - METHOD get_persistence. - - IF mo_persistence IS NOT BOUND. - - TRY. - CREATE OBJECT mo_persistence TYPE ('CL_AMC_APPLICATION_OBJ_PERS'). - - CATCH cx_root. - lcx_exception=>raise( 'SAMC not supported' ). - ENDTRY. - - ENDIF. - - ro_persistence = mo_persistence. - - ENDMETHOD. "get_persistence - - - METHOD lock. - - DATA: objname TYPE trobj_name, - object_key TYPE seu_objkey, - objtype TYPE trobjtype. - - objname = ms_item-obj_name. - object_key = ms_item-obj_name. - objtype = ms_item-obj_type. - - - get_persistence( ). - - mo_persistence->lock( - EXPORTING - p_objname_tr = objname - p_object_key = object_key - p_objtype_tr = objtype - EXCEPTIONS - foreign_lock = 1 - error_occurred = 2 - OTHERS = 3 ). - - IF sy-subrc <> 0. - lcx_exception=>raise( `Error occured while locking SAMC ` && objname ). - ENDIF. - - ENDMETHOD. "lock - - METHOD unlock. - - DATA: objname TYPE trobj_name, - object_key TYPE seu_objkey, - objtype TYPE trobjtype. - - objname = ms_item-obj_name. - object_key = ms_item-obj_name. - objtype = ms_item-obj_type. - - get_persistence( )->unlock( p_objname_tr = objname - p_object_key = object_key - p_objtype_tr = objtype ). - - ENDMETHOD. "unlock - - METHOD get_data. - - DATA: object_key TYPE seu_objkey. - - object_key = ms_item-obj_name. - - TRY. - get_persistence( ). - - mo_persistence->get( - EXPORTING - p_object_key = object_key - p_version = 'A' - CHANGING - p_object_data = mo_amc_appl_obj_data ). - - CATCH cx_root. - lcx_exception=>raise( 'SAMC error' ). - ENDTRY. - - mo_amc_appl_obj_data->get_data( - IMPORTING - p_data = p_data ). - - ENDMETHOD. "get_data + r_persistence_class_name = 'CL_AMC_APPLICATION_OBJ_PERS'. + ENDMETHOD. ENDCLASS. "lcl_object_samc IMPLEMENTATION diff --git a/src/zabapgit_object_sapc.prog.abap b/src/zabapgit_object_sapc.prog.abap index 47a1bbb88..1d69d495c 100644 --- a/src/zabapgit_object_sapc.prog.abap +++ b/src/zabapgit_object_sapc.prog.abap @@ -2,34 +2,16 @@ *& Include ZABAPGIT_OBJECT_SAPC *&---------------------------------------------------------------------* -CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_super FINAL. +CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_channel_super FINAL. PUBLIC SECTION. - INTERFACES lif_object. - - - PRIVATE SECTION. - DATA: mo_persistence TYPE REF TO if_wb_object_persist, - mo_apc_appl_obj_data TYPE REF TO if_wb_object_data_model. + METHODS: lif_object~exists REDEFINITION. + PROTECTED SECTION. METHODS: - create_apc_objects - RAISING - lcx_exception, - - get_data - EXPORTING - p_data TYPE any - RAISING - lcx_exception, - - lock - RAISING - lcx_exception, - - unlock - RAISING - lcx_exception. + get_persistence_cls_name REDEFINITION, + get_appl_obj_cls_name REDEFINITION, + get_data_structure_name REDEFINITION. ENDCLASS. "lcl_object_sAPC DEFINITION @@ -40,45 +22,6 @@ ENDCLASS. "lcl_object_sAPC DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_sapc IMPLEMENTATION. - METHOD lif_object~has_changed_since. - rv_changed = abap_true. - ENDMETHOD. "lif_object~has_changed_since - - METHOD lif_object~changed_by. - - DATA: lr_data TYPE REF TO data. - FIELD-SYMBOLS: TYPE any, - TYPE any, - TYPE any. - - create_apc_objects( ). - - TRY. - CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE'). - ASSIGN lr_data->* TO . - - CATCH cx_root. - lcx_exception=>raise( 'SAPC not supported' ). - ENDTRY. - - get_data( - IMPORTING - p_data = ). - - ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - - rv_user = . - - ENDMETHOD. "lif_object~changed_by - - METHOD lif_object~get_metadata. - rs_metadata = get_metadata( ). - rs_metadata-delete_tadir = abap_true. - ENDMETHOD. "lif_object~get_metadata. - METHOD lif_object~exists. DATA: ls_tadir TYPE tadir. @@ -94,243 +37,22 @@ CLASS lcl_object_sapc IMPLEMENTATION. ENDMETHOD. "lif_object~exists - METHOD lif_object~serialize. + METHOD get_appl_obj_cls_name. - DATA: lr_data TYPE REF TO data. - - FIELD-SYMBOLS: TYPE any, - TYPE any, - TYPE any. - - create_apc_objects( ). - - TRY. - CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE'). - ASSIGN lr_data->* TO . - - CATCH cx_root. - lcx_exception=>raise( 'SAPC not supported' ). - ENDTRY. - - get_data( - IMPORTING - p_data = ). - - ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - - ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE TO . - ASSERT sy-subrc = 0. - CLEAR . - - io_xml->add( iv_name = 'SAPC' - ig_data = ). - - ENDMETHOD. "serialize - - METHOD lif_object~deserialize. - - DATA: lr_data TYPE REF TO data. - - FIELD-SYMBOLS: TYPE any. - - create_apc_objects( ). - - TRY. - CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE'). - ASSIGN lr_data->* TO . - - CATCH cx_root. - lcx_exception=>raise( 'SAPC not supported' ). - ENDTRY. - - io_xml->read( - EXPORTING - iv_name = 'SAPC' - CHANGING - cg_data = ). - - IF lif_object~exists( ) = abap_true. - lif_object~delete( ). - ENDIF. - - TRY. - lock( ). - - CALL FUNCTION 'RS_CORR_INSERT' - EXPORTING - object = ms_item-obj_name - object_class = 'SAPC' - mode = 'I' - global_lock = abap_true - devclass = iv_package - master_language = mv_language - EXCEPTIONS - cancelled = 1 - permission_failure = 2 - unknown_objectclass = 3 - OTHERS = 4. - - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error occured while creating SAPC' ). - ENDIF. - - mo_apc_appl_obj_data->set_data( ). - - mo_persistence->save( p_object_data = mo_apc_appl_obj_data ). - - unlock( ). - - CATCH cx_swb_exception. - lcx_exception=>raise( 'Error occured while creating SAPC' ). - ENDTRY. - - ENDMETHOD. "deserialize - - METHOD lif_object~delete. - - DATA: object_key TYPE seu_objkey. - - create_apc_objects( ). - - object_key = ms_item-obj_name. - - TRY. - lock( ). - - mo_persistence->delete( p_object_key = object_key ). - - unlock( ). - - CATCH cx_swb_exception. - lcx_exception=>raise( 'Error occured while deleting SAPC' ). - ENDTRY. - - ENDMETHOD. "delete - - METHOD lif_object~jump. - - CALL FUNCTION 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' - object_name = ms_item-obj_name - object_type = ms_item-obj_type. - - ENDMETHOD. "jump - - METHOD lif_object~compare_to_remote_version. - CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. - ENDMETHOD. "lif_object~compare_to_remote_version - - METHOD create_apc_objects. - - TRY. - IF mo_apc_appl_obj_data IS NOT BOUND. - CREATE OBJECT mo_apc_appl_obj_data TYPE ('CL_APC_APPLICATION_OBJ_DATA'). - ENDIF. - - IF mo_persistence IS NOT BOUND. - CREATE OBJECT mo_persistence TYPE ('CL_APC_APPLICATION_OBJ_PERS'). - ENDIF. - - CATCH cx_root. - lcx_exception=>raise( 'SAPC not supported' ). - ENDTRY. + r_data_class_name = 'CL_APC_APPLICATION_OBJ_DATA'. ENDMETHOD. - METHOD lock. + METHOD get_data_structure_name. - DATA: objname TYPE trobj_name, - object_key TYPE seu_objkey, - objtype TYPE trobjtype. + r_data_structure_name = 'APC_APPLICATION_COMPLETE'. - objname = ms_item-obj_name. - object_key = ms_item-obj_name. - objtype = ms_item-obj_type. + ENDMETHOD. - mo_persistence->lock( - EXPORTING - p_objname_tr = objname - p_object_key = object_key - p_objtype_tr = objtype - EXCEPTIONS - foreign_lock = 1 - error_occurred = 2 - OTHERS = 3 ). + METHOD get_persistence_cls_name. - IF sy-subrc <> 0. - lcx_exception=>raise( `Error occured while locking SAPC ` && objname ). - ENDIF. + r_persistence_class_name = 'CL_APC_APPLICATION_OBJ_PERS'. - ENDMETHOD. "lock - - METHOD unlock. - - DATA: objname TYPE trobj_name, - object_key TYPE seu_objkey, - objtype TYPE trobjtype. - - objname = ms_item-obj_name. - object_key = ms_item-obj_name. - objtype = ms_item-obj_type. - - mo_persistence->unlock( p_objname_tr = objname - p_object_key = object_key - p_objtype_tr = objtype ). - - ENDMETHOD. "unlock - - METHOD get_data. - - DATA: object_key TYPE seu_objkey. - - object_key = ms_item-obj_name. - - TRY. - mo_persistence->get( - EXPORTING - p_object_key = object_key - p_version = 'A' - CHANGING - p_object_data = mo_apc_appl_obj_data ). - - CATCH cx_root. - lcx_exception=>raise( 'SAPC error' ). - ENDTRY. - - mo_apc_appl_obj_data->get_data( - IMPORTING - p_data = p_data ). - - ENDMETHOD. "get_data + ENDMETHOD. ENDCLASS. "lcl_object_sAPC IMPLEMENTATION diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 8b2907a56..36b404db1 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -1852,6 +1852,363 @@ CLASS lcl_objects_super IMPLEMENTATION. ENDCLASS. "lcl_objects_super IMPLEMENTATION +CLASS lcl_objects_channel_super DEFINITION ABSTRACT + INHERITING FROM lcl_objects_super . + + PUBLIC SECTION. + INTERFACES: + lif_object + ABSTRACT METHODS exists. + + PROTECTED SECTION. + METHODS: + get_persistence_cls_name ABSTRACT + RETURNING + VALUE(r_persistence_class_name) TYPE seoclsname, + + get_appl_obj_cls_name ABSTRACT + RETURNING + VALUE(r_data_class_name) TYPE seoclsname, + + get_data_structure_name ABSTRACT + RETURNING + VALUE(r_data_structure_name) TYPE string. + + PRIVATE SECTION. + DATA: mo_persistence TYPE REF TO if_wb_object_persist, + mo_appl_obj_data TYPE REF TO if_wb_object_data_model. + + METHODS: + create_channel_objects + RAISING + lcx_exception, + + get_data + EXPORTING + p_data TYPE any + RAISING + lcx_exception, + + lock + RAISING + lcx_exception, + + unlock + RAISING + lcx_exception. + +ENDCLASS. + +CLASS lcl_objects_channel_super IMPLEMENTATION. + + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. + + METHOD lif_object~changed_by. + + DATA: lr_data TYPE REF TO data, + data_structure_name TYPE string. + + FIELD-SYMBOLS: TYPE any, + TYPE any, + TYPE any. + + create_channel_objects( ). + + TRY. + data_structure_name = get_data_structure_name( ). + CREATE DATA lr_data TYPE (data_structure_name). + ASSIGN lr_data->* TO . + + CATCH cx_root. + lcx_exception=>raise( |{ ms_item-obj_name } not supported| ). + ENDTRY. + + get_data( + IMPORTING + p_data = ). + + ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + + rv_user = . + + ENDMETHOD. + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + rs_metadata-delete_tadir = abap_true. + ENDMETHOD. + +* METHOD lif_object~exists. +* +* DATA: ls_tadir TYPE tadir. +* +* ls_tadir = lcl_tadir=>read_single( +* iv_object = ms_item-obj_type +* iv_obj_name = ms_item-obj_name ). +* IF ls_tadir IS INITIAL. +* RETURN. +* ENDIF. +* +* rv_bool = abap_true. +* +* ENDMETHOD. + + METHOD lif_object~serialize. + + DATA: lr_data TYPE REF TO data, + data_structure_name TYPE string. + + FIELD-SYMBOLS: TYPE any, + TYPE any, + TYPE any. + + create_channel_objects( ). + + TRY. + data_structure_name = get_data_structure_name( ). + CREATE DATA lr_data TYPE (data_structure_name). + ASSIGN lr_data->* TO . + + CATCH cx_root. + lcx_exception=>raise( |{ ms_item-obj_type } not supported| ). + ENDTRY. + + get_data( + IMPORTING + p_data = ). + + ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + + ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR . + + ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR . + + ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR . + + ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR . + + ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR . + + ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR . + + ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR . + + ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR . + + io_xml->add( iv_name = ms_item-obj_type + ig_data = ). + + ENDMETHOD. + + METHOD lif_object~deserialize. + + DATA: lr_data TYPE REF TO data, + data_structure_name TYPE string. + + FIELD-SYMBOLS: TYPE any. + + create_channel_objects( ). + + TRY. + data_structure_name = get_data_structure_name( ). + CREATE DATA lr_data TYPE (data_structure_name). + ASSIGN lr_data->* TO . + + CATCH cx_root. + lcx_exception=>raise( |{ ms_item-obj_type } not supported| ). + ENDTRY. + + io_xml->read( + EXPORTING + iv_name = ms_item-obj_type + CHANGING + cg_data = ). + + IF lif_object~exists( ) = abap_true. + lif_object~delete( ). + ENDIF. + + TRY. + lock( ). + + CALL FUNCTION 'RS_CORR_INSERT' + EXPORTING + object = ms_item-obj_name + object_class = ms_item-obj_type + mode = 'I' + global_lock = abap_true + devclass = iv_package + master_language = mv_language + EXCEPTIONS + cancelled = 1 + permission_failure = 2 + unknown_objectclass = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + lcx_exception=>raise( |Error occured while creating { ms_item-obj_type }| ). + ENDIF. + + mo_appl_obj_data->set_data( ). + + mo_persistence->save( p_object_data = mo_appl_obj_data ). + + unlock( ). + + CATCH cx_swb_exception. + lcx_exception=>raise( |Error occured while creating { ms_item-obj_type }| ). + ENDTRY. + + ENDMETHOD. + + METHOD lif_object~delete. + + DATA: object_key TYPE seu_objkey. + + create_channel_objects( ). + + object_key = ms_item-obj_name. + + TRY. + lock( ). + + mo_persistence->delete( p_object_key = object_key ). + + unlock( ). + + CATCH cx_swb_exception. + lcx_exception=>raise( |Error occured while deleting { ms_item-obj_type }| ). + ENDTRY. + + ENDMETHOD. + + METHOD lif_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type. + + ENDMETHOD. + + METHOD lif_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. + ENDMETHOD. + + METHOD create_channel_objects. + + DATA: appl_obj_cls_name TYPE seoclsname, + persistence_cls_name TYPE seoclsname. + + TRY. + IF mo_appl_obj_data IS NOT BOUND. + appl_obj_cls_name = get_appl_obj_cls_name( ). + CREATE OBJECT mo_appl_obj_data TYPE (appl_obj_cls_name). + ENDIF. + + IF mo_persistence IS NOT BOUND. + persistence_cls_name = get_persistence_cls_name( ). + CREATE OBJECT mo_persistence TYPE (persistence_cls_name). + ENDIF. + + CATCH cx_root. + lcx_exception=>raise( |{ ms_item-obj_type } not supported| ). + ENDTRY. + + ENDMETHOD. + + METHOD get_data. + + DATA: object_key TYPE seu_objkey. + + object_key = ms_item-obj_name. + + TRY. + mo_persistence->get( + EXPORTING + p_object_key = object_key + p_version = 'A' + CHANGING + p_object_data = mo_appl_obj_data ). + + CATCH cx_root. + lcx_exception=>raise( |{ ms_item-obj_type } not supported| ). + ENDTRY. + + mo_appl_obj_data->get_data( + IMPORTING + p_data = p_data ). + + ENDMETHOD. + + METHOD lock. + + DATA: objname TYPE trobj_name, + object_key TYPE seu_objkey, + objtype TYPE trobjtype. + + objname = ms_item-obj_name. + object_key = ms_item-obj_name. + objtype = ms_item-obj_type. + + mo_persistence->lock( + EXPORTING + p_objname_tr = objname + p_object_key = object_key + p_objtype_tr = objtype + EXCEPTIONS + foreign_lock = 1 + error_occurred = 2 + OTHERS = 3 ). + + IF sy-subrc <> 0. + lcx_exception=>raise( |Error occured while locking { ms_item-obj_type } | && objname ). + ENDIF. + + ENDMETHOD. "lock + + METHOD unlock. + + DATA: objname TYPE trobj_name, + object_key TYPE seu_objkey, + objtype TYPE trobjtype. + + objname = ms_item-obj_name. + object_key = ms_item-obj_name. + objtype = ms_item-obj_type. + + mo_persistence->unlock( p_objname_tr = objname + p_object_key = object_key + p_objtype_tr = objtype ). + + ENDMETHOD. "unlock + + +ENDCLASS. + *----------------------------------------------------------------------* * CLASS lcl_object DEFINITION *----------------------------------------------------------------------* From 0f6a47e5ce4cbd2757d1a7d74c3ee8b38bad05be Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 24 Jul 2017 21:13:07 +0000 Subject: [PATCH 059/166] lcl_objects_channel_super refactoring --- src/zabapgit_object_samc.prog.abap | 18 ------- src/zabapgit_object_sapc.prog.abap | 18 ------- src/zabapgit_objects.prog.abap | 83 +++++++++++++++++------------- 3 files changed, 46 insertions(+), 73 deletions(-) diff --git a/src/zabapgit_object_samc.prog.abap b/src/zabapgit_object_samc.prog.abap index ebbe36021..ac4fd1ba1 100644 --- a/src/zabapgit_object_samc.prog.abap +++ b/src/zabapgit_object_samc.prog.abap @@ -4,9 +4,6 @@ CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_channel_super FINAL. - PUBLIC SECTION. - METHODS: lif_object~exists REDEFINITION. - PROTECTED SECTION. METHODS: get_persistence_cls_name REDEFINITION, @@ -22,21 +19,6 @@ ENDCLASS. "lcl_object_samc DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_samc IMPLEMENTATION. - METHOD lif_object~exists. - - DATA: ls_tadir TYPE tadir. - - ls_tadir = lcl_tadir=>read_single( - iv_object = ms_item-obj_type - iv_obj_name = ms_item-obj_name ). - IF ls_tadir IS INITIAL. - RETURN. - ENDIF. - - rv_bool = abap_true. - - ENDMETHOD. "lif_object~exists - METHOD get_appl_obj_cls_name. r_data_class_name = 'CL_AMC_APPLICATION_OBJ_DATA'. diff --git a/src/zabapgit_object_sapc.prog.abap b/src/zabapgit_object_sapc.prog.abap index 1d69d495c..d708f7286 100644 --- a/src/zabapgit_object_sapc.prog.abap +++ b/src/zabapgit_object_sapc.prog.abap @@ -4,9 +4,6 @@ CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_channel_super FINAL. - PUBLIC SECTION. - METHODS: lif_object~exists REDEFINITION. - PROTECTED SECTION. METHODS: get_persistence_cls_name REDEFINITION, @@ -22,21 +19,6 @@ ENDCLASS. "lcl_object_sAPC DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_sapc IMPLEMENTATION. - METHOD lif_object~exists. - - DATA: ls_tadir TYPE tadir. - - ls_tadir = lcl_tadir=>read_single( - iv_object = ms_item-obj_type - iv_obj_name = ms_item-obj_name ). - IF ls_tadir IS INITIAL. - RETURN. - ENDIF. - - rv_bool = abap_true. - - ENDMETHOD. "lif_object~exists - METHOD get_appl_obj_cls_name. r_data_class_name = 'CL_APC_APPLICATION_OBJ_DATA'. diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 36b404db1..c34731f1f 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -1857,8 +1857,7 @@ CLASS lcl_objects_channel_super DEFINITION ABSTRACT PUBLIC SECTION. INTERFACES: - lif_object - ABSTRACT METHODS exists. + lif_object. PROTECTED SECTION. METHODS: @@ -1875,8 +1874,11 @@ CLASS lcl_objects_channel_super DEFINITION ABSTRACT VALUE(r_data_structure_name) TYPE string. PRIVATE SECTION. - DATA: mo_persistence TYPE REF TO if_wb_object_persist, - mo_appl_obj_data TYPE REF TO if_wb_object_data_model. + DATA: mo_persistence TYPE REF TO if_wb_object_persist, + mo_appl_obj_data TYPE REF TO if_wb_object_data_model, + mv_data_structure_name TYPE string, + mv_appl_obj_cls_name TYPE seoclsname, + mv_persistence_cls_name TYPE seoclsname. METHODS: create_channel_objects @@ -1895,7 +1897,9 @@ CLASS lcl_objects_channel_super DEFINITION ABSTRACT unlock RAISING - lcx_exception. + lcx_exception, + + get_names. ENDCLASS. @@ -1907,8 +1911,7 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. METHOD lif_object~changed_by. - DATA: lr_data TYPE REF TO data, - data_structure_name TYPE string. + DATA: lr_data TYPE REF TO data. FIELD-SYMBOLS: TYPE any, TYPE any, @@ -1917,8 +1920,7 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. create_channel_objects( ). TRY. - data_structure_name = get_data_structure_name( ). - CREATE DATA lr_data TYPE (data_structure_name). + CREATE DATA lr_data TYPE (mv_data_structure_name). ASSIGN lr_data->* TO . CATCH cx_root. @@ -1943,25 +1945,31 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. rs_metadata-delete_tadir = abap_true. ENDMETHOD. -* METHOD lif_object~exists. -* -* DATA: ls_tadir TYPE tadir. -* -* ls_tadir = lcl_tadir=>read_single( -* iv_object = ms_item-obj_type -* iv_obj_name = ms_item-obj_name ). -* IF ls_tadir IS INITIAL. -* RETURN. -* ENDIF. -* -* rv_bool = abap_true. -* -* ENDMETHOD. + METHOD lif_object~exists. + + DATA: object_key TYPE seu_objkey. + + create_channel_objects( ). + + object_key = ms_item-obj_name. + + TRY. + mo_persistence->get( p_object_key = object_key + p_version = 'A' + p_existence_check_only = abap_true ). + + CATCH cx_swb_object_does_not_exist cx_swb_exception. + rv_bool = abap_false. + RETURN. + ENDTRY. + + rv_bool = abap_true. + + ENDMETHOD. METHOD lif_object~serialize. - DATA: lr_data TYPE REF TO data, - data_structure_name TYPE string. + DATA: lr_data TYPE REF TO data. FIELD-SYMBOLS: TYPE any, TYPE any, @@ -1970,8 +1978,7 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. create_channel_objects( ). TRY. - data_structure_name = get_data_structure_name( ). - CREATE DATA lr_data TYPE (data_structure_name). + CREATE DATA lr_data TYPE (mv_data_structure_name). ASSIGN lr_data->* TO . CATCH cx_root. @@ -2024,16 +2031,14 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. METHOD lif_object~deserialize. - DATA: lr_data TYPE REF TO data, - data_structure_name TYPE string. + DATA: lr_data TYPE REF TO data. FIELD-SYMBOLS: TYPE any. create_channel_objects( ). TRY. - data_structure_name = get_data_structure_name( ). - CREATE DATA lr_data TYPE (data_structure_name). + CREATE DATA lr_data TYPE (mv_data_structure_name). ASSIGN lr_data->* TO . CATCH cx_root. @@ -2120,18 +2125,15 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. METHOD create_channel_objects. - DATA: appl_obj_cls_name TYPE seoclsname, - persistence_cls_name TYPE seoclsname. + get_names( ). TRY. IF mo_appl_obj_data IS NOT BOUND. - appl_obj_cls_name = get_appl_obj_cls_name( ). - CREATE OBJECT mo_appl_obj_data TYPE (appl_obj_cls_name). + CREATE OBJECT mo_appl_obj_data TYPE (mv_appl_obj_cls_name). ENDIF. IF mo_persistence IS NOT BOUND. - persistence_cls_name = get_persistence_cls_name( ). - CREATE OBJECT mo_persistence TYPE (persistence_cls_name). + CREATE OBJECT mo_persistence TYPE (mv_persistence_cls_name). ENDIF. CATCH cx_root. @@ -2206,6 +2208,13 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. ENDMETHOD. "unlock + METHOD get_names. + + mv_data_structure_name = get_data_structure_name( ). + mv_appl_obj_cls_name = get_appl_obj_cls_name( ). + mv_persistence_cls_name = get_persistence_cls_name( ). + + ENDMETHOD. ENDCLASS. From 8ad3a6b36009ab6f3b259424c3ccfede79e00ee6 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 24 Jul 2017 21:15:55 +0000 Subject: [PATCH 060/166] lcl_objects_channel_super refactoring --- src/zabapgit_objects.prog.abap | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index c34731f1f..1bd4ed359 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -2210,9 +2210,17 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. METHOD get_names. - mv_data_structure_name = get_data_structure_name( ). - mv_appl_obj_cls_name = get_appl_obj_cls_name( ). - mv_persistence_cls_name = get_persistence_cls_name( ). + IF mv_data_structure_name IS INITIAL. + mv_data_structure_name = get_data_structure_name( ). + ENDIF. + + IF mv_appl_obj_cls_name IS INITIAL. + mv_appl_obj_cls_name = get_appl_obj_cls_name( ). + ENDIF. + + IF mv_persistence_cls_name IS INITIAL. + mv_persistence_cls_name = get_persistence_cls_name( ). + ENDIF. ENDMETHOD. From f900d68fb88da83063622e293f3fc3d948b97781 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Tue, 25 Jul 2017 06:04:16 +0200 Subject: [PATCH 061/166] docs: add PRAG --- docs/ref-supported.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 95425885c..bde9163d4 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -40,6 +40,7 @@ PARA | SPA/GPA Parameters | Yes PDTS | Standard Task | [#153](https://github.com/larshp/abapGit/issues/153) PDWS | Workflow templates | [#154](https://github.com/larshp/abapGit/issues/154) PINF | Package interface | Yes +PRAG | Pragma in ABAP Source Code | [#854](https://github.com/larshp/abapGit/issues/854) PROG | Program | Yes SAMC | ABAP Messaging Channels | Yes SAPC | ABAP Push Channels | Yes From 30c6b9dbfafe92123aefc83eb25911fa99912ab2 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Tue, 25 Jul 2017 05:47:33 +0000 Subject: [PATCH 062/166] change 'changed_by' to user_unknown --- src/zabapgit_object_prag.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_object_prag.prog.abap b/src/zabapgit_object_prag.prog.abap index e79b062ef..326d836ee 100644 --- a/src/zabapgit_object_prag.prog.abap +++ b/src/zabapgit_object_prag.prog.abap @@ -40,7 +40,7 @@ CLASS lcl_object_prag IMPLEMENTATION. METHOD lif_object~changed_by. - rv_user = sy-uname. + rv_user = c_user_unknown. ENDMETHOD. From faaf1efd288e80c4a0444242992f6a2c19c7548a Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Tue, 25 Jul 2017 08:12:28 +0200 Subject: [PATCH 063/166] docs: PRAG supported --- docs/ref-supported.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index bde9163d4..7d2639ded 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -40,7 +40,7 @@ PARA | SPA/GPA Parameters | Yes PDTS | Standard Task | [#153](https://github.com/larshp/abapGit/issues/153) PDWS | Workflow templates | [#154](https://github.com/larshp/abapGit/issues/154) PINF | Package interface | Yes -PRAG | Pragma in ABAP Source Code | [#854](https://github.com/larshp/abapGit/issues/854) +PRAG | Pragma in ABAP Source Code | Yes PROG | Program | Yes SAMC | ABAP Messaging Channels | Yes SAPC | ABAP Push Channels | Yes From cb694f8b4fa5bf471c302ffaa34e48ec5936b3e7 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Tue, 25 Jul 2017 06:18:43 +0000 Subject: [PATCH 064/166] refactor channels_super --- src/zabapgit_objects.prog.abap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 1bd4ed359..011131204 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -1853,7 +1853,7 @@ CLASS lcl_objects_super IMPLEMENTATION. ENDCLASS. "lcl_objects_super IMPLEMENTATION CLASS lcl_objects_channel_super DEFINITION ABSTRACT - INHERITING FROM lcl_objects_super . + INHERITING FROM lcl_objects_super. PUBLIC SECTION. INTERFACES: @@ -2078,7 +2078,7 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. mo_appl_obj_data->set_data( ). - mo_persistence->save( p_object_data = mo_appl_obj_data ). + mo_persistence->save( mo_appl_obj_data ). unlock( ). @@ -2099,7 +2099,7 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. TRY. lock( ). - mo_persistence->delete( p_object_key = object_key ). + mo_persistence->delete( object_key ). unlock( ). From 71ef0d8fca3b8a00cc149d7d7b6b2e05cf18f315 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 26 Jul 2017 12:31:21 +0200 Subject: [PATCH 065/166] DOMA, sort values --- src/zabapgit_object_doma.prog.abap | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_doma.prog.abap b/src/zabapgit_object_doma.prog.abap index bd8194ce9..df967d82f 100644 --- a/src/zabapgit_object_doma.prog.abap +++ b/src/zabapgit_object_doma.prog.abap @@ -168,6 +168,10 @@ CLASS lcl_object_doma IMPLEMENTATION. CLEAR ls_dd01v-masklen. ENDIF. + SORT lt_dd07v BY + valpos ASCENDING + ddlanguage ASCENDING. + io_xml->add( iv_name = 'DD01V' ig_data = ls_dd01v ). io_xml->add( iv_name = 'DD07V_TAB' @@ -278,7 +282,7 @@ CLASS lcl_object_doma IMPLEMENTATION. SORT lt_i18n_langs ASCENDING. SORT lt_dd01_texts BY ddlanguage ASCENDING. - SORT lt_dd07_texts BY ddlanguage ASCENDING. + SORT lt_dd07_texts BY valpos ASCENDING ddlanguage ASCENDING. IF lines( lt_i18n_langs ) > 0. io_xml->add( iv_name = 'I18N_LANGS' From ce523efefe0483b146f078677e06adea4af34487 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Wed, 26 Jul 2017 18:44:27 +0000 Subject: [PATCH 066/166] Rename some methods --- src/zabapgit_object_samc.prog.abap | 8 ++++---- src/zabapgit_object_sapc.prog.abap | 8 ++++---- src/zabapgit_objects.prog.abap | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/zabapgit_object_samc.prog.abap b/src/zabapgit_object_samc.prog.abap index ac4fd1ba1..803c6765e 100644 --- a/src/zabapgit_object_samc.prog.abap +++ b/src/zabapgit_object_samc.prog.abap @@ -6,8 +6,8 @@ CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_channel_super FINAL PROTECTED SECTION. METHODS: - get_persistence_cls_name REDEFINITION, - get_appl_obj_cls_name REDEFINITION, + get_persistence_class_name REDEFINITION, + get_data_class_name REDEFINITION, get_data_structure_name REDEFINITION. ENDCLASS. "lcl_object_samc DEFINITION @@ -19,7 +19,7 @@ ENDCLASS. "lcl_object_samc DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_samc IMPLEMENTATION. - METHOD get_appl_obj_cls_name. + METHOD get_data_class_name. r_data_class_name = 'CL_AMC_APPLICATION_OBJ_DATA'. @@ -31,7 +31,7 @@ CLASS lcl_object_samc IMPLEMENTATION. ENDMETHOD. - METHOD get_persistence_cls_name. + METHOD get_persistence_class_name. r_persistence_class_name = 'CL_AMC_APPLICATION_OBJ_PERS'. diff --git a/src/zabapgit_object_sapc.prog.abap b/src/zabapgit_object_sapc.prog.abap index d708f7286..9701d416a 100644 --- a/src/zabapgit_object_sapc.prog.abap +++ b/src/zabapgit_object_sapc.prog.abap @@ -6,8 +6,8 @@ CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_channel_super FINAL PROTECTED SECTION. METHODS: - get_persistence_cls_name REDEFINITION, - get_appl_obj_cls_name REDEFINITION, + get_persistence_class_name REDEFINITION, + get_data_class_name REDEFINITION, get_data_structure_name REDEFINITION. ENDCLASS. "lcl_object_sAPC DEFINITION @@ -19,7 +19,7 @@ ENDCLASS. "lcl_object_sAPC DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_sapc IMPLEMENTATION. - METHOD get_appl_obj_cls_name. + METHOD get_data_class_name. r_data_class_name = 'CL_APC_APPLICATION_OBJ_DATA'. @@ -31,7 +31,7 @@ CLASS lcl_object_sapc IMPLEMENTATION. ENDMETHOD. - METHOD get_persistence_cls_name. + METHOD get_persistence_class_name. r_persistence_class_name = 'CL_APC_APPLICATION_OBJ_PERS'. diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 011131204..540b47bdf 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -1861,11 +1861,11 @@ CLASS lcl_objects_channel_super DEFINITION ABSTRACT PROTECTED SECTION. METHODS: - get_persistence_cls_name ABSTRACT + get_persistence_class_name ABSTRACT RETURNING VALUE(r_persistence_class_name) TYPE seoclsname, - get_appl_obj_cls_name ABSTRACT + get_data_class_name ABSTRACT RETURNING VALUE(r_data_class_name) TYPE seoclsname, @@ -2215,11 +2215,11 @@ CLASS lcl_objects_channel_super IMPLEMENTATION. ENDIF. IF mv_appl_obj_cls_name IS INITIAL. - mv_appl_obj_cls_name = get_appl_obj_cls_name( ). + mv_appl_obj_cls_name = get_data_class_name( ). ENDIF. IF mv_persistence_cls_name IS INITIAL. - mv_persistence_cls_name = get_persistence_cls_name( ). + mv_persistence_cls_name = get_persistence_class_name( ). ENDIF. ENDMETHOD. From fb08006b950f205f5d630aaa4ccd58a754921577 Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 28 Jul 2017 08:05:35 +0000 Subject: [PATCH 067/166] fix #864 --- src/zabapgit_git.prog.abap | 58 ++++++++++++++++++-------------- src/zabapgit_unit_test.prog.abap | 58 ++++++++++++++++++++++---------- 2 files changed, 74 insertions(+), 42 deletions(-) diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index c25960625..28831f90a 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -612,6 +612,7 @@ CLASS lcl_git_pack IMPLEMENTATION. DATA: lv_string TYPE string, lv_word TYPE string, + lv_length TYPE i, lv_trash TYPE string ##NEEDED, lt_string TYPE TABLE OF string. @@ -623,34 +624,41 @@ CLASS lcl_git_pack IMPLEMENTATION. SPLIT lv_string AT lif_defs=>gc_newline INTO TABLE lt_string. LOOP AT lt_string ASSIGNING . - IF NOT rs_commit-committer IS INITIAL. - CONCATENATE rs_commit-body INTO rs_commit-body - SEPARATED BY lif_defs=>gc_newline. - ELSE. - SPLIT AT space INTO lv_word lv_trash. - CASE lv_word. - WHEN 'tree'. - rs_commit-tree = +5. - WHEN 'parent'. - IF rs_commit-parent IS INITIAL. - rs_commit-parent = +7. - ELSE. - rs_commit-parent2 = +7. - ENDIF. - WHEN 'author'. - rs_commit-author = +7. - WHEN 'committer'. - rs_commit-committer = +10. - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - ENDIF. +* IF NOT rs_commit-committer IS INITIAL. +* CONCATENATE rs_commit-body INTO rs_commit-body +* SEPARATED BY lif_defs=>gc_newline. +* ELSE. + lv_length = strlen( ) + 1. + lv_string = lv_string+lv_length. + + SPLIT AT space INTO lv_word lv_trash. + CASE lv_word. + WHEN 'tree'. + rs_commit-tree = +5. + WHEN 'parent'. + IF rs_commit-parent IS INITIAL. + rs_commit-parent = +7. + ELSE. + rs_commit-parent2 = +7. + ENDIF. + WHEN 'author'. + rs_commit-author = +7. + WHEN 'committer'. + rs_commit-committer = +10. + EXIT. " current loop + WHEN OTHERS. + ASSERT 0 = 1. + ENDCASE. + +* ENDIF. ENDLOOP. + rs_commit-body = lv_string+1. + * strip first newline - IF strlen( rs_commit-body ) >= 2. - rs_commit-body = rs_commit-body+2. - ENDIF. +* IF strlen( rs_commit-body ) >= 2. +* rs_commit-body = rs_commit-body+2. +* ENDIF. IF rs_commit-author IS INITIAL OR rs_commit-committer IS INITIAL diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index d187f05b5..ce1075277 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -1004,9 +1004,6 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION. cl_abap_unit_assert=>assert_equals( act = ms_raw-committer exp = 'committer' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-body - exp = 'comment' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-parent exp = 'parent1' ). @@ -1014,6 +1011,10 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION. act = ms_raw-parent2 exp = 'parent2' ). + cl_abap_unit_assert=>assert_char_cp( + act = ms_raw-body + exp = 'comment+' ). + ENDMETHOD. METHOD decode2. @@ -1035,13 +1036,14 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION. cl_abap_unit_assert=>assert_equals( act = ms_raw-committer exp = 'committer' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-body - exp = 'comment' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-parent exp = '' ). + cl_abap_unit_assert=>assert_char_cp( + act = ms_raw-body + exp = 'comment+' ). + ENDMETHOD. METHOD decode3. @@ -1064,13 +1066,14 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION. cl_abap_unit_assert=>assert_equals( act = ms_raw-committer exp = 'committer' ). - cl_abap_unit_assert=>assert_equals( - act = ms_raw-body - exp = 'comment' ). cl_abap_unit_assert=>assert_equals( act = ms_raw-parent exp = 'parent1' ). + cl_abap_unit_assert=>assert_char_cp( + act = ms_raw-body + exp = 'comment+' ). + ENDMETHOD. ENDCLASS. @@ -1084,11 +1087,15 @@ CLASS ltcl_git_pack DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FI PRIVATE SECTION. + CONSTANTS: c_sha TYPE lif_defs=>ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'. + METHODS: tree FOR TESTING RAISING lcx_exception, commit FOR TESTING RAISING lcx_exception, + commit_newline FOR TESTING + RAISING lcx_exception, pack_short FOR TESTING RAISING lcx_exception, pack_long FOR TESTING @@ -1326,8 +1333,6 @@ CLASS ltcl_git_pack IMPLEMENTATION. METHOD tree. - CONSTANTS: lc_sha TYPE lif_defs=>ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'. - DATA: lt_nodes TYPE lcl_git_pack=>ty_nodes_tt, ls_node LIKE LINE OF lt_nodes, lv_data TYPE xstring, @@ -1336,7 +1341,7 @@ CLASS ltcl_git_pack IMPLEMENTATION. CLEAR ls_node. ls_node-chmod = lif_defs=>gc_chmod-file. ls_node-name = 'foobar.txt'. - ls_node-sha1 = lc_sha. + ls_node-sha1 = c_sha. APPEND ls_node TO lt_nodes. lv_data = lcl_git_pack=>encode_tree( lt_nodes ). @@ -1350,16 +1355,13 @@ CLASS ltcl_git_pack IMPLEMENTATION. METHOD commit. - CONSTANTS: lc_tree TYPE lif_defs=>ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc', - lc_parent TYPE lif_defs=>ty_sha1 VALUE '1236cb3c4b7f0b3600b64f744cde614a283a88dc'. - DATA: ls_commit TYPE lcl_git_pack=>ty_commit, ls_result TYPE lcl_git_pack=>ty_commit, lv_data TYPE xstring. - ls_commit-tree = lc_tree. - ls_commit-parent = lc_parent. + ls_commit-tree = c_sha. + ls_commit-parent = c_sha. ls_commit-author = 'larshp 1387823471 +0100'. ls_commit-committer = 'larshp 1387823471 +0100'. ls_commit-body = 'very informative'. @@ -1373,6 +1375,28 @@ CLASS ltcl_git_pack IMPLEMENTATION. ENDMETHOD. "commit + METHOD commit_newline. + + DATA: ls_commit TYPE lcl_git_pack=>ty_commit, + ls_result TYPE lcl_git_pack=>ty_commit, + lv_data TYPE xstring. + + + ls_commit-tree = c_sha. + ls_commit-parent = c_sha. + ls_commit-author = 'larshp 1387823471 +0100'. + ls_commit-committer = 'larshp 1387823471 +0100'. + ls_commit-body = 'very informative' && lif_defs=>gc_newline && lif_defs=>gc_newline. + + lv_data = lcl_git_pack=>encode_commit( ls_commit ). + ls_result = lcl_git_pack=>decode_commit( lv_data ). + + cl_abap_unit_assert=>assert_equals( + exp = ls_commit + act = ls_result ). + + ENDMETHOD. + ENDCLASS. "lcl_abap_unit IMPLEMENTATION CLASS ltcl_html DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. From c86878fc06abe80b0dcd377f2404797dcfcf35c0 Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 28 Jul 2017 08:37:30 +0000 Subject: [PATCH 068/166] fix #865 --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 6b1f96c55..b8f538ba9 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -199,7 +199,7 @@ INTERFACE lif_defs. CONSTANTS: gc_root_dir TYPE string VALUE '/', gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT, - gc_author_regex TYPE string VALUE '^([\\\w\s\.@\-_1-9]+) <(.*)> (\d{10})\s?.\d{4}$' ##NO_TEXT. + gc_author_regex TYPE string VALUE '^([\\\w\s\.@\-_1-9\(\) ]+) <(.*)> (\d{10})\s?.\d{4}$' ##NO_TEXT. CONSTANTS: BEGIN OF gc_action, repo_clone TYPE string VALUE 'repo_clone', From 8928b2b6ba570d766933d53a10a4256c6b0643f6 Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 28 Jul 2017 08:46:48 +0000 Subject: [PATCH 069/166] v1.37.7 --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index b8f538ba9..e6d55491f 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -7,7 +7,7 @@ TYPE-POOLS seop. INTERFACE lif_defs. CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.37.6'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.37.7'. "#EC NOTEXT TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, From 35e5d809c9a8b5099cc843434a4aa796cec1f15b Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Fri, 28 Jul 2017 10:47:46 +0200 Subject: [PATCH 070/166] v1.37.7 --- changelog.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/changelog.txt b/changelog.txt index c835f91ac..e867a7b07 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,13 @@ Legend + : added - : removed +2017-07-28 v1.37.7 +------------------ +* Fix dump when parsing commit author, regex +* Fix decoding of commit body, newlines +* SAMC SAPC refactoring +* DOMA diff fix, sorting + 2017-07-23 v1.37.6 ------------------ * SMIM exists() performance From 8187c45640338c79dd0b95c4dcf98f9ac891fee8 Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 28 Jul 2017 10:03:46 +0000 Subject: [PATCH 071/166] cleanup --- src/zabapgit_git.prog.abap | 11 +++++------ src/zabapgit_object_dtel.prog.abap | 2 +- src/zabapgit_object_pinf.prog.abap | 2 +- src/zabapgit_object_shlp.prog.abap | 2 +- src/zabapgit_object_smim.prog.abap | 5 +++-- src/zabapgit_object_tran.prog.abap | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 28831f90a..448defdff 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -691,24 +691,23 @@ CLASS lcl_git_pack IMPLEMENTATION. METHOD delta. + DEFINE _eat_byte. + lv_x = lv_delta(1). + lv_delta = lv_delta+1. + END-OF-DEFINITION. + DATA: lv_delta TYPE xstring, lv_base TYPE xstring, lv_result TYPE xstring, -* lv_bitbyte TYPE ty_bitbyte, lv_offset TYPE i, lv_sha1 TYPE lif_defs=>ty_sha1, ls_object LIKE LINE OF ct_objects, lv_len TYPE i, lv_org TYPE x, -* lv_i TYPE i, lv_x TYPE x. FIELD-SYMBOLS: LIKE LINE OF ct_objects. - DEFINE _eat_byte. - lv_x = lv_delta(1). - lv_delta = lv_delta+1. - END-OF-DEFINITION. lv_delta = is_object-data. diff --git a/src/zabapgit_object_dtel.prog.abap b/src/zabapgit_object_dtel.prog.abap index cb2bac785..44d54a9bb 100644 --- a/src/zabapgit_object_dtel.prog.abap +++ b/src/zabapgit_object_dtel.prog.abap @@ -154,7 +154,7 @@ CLASS lcl_object_dtel IMPLEMENTATION. ON tparat~paramid = tpara~paramid AND tparat~sprache = mv_language INTO ls_tpara - WHERE tpara~paramid = ls_dd04v-memoryid. + WHERE tpara~paramid = ls_dd04v-memoryid. "#EC CI_BUFFJOIN ENDIF. CLEAR: ls_dd04v-as4user, diff --git a/src/zabapgit_object_pinf.prog.abap b/src/zabapgit_object_pinf.prog.abap index 810d7696e..9a5d3c41b 100644 --- a/src/zabapgit_object_pinf.prog.abap +++ b/src/zabapgit_object_pinf.prog.abap @@ -77,7 +77,7 @@ CLASS lcl_object_pinf IMPLEMENTATION. IF rv_bool = abap_true. SELECT SINGLE mainpack FROM tdevc INTO lv_main_pack - WHERE devclass = lv_pack_name. + WHERE devclass = lv_pack_name. "#EC CI_GENBUFF rv_bool = boolc( sy-subrc = 0 ). ENDIF. diff --git a/src/zabapgit_object_shlp.prog.abap b/src/zabapgit_object_shlp.prog.abap index 3373ada0a..8e1198c70 100644 --- a/src/zabapgit_object_shlp.prog.abap +++ b/src/zabapgit_object_shlp.prog.abap @@ -30,7 +30,7 @@ CLASS lcl_object_shlp IMPLEMENTATION. SELECT SINGLE as4date as4time FROM dd30l INTO (lv_date, lv_time) WHERE shlpname = ms_item-obj_name - AND as4local = 'A'. + AND as4local = 'A'. "#EC CI_GENBUFF rv_changed = check_timestamp( iv_timestamp = iv_timestamp diff --git a/src/zabapgit_object_smim.prog.abap b/src/zabapgit_object_smim.prog.abap index 2512a49d4..f877e481b 100644 --- a/src/zabapgit_object_smim.prog.abap +++ b/src/zabapgit_object_smim.prog.abap @@ -73,7 +73,7 @@ CLASS lcl_object_smim IMPLEMENTATION. lv_loio = ms_item-obj_name. SELECT SINGLE loio_id FROM smimloio INTO lv_loio - WHERE loio_id = lv_loio. + WHERE loio_id = lv_loio. "#EC CI_GENBUFF rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. @@ -208,7 +208,8 @@ CLASS lcl_object_smim IMPLEMENTATION. ls_file-data = lv_content. mo_files->add( ls_file ). - SELECT SINGLE lo_class FROM smimloio INTO lv_class WHERE loio_id = lv_loio. + SELECT SINGLE lo_class FROM smimloio INTO lv_class + WHERE loio_id = lv_loio. "#EC CI_GENBUFF ENDIF. io_xml->add( iv_name = 'URL' diff --git a/src/zabapgit_object_tran.prog.abap b/src/zabapgit_object_tran.prog.abap index 6e742dd2d..4af431ff9 100644 --- a/src/zabapgit_object_tran.prog.abap +++ b/src/zabapgit_object_tran.prog.abap @@ -41,11 +41,11 @@ CLASS lcl_object_tran DEFINITION INHERITING FROM lcl_objects_super FINAL. serialize_texts IMPORTING io_xml TYPE REF TO lcl_xml_output - RAISING lcx_exception, + RAISING lcx_exception, deserialize_texts IMPORTING io_xml TYPE REF TO lcl_xml_input - RAISING lcx_exception. + RAISING lcx_exception. ENDCLASS. "lcl_object_TRAN DEFINITION @@ -443,7 +443,7 @@ CLASS lcl_object_tran IMPLEMENTATION. INTO CORRESPONDING FIELDS OF TABLE lt_tpool_i18n FROM tstct WHERE sprsl <> mv_language - AND tcode = ms_item-obj_name. + AND tcode = ms_item-obj_name. "#EC CI_GENBUFF IF lines( lt_tpool_i18n ) > 0. SORT lt_tpool_i18n BY sprsl ASCENDING. From aa1c2649a4ef09714c3c8065425b158a03c61b4f Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 28 Jul 2017 10:08:33 +0000 Subject: [PATCH 072/166] SICF, fix changed_by --- src/zabapgit_object_sicf.prog.abap | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index 17c3bb22c..79ba14628 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -77,6 +77,10 @@ CLASS lcl_object_sicf IMPLEMENTATION. rv_user = ls_icfservice-icf_muser. + IF rv_user IS INITIAL. + rv_user = c_user_unknown. + ENDIF. + ENDMETHOD. METHOD lif_object~get_metadata. @@ -448,12 +452,12 @@ CLASS lcl_object_sicf IMPLEMENTATION. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' STARTING NEW TASK 'GIT' EXPORTING - tcode = 'SICF' - mode_val = 'E' + tcode = 'SICF' + mode_val = 'E' TABLES - using_tab = lt_bcdata + using_tab = lt_bcdata EXCEPTIONS - OTHERS = 1. + OTHERS = 1. IF sy-subrc <> 0. lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SICF' ). From 95cefd53bbaa3387b189f0557117c0b1125b01a7 Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 28 Jul 2017 11:54:17 +0000 Subject: [PATCH 073/166] SICF double entries, fix #705 --- src/zabapgit_object_sicf.prog.abap | 25 ++++------ src/zabapgit_objects.prog.abap | 8 +-- src/zabapgit_tadir.prog.abap | 79 +++++++++++++++++++++++++++--- 3 files changed, 81 insertions(+), 31 deletions(-) diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index 79ba14628..0c5647477 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -89,11 +89,11 @@ CLASS lcl_object_sicf IMPLEMENTATION. METHOD lif_object~exists. - DATA: ls_icfservice TYPE icfservice. + DATA: ls_tadir TYPE tadir. + ls_tadir = lcl_tadir=>read_single_sicf( ms_item-obj_name ). - read( IMPORTING es_icfservice = ls_icfservice ). - rv_bool = boolc( NOT ls_icfservice IS INITIAL ). + rv_bool = boolc( NOT ls_tadir IS INITIAL ). ENDMETHOD. "lif_object~exists @@ -144,17 +144,7 @@ CLASS lcl_object_sicf IMPLEMENTATION. CLEAR et_icfhandler. CLEAR ev_url. - ls_key = ms_item-obj_name. - IF ls_key-icfparguid IS INITIAL. -* limitation: name must be unique - SELECT SINGLE icfparguid FROM icfservice - INTO ls_key-icfparguid - WHERE icf_name = ls_key-icf_name - AND icf_cuser <> 'SAP' ##warn_ok. - IF sy-subrc <> 0. - RETURN. - ENDIF. - ENDIF. + ls_key = lcl_tadir=>read_single_sicf( ms_item-obj_name )-obj_name. cl_icf_tree=>if_icf_tree~get_info_from_serv( EXPORTING @@ -202,6 +192,7 @@ CLASS lcl_object_sicf IMPLEMENTATION. ls_read TYPE icfservice, ls_icfdocu TYPE icfdocu, lv_url TYPE string, + lv_exists TYPE abap_bool, lt_icfhandler TYPE TABLE OF icfhandler. @@ -214,14 +205,16 @@ CLASS lcl_object_sicf IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'ICFHANDLER_TABLE' CHANGING cg_data = lt_icfhandler ). - read( IMPORTING es_icfservice = ls_read ). - IF ls_read IS INITIAL. + + lv_exists = lif_object~exists( ). + IF lv_exists = abap_false. insert_sicf( is_icfservice = ls_icfservice is_icfdocu = ls_icfdocu it_icfhandler = lt_icfhandler iv_package = iv_package iv_url = lv_url ). ELSE. + read( IMPORTING es_icfservice = ls_read ). change_sicf( is_icfservice = ls_icfservice is_icfdocu = ls_icfdocu it_icfhandler = lt_icfhandler diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 540b47bdf..946d3925a 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -449,13 +449,7 @@ CLASS lcl_objects_files IMPLEMENTATION. DATA: lv_obj_name TYPE string. - IF ms_item-obj_type = 'SICF'. -* multiple SICF nodes with same name cannot be added to repository - lv_obj_name = ms_item-obj_name(15). - ELSE. - lv_obj_name = ms_item-obj_name. - ENDIF. - + lv_obj_name = ms_item-obj_name. IF iv_extra IS INITIAL. CONCATENATE lv_obj_name '.' ms_item-obj_type '.' iv_ext diff --git a/src/zabapgit_tadir.prog.abap b/src/zabapgit_tadir.prog.abap index b99a3bbe6..f0252bd56 100644 --- a/src/zabapgit_tadir.prog.abap +++ b/src/zabapgit_tadir.prog.abap @@ -22,6 +22,11 @@ CLASS lcl_tadir DEFINITION FINAL. iv_object TYPE tadir-object iv_obj_name TYPE tadir-obj_name RETURNING VALUE(rs_tadir) TYPE tadir, + read_single_sicf + IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' + iv_obj_name TYPE tadir-obj_name + RETURNING VALUE(rs_tadir) TYPE tadir + RAISING lcx_exception, get_object_package IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' iv_object TYPE tadir-object @@ -30,6 +35,10 @@ CLASS lcl_tadir DEFINITION FINAL. PRIVATE SECTION. CLASS-METHODS: + read_sicf_url + IMPORTING iv_obj_name TYPE tadir-obj_name + RETURNING VALUE(rv_hash) TYPE text25 + RAISING lcx_exception, check_exists IMPORTING it_tadir TYPE lif_defs=>ty_tadir_tt RETURNING VALUE(rt_tadir) TYPE lif_defs=>ty_tadir_tt @@ -57,18 +66,43 @@ CLASS lcl_tadir IMPLEMENTATION. IF iv_object = 'SICF'. - CONCATENATE iv_obj_name '%' INTO lv_obj_name. + rs_tadir = read_single_sicf( iv_pgmid = iv_pgmid + iv_obj_name = iv_obj_name ). ELSE. - lv_obj_name = iv_obj_name. + SELECT SINGLE * FROM tadir INTO rs_tadir + WHERE pgmid = iv_pgmid + AND object = iv_object + AND obj_name = iv_obj_name. "#EC CI_SUBRC ENDIF. - SELECT SINGLE * FROM tadir INTO rs_tadir - WHERE pgmid = iv_pgmid - AND object = iv_object - AND obj_name LIKE lv_obj_name. "#EC CI_SUBRC "#EC CI_GENBUFF - ENDMETHOD. "read_single + METHOD read_single_sicf. + + DATA: lt_tadir TYPE STANDARD TABLE OF tadir WITH DEFAULT KEY, + lv_hash TYPE text25, + lv_obj_name TYPE tadir-obj_name. + + FIELD-SYMBOLS: LIKE LINE OF lt_tadir. + + + lv_hash = iv_obj_name+15. + CONCATENATE iv_obj_name(15) '%' INTO lv_obj_name. + + SELECT * FROM tadir INTO TABLE lt_tadir + WHERE pgmid = iv_pgmid + AND object = 'SICF' + AND obj_name LIKE lv_obj_name. + + LOOP AT lt_tadir ASSIGNING . + IF read_sicf_url( -obj_name ) = lv_hash. + rs_tadir = . + RETURN. + ENDIF. + ENDLOOP. + + ENDMETHOD. + METHOD get_object_package. DATA ls_tadir TYPE tadir. @@ -85,6 +119,34 @@ CLASS lcl_tadir IMPLEMENTATION. ENDMETHOD. "get_object_package. + METHOD read_sicf_url. + + DATA: lv_name TYPE icfname, + lv_url TYPE string, + lv_parguid TYPE icfparguid. + + + lv_name = iv_obj_name. + lv_parguid = iv_obj_name+15. + + cl_icf_tree=>if_icf_tree~get_info_from_serv( + EXPORTING + icf_name = lv_name + icfparguid = lv_parguid + IMPORTING + url = lv_url + EXCEPTIONS + wrong_name = 1 + wrong_parguid = 2 + incorrect_service = 3 + no_authority = 4 + OTHERS = 5 ). + IF sy-subrc = 0. + rv_hash = lcl_hash=>sha1_raw( lcl_convert=>string_to_xstring_utf8( lv_url ) ). + ENDIF. + + ENDMETHOD. + METHOD check_exists. DATA: lv_exists TYPE abap_bool, @@ -158,7 +220,8 @@ CLASS lcl_tadir IMPLEMENTATION. CASE -object. WHEN 'SICF'. - -obj_name = -obj_name(15). +* replace the internal GUID with a hash of the path + -obj_name+15 = read_sicf_url( -obj_name ). ENDCASE. ENDLOOP. From d378d7e31bef9d29d0bedc5d9aba46aad845e7d0 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Fri, 28 Jul 2017 17:32:17 +0000 Subject: [PATCH 074/166] add jump for DOCT SFPI SSST STYL --- src/zabapgit_object_doct.prog.abap | 40 ++++++++++++++++++++++++++-- src/zabapgit_object_docv.prog.abap | 2 +- src/zabapgit_object_sfpi.prog.abap | 8 +++++- src/zabapgit_object_ssst.prog.abap | 34 +++++++++++++++++++++++- src/zabapgit_object_styl.prog.abap | 42 +++++++++++++++++++++++++++++- 5 files changed, 120 insertions(+), 6 deletions(-) diff --git a/src/zabapgit_object_doct.prog.abap b/src/zabapgit_object_doct.prog.abap index 08bff8fa9..517d8dd7c 100644 --- a/src/zabapgit_object_doct.prog.abap +++ b/src/zabapgit_object_doct.prog.abap @@ -21,7 +21,7 @@ CLASS lcl_object_doct DEFINITION INHERITING FROM lcl_objects_super FINAL. END OF ty_data. METHODS: read - RETURNING value(rs_data) TYPE ty_data. + RETURNING VALUE(rs_data) TYPE ty_data. ENDCLASS. "lcl_object_msag DEFINITION @@ -88,7 +88,43 @@ CLASS lcl_object_doct IMPLEMENTATION. METHOD lif_object~jump. - lcx_exception=>raise( 'todo, jump DOCT' ). + DATA: ls_dokentry TYPE dokentry, + ls_bcdata TYPE bdcdata, + lt_bcdata TYPE STANDARD TABLE OF bdcdata. + + ls_dokentry-username = sy-uname. + ls_dokentry-langu = sy-langu. + ls_dokentry-class = c_id. + MODIFY dokentry FROM ls_dokentry. + + ls_bcdata-program = 'SAPMSDCU'. + ls_bcdata-dynpro = '0100'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + ls_bcdata-dynpro = space. + ls_bcdata-dynbegin = space. + ls_bcdata-fnam = 'RSDCU-OBJECT7'. + ls_bcdata-fval = ms_item-obj_name. + APPEND ls_bcdata TO lt_bcdata. + + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=SHOW'. + APPEND ls_bcdata TO lt_bcdata. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'SE61' + mode_val = 'E' + TABLES + using_tab = lt_bcdata + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, DOCT' ). + ENDIF. ENDMETHOD. "jump diff --git a/src/zabapgit_object_docv.prog.abap b/src/zabapgit_object_docv.prog.abap index da0aaaeea..9efd1cec8 100644 --- a/src/zabapgit_object_docv.prog.abap +++ b/src/zabapgit_object_docv.prog.abap @@ -87,7 +87,7 @@ CLASS lcl_object_docv IMPLEMENTATION. METHOD lif_object~jump. - lcx_exception=>raise( 'todo, jump DOCT' ). + lcx_exception=>raise( 'todo, jump DOCV' ). ENDMETHOD. "jump diff --git a/src/zabapgit_object_sfpi.prog.abap b/src/zabapgit_object_sfpi.prog.abap index 9ba05f810..d4f441775 100644 --- a/src/zabapgit_object_sfpi.prog.abap +++ b/src/zabapgit_object_sfpi.prog.abap @@ -70,7 +70,13 @@ CLASS lcl_object_sfpi IMPLEMENTATION. ENDMETHOD. "lif_object~exists METHOD lif_object~jump. - lcx_exception=>raise( 'todo, SFPI jump' ). + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type. + ENDMETHOD. "jump METHOD lif_object~delete. diff --git a/src/zabapgit_object_ssst.prog.abap b/src/zabapgit_object_ssst.prog.abap index 10d31542b..e6de02a32 100644 --- a/src/zabapgit_object_ssst.prog.abap +++ b/src/zabapgit_object_ssst.prog.abap @@ -225,7 +225,39 @@ CLASS lcl_object_ssst IMPLEMENTATION. ENDMETHOD. "delete METHOD lif_object~jump. - lcx_exception=>raise( 'todo' ). + + DATA: ls_bcdata TYPE bdcdata, + lt_bcdata TYPE STANDARD TABLE OF bdcdata. + + ls_bcdata-program = 'SAPMSSFS'. + ls_bcdata-dynpro = '0100'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'SSFSCREENS-SNAME'. + ls_bcdata-fval = ms_item-obj_name. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=DISPLAY'. + APPEND ls_bcdata TO lt_bcdata. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'SMARTSTYLES' + mode_val = 'E' + TABLES + using_tab = lt_bcdata + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SSST' ). + ENDIF. + ENDMETHOD. "jump METHOD lif_object~compare_to_remote_version. diff --git a/src/zabapgit_object_styl.prog.abap b/src/zabapgit_object_styl.prog.abap index 3e6537cb8..b8f9c78ce 100644 --- a/src/zabapgit_object_styl.prog.abap +++ b/src/zabapgit_object_styl.prog.abap @@ -86,7 +86,47 @@ CLASS lcl_object_styl IMPLEMENTATION. METHOD lif_object~jump. - lcx_exception=>raise( 'todo, STYL jump' ). + DATA: ls_bcdata TYPE bdcdata, + lt_bcdata TYPE STANDARD TABLE OF bdcdata. + + ls_bcdata-program = 'SAPMSSCS'. + ls_bcdata-dynpro = '1100'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'RSSCS-TDSTYLE'. + ls_bcdata-fval = ms_item-obj_name. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'RSSCS-TDSPRAS'. + ls_bcdata-fval = sy-langu. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'RSSCS-TDHEADEROB'. + ls_bcdata-fval = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=SHOW'. + APPEND ls_bcdata TO lt_bcdata. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'SE72' + mode_val = 'E' + TABLES + using_tab = lt_bcdata + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, STYL' ). + ENDIF. ENDMETHOD. "jump From fcbe626dfb45fdf8db345fc37fab9171d68e92e4 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 30 Jul 2017 08:11:56 +0000 Subject: [PATCH 075/166] add jump DOCT IARP IASP IATU NROB SFPF SMIM TOBJ --- src/zabapgit_object_doct.prog.abap | 4 +-- src/zabapgit_object_iarp.prog.abap | 8 +++++- src/zabapgit_object_iasp.prog.abap | 8 +++++- src/zabapgit_object_iatu.prog.abap | 8 +++++- src/zabapgit_object_nrob.prog.abap | 32 +++++++++++++++++++++++- src/zabapgit_object_sfpf.prog.abap | 8 +++++- src/zabapgit_object_smim.prog.abap | 8 +++++- src/zabapgit_object_tobj.prog.abap | 40 +++++++++++++++++++++++++++++- 8 files changed, 107 insertions(+), 9 deletions(-) diff --git a/src/zabapgit_object_doct.prog.abap b/src/zabapgit_object_doct.prog.abap index 517d8dd7c..21e268b60 100644 --- a/src/zabapgit_object_doct.prog.abap +++ b/src/zabapgit_object_doct.prog.abap @@ -102,12 +102,12 @@ CLASS lcl_object_doct IMPLEMENTATION. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. - ls_bcdata-dynpro = space. - ls_bcdata-dynbegin = space. + CLEAR ls_bcdata. ls_bcdata-fnam = 'RSDCU-OBJECT7'. ls_bcdata-fval = ms_item-obj_name. APPEND ls_bcdata TO lt_bcdata. + CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=SHOW'. APPEND ls_bcdata TO lt_bcdata. diff --git a/src/zabapgit_object_iarp.prog.abap b/src/zabapgit_object_iarp.prog.abap index ff3cd15b0..8469d7d5f 100644 --- a/src/zabapgit_object_iarp.prog.abap +++ b/src/zabapgit_object_iarp.prog.abap @@ -185,7 +185,13 @@ CLASS lcl_object_iarp IMPLEMENTATION. ENDMETHOD. "lif_object~exists METHOD lif_object~jump. - lcx_exception=>raise( 'todo, IARP, jump' ). + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type. + ENDMETHOD. "lif_object~jump METHOD lif_object~compare_to_remote_version. diff --git a/src/zabapgit_object_iasp.prog.abap b/src/zabapgit_object_iasp.prog.abap index 74c24d2a1..ba1bfff00 100644 --- a/src/zabapgit_object_iasp.prog.abap +++ b/src/zabapgit_object_iasp.prog.abap @@ -185,7 +185,13 @@ CLASS lcl_object_iasp IMPLEMENTATION. ENDMETHOD. "lif_object~exists METHOD lif_object~jump. - lcx_exception=>raise( 'todo, IASP, jump' ). + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type. + ENDMETHOD. "lif_object~jump METHOD lif_object~compare_to_remote_version. diff --git a/src/zabapgit_object_iatu.prog.abap b/src/zabapgit_object_iatu.prog.abap index e589eaff8..bd1ce1c75 100644 --- a/src/zabapgit_object_iatu.prog.abap +++ b/src/zabapgit_object_iatu.prog.abap @@ -202,7 +202,13 @@ CLASS lcl_object_iatu IMPLEMENTATION. ENDMETHOD. "lif_object~exists METHOD lif_object~jump. - lcx_exception=>raise( 'todo, IATU, jump' ). + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type. + ENDMETHOD. "lif_object~jump METHOD lif_object~compare_to_remote_version. diff --git a/src/zabapgit_object_nrob.prog.abap b/src/zabapgit_object_nrob.prog.abap index 1e4fa6e63..f42d6eaaf 100644 --- a/src/zabapgit_object_nrob.prog.abap +++ b/src/zabapgit_object_nrob.prog.abap @@ -250,7 +250,37 @@ CLASS lcl_object_nrob IMPLEMENTATION. METHOD lif_object~jump. - lcx_exception=>raise( 'todo' ). + DATA: ls_bcdata TYPE bdcdata, + lt_bcdata TYPE STANDARD TABLE OF bdcdata. + + ls_bcdata-program = 'SAPMSNRO'. + ls_bcdata-dynpro = '0150'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'NRIV-OBJECT'. + ls_bcdata-fval = ms_item-obj_name. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=DISP'. + APPEND ls_bcdata TO lt_bcdata. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'SNRO' + mode_val = 'E' + TABLES + using_tab = lt_bcdata + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, NROB' ). + ENDIF. ENDMETHOD. "jump diff --git a/src/zabapgit_object_sfpf.prog.abap b/src/zabapgit_object_sfpf.prog.abap index b8da5dc5b..f99691927 100644 --- a/src/zabapgit_object_sfpf.prog.abap +++ b/src/zabapgit_object_sfpf.prog.abap @@ -74,7 +74,13 @@ CLASS lcl_object_sfpf IMPLEMENTATION. ENDMETHOD. "lif_object~exists METHOD lif_object~jump. - lcx_exception=>raise( 'todo, SFPF jump' ). + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type. + ENDMETHOD. "jump METHOD lif_object~delete. diff --git a/src/zabapgit_object_smim.prog.abap b/src/zabapgit_object_smim.prog.abap index f877e481b..82b0f89ec 100644 --- a/src/zabapgit_object_smim.prog.abap +++ b/src/zabapgit_object_smim.prog.abap @@ -331,7 +331,13 @@ CLASS lcl_object_smim IMPLEMENTATION. ENDMETHOD. "delete METHOD lif_object~jump. - lcx_exception=>raise( 'todo, SMIM, jump' ). + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type. + ENDMETHOD. "jump METHOD lif_object~compare_to_remote_version. diff --git a/src/zabapgit_object_tobj.prog.abap b/src/zabapgit_object_tobj.prog.abap index 3e1f83f49..308dc0a7e 100644 --- a/src/zabapgit_object_tobj.prog.abap +++ b/src/zabapgit_object_tobj.prog.abap @@ -191,7 +191,45 @@ CLASS lcl_object_tobj IMPLEMENTATION. ENDMETHOD. "delete METHOD lif_object~jump. - lcx_exception=>raise( 'todo, TOBJ jump' ). + + DATA: ls_bcdata TYPE bdcdata, + lt_bcdata TYPE STANDARD TABLE OF bdcdata. + + ls_bcdata-program = 'SAPMSVIM'. + ls_bcdata-dynpro = '0050'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'VIMDYNFLDS-VIEWNAME'. + ls_bcdata-fval = substring( val = ms_item-obj_name + len = strlen( ms_item-obj_name ) - 1 ). + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'VIMDYNFLDS-ELEM_GEN'. + ls_bcdata-fval = abap_true. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=SHOW'. + APPEND ls_bcdata TO lt_bcdata. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'SE54' + mode_val = 'E' + TABLES + using_tab = lt_bcdata + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, TOBJ' ). + ENDIF. + ENDMETHOD. "jump METHOD lif_object~compare_to_remote_version. From cc3b41da3d76528c8f86df5816520903cc317c97 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 30 Jul 2017 08:29:26 +0000 Subject: [PATCH 076/166] add comment DOCT jump --- src/zabapgit_object_doct.prog.abap | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/zabapgit_object_doct.prog.abap b/src/zabapgit_object_doct.prog.abap index 21e268b60..dccb66670 100644 --- a/src/zabapgit_object_doct.prog.abap +++ b/src/zabapgit_object_doct.prog.abap @@ -92,6 +92,11 @@ CLASS lcl_object_doct IMPLEMENTATION. ls_bcdata TYPE bdcdata, lt_bcdata TYPE STANDARD TABLE OF bdcdata. + " We need to modify dokentry directly, otherwise + " Batch Input on SE61 wouldn't work because it stores + " the last seen Document Class in this table. There's + " no standard function to do this. SE61 does this + " directly in its dialog modules ls_dokentry-username = sy-uname. ls_dokentry-langu = sy-langu. ls_dokentry-class = c_id. From e3b8095c65277e7ac74ff5ae0eaa7388130d29d1 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 30 Jul 2017 08:49:04 +0000 Subject: [PATCH 077/166] Refactoring - add pragma for dynamic accessed data object - delete superflous code in ADT jump --- src/zabapgit_objects.prog.abap | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 540b47bdf..8017477a6 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -1668,7 +1668,7 @@ CLASS lcl_objects_super IMPLEMENTATION. li_object TYPE REF TO cl_wb_object, li_adt TYPE REF TO object, li_adt_uri_mapper TYPE REF TO object, - li_adt_objref TYPE REF TO object. + li_adt_objref TYPE REF TO object ##needed. FIELD-SYMBOLS: TYPE string. @@ -1797,22 +1797,10 @@ CLASS lcl_objects_super IMPLEMENTATION. METHOD is_adt_jump_possible. - DATA: li_wb_manager TYPE REF TO if_wb_manager, - li_wb_request TYPE REF TO cl_wb_request, + DATA: li_wb_request TYPE REF TO cl_wb_request, li_adt_uri_mapper_vit TYPE REF TO object, is_vit_wb_request TYPE abap_bool. - cl_wb_manager=>get_instance( - IMPORTING - p_instance = li_wb_manager - EXCEPTIONS - no_instance = 1 - OTHERS = 2 ). - - IF sy-subrc <> 0. - lcx_exception=>raise( 'ADT Jump Error' ). - ENDIF. - cl_wb_request=>create_from_object_ref( EXPORTING p_wb_object = io_object From 0dd0a4b7be925d4423f62873d26b29b7e395ba92 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Tue, 1 Aug 2017 06:08:51 +0200 Subject: [PATCH 078/166] docs: add presentation --- docs/other-articles-and-presentations.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/other-articles-and-presentations.md b/docs/other-articles-and-presentations.md index 32b2e296a..59cc5b97a 100644 --- a/docs/other-articles-and-presentations.md +++ b/docs/other-articles-and-presentations.md @@ -46,6 +46,9 @@ Mastering SAP Technologies, Melbourne, May 23rd [abapGit – so easy](https://blogs.sap.com/2017/06/21/abapgit-so-easy/) -Graham Robinson +SAUG National Summit 2017, September 5th +-Graham Robinson + SAP Teched Las Vegas -Graham Robinson From 931d1cf3bfd1aba269df835a61b075d3570cf928 Mon Sep 17 00:00:00 2001 From: larshp Date: Tue, 1 Aug 2017 15:08:08 +0000 Subject: [PATCH 079/166] fix #872 --- src/zabapgit_object_tabl.prog.abap | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_tabl.prog.abap b/src/zabapgit_object_tabl.prog.abap index a8d4a2ab5..4f0e423cd 100644 --- a/src/zabapgit_object_tabl.prog.abap +++ b/src/zabapgit_object_tabl.prog.abap @@ -79,14 +79,27 @@ CLASS lcl_object_tabl IMPLEMENTATION. METHOD lif_object~changed_by. - SELECT SINGLE as4user FROM dd02l INTO rv_user + DATA: lv_as4date TYPE dd02l-as4date, + lv_as4time TYPE dd02l-as4time. + + + SELECT SINGLE as4user as4date as4time + FROM dd02l INTO (rv_user, lv_as4date, lv_as4time) WHERE tabname = ms_item-obj_name AND as4local = 'A' AND as4vers = '0000'. IF sy-subrc <> 0. rv_user = c_user_unknown. + RETURN. ENDIF. + SELECT SINGLE as4user INTO rv_user + FROM dd09l + WHERE tabname = ms_item-obj_name + AND as4local = 'A' + AND as4vers = '0000' + AND ( as4date > lv_as4date OR ( as4date = lv_as4date AND as4time > lv_as4time ) ). + ENDMETHOD. METHOD lif_object~get_metadata. From 606423912c9f580e448867e23b6c591dd77389da Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 3 Aug 2017 14:44:38 +0200 Subject: [PATCH 080/166] docs: supported objects, add DIAL link --- docs/ref-supported.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 7d2639ded..3b4ec1ec5 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -16,6 +16,7 @@ CLAS | Class (ABAP Objects) | Yes CMOD | Customer enhancement projects | [#151](https://github.com/larshp/abapGit/issues/151) DCLS | ABAP Data Control Language Sources | Yes DDLS | Data Definition Language Source | Yes +DIAL | Dialog Module | [#879](https://github.com/larshp/abapGit/issues/879) DOCT | General Text | Yes DOCV | Documentation (Independent) | Yes DOMA | Domain | Yes From af93a489db35f480e2bcd70a0356e49e96d3d29c Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 3 Aug 2017 15:29:34 +0000 Subject: [PATCH 081/166] downport to 702, #878 --- src/zabapgit_http.prog.abap | 7 +++++-- src/zabapgit_unit_test.prog.abap | 9 ++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/zabapgit_http.prog.abap b/src/zabapgit_http.prog.abap index acfad0299..47176c60a 100644 --- a/src/zabapgit_http.prog.abap +++ b/src/zabapgit_http.prog.abap @@ -501,8 +501,8 @@ CLASS lcl_http IMPLEMENTATION. METHOD is_local_system. DATA: lv_host TYPE string, - lt_list TYPE lif_defs=>ty_icm_sinfo2_tt. - + lt_list TYPE lif_defs=>ty_icm_sinfo2_tt, + li_exit TYPE ref to lif_exit. CALL FUNCTION 'ICM_GET_INFO2' TABLES @@ -516,6 +516,9 @@ CLASS lcl_http IMPLEMENTATION. RETURN. ENDIF. + li_exit = lcl_exit=>get_instance( ). + li_exit->change_local_host( CHANGING ct_hosts = lt_list ). + lcl_exit=>get_instance( )->change_local_host( CHANGING ct_hosts = lt_list ). FIND REGEX 'https?://([^/^:]*)' IN iv_url diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index ce1075277..8d743b21a 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -2037,11 +2037,10 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. METHOD _hex_to_char. - cl_abap_conv_in_ce=>create( )->convert( - EXPORTING - input = i_x - IMPORTING - data = r_s ). + DATA lr_conv TYPE REF TO cl_abap_conv_in_ce. + + lr_conv = cl_abap_conv_in_ce=>create( ). + lr_conv->convert( EXPORTING input = i_x IMPORTING data = r_s ). ENDMETHOD. From 89853a2264b7749ad8606d7df7288d7f01c86a90 Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 3 Aug 2017 15:37:58 +0000 Subject: [PATCH 082/166] v1.37.8 --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index e6d55491f..3c6ad6d4a 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -7,7 +7,7 @@ TYPE-POOLS seop. INTERFACE lif_defs. CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.37.7'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.37.8'. "#EC NOTEXT TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, From 64f15276c51b74276f023dda2613f8151be199dd Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 3 Aug 2017 17:39:24 +0200 Subject: [PATCH 083/166] v1.37.8 --- changelog.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/changelog.txt b/changelog.txt index e867a7b07..906089859 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,11 @@ Legend + : added - : removed +2017-08-03 v1.37.8 +------------------ +* Fix TABL changed_by +* Downport to 702 + 2017-07-28 v1.37.7 ------------------ * Fix dump when parsing commit author, regex From 1ccc94d881c1d6700e207aa97c8855a796f13659 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Fri, 4 Aug 2017 06:50:42 +0000 Subject: [PATCH 084/166] #879 --- src/zabapgit_object_dial.prog.abap | 155 ++++++++++++++++++++++ src/zabapgit_object_dial.prog.xml | 25 ++++ src/zabapgit_object_serializing.prog.abap | 1 + 3 files changed, 181 insertions(+) create mode 100644 src/zabapgit_object_dial.prog.abap create mode 100644 src/zabapgit_object_dial.prog.xml diff --git a/src/zabapgit_object_dial.prog.abap b/src/zabapgit_object_dial.prog.abap new file mode 100644 index 000000000..1c8b6c26c --- /dev/null +++ b/src/zabapgit_object_dial.prog.abap @@ -0,0 +1,155 @@ +*&---------------------------------------------------------------------* +*& Include zabapgit_object_dial +*&---------------------------------------------------------------------* + + +CLASS lcl_object_dial DEFINITION INHERITING FROM lcl_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + + PRIVATE SECTION. + TYPES: BEGIN OF ty_dialog_module, + tdct TYPE tdct, + dia_pars TYPE STANDARD TABLE OF diapar + WITH NON-UNIQUE DEFAULT KEY, + END OF ty_dialog_module. + + METHODS: + _read_tdct + RETURNING + VALUE(rs_tdct) TYPE tdct. + +ENDCLASS. + +CLASS lcl_object_dial IMPLEMENTATION. + + METHOD lif_object~has_changed_since. + + rv_changed = abap_true. + + ENDMETHOD. + + METHOD lif_object~changed_by. + + rv_user = c_user_unknown. + + ENDMETHOD. + + METHOD lif_object~get_metadata. + + rs_metadata = get_metadata( ). + + ENDMETHOD. + + METHOD lif_object~exists. + + DATA: ls_tdct TYPE tdct. + + ls_tdct = _read_tdct( ). + + rv_bool = boolc( ls_tdct IS NOT INITIAL ). + + ENDMETHOD. + + METHOD lif_object~serialize. + + DATA: ls_dialog_module TYPE ty_dialog_module. + + ls_dialog_module-tdct = _read_tdct( ). + + SELECT * FROM diapar + INTO TABLE ls_dialog_module-dia_pars + WHERE dnam = ls_dialog_module-tdct-dnam. + + io_xml->add( iv_name = 'DIAL' + ig_data = ls_dialog_module ). + + ENDMETHOD. + + METHOD lif_object~deserialize. + + DATA: ls_dialog_module TYPE ty_dialog_module. + + io_xml->read( + EXPORTING + iv_name = 'DIAL' + CHANGING + cg_data = ls_dialog_module ). + + CALL FUNCTION 'RS_DIALOG_CREATE' + EXPORTING + dialogname = ls_dialog_module-tdct-dnam + dynpronumber = ls_dialog_module-tdct-dynr + programname = ls_dialog_module-tdct-prog +* It seems that dia_par parameter doesn't do anything, but we can't omit it +* Parameters are inserted below + TABLES + dia_par = ls_dialog_module-dia_pars + EXCEPTIONS + dialog_already_exists = 1 + invalid_name = 2 + OTHERS = 3. + + IF sy-subrc <> 0. + lcx_exception=>raise( |Error deserializing dialogmodule { ms_item-obj_name }| ). + ENDIF. + + " It seems that there's no API for diapar, therefore we manipulate it directly + INSERT diapar FROM TABLE ls_dialog_module-dia_pars. + + ENDMETHOD. + + METHOD lif_object~delete. + + DATA: ls_tdct TYPE tdct. + + " We don't use RS_DIALOG_DELETE because it interacts with the GUI + + ls_tdct = _read_tdct( ). + + PERFORM fu_delete_dialog IN PROGRAM sapmsdia USING ls_tdct. + + ENDMETHOD. + + + METHOD lif_object~jump. + + DATA: objectname TYPE tdct-dnam. + + objectname = ms_item-obj_name. + + CALL FUNCTION 'RS_DIALOG_SHOW' + EXPORTING + objectname = objectname + type = 'VW' + EXCEPTIONS + object_not_found = 1 + OTHERS = 2. + + IF sy-subrc <> 0. + lcx_exception=>raise( |Error from RS_DIALOG_SHOW, DIAL| ). + ENDIF. + + ENDMETHOD. + + METHOD lif_object~compare_to_remote_version. + + CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. + + ENDMETHOD. + + + METHOD _read_tdct. + + DATA: dnam TYPE tdct-dnam. + + dnam = ms_item-obj_name. + + SELECT SINGLE * FROM tdct + INTO rs_tdct + WHERE dnam = dnam. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zabapgit_object_dial.prog.xml b/src/zabapgit_object_dial.prog.xml new file mode 100644 index 000000000..eb942b95c --- /dev/null +++ b/src/zabapgit_object_dial.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_OBJECT_DIAL + A + X + S + D$ + I + X + D$S + X + + + + R + zabapgit_object_dial + 20 + + + + + diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap index baed8652b..a1d4a6ac0 100644 --- a/src/zabapgit_object_serializing.prog.abap +++ b/src/zabapgit_object_serializing.prog.abap @@ -10,6 +10,7 @@ INCLUDE zabapgit_object_oo_functions. INCLUDE zabapgit_object_clas. INCLUDE zabapgit_object_dcls. INCLUDE zabapgit_object_ddls. +INCLUDE zabapgit_object_dial. INCLUDE zabapgit_object_doct. INCLUDE zabapgit_object_docv. INCLUDE zabapgit_object_doma. From a898748eb1f4c9def5adb12834a2e273d60a4c2d Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 5 Aug 2017 06:13:30 +0000 Subject: [PATCH 085/166] fix #874 --- src/zabapgit_object_type.prog.abap | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/zabapgit_object_type.prog.abap b/src/zabapgit_object_type.prog.abap index 562b057d7..0612a2e13 100644 --- a/src/zabapgit_object_type.prog.abap +++ b/src/zabapgit_object_type.prog.abap @@ -14,6 +14,8 @@ CLASS lcl_object_type DEFINITION INHERITING FROM lcl_objects_super FINAL. ALIASES mo_files FOR lif_object~mo_files. PRIVATE SECTION. + CONSTANTS: c_prefix TYPE c LENGTH 3 VALUE '%_C'. + METHODS read EXPORTING ev_ddtext TYPE ddtypet-ddtext et_source TYPE abaptxt255_tab @@ -122,10 +124,6 @@ CLASS lcl_object_type IMPLEMENTATION. lv_typegroup = ms_item-obj_name. - IF lif_object~exists( ) = abap_true. - lif_object~delete( ). - ENDIF. - CALL FUNCTION 'RS_DD_TYGR_INSERT_SOURCES' EXPORTING typegroupname = lv_typegroup @@ -145,7 +143,7 @@ CLASS lcl_object_type IMPLEMENTATION. lcx_exception=>raise( 'error from RS_DD_TYGR_INSERT_SOURCES' ). ENDIF. - CONCATENATE '%_C' lv_typegroup INTO lv_progname. + CONCATENATE c_prefix lv_typegroup INTO lv_progname. UPDATE progdir SET uccheck = abap_true WHERE name = lv_progname. IF sy-subrc <> 0. @@ -156,8 +154,13 @@ CLASS lcl_object_type IMPLEMENTATION. METHOD lif_object~deserialize. - DATA: lv_ddtext TYPE ddtypet-ddtext, - lt_source TYPE abaptxt255_tab. + DATA: lv_ddtext TYPE ddtypet-ddtext, + lt_source TYPE abaptxt255_tab, + lv_progname TYPE reposrc-progname, + lv_typegroup TYPE rsedd0-typegroup. + + + lv_typegroup = ms_item-obj_name. io_xml->read( EXPORTING iv_name = 'DDTEXT' @@ -165,9 +168,14 @@ CLASS lcl_object_type IMPLEMENTATION. lt_source = mo_files->read_abap( ). - create( iv_ddtext = lv_ddtext - it_source = lt_source - iv_devclass = iv_package ). + IF lif_object~exists( ) = abap_false. + create( iv_ddtext = lv_ddtext + it_source = lt_source + iv_devclass = iv_package ). + ELSE. + CONCATENATE c_prefix lv_typegroup INTO lv_progname. + INSERT REPORT lv_progname FROM lt_source STATE 'I'. + ENDIF. lcl_objects_activation=>add_item( ms_item ). From 1816fde688d55de21538408b58f62dc54b6c9f9c Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 5 Aug 2017 07:21:23 +0000 Subject: [PATCH 086/166] fix #880 --- src/zabapgit_object_tobj.prog.abap | 55 +++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_tobj.prog.abap b/src/zabapgit_object_tobj.prog.abap index 308dc0a7e..abf4a341d 100644 --- a/src/zabapgit_object_tobj.prog.abap +++ b/src/zabapgit_object_tobj.prog.abap @@ -13,6 +13,19 @@ CLASS lcl_object_tobj DEFINITION INHERITING FROM lcl_objects_super FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + PRIVATE SECTION. + TYPES: BEGIN OF ty_tobj, + tddat TYPE tddat, + tvdir TYPE tvdir, + tvimf TYPE STANDARD TABLE OF tvimf WITH DEFAULT KEY, + END OF ty_tobj. + + METHODS: + read_extra IMPORTING iv_tabname TYPE vim_name + RETURNING VALUE(rs_tobj) TYPE ty_tobj, + update_extra IMPORTING is_tobj TYPE ty_tobj, + delete_extra IMPORTING iv_tabname TYPE vim_name. + ENDCLASS. "lcl_object_tobj DEFINITION *----------------------------------------------------------------------* @@ -22,6 +35,32 @@ ENDCLASS. "lcl_object_tobj DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_tobj IMPLEMENTATION. + METHOD read_extra. + + SELECT SINGLE * FROM tddat INTO rs_tobj-tddat WHERE tabname = iv_tabname. + + SELECT SINGLE * FROM tvdir INTO rs_tobj-tvdir WHERE tabname = iv_tabname. + + SELECT * FROM tvimf INTO TABLE rs_tobj-tvimf WHERE tabname = iv_tabname. + + ENDMETHOD. + + METHOD update_extra. + + MODIFY tddat FROM is_tobj-tddat. + MODIFY tvdir FROM is_tobj-tvdir. + MODIFY tvimf FROM TABLE is_tobj-tvimf. + + ENDMETHOD. + + METHOD delete_extra. + + DELETE FROM tddat WHERE tabname = iv_tabname. + DELETE FROM tvdir WHERE tabname = iv_tabname. + DELETE FROM tvimf WHERE tabname = iv_tabname. + + ENDMETHOD. + METHOD lif_object~has_changed_since. rv_changed = abap_true. ENDMETHOD. "lif_object~has_changed_since @@ -67,6 +106,7 @@ CLASS lcl_object_tobj IMPLEMENTATION. lt_objs TYPE tt_objs, lt_objsl TYPE tt_objsl, lt_objm TYPE tt_objm, + ls_tobj TYPE ty_tobj, lv_type_pos TYPE i. lv_type_pos = strlen( ms_item-obj_name ) - 1. @@ -113,6 +153,11 @@ CLASS lcl_object_tobj IMPLEMENTATION. io_xml->add( iv_name = 'OBJM' ig_data = lt_objm ). + ls_tobj = read_extra( ls_objh-objectname ). + + io_xml->add( iv_name = 'TOBJ' + ig_data = ls_tobj ). + ENDMETHOD. "serialize METHOD lif_object~deserialize. @@ -121,7 +166,8 @@ CLASS lcl_object_tobj IMPLEMENTATION. ls_objt TYPE objt, lt_objs TYPE tt_objs, lt_objsl TYPE tt_objsl, - lt_objm TYPE tt_objm. + lt_objm TYPE tt_objm, + ls_tobj TYPE ty_tobj. io_xml->read( EXPORTING iv_name = 'OBJH' @@ -160,6 +206,11 @@ CLASS lcl_object_tobj IMPLEMENTATION. lcx_exception=>raise( 'error from OBJ_GENERATE' ). ENDIF. + io_xml->read( EXPORTING iv_name = 'TOBJ' + CHANGING cg_data = ls_tobj ). + + update_extra( ls_tobj ). + ENDMETHOD. "deserialize METHOD lif_object~delete. @@ -188,6 +239,8 @@ CLASS lcl_object_tobj IMPLEMENTATION. lcx_exception=>raise( 'error from OBJ_GENERATE' ). ENDIF. + delete_extra( ls_objh-objectname ). + ENDMETHOD. "delete METHOD lif_object~jump. From 92262adb67b40a9d1f209f0784718ee5011edf2b Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 5 Aug 2017 07:24:38 +0000 Subject: [PATCH 087/166] fix compiler warning --- src/zabapgit_file_status.prog.abap | 3 ++- src/zabapgit_tadir.prog.abap | 6 ++++-- src/zabapgit_unit_test.prog.abap | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_file_status.prog.abap b/src/zabapgit_file_status.prog.abap index 416b901d3..d7402cfa1 100644 --- a/src/zabapgit_file_status.prog.abap +++ b/src/zabapgit_file_status.prog.abap @@ -27,7 +27,8 @@ CLASS lcl_file_status DEFINITION FINAL it_local TYPE lif_defs=>ty_files_item_tt it_remote TYPE lif_defs=>ty_files_tt it_cur_state TYPE lif_defs=>ty_file_signatures_tt - RETURNING VALUE(rt_results) TYPE lif_defs=>ty_results_tt, + RETURNING VALUE(rt_results) TYPE lif_defs=>ty_results_tt + RAISING lcx_exception, run_checks IMPORTING io_log TYPE REF TO lcl_log it_results TYPE lif_defs=>ty_results_tt diff --git a/src/zabapgit_tadir.prog.abap b/src/zabapgit_tadir.prog.abap index f0252bd56..bd0436200 100644 --- a/src/zabapgit_tadir.prog.abap +++ b/src/zabapgit_tadir.prog.abap @@ -21,7 +21,8 @@ CLASS lcl_tadir DEFINITION FINAL. IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' iv_object TYPE tadir-object iv_obj_name TYPE tadir-obj_name - RETURNING VALUE(rs_tadir) TYPE tadir, + RETURNING VALUE(rs_tadir) TYPE tadir + RAISING lcx_exception, read_single_sicf IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' iv_obj_name TYPE tadir-obj_name @@ -31,7 +32,8 @@ CLASS lcl_tadir DEFINITION FINAL. IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' iv_object TYPE tadir-object iv_obj_name TYPE tadir-obj_name - RETURNING VALUE(rv_devclass) TYPE tadir-devclass. + RETURNING VALUE(rv_devclass) TYPE tadir-devclass + RAISING lcx_exception. PRIVATE SECTION. CLASS-METHODS: diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 8d743b21a..7bb5a034d 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -2208,7 +2208,8 @@ CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS INHERITING FROM cl_aunit_assert. PUBLIC SECTION. - METHODS calculate_status FOR TESTING. + METHODS calculate_status FOR TESTING + RAISING lcx_exception. ENDCLASS. "ltcl_file_status From 6e702033be8b0fb9707380ca29723eff34863715 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 5 Aug 2017 07:26:32 +0000 Subject: [PATCH 088/166] v1.38.0 --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 3c6ad6d4a..d18b6f525 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -7,7 +7,7 @@ TYPE-POOLS seop. INTERFACE lif_defs. CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.37.8'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.38.0'. "#EC NOTEXT TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, From a2d4b42ea132024647196b07db5624f0b9d6a0f8 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 5 Aug 2017 09:28:17 +0200 Subject: [PATCH 089/166] Update changelog.txt --- changelog.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.txt b/changelog.txt index 906089859..140f4eab5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,12 @@ Legend + : added - : removed +2017-08-03 v1.38.0 +------------------ +! SICF serialization changed +* TOBJ serialization added TDDAT, TVDIR, and TVIMF tables +* TYPE fix overwriting/pull + 2017-08-03 v1.37.8 ------------------ * Fix TABL changed_by From 8599fce30909dd07d03f884ec01a91f7b30ad8ca Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 5 Aug 2017 09:28:33 +0200 Subject: [PATCH 090/166] v1.38.0 --- changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 140f4eab5..981a1de1b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,7 +8,7 @@ Legend + : added - : removed -2017-08-03 v1.38.0 +2017-08-05 v1.38.0 ------------------ ! SICF serialization changed * TOBJ serialization added TDDAT, TVDIR, and TVIMF tables From 35ec0c3b3350b6b1ace288953e159b4a5a98477e Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 5 Aug 2017 10:04:54 +0200 Subject: [PATCH 091/166] add section about bug reports --- CONTRIBUTING.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e3b68a83e..3c727e27e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,23 @@ +## Bug Reports + +A bug is a _demonstrable problem_ that is caused by the code in the repository. Good bug reports are extremely helpful - thank you! + +Guidelines for bug reports: + +1. **Use the GitHub issue search** — check if the issue has already been + reported. + +2. **Check if the issue has been fixed** — try to reproduce it using the + latest `master` or development branch in the repository. + +3. **Demonstrate the problem** — provide clear steps that can be reproduced. + +A good bug report should not leave others needing to chase you up for more +information. Please try to be as detailed as possible in your report. What is +your environment? What steps will reproduce the issue? What OS experienced the +problem? What would you expect to be the outcome? All these details will help +to fix any potential bugs. + ## Development Guidelines a. Make sure there is an open issue for the stuff that you want to work on. When starting the development add a comment in the issue. This will allow for discussing possible solutions, and avoid having multiple people look into the same issue. From 6ea69208b3e899bb0ba1f62e80c31d598252d5b4 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 5 Aug 2017 10:06:23 +0200 Subject: [PATCH 092/166] Update CONTRIBUTING.md --- CONTRIBUTING.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c727e27e..3abfcb45f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,11 +12,7 @@ Guidelines for bug reports: 3. **Demonstrate the problem** — provide clear steps that can be reproduced. -A good bug report should not leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What OS experienced the -problem? What would you expect to be the outcome? All these details will help -to fix any potential bugs. +A good bug report should not leave others needing to chase you up for more information. Please try to be as detailed as possible in your report. What is your environment? What steps will reproduce the issue? What would you expect to be the outcome? All these details will help to fix any potential bugs. ## Development Guidelines From 2e5d31f4f34cf4bbddc76886c94384a7b3009e01 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 5 Aug 2017 11:25:13 +0200 Subject: [PATCH 093/166] SICF fix --- src/zabapgit_object_sicf.prog.abap | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index 0c5647477..841ece111 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -95,6 +95,14 @@ CLASS lcl_object_sicf IMPLEMENTATION. rv_bool = boolc( NOT ls_tadir IS INITIAL ). + IF rv_bool = abap_true. + ls_key = ls_tadir-obj_name. + SELECT SINGLE icfaltnme FROM icfservice INTO ls_key-icf_name + WHERE icf_name = ls_key-icf_name + AND icfparguid = ls_key-icfparguid. + rv_bool = boolc( sy-subrc = 0 ). + ENDIF. + ENDMETHOD. "lif_object~exists METHOD lif_object~serialize. From 55013696ae9d8bd9d341221127f611d2780fa3aa Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 5 Aug 2017 11:26:11 +0200 Subject: [PATCH 094/166] SICF fix --- src/zabapgit_tadir.prog.abap | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/zabapgit_tadir.prog.abap b/src/zabapgit_tadir.prog.abap index bd0436200..b3170da02 100644 --- a/src/zabapgit_tadir.prog.abap +++ b/src/zabapgit_tadir.prog.abap @@ -103,6 +103,12 @@ CLASS lcl_tadir IMPLEMENTATION. ENDIF. ENDLOOP. + IF lines( lt_tadir ) = 1. + READ TABLE lt_tadir INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + rs_tadir = . + ENDIF. + ENDMETHOD. METHOD get_object_package. From 9b7d4721cf79b397364c10f5dea4ce802fd1ce99 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 5 Aug 2017 09:27:58 +0000 Subject: [PATCH 095/166] SICF fix --- src/zabapgit_object_sicf.prog.abap | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap index 841ece111..51a09b31e 100644 --- a/src/zabapgit_object_sicf.prog.abap +++ b/src/zabapgit_object_sicf.prog.abap @@ -89,7 +89,8 @@ CLASS lcl_object_sicf IMPLEMENTATION. METHOD lif_object~exists. - DATA: ls_tadir TYPE tadir. + DATA: ls_tadir TYPE tadir, + ls_key TYPE ty_sicf_key. ls_tadir = lcl_tadir=>read_single_sicf( ms_item-obj_name ). From 88be683c6ad3268952db4ef426992fb3d11dba0b Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Sun, 6 Aug 2017 17:04:11 +0000 Subject: [PATCH 096/166] tadir_insert | delete via batch input --- src/zabapgit_object_dial.prog.abap | 60 ++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_object_dial.prog.abap b/src/zabapgit_object_dial.prog.abap index 1c8b6c26c..6b314fc79 100644 --- a/src/zabapgit_object_dial.prog.abap +++ b/src/zabapgit_object_dial.prog.abap @@ -82,6 +82,7 @@ CLASS lcl_object_dial IMPLEMENTATION. dialogname = ls_dialog_module-tdct-dnam dynpronumber = ls_dialog_module-tdct-dynr programname = ls_dialog_module-tdct-prog + suppress_corr_check = abap_false * It seems that dia_par parameter doesn't do anything, but we can't omit it * Parameters are inserted below TABLES @@ -98,17 +99,68 @@ CLASS lcl_object_dial IMPLEMENTATION. " It seems that there's no API for diapar, therefore we manipulate it directly INSERT diapar FROM TABLE ls_dialog_module-dia_pars. + tadir_insert( iv_package ). + ENDMETHOD. METHOD lif_object~delete. - DATA: ls_tdct TYPE tdct. + DATA: ls_bcdata TYPE bdcdata, + lt_bcdata TYPE STANDARD TABLE OF bdcdata. - " We don't use RS_DIALOG_DELETE because it interacts with the GUI + ls_bcdata-program = 'SAPMSDIA'. + ls_bcdata-dynpro = '1010'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. - ls_tdct = _read_tdct( ). + CLEAR ls_bcdata. + ls_bcdata-fnam = 'DIAPAR-DNAM'. + ls_bcdata-fval = ms_item-obj_name. + APPEND ls_bcdata TO lt_bcdata. - PERFORM fu_delete_dialog IN PROGRAM sapmsdia USING ls_tdct. + CLEAR ls_bcdata. + ls_bcdata-fnam = 'RS38L-PARM'. + ls_bcdata-fval = abap_true. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=DELF'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-program = 'SAPLSPO1'. + ls_bcdata-dynpro = '0100'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=YES'. + APPEND ls_bcdata TO lt_bcdata. + + ls_bcdata-program = 'SAPMSDIA'. + ls_bcdata-dynpro = '1010'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=BACK'. + APPEND ls_bcdata TO lt_bcdata. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + EXPORTING + tcode = 'SE35' + mode_val = 'E' + TABLES + using_tab = lt_bcdata + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SE35' ). + ENDIF. ENDMETHOD. From 55cd2a5f7658d082c287d7502751929cc16bd50c Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 7 Aug 2017 16:13:46 +0000 Subject: [PATCH 097/166] DIAL: tadir already fixed by suppress_corr_check --- src/zabapgit_object_dial.prog.abap | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/zabapgit_object_dial.prog.abap b/src/zabapgit_object_dial.prog.abap index 6b314fc79..1f9dd63f6 100644 --- a/src/zabapgit_object_dial.prog.abap +++ b/src/zabapgit_object_dial.prog.abap @@ -99,8 +99,6 @@ CLASS lcl_object_dial IMPLEMENTATION. " It seems that there's no API for diapar, therefore we manipulate it directly INSERT diapar FROM TABLE ls_dialog_module-dia_pars. - tadir_insert( iv_package ). - ENDMETHOD. METHOD lif_object~delete. From 9bd699ec9c5a36b6bc9ed61a2d5ed0f2bdb3d9f3 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 7 Aug 2017 18:15:12 +0200 Subject: [PATCH 098/166] docs: DIAL supported --- docs/ref-supported.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 3b4ec1ec5..766ceb2c6 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -16,7 +16,7 @@ CLAS | Class (ABAP Objects) | Yes CMOD | Customer enhancement projects | [#151](https://github.com/larshp/abapGit/issues/151) DCLS | ABAP Data Control Language Sources | Yes DDLS | Data Definition Language Source | Yes -DIAL | Dialog Module | [#879](https://github.com/larshp/abapGit/issues/879) +DIAL | Dialog Module | Yes DOCT | General Text | Yes DOCV | Documentation (Independent) | Yes DOMA | Domain | Yes From de9805209dfd766ab0270b08bace7fbcc3f6fb40 Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 7 Aug 2017 16:16:15 +0000 Subject: [PATCH 099/166] v1.39.0 --- src/zabapgit_definitions.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index d18b6f525..03c84cc73 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -7,7 +7,7 @@ TYPE-POOLS seop. INTERFACE lif_defs. CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.38.0'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.39.0'. "#EC NOTEXT TYPES: ty_type TYPE c LENGTH 6, ty_bitbyte TYPE c LENGTH 8, From c9b47f965432cb53918e10059c93a761db91938b Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 7 Aug 2017 18:17:20 +0200 Subject: [PATCH 100/166] v1.39.0 --- changelog.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.txt b/changelog.txt index 981a1de1b..b37360a53 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,10 @@ Legend + : added - : removed +2017-08-07 v1.39.0 +------------------ ++ DIAL supported + 2017-08-05 v1.38.0 ------------------ ! SICF serialization changed From ff2e48634d12bc39c9300ed5386a6423262399f2 Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 7 Aug 2017 16:39:29 +0000 Subject: [PATCH 101/166] fix XML file dump, #886 --- src/zabapgit_objects_impl.prog.abap | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index 2fba5ea1e..7f261aaef 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -699,13 +699,19 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. METHOD compare_remote_to_local. +* this method is used for comparing local with remote objects +* before pull, this is useful eg. when overwriting a TABL object. +* only the main XML file is used for comparison DATA: ls_remote_file TYPE lif_defs=>ty_file, lo_remote_version TYPE REF TO lcl_xml_input, + lv_count TYPE i, lo_comparison_result TYPE REF TO lif_comparison_result. - IF is_result-filename CS '.XML'. + FIND ALL OCCURRENCES OF '.' IN is_result-filename MATCH COUNT lv_count. + + IF is_result-filename CS '.XML' AND lv_count = 2. IF io_object->exists( ) = abap_false. RETURN. ENDIF. From 917c7b571e2ddfcc255a4f47c75936bc57775140 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 7 Aug 2017 18:44:33 +0200 Subject: [PATCH 102/166] v1.39.0 --- changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.txt b/changelog.txt index b37360a53..4e289fc00 100644 --- a/changelog.txt +++ b/changelog.txt @@ -11,6 +11,7 @@ Legend 2017-08-07 v1.39.0 ------------------ + DIAL supported +* fix XML dump 2017-08-05 v1.38.0 ------------------ From a5e50342e16f88974191b96030461288d0b95427 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 7 Aug 2017 19:36:45 +0000 Subject: [PATCH 103/166] First stept CMPT implementation --- src/zabapgit_object_cmpt.prog.abap | 135 ++++++++++++++++++++++ src/zabapgit_object_cmpt.prog.xml | 22 ++++ src/zabapgit_object_serializing.prog.abap | 1 + 3 files changed, 158 insertions(+) create mode 100644 src/zabapgit_object_cmpt.prog.abap create mode 100644 src/zabapgit_object_cmpt.prog.xml diff --git a/src/zabapgit_object_cmpt.prog.abap b/src/zabapgit_object_cmpt.prog.abap new file mode 100644 index 000000000..37083cfa9 --- /dev/null +++ b/src/zabapgit_object_cmpt.prog.abap @@ -0,0 +1,135 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_OBJECT_CMPT +*&---------------------------------------------------------------------* + +CLASS lcl_object_cmpt DEFINITION INHERITING FROM lcl_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. +ENDCLASS. + +CLASS lcl_object_cmpt IMPLEMENTATION. + + METHOD lif_object~has_changed_since. + + rv_changed = abap_true. + + ENDMETHOD. + + METHOD lif_object~changed_by. + + DATA(template) = CAST cl_cmp_template( cl_cmp_template=>s_create_from_db( i_name = |{ ms_item-obj_name }| + i_version = 'A' ) ). + + + rv_user = template->if_cmp_template_edit~get_change_user( ). + + ENDMETHOD. + + METHOD lif_object~get_metadata. + + rs_metadata = get_metadata( ). + rs_metadata-delete_tadir = abap_true. + + ENDMETHOD. + + METHOD lif_object~exists. + + DATA: name TYPE c LENGTH 30. + + name = ms_item-obj_name. + + rv_bool = cl_cmp_template=>s_template_exists( i_name = name + i_version = 'A' ). + + ENDMETHOD. + + METHOD lif_object~serialize. + + DATA(cmp_db) = cl_cmp_template=>s_get_db_access( ). + + DATA(template) = cmp_db->read_template( i_name = |{ ms_item-obj_name }| + i_version = 'A' ). + + io_xml->add( iv_name = 'CMPT' + ig_data = template ). + + ENDMETHOD. + + METHOD lif_object~deserialize. + + DATA: template TYPE if_cmp_template_db=>typ_template. + + io_xml->read( + EXPORTING + iv_name = 'CMPT' + CHANGING + cg_data = template ). + + DATA(cmp_db) = cl_cmp_template=>s_get_db_access( ). + + cmp_db->save_template( i_template_db = template + i_flg_header = abap_true + i_flg_lines = abap_true ). + + CALL FUNCTION 'RS_CORR_INSERT' + EXPORTING + object = ms_item-obj_name + object_class = ms_item-obj_type + mode = 'I' + global_lock = abap_true + devclass = iv_package + master_language = mv_language + EXCEPTIONS + cancelled = 1 + permission_failure = 2 + unknown_objectclass = 3 + OTHERS = 4. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from RS_CORR_INSERT, CMPT' ). + ENDIF. + + ENDMETHOD. + + METHOD lif_object~delete. + + DATA(cmp_db) = cl_cmp_template=>s_get_db_access( ). + + DATA(deleted) = cmp_db->delete_template( i_name = |{ ms_item-obj_name }| + i_version = 'A' + i_flg_header = abap_true + i_flg_lines = abap_true ). + + IF deleted = abap_false. + lcx_exception=>raise( |Error deleting CMPT { ms_item-obj_name }| ). + ENDIF. + + ENDMETHOD. + + + METHOD lif_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type + EXCEPTIONS + not_executed = 1 + invalid_object_type = 2 + OTHERS = 3. + + IF sy-subrc <> 0. + lcx_exception=>raise( |Error from RS_TOOL_ACCESS, CMPT| ). + ENDIF. + + ENDMETHOD. + + METHOD lif_object~compare_to_remote_version. + + CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zabapgit_object_cmpt.prog.xml b/src/zabapgit_object_cmpt.prog.xml new file mode 100644 index 000000000..fc9840ac2 --- /dev/null +++ b/src/zabapgit_object_cmpt.prog.xml @@ -0,0 +1,22 @@ + + + + + + ZABAPGIT_OBJECT_CMPT + A + X + I + E + X + + + + R + Include ZABAPGIT_OBJECT_CMPT + 28 + + + + + diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap index a1d4a6ac0..faf27989e 100644 --- a/src/zabapgit_object_serializing.prog.abap +++ b/src/zabapgit_object_serializing.prog.abap @@ -8,6 +8,7 @@ INCLUDE zabapgit_object_acid. INCLUDE zabapgit_object_auth. INCLUDE zabapgit_object_oo_functions. INCLUDE zabapgit_object_clas. +INCLUDE zabapgit_object_cmpt. INCLUDE zabapgit_object_dcls. INCLUDE zabapgit_object_ddls. INCLUDE zabapgit_object_dial. From 5a108dd275cb736c5d978b520c2ec558ff740507 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Mon, 7 Aug 2017 20:04:06 +0000 Subject: [PATCH 104/166] downport CMPT --- src/zabapgit_object_cmpt.prog.abap | 130 +++++++++++++++++++++++------ 1 file changed, 105 insertions(+), 25 deletions(-) diff --git a/src/zabapgit_object_cmpt.prog.abap b/src/zabapgit_object_cmpt.prog.abap index 37083cfa9..8becf90a4 100644 --- a/src/zabapgit_object_cmpt.prog.abap +++ b/src/zabapgit_object_cmpt.prog.abap @@ -5,11 +5,36 @@ CLASS lcl_object_cmpt DEFINITION INHERITING FROM lcl_objects_super FINAL. PUBLIC SECTION. + METHODS: + constructor + IMPORTING + is_item TYPE lif_defs=>ty_item + iv_language TYPE spras. + INTERFACES lif_object. + + PRIVATE SECTION. + DATA: mo_cmp_db TYPE REF TO object. + ENDCLASS. CLASS lcl_object_cmpt IMPLEMENTATION. + METHOD constructor. + + super->constructor( is_item = is_item + iv_language = iv_language ). + + TRY. + CALL METHOD ('CL_CMP_TEMPLATE')=>('S_GET_DB_ACCESS') + RECEIVING + r_ref_db_access = mo_cmp_db. + + CATCH cx_root. + ENDTRY. + + ENDMETHOD. + METHOD lif_object~has_changed_since. rv_changed = abap_true. @@ -18,11 +43,23 @@ CLASS lcl_object_cmpt IMPLEMENTATION. METHOD lif_object~changed_by. - DATA(template) = CAST cl_cmp_template( cl_cmp_template=>s_create_from_db( i_name = |{ ms_item-obj_name }| - i_version = 'A' ) ). + DATA: mi_cmp_template TYPE REF TO object. + TRY. + CALL METHOD ('CL_CMP_TEMPLATE')=>('S_CREATE_FROM_DB') + EXPORTING + i_name = |{ ms_item-obj_name }| + i_version = 'A' + RECEIVING + r_ref_template = mi_cmp_template. - rv_user = template->if_cmp_template_edit~get_change_user( ). + CALL METHOD mi_cmp_template->('IF_CMP_TEMPLATE_EDIT~GET_CHANGE_USER') + RECEIVING + r_user = rv_user. + + CATCH cx_root. + lcx_exception=>raise( 'CMPT not supported' ). + ENDTRY. ENDMETHOD. @@ -39,38 +76,72 @@ CLASS lcl_object_cmpt IMPLEMENTATION. name = ms_item-obj_name. - rv_bool = cl_cmp_template=>s_template_exists( i_name = name - i_version = 'A' ). + TRY. + CALL METHOD ('CL_CMP_TEMPLATE')=>('S_TEMPLATE_EXISTS') + EXPORTING + i_name = name + i_version = 'A' + RECEIVING + r_flg_exists = rv_bool. + + CATCH cx_root. + lcx_exception=>raise( 'CMPT not supported' ). + ENDTRY. ENDMETHOD. METHOD lif_object~serialize. - DATA(cmp_db) = cl_cmp_template=>s_get_db_access( ). + DATA: lr_template TYPE REF TO data. + FIELD-SYMBOLS: