diff --git a/scripts/utils/create_package_template.py b/scripts/utils/create_package_template.py index 844e2e17c..e2b4c6afb 100755 --- a/scripts/utils/create_package_template.py +++ b/scripts/utils/create_package_template.py @@ -30,6 +30,32 @@ def package_version(dependency_version): return ".".join(version_segments[:4]) +# Get the package version from common.vm package version +def get_common_vm_version(): + common_vm_path = os.path.join(root_path, "packages", "common.vm") + nuspec_path = os.path.join(common_vm_path, "common.vm.nuspec") + + if os.path.exists(nuspec_path): + with open(nuspec_path, "r") as f: + for line in f: + if "" in line: + return line.split("")[1].split("")[0].strip() + return "0.0.0.20250206" # Default version if version tag is not found + + +# Get the package version from nodejs.vm package version +def get_nodejs_vm_version(): + nodejs_vm_path = os.path.join(root_path, "packages", "nodejs.vm") + nuspec_path = os.path.join(nodejs_vm_path, "nodejs.vm.nuspec") + + if os.path.exists(nuspec_path): + with open(nuspec_path, "r") as f: + for line in f: + if "" in line: + return line.split("")[1].split("")[0].strip() + return "0.0.0.20250219" # Default version if version tag is not found + + UNINSTALL_TEMPLATE_NAME = "chocolateyuninstall.ps1" INSTALL_TEMPLATE_NAME = "chocolateyinstall.ps1" @@ -37,6 +63,8 @@ def package_version(dependency_version): Needs the following format strings: pkg_name="...", version="...", authors="...", description="..." """ +COMMON_PACKAGE_VERSION = get_common_vm_version() +NODEJS_PACKAGE_VERSION = get_nodejs_vm_version() NUSPEC_TEMPLATE_NAME = "{}.vm.nuspec" NUSPEC_TEMPLATE = r""" @@ -46,7 +74,7 @@ def package_version(dependency_version): {authors} {description} - + {category} @@ -61,8 +89,8 @@ def package_version(dependency_version): {authors} {description} - - + + {category} @@ -77,7 +105,7 @@ def package_version(dependency_version): {authors} {description} - + {category} @@ -97,7 +125,7 @@ def package_version(dependency_version): {authors} {description} - + {category} @@ -393,6 +421,8 @@ def create_template( console_app="", inner_folder="", arguments="", + common_version=COMMON_PACKAGE_VERSION, + nodejs_version=NODEJS_PACKAGE_VERSION, ): pkg_path = os.path.join(packages_path, f"{pkg_name}.vm") try: @@ -416,6 +446,8 @@ def create_template( dependency=dependency, dependency_version=version, category=category, + common_version=common_version, + nodejs_version=nodejs_version, ) ) @@ -430,6 +462,8 @@ def create_template( shim_path=shim_path, console_app=console_app, inner_folder=inner_folder, + common_version=common_version, + nodejs_version=nodejs_version, ) ) diff --git a/scripts/utils/update_package.py b/scripts/utils/update_package.py index fd4215645..ca97e7740 100755 --- a/scripts/utils/update_package.py +++ b/scripts/utils/update_package.py @@ -269,11 +269,11 @@ def update_version_url(package): # Update dependencies -# Metapackages have only one dependency and same name (adding `.vm`) and version as the dependency +# Metapackages have only one dependency and same name (adding `.vm`) and version as the dependency def update_dependencies(package): nuspec_path, content = get_nuspec(package) matches = re.findall( - r'[^"\']+)["\'] version="\[(?P[^"\']+)\]" */>', content + r'[^"\']+)["\']\s+version=["\']\[(?P[^"\']+)\]["\'] */>', content ) updates = False @@ -303,6 +303,38 @@ def update_dependencies(package): return None +# Update metapackage dependencies +# Metapackages have only one dependency and same name (adding `.vm`) and version as the dependency +def update_metapackage_dependencies(package): + nuspec_path, content = get_nuspec(package) + matches = re.findall( + r'[^"\']+)["\']\s+(?:version=["\'](?P[^"\'\[\]]+)["\'] *)?/>', content + ) + + updates = False + for dependency, version in matches: + stream = os.popen(f"powershell.exe choco find -er {dependency}") + output = stream.read() + # ignore case to also find dependencies like GoogleChrome + m = re.search(rf"^{dependency}\|(?P.+)", output, re.M | re.I) + if m: + latest_version = m.group("version") + if latest_version != version: + if version is not None: + pattern = rf'' + else: + pattern = rf'' + content = re.sub( + pattern, + f'', + content, + ) + updates = True + if updates: + with open(nuspec_path, "w") as file: + file.write(content) + + # Update package which uses a generic URL that has no version def update_dynamic_url(package): version = get_version_from_nuspec(package) @@ -416,7 +448,10 @@ def from_str(string): is_install_script_present = check_install_script_present(args.package_name) latest_version = None + if args.update_type & UpdateType.DEPENDENCIES: + # Update dependencies first, as it is required for other updates + update_metapackage_dependencies(args.package_name) latest_version = update_dependencies(args.package_name) if is_install_script_present: