@@ -236,6 +236,13 @@ def setup_instparser(instparser):
236
236
"releaseargs" , nargs = argparse .REMAINDER , help = extraargs_help ("pytest" )
237
237
)
238
238
239
+ patchreleaseparser = subparsers .add_parser (
240
+ "update_patch_versions" ,
241
+ help = "Updates version numbers during patch release, used by maintainers and CI" ,
242
+ )
243
+ releaseparser .set_defaults (func = release_args )
244
+ releaseparser .add_argument ("--versions" , required = True )
245
+
239
246
fmtparser = subparsers .add_parser (
240
247
"format" ,
241
248
help = "Formats all source code with black and isort." ,
@@ -599,6 +606,24 @@ def update_dependencies(targets, version, packages):
599
606
)
600
607
601
608
609
+ def update_patch_dependencies (targets , version , prev_version , packages ):
610
+ print ("updating patch dependencies" )
611
+ # PEP 508 allowed specifier operators
612
+ operators = ["==" , "!=" , "<=" , ">=" , "<" , ">" , "===" , "~=" , "=" ]
613
+ operators_pattern = "|" .join (re .escape (op ) for op in operators )
614
+
615
+ for pkg in packages :
616
+ search = rf"({ basename (pkg )} [^,]*)(\s?({ operators_pattern } )\s?)(.*{ prev_version } )"
617
+ print (search )
618
+ replace = r"\1\2 " + version
619
+ update_files (
620
+ targets ,
621
+ "pyproject.toml" ,
622
+ search ,
623
+ replace ,
624
+ )
625
+
626
+
602
627
def update_files (targets , filename , search , replace ):
603
628
errors = False
604
629
for target in targets :
@@ -640,6 +665,27 @@ def release_args(args):
640
665
update_version_files (targets , version , packages )
641
666
642
667
668
+ def patch_release_args (args ):
669
+ print ("preparing patch release" )
670
+
671
+ rootpath = find_projectroot ()
672
+ targets = list (find_targets_unordered (rootpath ))
673
+ cfg = ConfigParser ()
674
+ cfg .read (str (find_projectroot () / "eachdist.ini" ))
675
+ versions = args .versions
676
+ # stable
677
+ mcfg = cfg ["stable" ]
678
+ packages = mcfg ["packages" ].split ()
679
+ print (f"update stable packages to { versions [0 ]} " )
680
+ update_patch_dependencies (targets , versions [0 ], versions [2 ], packages )
681
+
682
+ # prerelease
683
+ mcfg = cfg ["prerelease" ]
684
+ packages = mcfg ["packages" ].split ()
685
+ print (f"update prerelease packages to { versions [1 ]} " )
686
+ update_patch_dependencies (targets , versions [1 ], versions [3 ], packages )
687
+
688
+
643
689
def test_args (args ):
644
690
clean_remainder_args (args .pytestargs )
645
691
execute_args (
0 commit comments