11from __future__ import annotations
22
33import argparse
4+ import re
5+ import subprocess
46from pathlib import Path
5- from typing import (
6- List ,
7- Tuple ,
8- )
97
108import nox
119from nox import Session
1210
13- from exasol .toolbox import cli
1411from exasol .toolbox .nox ._shared import (
1512 Mode ,
1613 _version ,
1714)
1815from exasol .toolbox .nox .plugin import NoxTasks
1916from exasol .toolbox .release import (
17+ ReleaseTypes ,
2018 Version ,
2119 extract_release_notes ,
2220 new_changelog ,
2927def _create_parser () -> argparse .ArgumentParser :
3028 parser = argparse .ArgumentParser (
3129 prog = "nox -s release:prepare" ,
32- usage = "nox -s release:prepare -- [-h] version " ,
30+ usage = "nox -s release:prepare -- [-h] [-t | --type {major,minor,patch}] " ,
3331 formatter_class = argparse .ArgumentDefaultsHelpFormatter ,
3432 )
3533 parser .add_argument (
36- "version" ,
37- type = cli .version ,
38- help = ("A version string of the following format:" '"NUMBER.NUMBER.NUMBER"' ),
34+ "-t" ,
35+ "--type" ,
36+ type = ReleaseTypes ,
37+ help = "specifies which type of upgrade is to be performed" ,
38+ required = True ,
39+ default = argparse .SUPPRESS ,
3940 )
4041 parser .add_argument (
4142 "--no-add" ,
@@ -89,6 +90,42 @@ def _add_files_to_index(session: Session, files: list[Path]) -> None:
8990 session .run ("git" , "add" , f"{ file } " )
9091
9192
93+ class ReleaseError (Exception ):
94+ """Error during trigger release"""
95+
96+
97+ def _trigger_release () -> Version :
98+ def run (* args : str ):
99+ try :
100+ return subprocess .run (
101+ args , capture_output = True , text = True , check = True
102+ ).stdout
103+ except subprocess .CalledProcessError as ex :
104+ raise ReleaseError (
105+ f"failed to execute command { ex .cmd } \n \n { ex .stderr } "
106+ ) from ex
107+
108+ branches = run ("git" , "remote" , "show" , "origin" )
109+ if not (result := re .search (r"HEAD branch: (\S+)" , branches )):
110+ raise ReleaseError ("default branch could not be found" )
111+ default_branch = result .group (1 )
112+
113+ run ("git" , "checkout" , default_branch )
114+ run ("git" , "pull" )
115+
116+ release_version = Version .from_poetry ()
117+ print (f"release version: { release_version } " )
118+
119+ if re .search (rf"{ release_version } " , run ("git" , "tag" , "--list" )):
120+ raise ReleaseError (f"tag { release_version } already exists" )
121+ if re .search (rf"{ release_version } " , run ("gh" , "release" , "list" )):
122+ raise ReleaseError (f"release { release_version } already exists" )
123+
124+ run ("git" , "tag" , str (release_version ))
125+ run ("git" , "push" , "origin" , str (release_version ))
126+ return release_version
127+
128+
92129@nox .session (name = "release:prepare" , python = False )
93130def prepare_release (session : Session , python = False ) -> None :
94131 """
@@ -97,14 +134,7 @@ def prepare_release(session: Session, python=False) -> None:
97134 parser = _create_parser ()
98135 args = parser .parse_args (session .posargs )
99136
100- if not _is_valid_version (
101- old = (old_version := Version .from_poetry ()),
102- new = (new_version := args .version ),
103- ):
104- session .error (
105- f"Invalid version: the release version ({ new_version } ) "
106- f"must be greater than or equal to the current version ({ old_version } )"
107- )
137+ new_version = Version .upgrade_version_from_poetry (args .type )
108138
109139 if not args .no_branch and not args .no_add :
110140 session .run ("git" , "switch" , "-c" , f"release/prepare-{ new_version } " )
@@ -146,3 +176,9 @@ def prepare_release(session: Session, python=False) -> None:
146176 "--body" ,
147177 '""' ,
148178 )
179+
180+
181+ @nox .session (name = "release:trigger" , python = False )
182+ def trigger_release (session : Session ) -> None :
183+ """trigger an automatic project release"""
184+ print (f"new version: { _trigger_release ()} " )
0 commit comments