1+ import os
2+ from typing import Optional
13from pathlib import Path
2-
3- from subprocess import check_call
4+ import logging
5+ from subprocess import check_call , check_output , CalledProcessError
46
57from .change_log import main as change_log_main
68
79DEFAULT_DEST_FOLDER = "./dist"
810
11+ _LOGGER = logging .getLogger (__name__ )
12+
13+
914# prefolder: "sdk/compute"; name: "azure-mgmt-compute"
1015def create_package (prefolder , name , dest_folder = DEFAULT_DEST_FOLDER ):
1116 absdirpath = Path (prefolder , name ).absolute ()
@@ -16,7 +21,26 @@ def create_package(prefolder, name, dest_folder=DEFAULT_DEST_FOLDER):
1621 )
1722
1823
19- def change_log_generate (package_name , last_version , tag_is_stable : bool = False ):
24+ def change_log_new (package_folder : str , lastest_pypi_version : bool ) -> str :
25+ cmd = "tox run -c ../../../eng/tox/tox.ini --root . -e breaking -- --changelog "
26+ if lastest_pypi_version :
27+ cmd += "--latest-pypi-version"
28+ try :
29+ output = check_output (cmd , cwd = package_folder , shell = True )
30+ except CalledProcessError as e :
31+ _LOGGER .warning (f"Failed to generate sdk from typespec: { e .output .decode ('utf-8' )} " )
32+ raise e
33+ result = [l for l in output .decode ("utf-8" ).split (os .linesep )]
34+ begin = result .index ("===== changelog start =====" )
35+ end = result .index ("===== changelog end =====" )
36+ if begin == - 1 or end == - 1 :
37+ warn_info = "Failed to get changelog from breaking change detector"
38+ _LOGGER .warning (warn_info )
39+ raise Exception (warn_info )
40+ return "\n " .join (result [begin + 1 : end ]).strip ()
41+
42+
43+ def change_log_generate (package_name , last_version , tag_is_stable : bool = False , * , prefolder : Optional [str ] = None ):
2044 from pypi_tools .pypi import PyPIClient
2145
2246 client = PyPIClient ()
@@ -31,15 +55,27 @@ def change_log_generate(package_name, last_version, tag_is_stable: bool = False)
3155 last_version [- 1 ] = str (last_release )
3256 except :
3357 return "### Other Changes\n \n - Initial version"
34- else :
35- return change_log_main (f"{ package_name } :pypi" , f"{ package_name } :latest" , tag_is_stable )
58+
59+ # try new changelog tool
60+ if prefolder :
61+ try :
62+ return change_log_new (str (Path (prefolder ) / package_name ), not (last_stable_release and tag_is_stable ))
63+ except Exception as e :
64+ _LOGGER .warning (f"Failed to generate changelog with breaking_change_detector: { e } " )
65+
66+ # fallback to old changelog tool
67+ _LOGGER .info ("Fallback to old changelog tool" )
68+ return change_log_main (f"{ package_name } :pypi" , f"{ package_name } :latest" , tag_is_stable )
3669
3770
3871def extract_breaking_change (changelog ):
3972 log = changelog .split ("\n " )
4073 breaking_change = []
41- for i in range (0 , len (log )):
42- if log [i ].find ("Breaking Changes" ) > - 1 :
43- breaking_change = log [min (i + 2 , len (log ) - 1 ) :]
44- break
74+ idx = log .index ("### Breaking Changes" )
75+ if idx > - 1 :
76+ for i in range (idx + 1 , len (log )):
77+ if log [i ].find ("###" ) > - 1 :
78+ break
79+ if log [i ]:
80+ breaking_change .append (log [i ])
4581 return sorted ([x .replace (" - " , "" ) for x in breaking_change ])
0 commit comments