Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 39 additions & 5 deletions scripts/utils/create_package_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,41 @@ 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 "<version>" in line:
return line.split("<version>")[1].split("</version>")[0].strip()
return "0.0.0.20250206" # Default version if version tag is not found
Copy link

Copilot AI Sep 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The hardcoded default version should be a constant or configuration value to avoid magic numbers and ensure consistency across the codebase.

Copilot uses AI. Check for mistakes.


# 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 "<version>" in line:
return line.split("<version>")[1].split("</version>")[0].strip()
return "0.0.0.20250219" # Default version if version tag is not found
Copy link

Copilot AI Sep 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The hardcoded default version should be a constant or configuration value to avoid magic numbers and ensure consistency across the codebase.

Copilot uses AI. Check for mistakes.


UNINSTALL_TEMPLATE_NAME = "chocolateyuninstall.ps1"
INSTALL_TEMPLATE_NAME = "chocolateyinstall.ps1"

"""
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"""<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
Expand All @@ -46,7 +74,7 @@ def package_version(dependency_version):
<authors>{authors}</authors>
<description>{description}</description>
<dependencies>
<dependency id="common.vm" version="0.0.0.20250206" />
<dependency id="common.vm" version="{common_version}" />
</dependencies>
<tags>{category}</tags>
</metadata>
Expand All @@ -61,8 +89,8 @@ def package_version(dependency_version):
<authors>{authors}</authors>
<description>{description}</description>
<dependencies>
<dependency id="common.vm" version="0.0.0.20250206" />
<dependency id="nodejs.vm" version="0.0.0.20250730" />
<dependency id="common.vm" version="{common_version}" />
<dependency id="nodejs.vm" version="{nodejs_version}" />
</dependencies>
<tags>{category}</tags>
</metadata>
Expand All @@ -77,7 +105,7 @@ def package_version(dependency_version):
<authors>{authors}</authors>
<description>{description}</description>
<dependencies>
<dependency id="common.vm" version="0.0.0.20250206" />
<dependency id="common.vm" version="{common_version}" />
<dependency id="python3.vm" />
</dependencies>
<tags>{category}</tags>
Expand All @@ -97,7 +125,7 @@ def package_version(dependency_version):
<authors>{authors}</authors>
<description>{description}</description>
<dependencies>
<dependency id="common.vm" version="0.0.0.20250206" />
<dependency id="common.vm" version="{common_version}" />
<dependency id="{dependency}" version="[{dependency_version}]" />
</dependencies>
<tags>{category}</tags>
Expand Down Expand Up @@ -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:
Expand All @@ -416,6 +446,8 @@ def create_template(
dependency=dependency,
dependency_version=version,
category=category,
common_version=common_version,
nodejs_version=nodejs_version,
)
)

Expand All @@ -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,
)
)

Expand Down
39 changes: 37 additions & 2 deletions scripts/utils/update_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'<dependency id=["\'](?P<dependency>[^"\']+)["\'] version="\[(?P<version>[^"\']+)\]" */>', content
r'<dependency id=["\'](?P<dependency>[^"\']+)["\']\s+version=["\']\[(?P<version>[^"\']+)\]["\'] */>', content
)

updates = False
Expand Down Expand Up @@ -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'<dependency id=["\'](?P<dependency>[^"\']+)["\']\s+(?:version=["\'](?P<version>[^"\'\[\]]+)["\'] *)?/>', 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<version>.+)", output, re.M | re.I)
if m:
latest_version = m.group("version")
if latest_version != version:
if version is not None:
pattern = rf'<dependency id="{dependency}"\s+version=["\']{re.escape(version)}["\']\s*/>'
else:
pattern = rf'<dependency id="{dependency}"\s*/>'
content = re.sub(
pattern,
f'<dependency id="{dependency}" version="{latest_version}" />',
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)
Expand Down Expand Up @@ -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:
Expand Down
Loading