1
+ from __future__ import annotations
2
+
1
3
import argparse
2
4
import subprocess
3
5
import sys
4
6
from pathlib import Path
5
- from typing import Any
7
+ from typing import TYPE_CHECKING , Any , cast
6
8
7
9
import parver
8
10
from rich .console import Console
9
11
12
+ if TYPE_CHECKING :
13
+ from parver ._typing import PreTag
14
+
10
15
_console = Console (highlight = False )
11
16
_err_console = Console (stderr = True , highlight = False )
12
17
@@ -21,42 +26,37 @@ def echo(*args: str, err: bool = False, **kwargs: Any):
21
26
PROJECT_DIR = Path (__file__ ).parent .parent
22
27
23
28
24
- def get_current_version ():
25
- from pdm .pep517 .base import Builder
26
-
27
- metadata = Builder (PROJECT_DIR ).meta
28
- return metadata .version
29
+ def get_current_version () -> str :
30
+ return subprocess .check_output (["git" , "describe" , "--abbrev=0" , "--tags" ], cwd = PROJECT_DIR ).decode ().strip ()
29
31
30
32
31
- def bump_version (pre = None , major = False , minor = False , patch = True ):
32
- if not any ([major , minor , patch , pre ]):
33
- patch = True
34
- if len ([v for v in [major , minor , patch ] if v ]) > 1 :
35
- echo (
36
- "Only one option should be provided among (--major, --minor, --patch)" ,
37
- style = "red" ,
38
- err = True ,
39
- )
33
+ def bump_version (pre : str | None = None , major : bool = False , minor : bool = False ) -> str :
34
+ if major and minor :
35
+ echo ("Only one option should be provided among (--major, --minor)" , style = "red" , err = True )
40
36
sys .exit (1 )
41
37
current_version = parver .Version .parse (get_current_version ())
42
38
if major or minor :
43
- version_idx = [major , minor , patch ].index (True )
39
+ version_idx = [major , minor ].index (True )
44
40
version = current_version .bump_release (index = version_idx )
45
- else :
41
+ elif pre is not None and current_version . is_prerelease :
46
42
version = current_version
47
- if pre :
48
- if version .pre_tag == pre :
49
- pass
43
+ else :
44
+ version = current_version .bump_release (index = 2 )
45
+ if pre is not None :
46
+ if version .pre_tag != pre :
47
+ version = version .replace (pre_tag = cast ("PreTag" , pre ), pre = 0 )
50
48
else :
51
- version = version .replace ( pre_tag = pre , pre = 0 )
49
+ version = version .bump_pre ( )
52
50
else :
53
51
version = version .replace (pre = None , post = None )
54
52
version = version .replace (local = None , dev = None )
55
53
return str (version )
56
54
57
55
58
- def release (dry_run = False , commit = True , pre = None , major = False , minor = False , patch = True ):
59
- new_version = bump_version (pre , major , minor , patch )
56
+ def release (
57
+ dry_run : bool = False , commit : bool = True , pre : str | None = None , major : bool = False , minor : bool = False
58
+ ) -> None :
59
+ new_version = bump_version (pre , major , minor )
60
60
echo (f"Bump version to: { new_version } " , style = "yellow" )
61
61
if dry_run :
62
62
subprocess .check_call (["towncrier" , "build" , "--version" , new_version , "--draft" ])
@@ -82,14 +82,13 @@ def parse_args(argv=None):
82
82
help = "Do not commit to Git" ,
83
83
)
84
84
group = parser .add_argument_group (title = "version part" )
85
- group .add_argument ("--pre" , help = "Pre tag" )
85
+ group .add_argument ("--pre" , help = "Bump with the pre tag" , choices = [ "a" , "b" , "rc" ] )
86
86
group .add_argument ("--major" , action = "store_true" , help = "Bump major version" )
87
87
group .add_argument ("--minor" , action = "store_true" , help = "Bump minor version" )
88
- group .add_argument ("--patch" , action = "store_true" , help = "Bump patch version" )
89
88
90
89
return parser .parse_args (argv )
91
90
92
91
93
92
if __name__ == "__main__" :
94
93
args = parse_args ()
95
- release (args .dry_run , args .commit , args .pre , args .major , args .minor , args . patch )
94
+ release (args .dry_run , args .commit , args .pre , args .major , args .minor )
0 commit comments