From f23dcbec17c4dc05ce0c151c1642e680945bf9e4 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Wed, 10 Jul 2019 19:19:03 +0200 Subject: [PATCH] run migrations always in kimai:install command (#944) --- src/Command/InstallCommand.php | 27 ++++++++++++++++++-------- src/Repository/ActivityRepository.php | 12 ++++++++++++ src/Repository/CustomerRepository.php | 11 +++++++++++ src/Repository/ProjectRepository.php | 12 ++++++++++++ tests/Command/InstallCommandTest.php | 5 +++-- var/data/kimai_test.sqlite | Bin 770048 -> 770048 bytes 6 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/Command/InstallCommand.php b/src/Command/InstallCommand.php index 964508fa..6027a53b 100644 --- a/src/Command/InstallCommand.php +++ b/src/Command/InstallCommand.php @@ -224,17 +224,28 @@ class InstallCommand extends Command protected function importMigrations(SymfonyStyle $io, OutputInterface $output) { - if ($this->connection->getSchemaManager()->tablesExist(['migration_versions'])) { - $amount = $this->connection->executeQuery('SELECT count(*) as counter FROM migration_versions')->fetchColumn(0); - if ($amount > 0) { - $io->note(sprintf('Found %s migrations in your database, skipping import', $amount)); + if (!$this->connection->getSchemaManager()->tablesExist(['migration_versions'])) { + $command = $this->getApplication()->find('doctrine:migrations:version'); + $cmdInput = new ArrayInput(['--add' => true, '--all' => true]); + $cmdInput->setInteractive(false); + $command->run($cmdInput, $output); - return; - } + return; } - $command = $this->getApplication()->find('doctrine:migrations:version'); - $cmdInput = new ArrayInput(['--add' => true, '--all' => true]); + // this case should not happen, but you know ... everything is possible + $amount = $this->connection->executeQuery('SELECT count(*) as counter FROM migration_versions')->fetchColumn(0); + if ($amount === 0) { + $command = $this->getApplication()->find('doctrine:migrations:version'); + $cmdInput = new ArrayInput(['--add' => true, '--all' => true]); + $cmdInput->setInteractive(false); + $command->run($cmdInput, $output); + + return; + } + + $command = $this->getApplication()->find('doctrine:migrations:migrate'); + $cmdInput = new ArrayInput(['--allow-no-migration' => true]); $cmdInput->setInteractive(false); $command->run($cmdInput, $output); diff --git a/src/Repository/ActivityRepository.php b/src/Repository/ActivityRepository.php index e5264959..b8bfd362 100644 --- a/src/Repository/ActivityRepository.php +++ b/src/Repository/ActivityRepository.php @@ -81,6 +81,18 @@ class ActivityRepository extends EntityRepository return $stats; } + /** + * @deprecated since 1.1 + */ + public function builderForEntityType($activity, $project) + { + $query = new ActivityFormTypeQuery(); + $query->setActivity($activity); + $query->setProject($project); + + return $this->getQueryBuilderForFormType($query); + } + /** * Returns a query builder that is used for ActivityType and your own 'query_builder' option. * diff --git a/src/Repository/CustomerRepository.php b/src/Repository/CustomerRepository.php index 658d62c3..1c38d957 100644 --- a/src/Repository/CustomerRepository.php +++ b/src/Repository/CustomerRepository.php @@ -107,6 +107,17 @@ class CustomerRepository extends EntityRepository return $stats; } + /** + * @deprecated since 1.1 + */ + public function builderForEntityType($customer) + { + $query = new CustomerFormTypeQuery(); + $query->setCustomer($customer); + + return $this->getQueryBuilderForFormType($query); + } + /** * Returns a query builder that is used for CustomerType and your own 'query_builder' option. * diff --git a/src/Repository/ProjectRepository.php b/src/Repository/ProjectRepository.php index 9a91d4f6..a321bb38 100644 --- a/src/Repository/ProjectRepository.php +++ b/src/Repository/ProjectRepository.php @@ -91,6 +91,18 @@ class ProjectRepository extends EntityRepository return $stats; } + /** + * @deprecated since 1.1 + */ + public function builderForEntityType($project, $customer) + { + $query = new ProjectFormTypeQuery(); + $query->setProject($project); + $query->setCustomer($customer); + + return $this->getQueryBuilderForFormType($query); + } + /** * Returns a query builder that is used for ProjectType and your own 'query_builder' option. * diff --git a/tests/Command/InstallCommandTest.php b/tests/Command/InstallCommandTest.php index 944a6e45..6e9b5cc7 100644 --- a/tests/Command/InstallCommandTest.php +++ b/tests/Command/InstallCommandTest.php @@ -85,8 +85,9 @@ class InstallCommandTest extends KernelTestCase self::assertContains('[NOTE] It seems as if you already have the required tables in your database,', $result); self::assertContains('skipping schema creation', $result); - self::assertContains('[NOTE] Found ', $result); - self::assertContains(' migrations in your database, skipping import', $result); + // make sure migrations run always + self::assertContains('Application Migrations', $result); + self::assertContains('No migrations to execute.', $result); self::assertContains( sprintf('[OK] Congratulations! Kimai 2 (%s %s) was successful installed!', Constants::VERSION, Constants::STATUS), diff --git a/var/data/kimai_test.sqlite b/var/data/kimai_test.sqlite index e848b8969c940be0f5d53f7ded4dc6ba96d3791e..52d4e23d3f555d7d4da64a878fe3a639748b2f47 100644 GIT binary patch delta 2623 zcma)7drVtZ7{A}SxAfjy+S>s(H^17oP_m(~=IyN4~AP5^Whtmz%s9U!cke2Dj z;^;OvHAb1$9An}$YBVN3ShP_LI*osrs3B4R(0?@kWpwiqqb{8*t-W+&RC>S80rj}_Vv$dEPY?Sc1 za9kJ?ZW0v1COjg%BfKd5bj~Ht8#KjMI>h49YGf_77106qU@Sfu^YxF8jU0&XO(y!| z(d1yUMYSeCkda2DG+FEu;dm;i2d~?X7+N_4SI<7ExM4P0ezoJ`l#WPOz74 zZ0U(K^+v?@uGUDOxRzb|SH@X-IF^X*ITZDXi-GHp4M`{5eOg-}04HO3XE}Ns{{&!4 ze^Kbf4_m>6Ke2)lKO`Ytq1e^kD|T(~?3C`^fq$z&0X$WKSiG?kH8I+^s75^Hga-aZ z_3c_)C>}a# z*@c?vl=BvBaG}lMQRy9czY9f#6B~N8ws4q4Caa-lC*EF$p1+!gVOfKeNjC;NbfEEm zY;(dm@aJGFZKN&w3s@_In=zR67f3SB>O0FVv{dJlm9QL=gFc_%r-aonuN?9!vZw?a z6n{fqeYrW`N?F4yQ{M=m0&Ouofwfyyl~)Z<5S0T4Jlh4_`XvDiVS_6)6?2A|w4aCj zFl$6L_WQ{eo+3C(aERazf@y-DOs5fj1Wk{T_tyw+AZS;|3DkMjPPMlX7zp$P1q7>V;aMlRjQLjhTPKLc9&xGI zNRg#n`?Ad4S2718zPeCE4(2iY7MR%_Gk(^MO7K4t(ig3u9UhEFrLjA;Hns9b=~IQ# z%njAk%IO@O1IQB0!`siQ1<(Cgo|=}#}mnscyuhGtZExOs)(a_d|aCy8_D|1{~H*KX1|(QLF+ z?oqNUa*)fr^0x)$mSD3IkbSLff%=eN2?Q0tjJG*RcL?Ewl*I&4X%hRR(PVHz@OYk}vLaWOOvUQ8T#ypO z*;F+xom;+kzGh(6$>C!TVC!;DTuWR^aq;Yay|{^l%br`9FXUG@=VEiy_#p>41dq79 z4JmmjeHY014?8&0Gf)Euaf1WmC~*LPY$xMilLc6CfW)8bi!GGL{d?29Q3dWSfiG~? zbue95rT$MvueZ9j#n*deG}wIYnjBif?V?4u*(gX~F UhM<5zOTZFv1bl`W)m`rX4+`tD6aWAK delta 33128 zcmb`w2Yggj*DpM$_j6_vdhb1u-XIA`limps1VSJQDiE4V(E&0+6cG@0EU4If0YvPA z*n982_wHlC@~!pXX9nK)y}$4K?)_aJv)0*bX7=p8`rdo(dDgEVuzvl3?QLV_kx1lz z`s+e}+v)GN9sTm8@;&n|33PrbR=78+PK@e7JQ6$?+!JgIz7FESwfkZd7X+=FN0l7& zq(y#I=}KsE^`hLlE34~PH1l`vSlYaKOzCTd)Q06tPh42Daz&=Q^S-4yQn2sar7gF2 z^Q0*e{{rVer_6rX9%j8@&9yxJEq#)4!V)9dAtpVO{H}|`^kOyskgkiZ0G0F zVtM7Doy(-`fh`A?d|pYxwpD)ZP&WUJm1VTmg`Hk@3jf)MCE0rP|lWam7JZO zqi-r3I!;Y4X)jesS;={Ar8dbY+DpTg4Us9yuiHt5$y?h?X0msC={S3%GTCTZQX(~W zPPXhIJ&^o8Ds|rZu91;ECsT6N-W%FXO4==?vgE<$^a;b3GLqFTq@nWKiOF-COZigo zUH4ymQhF~xKDnv0yiy7^_rNtRq?mMowDuKw?+a$9 z1Lk_^_X&GHFr#?t7`IhTx?0&K1%C#=1m6W;1Rn+ODDP-R!K>sU9uE$Zm)NVV3T_Ur z2`&pRB#*H<*buAvtM{tCS>6)^HYqMqf+?h*GF_gnWf_kH&b_eJ+9_pp1vyWhRdz24pJUhJOdZgCUt>2CEY z$`9I1x4~WH&UdTasqQ#;gj?YjyE)3;ZXdU++sjCGtf(8{;6tR7ZJtCbbAY)di!GJn-3o8OtA zn;)2OnlG78n~#_en0J}CYi-RN%qz`H%$?>rW|Mh_d8*l9E;8qvRpwN4oH@d*FpJF` zvya);Y-ct%ebX=_#vjH{#@EIt+A!l?;G z%lb3=qxysT0sRjBM*S-NQvG~=tG-E(>!<0<^b_?OeYQSLAFu4uN9v0P>m_=w-dFFY zx7Sz47`2JL7||3<&gcVT#$rZRMkb?- z43ANV44qL{M&C$8l1lx6Tcz%WjN+yCJT&!>fs~IJmBh{k3eE!ZF^UrZJ+#~pfRqP; zBui5ysbmaw-K{tn!n9()2aqR_RKTsG*fxQh0r^i06mJh~JqBc~;m(SRxKS9}2^8Ra z3jM3lvabX(D}jtBfV5WxItZlx10>HE2%QypbGTLDp2VnkCZ^XubF&_&X7kL`nA$CK z8KY*Ib&OhMV%TnG7IQbV71P>hf}g!IAfqlBKQXau#wUz2GG1lWGUEY8y)*7))HVa7 zmNSyv>YK5JQJ$O&6nTXU4iWV1emK$MoZ0O zloPubDEg*A!-4!m0zsNN-cx9~vlzv5%xP#EU4Y0gxEnGHM#=(4*)a?)+XmON6?Bs= zwd2b-!pF#=&q1C(#kQf>i?%UO*32hjfh{&i@1c(K1LUNb)j z(Zsm>o7ajKY@xsLEL!^IK=N2dSw7^G9@?52;|h?aB$qu#+TAQz+P?VOL61J3rg`l6-kK=MjPy?n5%mkU1ivR?<$ z?hItYpnK`BLjQYd*MKVj10AwV`1^M(;4YZVDKoTsp zhYdUEVeexiO$dlQEVmTsYLCd8;NCnrsE8thRSUV?9k z!IEwoMA=PS2cr6zK(LB#Y630!1t94yMqOj|0=Ym@`g*dzu2J;eH5dVEfRT3fx})XU zKz1`AOLSwx{<<3Irc1!x$X$Glw~KooTJ9EsB0$atAiFJ)^#+guU5$6q4x_2UeRNT( z&{Em}NvE^^hCmXK`4f-=v+orBnOmKLOMtwVK+Xj~%Ev(Rw*tjS z@i%mW{&kGXOzi0I1+t)x9kuiL9Ub8iI`}jBr4Du(kp3f(ES#hF4!7DXOZolnO>VRc z;DFls(5!aeE)YFE>R0wCo%p3tHFQgi~s6z!x{yujkjA zIna=1_C4@F&Frj9Zz}(|{aUex?mg$uyRMs8<4M7)+*C zjg|xp%#7T{{K*{2w2S~oonfql{by)@fT~^%qgC$P_QNmly*d5$5V^;wM?ST9N0y#iB z49HYnZW-PK(KO%{4CM;6l!QQyKoZzwNEJLJqnK%WtRIl`JdjZVq(k>~trjhH z3Xt?CBQ3TZDEf;)V5=67g3Fo@L290Oj|XGX+$y})dJ4$EI5qVPwB*YfsZrz)s(UJ0 z&Oji$4UqLSkbxN~F({wn?`ERn4i+fh9N4)U$UZC(M5h@4qD5;E{)7f!rl=2bOAeq% zvJV}TZA@D>Atl+k7jMy5bLJX62{@ghHw{m$zzgyp<-=try z?;_hdS3grTiVOoGuortgW3UgmUf4Bqjr^csdm10u6CxjUR$j# z*G|$FXeX$@Xw$U`+VR>DtyIek{s?}ey~9s}cZ1i|{lW9W6TzY2-e6yFOK@#)d5{dY zs}~1n1sj94!OCE<`jlF(76rAz++ap9DHt6L4F&}TLI0p2{HpW(ENY=-_$q! zAN()@;yvKq<=yVxpk}MRy{o)S zy^-g8TfI$Q+&j%%rd+Nb_D=L_yxHC~Z@f3s8|;;MxwN6sEw!Pbwe%GCFZWmXJNI+< z1NTk$CHHCf5%&T0vz;CGwCSMU_Fp#-{>#>ZlzibhvyG}*YO~}m8?7#JE$Z}fx;pKg z=8o?ePQ?Dh{>lE@{=|OQe$9T~enP#T_EGP*_uIG8p671+V*5OMi=D7fw@*c5~ae4LhQ?wf?Yvvc9%HvEH>_v!1t}P^Vajtb46} z)-Bex*5y__X>GU8vNo#Us@2w7Yo)c=s--R48R{0b-kNNUv4&Y?R-rXO>u2?{I$Le5 zOv|-2O;*RM!_9xp-^?G(FU^n4x6N0~=gh~=gXTTvUh`)2TJs9?B6Ekj)ZFsF+9Xi# zPi+&##Xf=hq8XT`DH(qnKO5f|pBnEOuNyBIPZ|#!_ZfGpU5s0e>x?Umi;Nw{*+!$W z&RAtEG3tzY#!O?fF~%5Xl&SBlryGUF0QEfe6r-2X*=S>A8m^(~|7hLy-^l%bseh!u zt-qo_t3Recq&8Q5)lef!-#?U}l&_Ufly{Zal;@QvltaqB%0A^5UbKs4`^XI5w_Lg` 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 IgER5}0cV%nMF0Q*