@@ -518,28 +518,6 @@ def normalize_pep440(version):
518518 )
519519 return parser .context ()["norm" ]
520520
521- def _upper (* , epoch = 0 , release , pre = "" , post = "" , dev = "" , local = "" ):
522- epoch = epoch
523- _release = list (release [:- 1 ])
524- pre = pre
525- post = post
526- dev = dev
527- local = local
528-
529- if pre or dev or local :
530- return _new_version (
531- epoch = epoch ,
532- release = release ,
533- )
534-
535- _release [- 1 ] = _release [- 1 ] + 1
536- release = "." .join ([str (d ) for d in _release ])
537-
538- return _new_version (
539- epoch = epoch ,
540- release = release ,
541- )
542-
543521def _pad_zeros (release , n ):
544522 if len (release ) >= n :
545523 return release
@@ -550,35 +528,25 @@ def _pad_zeros(release, n):
550528
551529# TODO @aignas 2025-05-04: add tests for the comparison
552530def _version_eq (left , right ):
531+ if left .is_prefix and right .is_prefix :
532+ fail ("Invalid comparison: both versions cannot be prefix matching" )
533+ if left .is_prefix :
534+ return right .norm .startswith ("{}." .format (left .norm ))
535+ if right .is_prefix :
536+ return left .norm .startswith ("{}." .format (right .norm ))
537+
553538 if left .epoch != right .epoch :
554539 return False
555540
556- if left .is_prefix :
557- right_release = right .release [:len (left .release )]
558- else :
559- ##right_release = _pad_zeros(right.release, len(left.release))
560- right_release = right .release
541+ ##right_release = _pad_zeros(right.release, len(left.release))
542+ right_release = right .release
561543
562- if right .is_prefix :
563- left_release = left .release [:len (right .release )]
564- else :
565- ##left_release = _pad_zeros(left.release, len(right.release))
566- left_release = left .release
544+ ##left_release = _pad_zeros(left.release, len(right.release))
545+ left_release = left .release
567546
568- ##print("left is prefix?", left.is_prefix)
569- ##print("left.release:", left.release, len(left.release))
570- ##print("left_release:", left_release)
571-
572- ##print("right is prefix?", right.is_prefix)
573- ##print("right.release:", right.release, len(right.release))
574- ##print("right_release:", right_release)
575547 if left_release != right_release :
576548 return False
577549
578- print ("is prefix?" , left .is_prefix , right .is_prefix )
579- if left .is_prefix or right .is_prefix :
580- return True
581-
582550 return (
583551 left .pre == right .pre and
584552 left .post == right .post and
@@ -628,7 +596,7 @@ def _version_gt(left, right):
628596
629597 return left .release > right .release
630598
631- def _new_version (* , epoch = 0 , release , pre = "" , post = "" , dev = "" , local = "" , is_prefix = False ):
599+ def _new_version (* , epoch = 0 , release , pre = "" , post = "" , dev = "" , local = "" , is_prefix = False , norm ):
632600 epoch = epoch or 0
633601 _release = tuple ([int (d ) for d in release .split ("." )])
634602 pre = pre or ""
@@ -644,14 +612,7 @@ def _new_version(*, epoch = 0, release, pre = "", post = "", dev = "", local = "
644612 dev = dev ,
645613 local = local ,
646614 is_prefix = is_prefix ,
647- upper = lambda : _upper (
648- epoch = epoch ,
649- release = _release ,
650- pre = pre ,
651- post = post ,
652- dev = dev ,
653- local = local ,
654- ),
615+ norm = norm ,
655616 # TODO @aignas 2025-05-04: add tests for the comparison
656617 eq = lambda x : _version_eq (self , x ), # buildifier: disable=uninitialized
657618 ne = lambda x : not _version_eq (self , x ), # buildifier: disable=uninitialized
@@ -679,7 +640,9 @@ def parse_version(version):
679640 """
680641
681642 parser = _new (version .strip (" .*" )) # PEP 440: Leading and Trailing Whitespace and .*
643+ parser_2 = _new (version .strip (" .*" )) # PEP 440: Leading and Trailing Whitespace and .*
682644 accept (parser , _is ("v" ), "" ) # PEP 440: Preceding v character
645+ accept (parser_2 , _is ("v" ), "" ) # PEP 440: Preceding v character
683646
684647 parts = {}
685648 fns = [
@@ -693,6 +656,7 @@ def parse_version(version):
693656
694657 for p , fn in fns :
695658 fn (parser )
659+ fn (parser_2 )
696660 parts [p ] = parser .context ()["norm" ]
697661 parser .context ()["norm" ] = "" # Clear out the buffer so that it is easy to separate the fields
698662
@@ -708,4 +672,5 @@ def parse_version(version):
708672 # If we fail to parse the version return None
709673 return None
710674
675+ parts ["norm" ] = parser_2 .context ()["norm" ]
711676 return _new_version (** parts )
0 commit comments