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,53 @@ 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 (f"Invalid version: '{ version_str } '" )
81+ return
82+
83+ if next_increment_str := self .arguments .get ("next" ):
84+ if next_increment_str == "USE_GIT_COMMITS" :
85+ # TODO: implement this
86+ raise NotImplementedError ("USE_GIT_COMMITS is not implemented" )
87+
88+ next_increment = VersionIncrement .safe_cast (next_increment_str )
89+ # TODO: modify the interface of bump to accept VersionIncrement
90+ version = version .bump (increment = str (next_increment )) # type: ignore[arg-type]
91+
5892 if self .arguments .get ("major" ):
59- version = f"{ version_scheme .major } "
60- elif self .arguments .get ("minor" ):
61- version = f"{ version_scheme .minor } "
93+ out .write (version .major )
94+ return
95+ if self .arguments .get ("minor" ):
96+ out .write (version .minor )
97+ return
98+ if self .arguments .get ("patch" ):
99+ out .write (version .micro )
100+ return
62101
63102 out .write (
64103 f"Project Version: { version } "
@@ -67,11 +106,12 @@ def __call__(self) -> None:
67106 )
68107 return
69108
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
109+ for argument in ("major" , "minor" , "patch" ):
110+ if self .arguments .get (argument ):
111+ out .error (
112+ f"{ argument } can only be used with MANUAL_VERSION, --project or --verbose."
113+ )
114+ return
75115
76116 # If no arguments are provided, just show the installed commitizen version
77117 out .write (__version__ )
0 commit comments