@@ -520,9 +520,11 @@ public function getDevVersions(): array
520520 return true ;
521521 }
522522
523+ $ metadata = $ version ->getCurrentMetadata ();
524+
523525 static $ parser = new VersionParser ();
524526
525- return $ version ->hasVersionAlias () && str_ends_with ((string ) $ parser ->normalize ($ version ->getVersionAlias ()), '.9999999-dev ' );
527+ return $ metadata ->hasVersionAlias () && str_ends_with ((string ) $ parser ->normalize ($ metadata ->getVersionAlias ()), '.9999999-dev ' );
526528 });
527529 }
528530
@@ -536,41 +538,46 @@ public function getDevBranchVersions(): array
536538 return array_filter ($ this ->getSortedVersions (), static fn (Version $ version ) => str_starts_with ($ version ->getNormalizedName (), 'dev- ' ));
537539 }
538540
541+ /**
542+ * Sort versions from newest to oldest.
543+ */
539544 public static function sortVersions (Version $ a , Version $ b ): int
540545 {
541- $ aVersion = $ a ->getNormalizedName ();
542- $ bVersion = $ b ->getNormalizedName ();
546+ $ aName = $ a ->getNormalizedName ();
547+ $ bName = $ b ->getNormalizedName ();
543548
544- // use branch alias for sorting if one is provided
545- if (isset ( $ a ->getExtra ()['branch-alias ' ][$ aVersion ]) ) {
546- $ aVersion = Preg::replace ('{(.x)?-dev$} ' , '.9999999-dev ' , $ a -> getExtra ()[ ' branch-alias ' ][ $ aVersion ] );
549+ // Use the branch alias for sorting if one is provided
550+ if (null !== $ aBranchAlias = $ a ->getCurrentMetadata ()-> getExtra ()['branch-alias ' ][$ aName ] ?? null ) {
551+ $ aName = Preg::replace ('{(.x)?-dev$} ' , '.9999999-dev ' , $ aBranchAlias );
547552 }
548- if (isset ( $ b ->getExtra ()['branch-alias ' ][$ bVersion ]) ) {
549- $ bVersion = Preg::replace ('{(.x)?-dev$} ' , '.9999999-dev ' , $ b -> getExtra ()[ ' branch-alias ' ][ $ bVersion ] );
553+ if (null !== $ bBranchAlias = $ b ->getCurrentMetadata ()-> getExtra ()['branch-alias ' ][$ bName ] ?? null ) {
554+ $ bName = Preg::replace ('{(.x)?-dev$} ' , '.9999999-dev ' , $ bBranchAlias );
550555 }
551556
552- $ aVersion = Preg::replace ('{^dev-.*} ' , '0.0.0-alpha ' , $ aVersion );
553- $ bVersion = Preg::replace ('{^dev-.*} ' , '0.0.0-alpha ' , $ bVersion );
557+ $ aName = Preg::replace ('{^dev-.*} ' , '0.0.0-alpha ' , $ aName );
558+ $ bName = Preg::replace ('{^dev-.*} ' , '0.0.0-alpha ' , $ bName );
554559
555- // sort default branch first if it is non numeric
556- if ('0.0.0-alpha ' === $ aVersion && $ a ->isDefaultBranch ()) {
560+ // Sort the default branch first if it is non- numeric
561+ if ('0.0.0-alpha ' === $ aName && $ a ->isDefaultBranch ()) {
557562 return -1 ;
558563 }
559- if ('0.0.0-alpha ' === $ bVersion && $ b ->isDefaultBranch ()) {
564+ if ('0.0.0-alpha ' === $ bName && $ b ->isDefaultBranch ()) {
560565 return 1 ;
561566 }
562567
563- // equal versions are sorted by date
564- if ($ aVersion === $ bVersion ) {
565- // make sure sort is stable
566- if ($ a ->getReleasedAt () === $ b ->getReleasedAt ()) {
567- return $ a ->getNormalizedName () <=> $ b ->getNormalizedName ();
568- }
568+ if ($ aName !== $ bName ) {
569+ return version_compare ($ bName , $ aName );
570+ }
571+
572+ // Equal versions are sorted by release date
573+ $ aReleasedAt = $ a ->getCurrentMetadata ()->getReleasedAt ();
574+ $ bReleasedAt = $ b ->getCurrentMetadata ()->getReleasedAt ();
569575
570- return $ b ->getReleasedAt () > $ a ->getReleasedAt () ? 1 : -1 ;
576+ if (0 !== $ sort = $ bReleasedAt <=> $ aReleasedAt ) {
577+ return $ sort ;
571578 }
572579
573- // the rest is sorted by version
574- return version_compare ( $ bVersion , $ aVersion );
580+ // Add a stable fallback sort
581+ return $ b -> getId () <=> $ a -> getId ( );
575582 }
576583}
0 commit comments