From fe4468867985f88f101648e49ff3040e1d147b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=97=D0=B0=D0=B7=D1=83=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87=20=28=D0=97?= =?UTF-8?q?=D0=9A-0001393=29?= Date: Tue, 26 Nov 2024 06:47:29 +0300 Subject: [PATCH] =?UTF-8?q?ORAIS-1429:=20=D0=97=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=20=D0=BF=D1=80=D0=B5=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- COPYRIGHT | 4 +- README.md | 4 + docs/img/GitExtensions_Interface.png | Bin 0 -> 5766 bytes docs/img/GitExtensions_Settings.png | Bin 0 -> 48332 bytes docs/КомандаВыполнитьСценарии.md | 48 +++ docs/ОтключениеРазрешенияИзменятьФорму.md | 4 +- src/Классы/ДанныеФормы.os | 4 +- src/Классы/КомандаВыполнитьСценарии.os | 296 +++++++++++++----- src/Классы/КомандаКонфигуратион.os | 28 +- src/Классы/КомандаПрекоммит.os | 2 +- .../НастройкаСценарияСортировкиСостава.os | 2 +- src/Классы/НастройкиСортировкиСостава.os | 4 +- src/Модули/ВариантИзмененийФайловGit.os | 12 +- src/Модули/КонфигурацияПоставщика.os | 2 +- src/Модули/МенеджерНастроек.os | 2 +- src/Модули/СценарииОбработки.os | 2 +- src/Модули/ТипыОбъектовДляСортировки.os | 2 +- src/Модули/ФайловыеОперации.os | 21 +- src/СценарииОбработки/ВставкаКопирайтов.os | 6 +- .../ДобавлениеПробеловПередКлючевымиСловами.os | 2 +- .../ЗапретИспользованияПерейти.os | 6 +- .../ОтключениеПолнотекстовогоПоиска.os | 6 +- .../ОтключениеРазрешенияИзменятьФорму.os | 10 +- .../ПроверкаДублейПроцедурИФункций.os | 2 +- .../ПроверкаКорректностиИнструкцийПрепроцессора.os | 12 +- .../ПроверкаКорректностиОбластей.os | 2 +- .../ПроверкаНецензурныхСлов.os | 7 +- .../РазборОбычныхФормНаИсходники.os | 2 +- src/СценарииОбработки/СортировкаПравРолей.os | 2 +- src/СценарииОбработки/СортировкаСостава.os | 58 ++-- .../УдалениеДублейМетаданных.os | 4 +- .../УдалениеЛишнихКонцевыхПробелов.os | 2 +- 32 files changed, 375 insertions(+), 183 deletions(-) create mode 100644 docs/img/GitExtensions_Interface.png create mode 100644 docs/img/GitExtensions_Settings.png create mode 100644 docs/КомандаВыполнитьСценарии.md diff --git a/COPYRIGHT b/COPYRIGHT index e726d60..e04b1e7 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,6 +1,6 @@ //©///////////////////////////////////////////////////////////////////////////©// // -// Copyright 2014-2023 BIA-Technologies Limited Liability Company +// Copyright 2014-2024 BIA-Technologies Limited Liability Company // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,4 +14,4 @@ // See the License for the specific language governing permissions and // limitations under the License. // -//©///////////////////////////////////////////////////////////////////////////©// +//©///////////////////////////////////////////////////////////////////////////©// \ No newline at end of file diff --git a/README.md b/README.md index 7b7f200..a25a04e 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,10 @@ precommit4onec может читать настройки своей работ } ``` +## Принудительное выполнение для группы файлов + +Команда `exec-rules` предназначена для запуска выбранных сценариев в указанном репозитории. [См. подробнее](/docs/КомандаВыполнитьСценарии.md) + ## Расширение функциональности Для создания нового сценария обработки файлов необходимо воспользоваться шаблоном, находящимся в каталоге `СценарииОбработки` скрипта. diff --git a/docs/img/GitExtensions_Interface.png b/docs/img/GitExtensions_Interface.png new file mode 100644 index 0000000000000000000000000000000000000000..a101ea85b64e4fecad81636382ac89e1140748c9 GIT binary patch literal 5766 zcmbVQ_dlCm*pHgEsZyhMl~yS+S|hP)*WT0~RTQ;pj2cC0P_u~Hnw47d*sWcob_KOp z1x<`Z#Cqd-KJWVnyg%III-hgSeVyz6UhA7+pr=7c%|Q(S0O+(d)rOJU-!|p^aB9syRR;ie(!Q;0DzTK zOHJ7%*mf_U#^UDmTz?1*u3@OEtfZ83`jlK?lJqV%+jZj(SS4wU3LgB!NRvt0*N-{< ztI3#Cj!=cOrEOh9Zs_n)35zk+(+9xAH%*T$tv++-qQUjQV2WYroOa6D(r>3>i*8_# z_MQB__m(v$d(zR5PngJ*8OfBTI5Z(tZ+NNRJXcF05M@TP@pxV=-_=ktlQK&6YDi7s z&D2}s6yA7svI>T)RgB40Mm$%mcsZC#LH}*UPu!@O4=5#_tm1~@u~c=ID&jo*XYLo> zuFVv=0GpZg!7`X?f%p+MRSI+ej=#(@?if_}rTq2WDLZV!_P$yP-PNAMyx8&U6$~Vr z5R}s+TgVxYE3QKhXQ$< zjMfnAtFP<%x|&MgYLk)#J_wN$mXzIUF25;LEmnA^5dOqWy#+)h6Y!^}O&&91Qc^5% z5)u*z2Z!FBCirh(``LM(fWN=l$p?VfNJ+c9yJrnqg=g*<@!Sei~ zieYlc?B7b<^quh*w;9u=9t(yE*oN52mbAXj(od?g&A78`#m5zDm-OuZ*b`>ew(^y0 z3rsQjZ@#KCn(<`=_9X;#ql3#f%k>yMTKa=sgb)o>f+t@U#YVFE*4KF}C4oBw;d4#i z5d~x%3N8$Y9%1vEP_hcBp6Jxwd-v`M3ic3H8yOjyo^JdU)7sh!g)-Err>3TkkB{G$ z4_u#a89zB5SRtOaM+GA1|A&!_E9vn4<y##&U{BbAm^Nh2*iX~LQhW*GM}P+Wg2I{b?xgOmyl9$tiqRBtCL0OHQO7^%ofR= zoe{yokJO8nMV*q*5Wi5QGfZMxG?ynS{Tr{GMPG2}PNfohmTrTKyYWZ#YZKkDTNB&8 zK_5k*PrUNf$+|8!LOWs)hAApq`g$!d0w49d|50m0H5CxSevsf>e7q~nj990(cD>JU zt{ZOo=3276onqh3teSJp#8r1+1xrf*Tm-%ZyVkM~yXU*TGqYJ1|D}{4m&#gptR&7? zAnVCnIhqmMH7nuR{rZ#==j1!T^NVaCG}M{?6_c1Z{&1r8RbkjmyNhP{L55bQh6GqQ z8km!FDSfL&UCsIE@A(R5#h@UUqI*T_1KwxvTUI?DA1vyi7<%+g&eSx3B8s9#(~*k2 zt%0KS7IHYXE2XFYJpk?LhWPV#O5^S?RJ6{|pZW5#-ivL4dvhB@cH+XqdEm>8jiDu* z&WmoZ`3rG5xjAK&lT2z)=kDi?E(c)Lzw2&rad|p%s6BbI@P+L%;(OL+CwJYX!Of_Jaf3*?JBtl0YmX+1z#kswM zN59=}D5zEJ60gn{-L>HN9AK3hHtDOFWe|86b1i+J)VT-y#J3kEx3zj+?Sg+e z+}@*aD(K#6a~)h?f0oc^ta!Y+f44Vo4hNkG$4f}}gof%q^>4O3$0gTSrTY?XZyI*+ z-aFToNqFW>~7tPRj3n6qune9ctbS+;lK+bnn z&2n}T=%&ZU##WH2w1%v8`u880&>?Dv<%L+vCj5VKz3CPUjwG6r6-Dav<8jErdK4)o z!h5O1Wk_QvtF!gR^yUNW4rJ>wvT4aShJb1LSXczIDzoOU+)Mut`G9h0vO55~5+FxJ zzS47Kjeh_8+wwtw&+uzdFxb!cZ{BoVo;fWAX_Ycb)s&>?MoVcCXeYMbFT@1iR0gsU z=Y}#F+=d2xQq7gQFD>1Mr;zyFQ{)JsNFY9!;S$R)|S8Z zsFg0@u&TE)AxytZxGddLulrRcoHt( z&iT4Z9!VtEKb$m%B6QR1LXKo5!BEy&b47HW=8 zPWSH(4h=DIfiKQ~d;s&0DY0qM)|#r*T*YUx>l+o-dl^5tG&(qmfx3E{(ym`oL4g>p ziLl3Rmsy)vTQs?j^v@&qE>TrH80lxDLB1ZEkiR~}sn3Fff~MUWnV6VZSbBE+dGo26 zaM?iDabtZ&?9t??o_0a2>r#dE#@5nY(7m9aiFb4|vD=fB(yt^uEDCM1q^7nW6un@D zqMH0Gp>*BjiK>92XBz&#JywfNxl4Y96m&N}9*O^c$f1cX_rH z+-CS{8Vz~I!zcvh?&!VJ{t>_df>O>6&}#Mw!zT+pRm>gwCvxv>dqOF{&;1S~BYC!R zIAhSqV2{Lq6x*Yy{Q@rG)Y{Qw9u*K-%uAb7e>!eHMhAB^q6KD1?Cq3SLEG+@k_>Nl zg7wY=E>(;7v%N2=rrD|dnFci?UL<1E@^gZZ8-cx@mzc^0CHBM<2kPwO_1C;#?Q!*T zk3)LSkDa9WO02(kupk+VWpL3tCSeKWG@CpM7R^2@Z+xyxjXg!kA%c#N5jkU;@;bG{z`OUCDIeG>FKR9$D(^5`t^II&3S4iT73@Zpk`&f;)}tK z^?Im83BL9i7i~9amgHv+r?~d{V3>x{Z_~6n`0z)A=r`YkZ+>uO`I&a`*{75cKXK#u zs~_BCEBr=2r89wUv{}}#Lt{1FwcSWwNJxFFb6%$5%cvq^%5Cj4L;Cl6vl#H>+u;J# z2CIj9-K_hXuVHs226v<)C(ll{iQI1sY*p=W^uQY4>s!RiYTRJh%hjTd-e^%ik0Y|k6>>A!!KS$K3CYB z2Y2N-P@P<4Wu7AyEr03Yrg~Z;1c)eKX;Yk5*OtXSxEqRdwbj9v~@a#MP~6Ar>%UdR!d#jVRbre>fN+1$Vetl?`#w7`h+}2 zq*Q`V6XIW72`YS=EAz#wF|CZmHTDJj*K7)f`+P)SmWf?mU9GEk>$D1ewaw(PZMf1{ z(k01y8u3xq+tA92W1j2Ut}v(Yw8q7P*vjhbm0>b&wypZoK6HpgJL7yJr){xU_UT&_ zh4997miGQfgDTbLk5YE^Kb_I_!~1Br-o|@W$p8 zSuG=fKfEW`I3VvHS`QN$Z@zQfet~#~B{|sMf=FY$tX~%!v~5XuyW=IfuLDyY^f?aX z=*;eD*v)1~xSV9$vC*w`IFYfFT^TkUpgP4No%3*X&ARnOyL9@OT_IP7^2E_wj-aF- zxNqP6Vs~rJn}+^kZG`!8e<@K!#LMukfwdk@=aj8}3x`wZ3SuFGX0?+$s#{RXsU+xz z?!`}p(dNE%Z4Y6J7?~$WMDP5b(K*{V>@T|{-3z(dT?aNZBGoNgXbtjSXt@c` z$XJSbdwBQbxRN<{ox~)vPZFJNkf#mQG0PJ%v_ak(37tZkGloFk^ie2>|>jm!tF3kwSn2qeUeuC?A!6|z1#k^=li z*O*gyK%Yr0qSbUDfZhJyUh>JpfSq3t?O~>>Fp4(sn0y*WM&5AvyQHMyp&@YvjPLY)O$=-Dno?;>9ZiOVemnGElKURH-YN$|Nm|d;bGEl82u4 zHo?UI7K49zA<-VojU|yWBe_#dP;h**1qYw-K7(iQlz-EfQr7 zBH(`w<%NfeY z(-Z>?-q|sTmx~p6$Qr~shG$>9jQloiYFc-!`=I$zs6|1LEvKBjE}Zgo3Fsa1f`Ez| z4s%6wFf&#+lObVF7VBayY{%(=CfT(Ch&~GLo%wQfkx9oLaw}F?5>p;i>z$U+^D{<+Fa>cX%urlGY@1iH)VnJb@;?MDj(h++ecDYv#tMo_BUdT*rflnQGOM5%c~u1yA*>aS1P5pYm^UaaUnON{u;{a{X{LGxiz8B(BoRp z&ZiR-kohLGTOir719 zKDf%mHcPpXg9Z?UfNY<>)A_{+BDYXrVITit*KH*OZ4`bY#0`Hg5UrrTq5Y)XDpoQ9 z(YyDcRkkgg!m=$Pz&ax8)s!d~927aLZ@;wur;CAK{pm5?(H8-%uil_X{slcv1D0r6 zGzM81Z5(#q_BWPBr#~-bUjp|P$nl3ifsdu!+xXp#;2J$_0vK%6{0sSVrZ5srsC=!h zdZJcu@#Dh3mrY*OZ4=8X91(Q;RredOOA|CCrB{3-I>on;;4CC{IU4nNt790!DXc01 z9;QZ);=3d_70Ymkb}yGY1G=PtgwxK$%G;0eczk+hruW>@_ErIUXehTS2(3)^pAMJ_ z4&DNh7}P9VzB<Z>u^K zCgrpIP3&0<=EZH{X-dBN(PTgJPOjTg=DCZ}294B*rO$zVmi;_Z>LjDWNpD@&Ni)2Q z=W3LdwTlk)WuN4iGen;I=hdyFdAxCn*h+bWRzPA zzpZ|f8rzT1Wku#yRn8aI@~cgXxz-@scM%AUlOyO8Od^M)qM}h~vuE&w2Trqw6R6^Q8`mkB?8`5u8I^O^wJyDCE?KchxKz`^g3pIjU!t zLD_t@2=c*zA65{?x^pQ{wDMFDK`Hci+QMr&Jf0jMa)kA{v^Dl%0ZRwhl+{`~082e`^>%lL(Ri_j@cXZi)E}hXZ!qFh^-qLGSzAM5AuT z#>LguMMg#z7VsrvO~i?PQ1qBsDJbX>Vp`+u64Clk zaA@d3IGw}RwQufoB1FvVzeXJU9k%vDT|hA$QoM=)T=)CBs7!)XT6qQ`a{eGFtz3MJ z2(hbNf*?F%G%Ap1pGO(%Ae+l+G$D8f6+iPeVVx<6gUQ%8x&I=a2EY>1&#{jJ- LdTKQ)_HX_N$uVrI literal 0 HcmV?d00001 diff --git a/docs/img/GitExtensions_Settings.png b/docs/img/GitExtensions_Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..8747565b46a67a9e61bd9950f4b83c80aa4ce383 GIT binary patch literal 48332 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
    r^klOBG_JQyA0?u+` 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 -rules <Применяемые сценарии> -cfg-file <Файл настроек> <КаталогРепозитория> <Коммит1> <Коммит2> +``` + +Описание параметров: +- КаталогРепозитория - обязательный параметр, должен содержать абсолютный или относительный путь к каталогу репозитория, для файлов которого будут выполняться сценарии прекоммита; +- Коммит1, Коммит2 - необязательные параметры, если указаны, сценарии будут выполнены не для всех исходных файлов, а только для тех, которые были изменены между двумя коммитами. В качестве значения следует передавать хэш коммита. Если указано два хэша, будут составлен список измененных файлов между ними, если один, то он должен иметь двух родителей (как в случае коммита при merge-реквесте), иначе будет вызвано исключение; +- Каталоги исходных файлов - необязательный параметр, поддерживает перечисление через запятую относительных путей к каталогам внутри каталога репозитория, в которых расположены исходные файлы, для которых будут выполнять сценарии прекоммита. Значение по-умолчанию - "src"; +- Применяемые сценарии - необязательный параметр, содержащий список сценариев, перечисленных через запятую, выполняемый для обрабатываемых файлов. Если не указан, выполняются все сценарии прекоммита; +- Файл настроек - необязательный параметр, путь к файлу настроек прекоммита. Если не указан, используется файл `v8config.json` репозитория или глобальные настройки, если файл в репозитории отсутствует. + +### Примеры + +1. Команда: + + ```shell + precommit4onec exec-rules "C:\МойРепозиторий" -source-dir "ПапкаИсходныхФайловSrc" -rules "ВставкаКопирайтов,ПроверкаНецензурныхСлов" + ``` + + Для всех файлов в каталоге `C:\МойРепозиторий\ПапкаИсходныхФайловSrc` будут выполнены сценарии: `ВставкаКопирайтов`, `ПроверкаНецензурныхСлов`. + +2. Команда: + + ```shell + precommit4onec exec-rules "C:\МойРепозиторий" 454474a414494f4b77c484939173e1d44678c96a 937f5cf1ebdda2eaadb1aa169cf066583f2763db + ``` + + Для файлов в каталоге `C:\МойРепозиторий\src`, измененных между указанными коммитами, будут выполнены все сценарии прекоммита. Если файлы находятся вне каталога `src`, они будут проигнорированы. + +### Вызов команды в Git Extensions + +Возможности [Git Extension](https://gitextensions.github.io/) позволяют подключать пользовательские скрипты для работы с данными. Например, следующая настройка в разделе `Git Extensions\Scripts`: + +![Settings](img/GitExtensions_Settings.png) + +позволяет добавить на командную панель кнопку запуска прекоммита для выбранных в дереве коммитов: + +![Button](img/GitExtensions_Interface.png) + +В настройках указывается: +- Command - путь к скрипту запуска прекоммита; +- Arguments - параметры запуска по шаблону, описанному выше. Вместо `{sHashes}` Git Extensions подставит разделенные пробелом хэши выделенных в дереве коммитов. diff --git a/docs/ОтключениеРазрешенияИзменятьФорму.md b/docs/ОтключениеРазрешенияИзменятьФорму.md index 1983daf..1fe5c3b 100644 --- a/docs/ОтключениеРазрешенияИзменятьФорму.md +++ b/docs/ОтключениеРазрешенияИзменятьФорму.md @@ -6,9 +6,9 @@ Cнимает флаг `РазрешеноИзменятьФорму` в опи При выполнении команды `exec-rules` не выполняется по умолчанию. Для выполнения этого сценария необходимо явно указать его при запуске команды в параметре `rules` ```bash -precommit4onec exec-rules C:\МойЛучшийРепозиторий -source-dir МойЛучшийИсходныйКод\НоваяПапка4 -rules ОтключениеРазрешенияИзменятьФорму +precommit4onec exec-rules C:\МойЛучшийРепозиторий -source-dir МойЛучшийИсходныйКод\ПапкаИсходныхФайловSrc -rules ОтключениеРазрешенияИзменятьФорму ``` ```bash -precommit4onec exec-rules C:\МойЛучшийРепозиторий -source-dir МойЛучшийИсходныйКод\НоваяПапка4 -rules "ОтключениеРазрешенияИзменятьФорму,ПроверкаНецензурныхСлов" +precommit4onec exec-rules C:\МойЛучшийРепозиторий -source-dir МойЛучшийИсходныйКод\ПапкаИсходныхФайловSrc -rules "ОтключениеРазрешенияИзменятьФорму,ПроверкаНецензурныхСлов" ``` diff --git a/src/Классы/ДанныеФормы.os b/src/Классы/ДанныеФормы.os index 8660804..2e76e6f 100644 --- a/src/Классы/ДанныеФормы.os +++ b/src/Классы/ДанныеФормы.os @@ -367,10 +367,10 @@ Если СвободныеИдентификаторы.Количество() > 0 Тогда СвободныйИдентификатор = СвободныеИдентификаторы[0]; СвободныеИдентификаторы.Удалить(0); - Возврат СвободныйИдентификатор; + Возврат СвободныйИдентификатор; Иначе ПоследнийИдентификатор = ПоследнийИдентификатор + 1; - Возврат ПоследнийИдентификатор; + Возврат ПоследнийИдентификатор; КонецЕсли; КонецФункции diff --git a/src/Классы/КомандаВыполнитьСценарии.os b/src/Классы/КомандаВыполнитьСценарии.os index ef9ef09..8c32790 100644 --- a/src/Классы/КомандаВыполнитьСценарии.os +++ b/src/Классы/КомандаВыполнитьСценарии.os @@ -18,8 +18,14 @@ // Добавление параметров команды Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРепозитория", "Каталог анализируемого репозитория"); + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "Коммит1", + "Идентификатор коммита. Если указан, анализируются только файлы, измененные коммитом. + | Если это merge-request, то изменения между двумя родительскими коммитами."); + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "Коммит2", + "Идентификатор коммита. Если указан, то анализируются только файлы, которые отличаются + | между двумя указанными коммитами."); Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir", - "Каталог расположения исходных файлов относительно корня репозитория. + "Каталог расположения исходных файлов относительно корня репозитория. | Если сценариев несколько, указываются в кавычках через , . По умолчанию "); Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-rules", "Перечень правил для применения. Если сценариев несколько, указываются в кавычках через ,"); @@ -35,67 +41,21 @@ // Приложение - Модуль - Модуль менеджера приложения // Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт - - Лог = Приложение.ПолучитьЛог(); - НастройкиИБ = Приложение.ПолучитьНастройкиИБ(); - - КаталогРепозитория = ПараметрыКоманды["КаталогРепозитория"]; - ФайлКаталогРепозитория = Новый Файл(КаталогРепозитория); - КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя; - Если НЕ ФайлКаталогРепозитория.Существует() ИЛИ ФайлКаталогРепозитория.ЭтоФайл() Тогда - - Лог.Ошибка("Каталог репозитория '%1' не существует или это файл", КаталогРепозитория); - Возврат Приложение.РезультатыКоманд().НеверныеПараметры; - - КонецЕсли; - - АдресПоискаКонфигурационногоФайла = ПараметрыКоманды["-cfg-file"]; - Если Не ЗначениеЗаполнено(АдресПоискаКонфигурационногоФайла) Тогда - АдресПоискаКонфигурационногоФайла = КаталогРепозитория; - КонецЕсли; - - ПараметрКаталогиИсходныхФайлов = ПараметрыКоманды["-source-dir"]; - Если Не ЗначениеЗаполнено(ПараметрКаталогиИсходныхФайлов) Тогда - ПараметрКаталогиИсходныхФайлов = "src"; - КонецЕсли; - КаталогиИсходныхФайлов = СтрРазделить(ПараметрКаталогиИсходныхФайлов, ",", Ложь); - - ОбрабатываемыеФайлы = Новый Массив(); - КаталогиИсходныхПоФайлам = Новый Соответствие(); - Для Каждого КаталогИсходныхФайлов Из КаталогиИсходныхФайлов Цикл - - ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, СокрЛП(КаталогИсходныхФайлов)); - ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов); - ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя; - Если Не ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда - - Лог.Ошибка("Каталога <%1> не существует", ТекущийКаталогИсходныхФайлов); - - КонецЕсли; - - ОбрабатываемыеФайлыКаталога = НайтиФайлы(ТекущийКаталогИсходныхФайлов, ПолучитьМаскуВсеФайлы(), Истина); - Для Каждого ОбрабатываемыйФайлКаталога Из ОбрабатываемыеФайлыКаталога Цикл - - ОбрабатываемыеФайлы.Добавить(ОбрабатываемыйФайлКаталога); - КаталогиИсходныхПоФайлам.Вставить(ОбрабатываемыйФайлКаталога.ПолноеИмя, ТекущийКаталогИсходныхФайлов); - - КонецЦикла; - - КонецЦикла; - - ИменаЗагружаемыхСценариев = Неопределено; - ПараметрИменаЗагружаемыхСценариев = ПараметрыКоманды["-rules"]; - ЗатребованныеСценарии = Новый Массив; - - Если ЗначениеЗаполнено(ПараметрИменаЗагружаемыхСценариев) Тогда - ПараметрИменаЗагружаемыхСценариев = СтрЗаменить(ПараметрИменаЗагружаемыхСценариев, " ", ""); - ИменаЗагружаемыхСценариев = СтрРазделить(ПараметрИменаЗагружаемыхСценариев, ",", Ложь); - - // Остаются только имена, чтобы сравнивать в сценариях по имени - ЗатребованныеСценарии = СтрРазделить(СтрЗаменить(ПараметрИменаЗагружаемыхСценариев, ".os", ""), ",", Ложь); + Параметры = ПараметрыВыполнения(ПараметрыКоманды, Приложение); + Если Параметры = Неопределено Тогда + Возврат Приложение.РезультатыКоманд().НеверныеПараметры; КонецЕсли; - + + Лог = Параметры.Лог; + НастройкиИБ = Параметры.НастройкиИБ; + КаталогРепозитория = Параметры.КаталогРепозитория; + АдресПоискаКонфигурационногоФайла = Параметры.КаталогКонфигурационногоФайла; + ИменаЗагружаемыхСценариев = Параметры.Сценарии; + ЗатребованныеСценарии = Параметры.ИменаСценариев; + ОбрабатываемыеФайлы = Параметры.ОбрабатываемыеФайлы; + КаталогиИсходныхПоФайлам = Параметры.КаталогиФайлов; + УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(АдресПоискаКонфигурационногоФайла); НаборНастроек = СценарииОбработки.ПолучитьСценарииСПараметрамиВыполнения(КаталогРепозитория, ИменаЗагружаемыхСценариев); КритичныеОшибки = Новый Массив; @@ -106,9 +66,7 @@ Ит = 0; Пока Ит < ОбрабатываемыеФайлы.Количество() Цикл - АнализируемыйФайл = ОбрабатываемыеФайлы[Ит]; - Если АнализируемыйФайл.ЭтоКаталог() Тогда Ит = Ит + 1; Продолжить; @@ -118,15 +76,10 @@ ИмяФайла = ФайловыеОперации.ПолучитьНормализованныйОтносительныйПуть(КаталогРепозитория, СтрЗаменить(АнализируемыйФайл.ПолноеИмя, КаталогРепозитория, "")); - ИмяПроекта = МенеджерНастроек.ИмяПроектаДляФайла(ИмяФайла); - НастройкаОбработки = НаборНастроек[ИмяПроекта]; - Если НЕ ЗначениеЗаполнено(НастройкаОбработки) Тогда - ВызватьИсключение СтрШаблон("Не удалось получить настройки для %1", ИмяФайла); - КонецЕсли; ПараметрыОбработки.Настройки = НастройкаОбработки.НастройкиСценариев.Получить("НастройкиСценариев"); @@ -135,7 +88,6 @@ ПараметрыОбработки.ЗатребованныеСценарии = ЗатребованныеСценарии; Для Каждого СценарийОбработки Из НастройкаОбработки.СценарииОбработки Цикл - Попытка ФайлОбработан = СценарийОбработки.ОбработатьФайл(АнализируемыйФайл, ПараметрыОбработки.ТекущийКаталогИсходныхФайлов, @@ -146,43 +98,225 @@ КонецЕсли; Для Каждого ФайлДляДопОбработки Из ПараметрыОбработки.ФайлыДляПостОбработки Цикл - НовыйОбрабатываемыйФайл = ФайловыеОперации.НовыйФайл(ФайлДляДопОбработки); ОбрабатываемыеФайлы.Добавить(НовыйОбрабатываемыйФайл); КаталогиИсходныхПоФайлам.Вставить(НовыйОбрабатываемыйФайл.ПолноеИмя, ПараметрыОбработки.ТекущийКаталогИсходныхФайлов); - КонецЦикла; ПараметрыОбработки.ФайлыДляПостОбработки.Очистить(); - Исключение - Ошибка = ОписаниеОшибки(); КритичныеОшибки.Добавить(Ошибка); Лог.Информация("Критичная ошибка: %1", Ошибка); - КонецПопытки; - КонецЦикла; - + Ит = Ит + 1; - КонецЦикла; // В отличие от прекоммита, здесь лучше вывести все криты в конце одним блоком еще раз. Если КритичныеОшибки.Количество() Тогда - Лог.Ошибка("В результате выполнения возникли исключения:"); - Для Каждого ОписаниеОшибки Из КритичныеОшибки Цикл - Лог.Ошибка(ОписаниеОшибки); - КонецЦикла; - КонецЕсли; // При успешном выполнении возвращает код успеха Возврат Приложение.РезультатыКоманд().Успех; КонецФункции // ВыполнитьКоманду + +Функция РепозиторийGit(КаталогРепозитория = "") + Если РепозиторийGit = Неопределено Тогда + РепозиторийGit = Новый ГитРепозиторий; + КонецЕсли; + + Если НЕ ПустаяСтрока(КаталогРепозитория) И РепозиторийGit.ПолучитьРабочийКаталог() <> КаталогРепозитория Тогда + РепозиторийGit.УстановитьРабочийКаталог(КаталогРепозитория); + КонецЕсли; + + Возврат РепозиторийGit; +КонецФункции + +Функция ПараметрыВыполнения(ПараметрыКоманды, Приложение) + Лог = Приложение.ПолучитьЛог(); + НастройкиИБ = Приложение.ПолучитьНастройкиИБ(); + КаталогРепозитория = ЗначениеПараметра(ПараметрыКоманды, "КаталогРепозитория", ""); + Если НЕ ЭтоСуществующийКаталог(КаталогРепозитория) Тогда + Возврат Неопределено; + КонецЕсли; + + Коммиты = МассивКоммитов(ПараметрыКоманды, КаталогРепозитория); + КаталогКонфигурационногоФайла = ЗначениеПараметра(ПараметрыКоманды, "-cfg-file", КаталогРепозитория); + ПараметрКаталогиИсходныхФайлов = ЗначениеПараметра(ПараметрыКоманды, "-source-dir", "src"); + КаталогиИсходныхФайлов = СтрРазделить(ПараметрКаталогиИсходныхФайлов, ",", Ложь); + + ОбрабатываемыеОбъекты = ОбрабатываемыеОбъекты(КаталогРепозитория, КаталогиИсходныхФайлов, Коммиты); + + Сценарии = Неопределено; + ИменаСценариев = Новый Массив; + ПараметрИменаЗагружаемыхСценариев = ЗначениеПараметра(ПараметрыКоманды, "-rules"); + Если ЗначениеЗаполнено(ПараметрИменаЗагружаемыхСценариев) Тогда + ПараметрИменаЗагружаемыхСценариев = СтрЗаменить(ПараметрИменаЗагружаемыхСценариев, " ", ""); + Сценарии = СтрРазделить(ПараметрИменаЗагружаемыхСценариев, ",", Ложь); + ИменаСценариев = СтрРазделить(СтрЗаменить(ПараметрИменаЗагружаемыхСценариев, ".os", ""), ",", Ложь); + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("Лог", Лог); + ПараметрыВыполнения.Вставить("НастройкиИБ", НастройкиИБ); + ПараметрыВыполнения.Вставить("КаталогРепозитория", КаталогРепозитория); + ПараметрыВыполнения.Вставить("КаталогКонфигурационногоФайла", КаталогКонфигурационногоФайла); + ПараметрыВыполнения.Вставить("Сценарии", Сценарии); + ПараметрыВыполнения.Вставить("ИменаСценариев", ИменаСценариев); + ПараметрыВыполнения.Вставить("ОбрабатываемыеФайлы", ОбрабатываемыеОбъекты.Файлы); + ПараметрыВыполнения.Вставить("КаталогиФайлов", ОбрабатываемыеОбъекты.Каталоги); + + Возврат ПараметрыВыполнения; +КонецФункции + +Функция ЗначениеПараметра(НаборПараметров, ИмяПараметра, ЗначениеПоУмолчанию = Неопределено) + Значение = НаборПараметров[ИмяПараметра]; + Возврат ?(ЗначениеЗаполнено(Значение), Значение, ЗначениеПоУмолчанию); +КонецФункции + +Функция ОбрабатываемыеОбъекты(КаталогРепозитория, КаталогиИсходныхФайлов, Коммиты) + ОбрабатываемыеФайлы = Новый Массив(); + КаталогиФайлов = Новый Соответствие(); + + Если Коммиты.Количество() > 0 Тогда + Изменения = СписокИзмененийМеждуКоммитами(Коммиты, КаталогРепозитория); + Для Каждого ИмяФайла Из Изменения Цикл + Для Каждого КаталогИсходныхФайлов Из КаталогиИсходныхФайлов Цикл + ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, СокрЛП(КаталогИсходныхФайлов)); + ФайлПодлежитОбработке = ЭтоСуществующийКаталог(ТекущийКаталогИсходныхФайлов) + И ФайловыеОперации.ФайлНаходитсяВКаталоге(ИмяФайла, ТекущийКаталогИсходныхФайлов); + + Если ФайлПодлежитОбработке Тогда + ОбрабатываемыйФайл = ФайловыеОперации.НовыйФайл(ИмяФайла); + ОбрабатываемыеФайлы.Добавить(ОбрабатываемыйФайл); + КаталогиФайлов.Вставить(ОбрабатываемыйФайл.ПолноеИмя, ТекущийКаталогИсходныхФайлов); + + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + Иначе + Для Каждого КаталогИсходныхФайлов Из КаталогиИсходныхФайлов Цикл + ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, СокрЛП(КаталогИсходныхФайлов)); + Если НЕ ЭтоСуществующийКаталог(ТекущийКаталогИсходныхФайлов) Тогда + Продолжить; + КонецЕсли; + + ОбрабатываемыеФайлыКаталога = НайтиФайлы(ТекущийКаталогИсходныхФайлов, ПолучитьМаскуВсеФайлы(), Истина); + Для Каждого ОбрабатываемыйФайлКаталога Из ОбрабатываемыеФайлыКаталога Цикл + ОбрабатываемыеФайлы.Добавить(ОбрабатываемыйФайлКаталога); + КаталогиФайлов.Вставить(ОбрабатываемыйФайлКаталога.ПолноеИмя, ТекущийКаталогИсходныхФайлов); + КонецЦикла; + КонецЦикла; + КонецЕсли; + + Результат = Новый Структура("Файлы, Каталоги", ОбрабатываемыеФайлы, КаталогиФайлов); + Возврат Результат; +КонецФункции + +Функция ЭтоСуществующийКаталог(Каталог) + КаталогОбъект = Новый Файл(Каталог); + Если НЕ КаталогОбъект.Существует() Тогда + Лог.Ошибка("Каталог <%1> не существует", Каталог); + Возврат Ложь; + ИначеЕсли НЕ КаталогОбъект.ЭтоКаталог() Тогда + Лог.Ошибка("Каталог <%1> является файлов", Каталог); + Возврат Ложь; + Иначе + Каталог = КаталогОбъект.ПолноеИмя; + Возврат Истина; + КонецЕсли; +КонецФункции + +Функция МассивКоммитов(ПараметрыКоманды, КаталогРепозитория) + Коммиты = Новый Массив; + Репозиторий = РепозиторийGit(КаталогРепозитория); + Если НЕ Репозиторий.ЭтоРепозиторий() Тогда + Возврат Коммиты; + КонецЕсли; + + Коммит1 = ЗначениеПараметра(ПараметрыКоманды, "Коммит1", ""); + Если НЕ ПустаяСтрока(Коммит1) Тогда + Коммит2 = ЗначениеПараметра(ПараметрыКоманды, "Коммит2", ""); + Если ПустаяСтрока(Коммит2) Тогда + Коммиты = РодительскиеКоммиты(Коммит1); + Иначе + Коммиты.Добавить(Коммит1); + Коммиты.Добавить(Коммит2); + КонецЕсли; + КонецЕсли; + + Возврат Коммиты; +КонецФункции + +Функция РодительскиеКоммиты(Коммит) + Коммиты = Новый Массив; + Git = РепозиторийGit(); + Git.ВыполнитьКоманду(МассивПараметров("cat-file", "-p", Коммит)); + Результат = Git.ПолучитьВыводКоманды(); + + РегулярноеВыражение = Новый РегулярноеВыражение("parent (\w+)"); + Совпадения = РегулярноеВыражение.НайтиСовпадения(Результат); + Если НЕ ДваЭлементаВКоллекции(Совпадения) Тогда + Лог.Ошибка("В команду необходимо передать два коммита или коммит с двумя родителями (объединение веток)."); + ВызватьИсключение "Не удалось составить список измененных файлов коммита"; + КонецЕсли; + + Для Каждого Совпадение Из Совпадения Цикл + Группа = Совпадение.Группы[1]; + Коммиты.Добавить(Группа.Значение); + КонецЦикла; + + Возврат Коммиты; +КонецФункции + +Функция МассивПараметров(Параметр1, Параметр2 = Неопределено, Параметр3 = Неопределено, Параметр4 = Неопределено) + Массив = Новый Массив; + Массив.Добавить(Параметр1); + + Если Параметр2 <> Неопределено Тогда + Массив.Добавить(Параметр2); + КонецЕсли; + Если Параметр3 <> Неопределено Тогда + Массив.Добавить(Параметр3); + КонецЕсли; + Если Параметр4 <> Неопределено Тогда + Массив.Добавить(Параметр4); + КонецЕсли; + + Возврат Массив; +КонецФункции + +Функция СписокИзмененийМеждуКоммитами(Коммиты, КаталогРепозитория) + Если НЕ ДваЭлементаВКоллекции(Коммиты) Тогда + Возврат Новый Массив; + КонецЕсли; + + Git = РепозиторийGit(КаталогРепозитория); + ПараметрыКоманды = МассивПараметров(СтрШаблон("diff --name-only %1 %2", Коммиты[0], Коммиты[1])); + Git.ВыполнитьКоманду(ПараметрыКоманды); + Результат = Git.ПолучитьВыводКоманды(); + + Если ПустаяСтрока(Результат) Тогда + Возврат Новый Массив; + КонецЕсли; + + ИзмененныеФайлы = СтрРазделить(СокрЛП(Результат), Символы.ПС); + Для Индекс = 0 По ИзмененныеФайлы.ВГраница() Цикл + ИзмененныеФайлы[Индекс] = ОбъединитьПути(КаталогРепозитория, СокрЛП(ИзмененныеФайлы[Индекс])); + КонецЦикла; + + Возврат ИзмененныеФайлы; +КонецФункции + +Функция ДваЭлементаВКоллекции(Коллекция) + ЗначениеСравнения = 2; + Возврат Коллекция.Количество() = ЗначениеСравнения; +КонецФункции diff --git a/src/Классы/КомандаКонфигуратион.os b/src/Классы/КомандаКонфигуратион.os index 4009f54..3994f65 100644 --- a/src/Классы/КомандаКонфигуратион.os +++ b/src/Классы/КомандаКонфигуратион.os @@ -111,7 +111,7 @@ ПроектыКонфигурации = МенеджерНастроек.ПроектыКонфигурации(); - Для Каждого ИмяПроекта из ПроектыКонфигурации Цикл + Для Каждого ИмяПроекта Из ПроектыКонфигурации Цикл НапечататьНастройкиПроекта(ИмяПроекта, ИмяПроекта); @@ -138,13 +138,11 @@ Процедура ВывестиНастройкиРекурсивно(НастройкиПрекоммита, Уровень = 1) - ПробельныеСимволы = ""; - - Для Счетчик = 1 по Уровень Цикл - - ПробельныеСимволы = ПробельныеСимволы + Символы.Таб; - + МассивТабуляций = Новый Массив(Уровень); + Для Индекс = 0 По МассивТабуляций.ВГраница() Цикл + МассивТабуляций[Индекс] = Символы.Таб; КонецЦикла; + ПробельныеСимволы = СтрСоединить(МассивТабуляций); Для Каждого НастройкаПрекоммита Из НастройкиПрекоммита Цикл @@ -164,7 +162,7 @@ ВывестиНастройкиРекурсивно(НастройкаПрекоммита.Значение, Уровень + 1); - КонецЕсли; + КонецЕсли; КонецЦикла; @@ -180,9 +178,9 @@ ОтключенныеСценарии = МенеджерНастроек.ЗначениеНастройки("ОтключенныеСценарии"); ИменаСценариев = СценарииОбработки.ГлобальныеСценарии(); - Лог.Отладка("Сохраненные значения опции 'ГлобальныеСценарии': %1%2", + Лог.Отладка("Сохраненные значения опции 'ГлобальныеСценарии': %1%2", Символы.ПС, ?(НЕ ЗначениеЗаполнено(ГлобальныеСценарии), "<пусто>", СтрСоединить(ГлобальныеСценарии, Символы.ПС))); - Лог.Отладка("Сохраненные значения опции 'ОтключенныеСценарии': %1%2", + Лог.Отладка("Сохраненные значения опции 'ОтключенныеСценарии': %1%2", Символы.ПС, ?(НЕ ЗначениеЗаполнено(ОтключенныеСценарии), "<пусто>", СтрСоединить(ОтключенныеСценарии, Символы.ПС))); Если ИнтерактивныйРедактор.ПолучитьНастройкуБулево("Проверять сообщение коммита на наличие номера задачи?", Ложь) Тогда @@ -196,10 +194,10 @@ КонецЕсли; Если ИнтерактивныйРедактор.ПолучитьНастройкуБулево("Выполнить настройку подключенных глобальных сценариев?", Истина) Тогда - ГлобальныеСценарии = ИнтерактивныйРедактор.ПолучитьНастройкуМассив("Выберите подключаемые глобальные сценарии: ", + ГлобальныеСценарии = ИнтерактивныйРедактор.ПолучитьНастройкуМассив("Выберите подключаемые глобальные сценарии: ", ИменаСценариев, ГлобальныеСценарии); ИначеЕсли ИнтерактивныйРедактор.ПолучитьНастройкуБулево("Выполнить настройку отключенных глобальных сценариев?", Истина) Тогда - ОтключенныеСценарии = ИнтерактивныйРедактор.ПолучитьНастройкуМассив("Выберите отключаемые глобальные сценарии: ", + ОтключенныеСценарии = ИнтерактивныйРедактор.ПолучитьНастройкуМассив("Выберите отключаемые глобальные сценарии: ", ИменаСценариев, ?(ОтключенныеСценарии = Неопределено, Новый Массив, ОтключенныеСценарии)); КонецЕсли; @@ -214,7 +212,7 @@ ЗначениеНастройки = МенеджерНастроек.ЗначениеНастройки("ИспользоватьСценарииРепозитория"); ИспользоватьСценарииРепозитория = ИнтерактивныйРедактор.ПолучитьНастройкуБулево(Подсказка, ЗначениеНастройки); Если ИспользоватьСценарииРепозитория Тогда - КаталогЛокальныхСценариев = ИнтерактивныйРедактор.ПолучитьНастройкуСтрока("Укажите относительный путь к сценариям в репозитории: ", + КаталогЛокальныхСценариев = ИнтерактивныйРедактор.ПолучитьНастройкуСтрока("Укажите относительный путь к сценариям в репозитории: ", МенеджерНастроек.ЗначениеНастройки("КаталогЛокальныхСценариев")); КонецЕсли; @@ -260,7 +258,7 @@ АдресКаталога = ИнтерактивныйРедактор.ПолучитьНастройкуСтрока("Введите относительный путь в репозитории к каталогу", ""); - Если ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, АдресКаталога) Тогда + Если ПроверитьАдресДополнительногоКаталога(КаталогРепозитория, АдресКаталога) Тогда АдресКаталога = МенеджерНастроек.НормализованноеИмяПроекта(АдресКаталога); НастройкиПроекта = ИнтерактивнаяНастройка(АдресКаталога); @@ -310,7 +308,7 @@ КонецЕсли; - Если НЕ РазрешеноДобавление Тогда + Если НЕ РазрешеноДобавление Тогда Сообщить(Сообщение); КонецЕсли; diff --git a/src/Классы/КомандаПрекоммит.os b/src/Классы/КомандаПрекоммит.os index 29f1691..d2d674b 100644 --- a/src/Классы/КомандаПрекоммит.os +++ b/src/Классы/КомандаПрекоммит.os @@ -74,7 +74,7 @@ ФайлыКОбработке = Новый ТаблицаЗначений(); ФайлыКОбработке.Колонки.Добавить("Файл"); ФайлыКОбработке.Колонки.Добавить("ТипИзменения"); - + Если НЕ СообщениеКоммитаСоответствуетМаске(НаборНастроек, ПараметрыОбработки) Тогда Возврат Приложение.РезультатыКоманд().ОшибкаВремениВыполнения; КонецЕсли; diff --git a/src/Классы/НастройкаСценарияСортировкиСостава.os b/src/Классы/НастройкаСценарияСортировкиСостава.os index 683aa50..9adcbbc 100644 --- a/src/Классы/НастройкаСценарияСортировкиСостава.os +++ b/src/Классы/НастройкаСценарияСортировкиСостава.os @@ -68,7 +68,7 @@ КонецФункции Функция РодительскийЭлемент() Экспорт - Возврат Новый Структура("Отступ, Имя, Завершение", + Возврат Новый Структура("Отступ, Имя, Завершение", ОтступРодительскогоЭлемента, РодительскийЭлемент, РодительскийЭлементЗавершение); КонецФункции diff --git a/src/Классы/НастройкиСортировкиСостава.os b/src/Классы/НастройкиСортировкиСостава.os index 7712d8d..67bf18c 100644 --- a/src/Классы/НастройкиСортировкиСостава.os +++ b/src/Классы/НастройкиСортировкиСостава.os @@ -16,7 +16,7 @@ // Конструктор создания на основании анализируемого файла Процедура ПриСозданииОбъекта(АнализируемыйФайл) ОписаниеПоФайлу = ТипыОбъектовДляСортировки.ПоФайлу(АнализируемыйФайл); - Если ОписаниеПоФайлу.Тип = ТипыОбъектовДляСортировки.Неизвестный Тогда + Если ОписаниеПоФайлу.Тип = ТипыОбъектовДляСортировки.Неизвестный Тогда Пустой = Истина; Возврат; КонецЕсли; @@ -67,7 +67,7 @@ КонецЕсли; НастройкиСценария.УставитьШаблоныПоиска(ШаблонПоискаСостава, ШаблонПоискаЭлементов); - Сценарии.Добавить(НастройкиСценария); + Сценарии.Добавить(НастройкиСценария); КонецПроцедуры Функция Сценарии() Экспорт diff --git a/src/Модули/ВариантИзмененийФайловGit.os b/src/Модули/ВариантИзмененийФайловGit.os index a4e5c47..96a98a1 100644 --- a/src/Модули/ВариантИзмененийФайловGit.os +++ b/src/Модули/ВариантИзмененийФайловGit.os @@ -25,23 +25,23 @@ // Функция ОпределитьВариантИзменения(СимволИзменения) Экспорт - Если СтрСравнить(СимволИзменения, "M") = 0 Тогда + Если СтрСравнить(СимволИзменения, "M") = 0 Тогда Возврат Изменен; - ИначеЕсли СтрСравнить(СимволИзменения, "A") = 0 Тогда + ИначеЕсли СтрСравнить(СимволИзменения, "A") = 0 Тогда Возврат Добавлен; - ИначеЕсли СтрСравнить(СимволИзменения, "D") = 0 Тогда + ИначеЕсли СтрСравнить(СимволИзменения, "D") = 0 Тогда Возврат Удален; - ИначеЕсли СтрСравнить(СимволИзменения, "R") = 0 Тогда + ИначеЕсли СтрСравнить(СимволИзменения, "R") = 0 Тогда Возврат Переименован; - ИначеЕсли СтрСравнить(СимволИзменения, "C") = 0 Тогда + ИначеЕсли СтрСравнить(СимволИзменения, "C") = 0 Тогда Возврат Скопирован; @@ -57,4 +57,4 @@ Изменен = "Изменен"; Удален = "Удален"; Переименован = "Переименован"; -Скопирован = "Скопирован"; \ No newline at end of file +Скопирован = "Скопирован"; diff --git a/src/Модули/КонфигурацияПоставщика.os b/src/Модули/КонфигурацияПоставщика.os index 7e5dc02..88cf2b3 100644 --- a/src/Модули/КонфигурацияПоставщика.os +++ b/src/Модули/КонфигурацияПоставщика.os @@ -268,7 +268,7 @@ КонецЕсли; Результат = Новый Массив; - Для каждого Группа Из Совпадение.Группы Цикл + Для Каждого Группа Из Совпадение.Группы Цикл Результат.Добавить(Группа.Значение); КонецЦикла; diff --git a/src/Модули/МенеджерНастроек.os b/src/Модули/МенеджерНастроек.os index 9739523..2dfd459 100644 --- a/src/Модули/МенеджерНастроек.os +++ b/src/Модули/МенеджерНастроек.os @@ -411,7 +411,7 @@ КонецЕсли; - Для каждого Ключ Из Ключи Цикл + Для Каждого Ключ Из Ключи Цикл Значение = Значение.Получить(Ключ); diff --git a/src/Модули/СценарииОбработки.os b/src/Модули/СценарииОбработки.os index 74318f8..c45bbd3 100644 --- a/src/Модули/СценарииОбработки.os +++ b/src/Модули/СценарииОбработки.os @@ -3,7 +3,7 @@ ТекущийКаталогСценариев = МенеджерПриложения.КаталогСценариев(); ВсеЗагруженные = Новый Массив; ФайлыГлобальныхСценариев = НайтиФайлы(ТекущийКаталогСценариев, "*.os"); - ФайлыЛокальныхСценариев = Новый Массив; + ФайлыЛокальныхСценариев = Новый Массив; Лог = МенеджерПриложения.ПолучитьЛог(); diff --git a/src/Модули/ТипыОбъектовДляСортировки.os b/src/Модули/ТипыОбъектовДляСортировки.os index 7adf339..f3c6491 100644 --- a/src/Модули/ТипыОбъектовДляСортировки.os +++ b/src/Модули/ТипыОбъектовДляСортировки.os @@ -51,4 +51,4 @@ ПланОбмена = "ПланОбмена"; ФункциональнаяОпция = "ФункциональнаяОпция"; Подсистема = "Подсистема"; -Неизвестный = ""; \ No newline at end of file +Неизвестный = ""; diff --git a/src/Модули/ФайловыеОперации.os b/src/Модули/ФайловыеОперации.os index e6245d3..6ace14d 100644 --- a/src/Модули/ФайловыеОперации.os +++ b/src/Модули/ФайловыеОперации.os @@ -17,7 +17,7 @@ // Функция НовыйФайл(ПутьИлиФайл) Экспорт - Если ТипЗнч(ПутьИлиФайл) = Тип("Строка") Тогда + Если ТипЗнч(ПутьИлиФайл) = Тип("Строка") Тогда НовыйФайл = Новый Файл(НормализоватьРазделители(ПутьИлиФайл)); @@ -92,7 +92,7 @@ Буфер = ПрочитатьДвоичныеДанные(ПутьКФайлу, МаркерUTFBOM.Количество()); Сч = 0; - Для Каждого Байт ИЗ Буфер Цикл + Для Каждого Байт Из Буфер Цикл Если МаркерUTFBOM[Сч] <> Строка(Байт) Тогда Возврат Кодировка; КонецЕсли; @@ -144,7 +144,7 @@ Рез = СтрЗаменить(ФайлВнутреннийКаталог.ПолноеИмя, ФайлКорень.ПолноеИмя, ""); Если Найти("\/", Лев(Рез, 1)) > 0 Тогда - Рез = Сред(Рез, 2); + Рез = Сред(Рез, 2); КонецЕсли; Если Найти("\/", Прав(Рез, 1)) > 0 Тогда @@ -227,7 +227,7 @@ Для Каждого Файл Из МассивФайлов Цикл - Если Файл.ЭтоКаталог() Тогда + Если Файл.ЭтоКаталог() Тогда МассивКаталогов.Добавить(Файл); @@ -267,3 +267,16 @@ КонецЕсли; КонецПроцедуры + +// Проверяет, находится ли файл в указанном каталоге или вложенных каталогах. +// +// Параметры: +// Файл - Файл, Строка - проверяемый файл или путь к нему +// Каталог - Строка - каталог, в котором должен находиться файл +// +// Возвращаемое значение: +// Булево +Функция ФайлНаходитсяВКаталоге(Знач Файл, Знач Каталог) Экспорт + Файл = НовыйФайл(Файл); + Возврат СтрНайти(Файл.ПолноеИмя, Каталог) > 0; +КонецФункции diff --git a/src/СценарииОбработки/ВставкаКопирайтов.os b/src/СценарииОбработки/ВставкаКопирайтов.os index bd620f0..6973663 100644 --- a/src/СценарииОбработки/ВставкаКопирайтов.os +++ b/src/СценарииОбработки/ВставкаКопирайтов.os @@ -143,11 +143,11 @@ Если КоллекцияСовпадений.Количество() = 0 Тогда ТекстОшибки = "Нет копирайта в модуле"; - НовыйТекстМодуля = ТекстКопирайта + Символы.ПС + Символы.ПС + СокрЛП(ТекстМодуля); + НовыйТекстМодуля = ТекстКопирайта + Символы.ПС + Символы.ПС + СокрЛП(ТекстМодуля); ИначеЕсли КоллекцияСовпадений.Количество() <> 2 Тогда - Лог.Ошибка("Модуль '%1' + Лог.Ошибка("Модуль '%1' |содержит несколько блоков, похожих на части копирайта. |Удалите лишние (либо все) блоки относящиеся к копирайту.", ПутьКФайлуМодуля); ВызватьИсключение "Копирайт не может быть проверен/скорректирован"; @@ -176,6 +176,6 @@ КонецЕсли; - Возврат Ложь; + Возврат Ложь; КонецФункции diff --git a/src/СценарииОбработки/ДобавлениеПробеловПередКлючевымиСловами.os b/src/СценарииОбработки/ДобавлениеПробеловПередКлючевымиСловами.os index 2ed41e2..b644335 100644 --- a/src/СценарииОбработки/ДобавлениеПробеловПередКлючевымиСловами.os +++ b/src/СценарииОбработки/ДобавлениеПробеловПередКлючевымиСловами.os @@ -72,7 +72,7 @@ ГруппыИндексов = Регексп.НайтиСовпадения(СодержимоеФайла); Если ГруппыИндексов.Количество() = 0 Тогда - Возврат ЛОЖЬ; + Возврат ЛОЖЬ; КонецЕсли; diff --git a/src/СценарииОбработки/ЗапретИспользованияПерейти.os b/src/СценарииОбработки/ЗапретИспользованияПерейти.os index b10e211..92b1463 100644 --- a/src/СценарииОбработки/ЗапретИспользованияПерейти.os +++ b/src/СценарииОбработки/ЗапретИспользованияПерейти.os @@ -51,7 +51,7 @@ КонецФункции // ОбработатьФайл() -Процедура ПроверитьНаОтсутствиеПерейти(ПутьКФайлуМодуля) +Процедура ПроверитьНаОтсутствиеПерейти(ПутьКФайлуМодуля) ТекстМодуля = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля); Если НЕ ПустаяСтрока(ТекстМодуля) Тогда @@ -91,8 +91,8 @@ КонецЕсли; ТекстОшибки = СтрШаблон( - "В файле '%1' обнаружено использование Перейти (%2)", - ПутьКФайлуМодуля, + "В файле '%1' обнаружено использование Перейти (%2)", + ПутьКФайлуМодуля, Совпадения.Количество()); Лог.Ошибка(ТекстОшибки); ВызватьИсключение ТекстОшибки; diff --git a/src/СценарииОбработки/ОтключениеПолнотекстовогоПоиска.os b/src/СценарииОбработки/ОтключениеПолнотекстовогоПоиска.os index db2146e..376008a 100644 --- a/src/СценарииОбработки/ОтключениеПолнотекстовогоПоиска.os +++ b/src/СценарииОбработки/ОтключениеПолнотекстовогоПоиска.os @@ -105,7 +105,7 @@ КонецЕсли; - Если ЗначениеЗаполнено(МассивРеквизитов) Тогда + Если ЗначениеЗаполнено(МассивРеквизитов) Тогда // получение текста файла до табличных частей Регексп = Новый РегулярноеВыражение("(<\?xml version[\w\W]+?)(|<\/mdclass:Document>)([\w\W]+)?"); @@ -166,7 +166,7 @@ Если ГруппыИндексов.Количество() <> 0 Тогда - Если ЗначениеЗаполнено(ПоискРеквизита) Тогда + Если ЗначениеЗаполнено(ПоискРеквизита) Тогда СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1$2DontUse$4"); @@ -258,7 +258,7 @@ Реквизит = ?(ЗначениеЗаполнено(Совпадение.Группы[3].Значение), Совпадение.Группы[3].Значение, Реквизит); ИспользованиеПоиска = Совпадение.Группы[4].Значение; - Если ЗначениеЗаполнено(ИспользованиеПоиска) И Исключения.Найти(Таблица + "." + Реквизит) = Неопределено Тогда + Если ЗначениеЗаполнено(ИспользованиеПоиска) И Исключения.Найти(Таблица + "." + Реквизит) = Неопределено Тогда ПолнотекстовыйПоиск = СтрШаблон(ШаблонЗамены, Таблица, Реквизит); diff --git a/src/СценарииОбработки/ОтключениеРазрешенияИзменятьФорму.os b/src/СценарииОбработки/ОтключениеРазрешенияИзменятьФорму.os index 0aff23c..34444d0 100644 --- a/src/СценарииОбработки/ОтключениеРазрешенияИзменятьФорму.os +++ b/src/СценарииОбработки/ОтключениеРазрешенияИзменятьФорму.os @@ -40,13 +40,12 @@ Возврат Ложь; КонецЕсли; - - ФайлДобавлен = ДополнительныеПараметры.Свойство("ТипИзменения") И + ФайлДобавлен = ДополнительныеПараметры.Свойство("ТипИзменения") И ДополнительныеПараметры.ТипИзменения = ВариантИзмененийФайловGit.Добавлен; // При передаче через параметр команды exec-rules т.к. поведение ТипИзменения лучше не переопределять, // ибо могут быть сайд эффекты - ЯвныйЗапускСценария = ДополнительныеПараметры.Свойство("ЗатребованныеСценарии") И + ЯвныйЗапускСценария = ДополнительныеПараметры.Свойство("ЗатребованныеСценарии") И ДополнительныеПараметры.ЗатребованныеСценарии.Найти(ИмяСценария()) <> Неопределено; Если ФайлДобавлен ИЛИ ЯвныйЗапускСценария Тогда @@ -79,8 +78,7 @@ Возврат Ложь; КонецЕсли; - - + Если ЭтоЕДТ Тогда Регексп = РегулярныеВыражения.Создать("()(true)(<\/allowFormCustomize>)"); @@ -126,4 +124,4 @@ Возврат Истина; -КонецФункции \ No newline at end of file +КонецФункции diff --git a/src/СценарииОбработки/ПроверкаДублейПроцедурИФункций.os b/src/СценарииОбработки/ПроверкаДублейПроцедурИФункций.os index 5a4108f..187422f 100644 --- a/src/СценарииОбработки/ПроверкаДублейПроцедурИФункций.os +++ b/src/СценарииОбработки/ПроверкаДублейПроцедурИФункций.os @@ -57,7 +57,7 @@ // Параметры: // ПутьКФайлуМодуля - Строка - Путь до файла // -Процедура ПроверитьНаДублированиеМетодов(ПутьКФайлуМодуля) +Процедура ПроверитьНаДублированиеМетодов(ПутьКФайлуМодуля) ТекстМодуля = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля); diff --git a/src/СценарииОбработки/ПроверкаКорректностиИнструкцийПрепроцессора.os b/src/СценарииОбработки/ПроверкаКорректностиИнструкцийПрепроцессора.os index 8eac450..f146852 100644 --- a/src/СценарииОбработки/ПроверкаКорректностиИнструкцийПрепроцессора.os +++ b/src/СценарииОбработки/ПроверкаКорректностиИнструкцийПрепроцессора.os @@ -127,7 +127,7 @@ Прервать; КонецЕсли; - Для каждого Часть Из ЧастиИнструкции Цикл + Для Каждого Часть Из ЧастиИнструкции Цикл Токен = НРег(СокрЛП(Часть)); Если Не ПустаяСтрока(Токен) И ВсеТокены.Найти(Токен) = Неопределено Тогда Ошибки.Добавить(СтрШаблон( @@ -201,19 +201,19 @@ Результат = Новый Массив(); - Для каждого Токен Из ТокеныОбласть() Цикл + Для Каждого Токен Из ТокеныОбласть() Цикл Результат.Добавить(Токен); КонецЦикла; - Для каждого Токен Из ТокеныЕсли() Цикл + Для Каждого Токен Из ТокеныЕсли() Цикл Результат.Добавить(Токен); КонецЦикла; - Для каждого Токен Из ТокеныИначеЕсли() Цикл + Для Каждого Токен Из ТокеныИначеЕсли() Цикл Результат.Добавить(Токен); КонецЦикла; - Для каждого Токен Из ТокеныИначе() Цикл + Для Каждого Токен Из ТокеныИначе() Цикл Результат.Добавить(Токен); КонецЦикла; - Для каждого Токен Из ТокеныКонецЕсли() Цикл + Для Каждого Токен Из ТокеныКонецЕсли() Цикл Результат.Добавить(Токен); КонецЦикла; diff --git a/src/СценарииОбработки/ПроверкаКорректностиОбластей.os b/src/СценарииОбработки/ПроверкаКорректностиОбластей.os index 1ba3597..a265558 100644 --- a/src/СценарииОбработки/ПроверкаКорректностиОбластей.os +++ b/src/СценарииОбработки/ПроверкаКорректностиОбластей.os @@ -51,7 +51,7 @@ КонецФункции // ОбработатьФайл() -Процедура ПроверитьНаКорректностьОбластей(ПутьКФайлуМодуля) +Процедура ПроверитьНаКорректностьОбластей(ПутьКФайлуМодуля) ТекстМодуля = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля); diff --git a/src/СценарииОбработки/ПроверкаНецензурныхСлов.os b/src/СценарииОбработки/ПроверкаНецензурныхСлов.os index 82c6978..fba7a4f 100644 --- a/src/СценарииОбработки/ПроверкаНецензурныхСлов.os +++ b/src/СценарииОбработки/ПроверкаНецензурныхСлов.os @@ -58,14 +58,14 @@ НастройкиСценария = ДополнительныеПараметры.Настройки.Получить(ИмяСценария()); ФайлСНецензурнымиСловами = НастройкиСценария.Получить("ФайлСНецензурнымиСловами"); // Если конфига нет, то и проверять в общем нечего - Если НЕ ЗначениеЗаполнено(ФайлСНецензурнымиСловами) Тогда + Если НЕ ЗначениеЗаполнено(ФайлСНецензурнымиСловами) Тогда Возврат Ложь; Иначе Файл = Новый Файл(ФайлСНецензурнымиСловами); // Если указан несуществующий файл, то ничего не делаем, но ругнемся в лог Если НЕ Файл.Существует() Тогда Лог.Предупреждение("Не обнаружен файл с нецензурными словами по пути %1", Файл.ПолноеИмя); - Возврат Ложь; + Возврат Ложь; КонецЕсли; КонецЕсли; @@ -98,7 +98,6 @@ КонецЕсли; - КонецПроцедуры Процедура ПроверкаНаНецензурныеСлова(СодержимоеФайла, ФайлСНецензурнымиСловами) @@ -156,4 +155,4 @@ Возврат Регексп; -КонецФункции \ No newline at end of file +КонецФункции diff --git a/src/СценарииОбработки/РазборОбычныхФормНаИсходники.os b/src/СценарииОбработки/РазборОбычныхФормНаИсходники.os index 90a3da4..e7e6306 100644 --- a/src/СценарииОбработки/РазборОбычныхФормНаИсходники.os +++ b/src/СценарииОбработки/РазборОбычныхФормНаИсходники.os @@ -98,7 +98,7 @@ Иначе ФайлыВКаталогеТВФ = НайтиФайлы(ИмяКаталогаВыгрузки, "*", ИСТИНА); - Для каждого ФайлВКателогеТВФ Из ФайлыВКаталогеТВФ Цикл + Для Каждого ФайлВКателогеТВФ Из ФайлыВКаталогеТВФ Цикл Если НЕ ФайлВКателогеТВФ.Существует() Тогда diff --git a/src/СценарииОбработки/СортировкаПравРолей.os b/src/СценарииОбработки/СортировкаПравРолей.os index 235f628..5c6fb4a 100644 --- a/src/СценарииОбработки/СортировкаПравРолей.os +++ b/src/СценарииОбработки/СортировкаПравРолей.os @@ -40,7 +40,7 @@ // Булево - Признак выполненной обработки файла // // BSLLS:UnusedParameters-off API -Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт +Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт // BSLLS:UnusedParameters-on ФайлОбработан = Ложь; Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлПравРоли(АнализируемыйФайл) Тогда diff --git a/src/СценарииОбработки/СортировкаСостава.os b/src/СценарииОбработки/СортировкаСостава.os index 910aac3..7c69722 100644 --- a/src/СценарииОбработки/СортировкаСостава.os +++ b/src/СценарииОбработки/СортировкаСостава.os @@ -31,7 +31,7 @@ // Булево - Признак выполненной обработки файла // // BSLLS:UnusedParameters-off API -Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт +Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт // BSLLS:UnusedParameters-on ФайлОбработан = Ложь; @@ -62,7 +62,7 @@ Функция ПараметрыСортировки(АнализируемыйФайл, НастройкиСценария) НастройкиСортировкиСостава = Новый НастройкиСортировкиСостава(АнализируемыйФайл); - Если Не НастройкиСортировкиСостава.Пустой() Тогда + Если Не НастройкиСортировкиСостава.Пустой() Тогда ОтключенныеОбъекты = ОтключенныеОбъекты(НастройкиСценария); Если ОтключенныеОбъекты.Найти(НРег(НастройкиСортировкиСостава.Тип)) <> Неопределено Тогда // Пропускаем @@ -70,7 +70,7 @@ КонецЕсли; УстановитьУсловияОбработкиФайла(НастройкиСортировкиСостава); - ПрефиксыСортировки = ПрефиксыСортировки(НастройкиСценария); + ПрефиксыСортировки = ПрефиксыСортировки(НастройкиСценария); НесортируемыеТипыМетаданных = НесортируемыеТипыМетаданных(); КонецЕсли; Возврат НастройкиСортировкиСостава; @@ -99,7 +99,7 @@ Иначе НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент("ChildObjects", " "); - КонецЕсли; + КонецЕсли; НастройкиСортировки.ДобавитьСценарий(НастройкаСценарияСортировкиСостава); КонецПроцедуры @@ -133,25 +133,25 @@ Процедура УстановитьУсловияОбработкиФайлаОпределяемыйТип(НастройкиСортировки) Если НастройкиСортировки.ЕДТ() Тогда НастройкаСценарияСортировкиСостава = Новый НастройкаСценарияСортировкиСостава("types"); - Если НастройкиСортировки.Заимствованный() Тогда + Если НастройкиСортировки.Заимствованный() Тогда НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент("typeExtension", " "); НастройкаСценарияСортировкиСостава.УстановитьИмяВложенного("type"); Иначе - НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); + НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); КонецЕсли; НастройкиСортировки.ДобавитьСценарий(НастройкаСценарияСортировкиСостава); Иначе Если НастройкиСортировки.Заимствованный() Тогда НастройкаСценарияСортировкиСостава = Новый НастройкаСценарияСортировкиСостава("v8:Type"); НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); - НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент("xr:CheckValue xsi:type=""v8:TypeDescription""", - " ", "xr:CheckValue"); + НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент("xr:CheckValue xsi:type=""v8:TypeDescription""", + " ", "xr:CheckValue"); НастройкиСортировки.ДобавитьСценарий(НастройкаСценарияСортировкиСостава); НастройкаСценарияСортировкиСостава = Новый НастройкаСценарияСортировкиСостава("v8:Type"); НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); - НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент("xr:ExtendValue xsi:type=""v8:TypeDescription""", - " ", "xr:ExtendValue"); + НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент("xr:ExtendValue xsi:type=""v8:TypeDescription""", + " ", "xr:ExtendValue"); НастройкиСортировки.ДобавитьСценарий(НастройкаСценарияСортировкиСостава); КонецЕсли; НастройкаСценарияСортировкиСостава = Новый НастройкаСценарияСортировкиСостава("v8:Type"); @@ -166,7 +166,7 @@ НастройкаСценарияСортировкиСостава = Новый НастройкаСценарияСортировкиСостава("extendedConfigurationObject"); НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент( - "extension xsi:type=""mdclassExtension:ExchangePlanExtension""", " ", "extension"); + "extension xsi:type=""mdclassExtension:ExchangePlanExtension""", " ", "extension"); НастройкиСортировки.ДобавитьСценарий(НастройкаСценарияСортировкиСостава); КонецЕсли; НастройкаСценарияСортировкиСостава = Новый НастройкаСценарияСортировкиСостава("content"); @@ -176,16 +176,16 @@ Иначе Если НастройкиСортировки.Заимствованный() Тогда НастройкаСценарияСортировкиСостава = Новый НастройкаСценарияСортировкиСостава("Item"); - НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент("ExtensionProperty", " "); + НастройкаСценарияСортировкиСостава.УстановитьРодительскийЭлемент("ExtensionProperty", " "); НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); НастройкаСценарияСортировкиСостава.УстановитьИмяВложенного("Metadata"); НастройкиСортировки.ДобавитьСценарий(НастройкаСценарияСортировкиСостава); - КонецЕсли; + КонецЕсли; НастройкаСценарияСортировкиСостава = Новый НастройкаСценарияСортировкиСостава("Item"); НастройкаСценарияСортировкиСостава.УстановитьРазделительЭлементов(" "); НастройкаСценарияСортировкиСостава.УстановитьИмяВложенного("Metadata"); - НастройкиСортировки.ДобавитьСценарий(НастройкаСценарияСортировкиСостава); + НастройкиСортировки.ДобавитьСценарий(НастройкаСценарияСортировкиСостава); КонецЕсли; КонецПроцедуры @@ -249,7 +249,7 @@ СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ПолноеИмяФайла); Замены = Новый Массив; - Для каждого Сценарий Из ПараметрыСортировки.Сценарии() Цикл + Для Каждого Сценарий Из ПараметрыСортировки.Сценарии() Цикл ПоискСостава = Сценарий.ШаблонПоискаСостава(); СовпаденияСостава = ПоискСостава.НайтиСовпадения(СодержимоеФайла); Если СовпаденияСостава.Количество() = 0 Тогда @@ -264,7 +264,7 @@ НовыйТекст = СодержимоеФайла; Для Ит = 0 По Замены.Количество() - 1 Цикл НовыйТекст = СтрЗаменить(НовыйТекст, "_____ЗАМЕНА____" + Ит, Замены.Получить(Ит)); - КонецЦикла; + КонецЦикла; НовыйТекст = СтрЗаменить(НовыйТекст, Символы.ПС + Символы.ПС, Символы.ПС); Если СтрСравнить(НовыйТекст, СодержимоеФайла) <> 0 Тогда @@ -283,8 +283,8 @@ Если ПараметрыСортировки.Тип = ТипыОбъектовДляСортировки.Конфигурация Тогда - СортированныеОбъекты = Новый Массив; - Для каждого ТипМетаданных Из ИменаВсехЭлементовПоПорядку(СоставОбъектов) Цикл + СортированныеОбъекты = Новый Массив; + Для Каждого ТипМетаданных Из ИменаВсехЭлементовПоПорядку(СоставОбъектов) Цикл СоставТипа = ВырезатьЭлемент(СоставОбъектов, ТипМетаданных, Сценарий.РазделительЭлементов()); Если НесортируемыеТипыМетаданных.Найти(НРег(ТипМетаданных)) = Неопределено Тогда @@ -332,7 +332,7 @@ Элементы = Новый ТаблицаЗначений; Элементы.Колонки.Добавить("ИмяЭлемента"); - Для каждого СовпадениеЭлемента Из ПоискЭлементов.НайтиСовпадения(ТекстХМЛ) Цикл + Для Каждого СовпадениеЭлемента Из ПоискЭлементов.НайтиСовпадения(ТекстХМЛ) Цикл Элементы.Добавить().ИмяЭлемента = СовпадениеЭлемента.Группы.ПоИмени("name").Значение; КонецЦикла; Элементы.Свернуть("ИмяЭлемента"); @@ -348,7 +348,7 @@ Если СовпаденияЭлемента.Количество() > 0 Тогда СтрокиЭлемента = Новый Массив; - Для каждого СовпадениеЭлемента Из СовпаденияЭлемента Цикл + Для Каждого СовпадениеЭлемента Из СовпаденияЭлемента Цикл СтрокиЭлемента.Добавить(СовпадениеЭлемента.Группы[1].Значение); КонецЦикла; @@ -363,7 +363,7 @@ Функция СортированныеЭлементы(Знач СтрокаСостава, ШаблонПоискаЭлементов, РазделительЭлементов) Экспорт ТаблицыПоПрефиксам = ТаблицыПоПрефиксам(); ПоискЭлементов = РегулярныеВыражения.Создать(ШаблонПоискаЭлементов); - Для Каждого СовпадениеЭлемента Из ПоискЭлементов.НайтиСовпадения(СтрокаСостава) Цикл + Для Каждого СовпадениеЭлемента Из ПоискЭлементов.НайтиСовпадения(СтрокаСостава) Цикл ЗначениеЭлемента = СовпадениеЭлемента.Группы[1].Значение; СтрокаСостава = СтрЗаменить(СтрокаСостава, СовпадениеЭлемента.Группы[0].Значение, ""); Если СтрНайти(ЗначениеЭлемента, "-") > 0 Тогда // Вероятно это UID (битая ссылка) @@ -379,7 +379,7 @@ КонецЦикла; СортированныеЭлементыПоПрефиксами = Новый Массив(); - Для каждого ТаблицаПрефикса Из ТаблицыПоПрефиксам Цикл + Для Каждого ТаблицаПрефикса Из ТаблицыПоПрефиксам Цикл Если ТаблицаПрефикса.Количество() = 0 Тогда Продолжить; КонецЕсли; @@ -408,24 +408,22 @@ Если НЕ ПустаяСтрока(Строка) Тогда СтрокиНовые.Добавить(Строка); КонецЕсли; - КонецЦикла; + КонецЦикла; СтрокаСостава = СтрСоединить(СтрокиНовые, Символы.ПС); КонецПроцедуры Функция ТаблицыПоПрефиксам() - ТаблицыПоПрефиксам = Новый Массив(); + КоличествоЭлементов = ?(ЗначениеЗаполнено(ПрефиксыСортировки), ПрефиксыСортировки.Количество() + 1, 1); + ТаблицыПоПрефиксам = Новый Массив(КоличествоЭлементов); ТаблицаСортировки = Новый ТаблицаЗначений; ТаблицаСортировки.Колонки.Добавить("СтрокаЭлемента"); ТаблицаСортировки.Колонки.Добавить("СтрокаСортировки"); - ТаблицыПоПрефиксам.Добавить(ТаблицаСортировки); - Если ЗначениеЗаполнено(ПрефиксыСортировки) Тогда - Для каждого Префикс Из ПрефиксыСортировки Цикл // BSLLS:UseLessForEach-off служебный итератор - ТаблицыПоПрефиксам.Добавить(ТаблицаСортировки.СкопироватьКолонки()); - КонецЦикла; - КонецЕсли; + Для Индекс = 0 По ТаблицыПоПрефиксам.ВГраница() Цикл + ТаблицыПоПрефиксам[Индекс] = ТаблицаСортировки.СкопироватьКолонки(); + КонецЦикла; Возврат ТаблицыПоПрефиксам; diff --git a/src/СценарииОбработки/УдалениеДублейМетаданных.os b/src/СценарииОбработки/УдалениеДублейМетаданных.os index 4a2aca1..41e4937 100644 --- a/src/СценарииОбработки/УдалениеДублейМетаданных.os +++ b/src/СценарииОбработки/УдалениеДублейМетаданных.os @@ -80,7 +80,7 @@ ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла); Если ПодчиненныеМетаданные.Количество() = 0 Тогда - Возврат Ложь; + Возврат Ложь; КонецЕсли; @@ -151,7 +151,7 @@ ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла); Если ПодчиненныеМетаданные.Количество() = 0 Тогда - Возврат Ложь; + Возврат Ложь; КонецЕсли; diff --git a/src/СценарииОбработки/УдалениеЛишнихКонцевыхПробелов.os b/src/СценарииОбработки/УдалениеЛишнихКонцевыхПробелов.os index fd3cc44..0e4e9a0 100644 --- a/src/СценарииОбработки/УдалениеЛишнихКонцевыхПробелов.os +++ b/src/СценарииОбработки/УдалениеЛишнихКонцевыхПробелов.os @@ -71,7 +71,7 @@ ГруппыИндексов = Регексп.НайтиСовпадения(СодержимоеФайла); Если ГруппыИндексов.Количество() = 0 Тогда - Возврат Ложь; + Возврат Ложь; КонецЕсли;