@@ -317,6 +317,7 @@ private function updateVersion(Package $package, Version $version, CompletePacka
317317 // handle links
318318 foreach (self ::SUPPORTED_LINK_TYPES as $ linkType => $ opts ) {
319319 $ links = [];
320+ $ linkIndex = 0 ;
320321 foreach ($ data ->{$ opts ['method ' ]}() as $ link ) {
321322 $ constraint = $ link ->getPrettyConstraint ();
322323 if (str_contains ($ constraint , ', ' ) && str_contains ($ constraint , '@ ' )) {
@@ -329,52 +330,68 @@ private function updateVersion(Package $package, Version $version, CompletePacka
329330 }, $ constraint );
330331 }
331332
332- $ links [$ link ->getTarget ()] = $ constraint ;
333+ $ links [$ link ->getTarget ()] = [ ' constraint ' => $ constraint, ' index ' => $ linkIndex ++] ;
333334 }
334335
335336 /** @var AbstractVersionLink $link */
336337 foreach ($ version ->{'get ' . $ linkType }() as $ link ) {
337338 $ linkPackageName = $ link ->getLinkedPackageName ();
338339
339340 // Clear links that have changed/disappeared (for updates)
340- if (!isset ($ links [$ linkPackageName ]) || $ links [$ linkPackageName ] !== $ link ->getLinkedVersionConstraint ()) {
341+ if (!isset ($ links [$ linkPackageName ]) || $ links [$ linkPackageName ][ ' constraint ' ] !== $ link ->getLinkedVersionConstraint ()) {
341342 $ version ->{'get ' . $ linkType }()->removeElement ($ link );
342343 $ em ->remove ($ link );
343344 } else {
345+ // Update index if it changed
346+ if ($ link ->getIndex () !== $ links [$ linkPackageName ]['index ' ]) {
347+ $ link ->setIndex ($ links [$ linkPackageName ]['index ' ]);
348+ }
344349 // Clear those that are already set
345350 unset($ links [$ linkPackageName ]);
346351 }
347352 }
348353
349- foreach ($ links as $ linkPackageName => $ linkPackageConstraint ) {
354+ foreach ($ links as $ linkPackageName => $ linkData ) {
350355 /** @var AbstractVersionLink $link */
351356 $ link = new $ opts ['entity ' ]();
352357 $ link ->setLinkedPackageName ($ linkPackageName );
353- $ link ->setLinkedVersionConstraint ($ linkPackageConstraint );
358+ $ link ->setLinkedVersionConstraint ($ linkData ['constraint ' ]);
359+ $ link ->setIndex ($ linkData ['index ' ]);
354360 $ version ->{'add ' . $ linkType . 'Link ' }($ link );
355361 $ link ->setVersion ($ version );
356362 $ em ->persist ($ link );
357363 }
358364 }
359365
360366 // handle suggests
361- if ($ suggests = $ data ->getSuggests ()) {
367+ if ($ suggestsData = $ data ->getSuggests ()) {
368+ $ suggests = [];
369+ $ suggestIndex = 0 ;
370+ foreach ($ suggestsData as $ suggestPackageName => $ suggestConstraint ) {
371+ $ suggests [$ suggestPackageName ] = ['constraint ' => $ suggestConstraint , 'index ' => $ suggestIndex ++];
372+ }
373+
362374 foreach ($ version ->getSuggest () as $ link ) {
363375 $ linkPackageName = $ link ->getLinkedPackageName ();
364376 // clear links that have changed/disappeared (for updates)
365- if (!isset ($ suggests [$ linkPackageName ]) || $ suggests [$ linkPackageName ] !== $ link ->getLinkedVersionConstraint ()) {
377+ if (!isset ($ suggests [$ linkPackageName ]) || $ suggests [$ linkPackageName ][ ' constraint ' ] !== $ link ->getLinkedVersionConstraint ()) {
366378 $ version ->getSuggest ()->removeElement ($ link );
367379 $ em ->remove ($ link );
368380 } else {
381+ // Update index if it changed
382+ if ($ link ->getIndex () !== $ suggests [$ linkPackageName ]['index ' ]) {
383+ $ link ->setIndex ($ suggests [$ linkPackageName ]['index ' ]);
384+ }
369385 // clear those that are already set
370386 unset($ suggests [$ linkPackageName ]);
371387 }
372388 }
373389
374- foreach ($ suggests as $ linkPackageName => $ linkPackageConstraint ) {
390+ foreach ($ suggests as $ linkPackageName => $ linkData ) {
375391 $ link = new VersionSuggestLink ();
376392 $ link ->setLinkedPackageName ($ linkPackageName );
377- $ link ->setLinkedVersionConstraint ($ linkPackageConstraint );
393+ $ link ->setLinkedVersionConstraint ($ linkData ['constraint ' ]);
394+ $ link ->setIndex ($ linkData ['index ' ]);
378395 $ version ->addSuggestLink ($ link );
379396 $ link ->setVersion ($ version );
380397 $ em ->persist ($ link );
0 commit comments