2323use Composer \Pcre \Preg ;
2424use Composer \Repository \Vcs \VcsDriverInterface ;
2525use Doctrine \ORM \EntityManagerInterface ;
26+ use Symfony \Component \DependencyInjection \Attribute \Autowire ;
2627use Symfony \Component \Messenger \MessageBusInterface ;
2728use Symfony \Component \Messenger \Stamp \DispatchAfterCurrentBusStamp ;
2829use Symfony \Component \Messenger \Stamp \TransportNamesStamp ;
@@ -36,6 +37,14 @@ public function __construct(
3637 private KeywordRepository $ keywordRepository ,
3738 private RegistryRepository $ registryRepository ,
3839 private PackageRepository $ packageRepository ,
40+ #[Autowire(param: 'dirigent.metadata.retain_stale_revisions.tagged_versions ' )]
41+ private bool $ retainStaleRevisionsTagged ,
42+ #[Autowire(param: 'dirigent.metadata.retain_stale_revisions.dev_versions ' )]
43+ private bool $ retainStaleRevisionsDev ,
44+ #[Autowire(param: 'dirigent.metadata.retain_pruned_versions.tagged_versions ' )]
45+ private bool $ retainPrunedVersionsTagged ,
46+ #[Autowire(param: 'dirigent.metadata.retain_pruned_versions.dev_versions ' )]
47+ private bool $ retainPrunedVersionsDev ,
3948 ) {
4049 }
4150
@@ -204,7 +213,15 @@ private function updatePackage(Package $package, array $composerPackages, ?VcsDr
204213
205214 // Remove outdated versions
206215 foreach ($ existingVersionMetadata as $ version ) {
207- $ this ->entityManager ->remove ($ version );
216+ $ removeVersion = $ version ->isDevelopment () ? !$ this ->retainPrunedVersionsDev : !$ this ->retainPrunedVersionsTagged ;
217+ if ($ removeVersion ) {
218+ $ this ->entityManager ->remove ($ version );
219+ } elseif (!$ version ->isPruned ()) {
220+ $ version ->setPruned (true );
221+ $ version ->setUpdatedAt (new \DateTimeImmutable ());
222+
223+ $ this ->entityManager ->persist ($ version );
224+ }
208225 }
209226
210227 $ package ->setUpdatedAt (new \DateTimeImmutable ());
@@ -214,15 +231,22 @@ private function updatePackage(Package $package, array $composerPackages, ?VcsDr
214231
215232 private function updateVersion (Version $ version , CompletePackageInterface $ data , ?VcsDriverInterface $ driver = null ): void
216233 {
234+ $ currentMetadata = $ version ->hasCurrentMetadata () ? $ version ->getCurrentMetadata () : null ;
217235 $ metadata = $ this ->createMetadata ($ version , $ data , $ driver );
218236
219- if (! $ version -> hasCurrentMetadata () || $ this ->hasMetadataChanged ($ version -> getCurrentMetadata () , $ metadata )) {
237+ if (null === $ currentMetadata || $ this ->hasMetadataChanged ($ currentMetadata , $ metadata )) {
220238 $ version ->setCurrentMetadata ($ metadata );
221239
222240 $ this ->entityManager ->persist ($ metadata );
241+
242+ $ removePreviousMetadata = $ version ->isDevelopment () ? !$ this ->retainStaleRevisionsDev : !$ this ->retainStaleRevisionsTagged ;
243+ if (null !== $ currentMetadata && $ removePreviousMetadata ) {
244+ $ this ->entityManager ->remove ($ currentMetadata );
245+ }
223246 }
224247
225248 $ version ->setDefaultBranch ($ data ->isDefaultBranch ());
249+ $ version ->setPruned (false );
226250 $ version ->setUpdatedAt (new \DateTimeImmutable ());
227251
228252 $ this ->entityManager ->persist ($ version );
0 commit comments