33# Utility for viewing and managing versions of cargo workspaces and crates.
44# For workspaces, it assumes that all crate members use a single shared version.
55#
6- # usage: cargo-version.py [-h] [-p PROJECT] [-r] [-n {major,minor,patch}] [-s SET] [-o]
6+ # usage: cargo-version.py [-h] [-p PROJECT] [-r] [-n {major,minor,patch}] [-s SET] [-o] [-m PRERELEASE]
77#
88# Change versions of cargo projects.
99#
1616# Version
1717# -s SET, --set SET Version
1818# -o, --show Version
19+ # -m PRERELEASE, --prerelease PRERELEASE
20+ # Set pre-prelease string.
1921#
2022
2123import toml
@@ -49,6 +51,11 @@ def bump_level(cls, version, level):
4951 else :
5052 return str (v .bump_prerelease ('nightly' ))[:- 2 ] ### remove the .1 suffix that semver always adds to the prererelease.
5153
54+ @classmethod
55+ def prerelease (cls , version , prerelease ):
56+ v = semver .VersionInfo .parse (version )
57+ return str (semver .VersionInfo (v .major , v .minor , v .patch , prerelease ))
58+
5259 def finalize_version (self ):
5360 return Crate (self .path , self .name , Crate .finalize (self .version ), self .dependencies .copy ())
5461
@@ -58,6 +65,9 @@ def bump_version(self, level):
5865 def set_version (self , version ):
5966 return Crate (self .path , self .name , version , self .dependencies .copy ())
6067
68+ def set_prerelease (self , prerelease ):
69+ return Crate (self .path , self .name , Crate .prerelease (self .version , prerelease ), self .dependencies .copy ())
70+
6171 def next_version (self ):
6272 return Crate (self .path , self .name , str (semver .VersionInfo .parse (self .version ).next_version ('patch' )), self .dependencies .copy ())
6373
@@ -100,6 +110,10 @@ def set_version(self, version):
100110 crates = {c .name : c .set_version (version ) for c in self .crates .values ()}
101111 return Workspace (Workspace .update_dependencies (crates ).values ())
102112
113+ def set_prerelease (self , prerelease ):
114+ crates = {c .name : c .set_prerelease (prerelease ) for c in self .crates .values ()}
115+ return Workspace (Workspace .update_dependencies (crates ).values ())
116+
103117 def next_version (self ):
104118 crates = {c .name : c .next_version () for c in self .crates .values ()}
105119 return Workspace (Workspace .update_dependencies (crates ).values ())
@@ -137,6 +151,7 @@ def parse_args():
137151 parser .add_argument ("-n" , "--next" , help = "Version" , choices = ['major' , 'minor' , 'patch' ])
138152 parser .add_argument ("-s" , "--set" , help = "Version" )
139153 parser .add_argument ("-o" , "--show" , help = "Version" , action = "store_true" )
154+ parser .add_argument ("-m" , "--prerelease" , help = "Set pre-prelease string." )
140155 return parser .parse_args ()
141156
142157if __name__ == "__main__" :
@@ -155,6 +170,9 @@ def parse_args():
155170 semver .VersionInfo .parse (args .set )
156171 new = old .set_version (args .set )
157172 new .save (old )
173+ elif args .prerelease :
174+ new = old .set_prerelease (args .prerelease )
175+ new .save (old )
158176 elif args .show :
159177 print (old .show_version ())
160178
0 commit comments