From 46af90f36f0d35ff23ab7aa8972d7961cb5185d6 Mon Sep 17 00:00:00 2001 From: Ruairidh MacLeod Date: Tue, 13 Dec 2022 00:07:47 +0000 Subject: [PATCH] wip: read package ID from xml --- pre_commit/languages/dotnet.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/pre_commit/languages/dotnet.py b/pre_commit/languages/dotnet.py index 54e7e15e6..32a4a9ffa 100644 --- a/pre_commit/languages/dotnet.py +++ b/pre_commit/languages/dotnet.py @@ -3,6 +3,8 @@ import contextlib import os.path import re +import xml.etree.ElementTree +import zipfile from typing import Generator from typing import Sequence @@ -58,16 +60,25 @@ def install_environment( ), ) - # Determine tool from the packaged file ..nupkg - # https://learn.microsoft.com/en-us/nuget/concepts/package-versioning#version-basics - tool_name_re = re.compile(r'(.*)\.\d+\.\d+\.\d+(-.*)?\.nupkg') + nupkg_dir = os.path.join(prefix.prefix_dir, build_dir) + nupkgs = [ + x for x in os.listdir(nupkg_dir) + if x.endswith('.nupkg') + ] - build_outputs = os.listdir(os.path.join(prefix.prefix_dir, build_dir)) - for output in build_outputs: + for nupkg in nupkgs: - tool_name_match = tool_name_re.match(output) - assert tool_name_match - tool_name = tool_name_match.group(1) + with zipfile.ZipFile(os.path.join(nupkg_dir, nupkg)) as z: + nuspec = [x for x in z.namelist() if x.endswith('.nuspec')][0] + with z.open(nuspec) as n: + tree = xml.etree.ElementTree.parse(n) + + ns = re.match(r'{.*}', tree.getroot().tag) + assert ns + tool_id_attribute = tree.find(f'.//{ns.group(0)}id') + assert tool_id_attribute + tool_id = tool_id_attribute.text + assert tool_id # Install to bin dir helpers.run_setup_cmd( @@ -76,7 +87,7 @@ def install_environment( 'dotnet', 'tool', 'install', '--tool-path', os.path.join(envdir, BIN_DIR), '--add-source', build_dir, - tool_name, + tool_id, ), )