22import sys
33from typing import TypedDict
44
5+ from packaging .version import InvalidVersion
6+
57from commitizen import out
68from commitizen .__version__ import __version__
79from commitizen .config import BaseConfig
810from commitizen .exceptions import NoVersionSpecifiedError , VersionSchemeUnknown
911from commitizen .providers import get_provider
12+ from commitizen .version_increment import VersionIncrement
1013from commitizen .version_schemes import get_version_scheme
1114
1215
1316class VersionArgs (TypedDict , total = False ):
17+ manual_version : str | None
18+ next : str | None
19+
20+ # Exclusive groups 1
1421 commitizen : bool
1522 report : bool
1623 project : bool
1724 verbose : bool
25+
26+ # Exclusive groups 2
1827 major : bool
1928 minor : bool
29+ patch : bool
2030
2131
2232class Version :
@@ -41,24 +51,49 @@ def __call__(self) -> None:
4151 if self .arguments .get ("verbose" ):
4252 out .write (f"Installed Commitizen Version: { __version__ } " )
4353
44- if not self .arguments .get ("commitizen" ) and (
45- self .arguments .get ("project" ) or self .arguments .get ("verbose" )
54+ if self .arguments .get ("commitizen" ):
55+ out .write (__version__ )
56+ return
57+
58+ if (
59+ self .arguments .get ("project" )
60+ or self .arguments .get ("verbose" )
61+ or self .arguments .get ("next" )
62+ or self .arguments .get ("manual_version" )
4663 ):
64+ version_str = self .arguments .get ("manual_version" )
65+ if version_str is None :
66+ try :
67+ version_str = get_provider (self .config ).get_version ()
68+ except NoVersionSpecifiedError :
69+ out .error ("No project information in this project." )
70+ return
4771 try :
48- version = get_provider (self .config ).get_version ()
49- except NoVersionSpecifiedError :
50- out .error ("No project information in this project." )
51- return
52- try :
53- version_scheme = get_version_scheme (self .config .settings )(version )
72+ version_scheme = get_version_scheme (self .config .settings )
5473 except VersionSchemeUnknown :
5574 out .error ("Unknown version scheme." )
5675 return
5776
77+ try :
78+ version = version_scheme (version_str )
79+ except InvalidVersion :
80+ out .error ("Invalid version." )
81+ return
82+
83+ if next_increment_str := self .arguments .get ("next" ):
84+ next_increment = VersionIncrement .safe_cast (next_increment_str )
85+ # TODO: modify the interface of bump to accept VersionIncrement
86+ version = version .bump (increment = str (next_increment )) # type: ignore[arg-type]
87+
5888 if self .arguments .get ("major" ):
59- version = f"{ version_scheme .major } "
60- elif self .arguments .get ("minor" ):
61- version = f"{ version_scheme .minor } "
89+ out .write (version .major )
90+ return
91+ if self .arguments .get ("minor" ):
92+ out .write (version .minor )
93+ return
94+ if self .arguments .get ("patch" ):
95+ out .write (version .micro )
96+ return
6297
6398 out .write (
6499 f"Project Version: { version } "
@@ -67,11 +102,12 @@ def __call__(self) -> None:
67102 )
68103 return
69104
70- if self .arguments .get ("major" ) or self .arguments .get ("minor" ):
71- out .error (
72- "Major or minor version can only be used with --project or --verbose."
73- )
74- return
105+ for argument in ("major" , "minor" , "patch" ):
106+ if self .arguments .get (argument ):
107+ out .error (
108+ f"{ argument } can only be used with MANUAL_VERSION, --project or --verbose."
109+ )
110+ return
75111
76112 # If no arguments are provided, just show the installed commitizen version
77113 out .write (__version__ )
0 commit comments