|
19 | 19 |
|
20 | 20 | from . import builder, version, cfg
|
21 | 21 | from .toml import load_toml, TomlImplementationMissing
|
| 22 | +from .manifest import fixup_meson_varname, CargoLock |
22 | 23 | from ..mesonlib import MesonException, MachineChoice
|
23 | 24 | from .. import coredata, mlog
|
24 | 25 | from ..wrap.wrap import PackageDefinition
|
@@ -48,15 +49,6 @@ class DataclassInstance(Protocol):
|
48 | 49 | )
|
49 | 50 |
|
50 | 51 |
|
51 |
| -def fixup_meson_varname(name: str) -> str: |
52 |
| - """Fixup a meson variable name |
53 |
| -
|
54 |
| - :param name: The name to fix |
55 |
| - :return: the fixed name |
56 |
| - """ |
57 |
| - return name.replace('-', '_') |
58 |
| - |
59 |
| - |
60 | 52 | def _fixup_raw_mappings(d: T.Mapping[str, T.Any], convert_version: bool = True) -> T.MutableMapping[str, T.Any]:
|
61 | 53 | """Fixup raw cargo mappings to ones more suitable for python to consume.
|
62 | 54 |
|
@@ -135,7 +127,7 @@ class Package:
|
135 | 127 | api: str = dataclasses.field(init=False)
|
136 | 128 |
|
137 | 129 | def __post_init__(self) -> None:
|
138 |
| - self.api = _version_to_api(self.version) |
| 130 | + self.api = version.api(self.version) |
139 | 131 |
|
140 | 132 | @classmethod
|
141 | 133 | def from_raw(cls, raw: raw.Package) -> Self:
|
@@ -206,9 +198,9 @@ def __post_init__(self, name: str) -> None:
|
206 | 198 | api = set()
|
207 | 199 | for v in self.version:
|
208 | 200 | if v.startswith(('>=', '==')):
|
209 |
| - api.add(_version_to_api(v[2:].strip())) |
| 201 | + api.add(version.api(v[2:].strip())) |
210 | 202 | elif v.startswith('='):
|
211 |
| - api.add(_version_to_api(v[1:].strip())) |
| 203 | + api.add(version.api(v[1:].strip())) |
212 | 204 | if not api:
|
213 | 205 | self.api = '0'
|
214 | 206 | elif len(api) == 1:
|
@@ -367,18 +359,6 @@ def from_raw(cls, raw: raw.Manifest, path: str = '') -> Self:
|
367 | 359 | )
|
368 | 360 |
|
369 | 361 |
|
370 |
| -def _version_to_api(version: str) -> str: |
371 |
| - # x.y.z -> x |
372 |
| - # 0.x.y -> 0.x |
373 |
| - # 0.0.x -> 0 |
374 |
| - vers = version.split('.') |
375 |
| - if int(vers[0]) != 0: |
376 |
| - return vers[0] |
377 |
| - elif len(vers) >= 2 and int(vers[1]) != 0: |
378 |
| - return f'0.{vers[1]}' |
379 |
| - return '0' |
380 |
| - |
381 |
| - |
382 | 362 | def _dependency_name(package_name: str, api: str, suffix: str = '-rs') -> str:
|
383 | 363 | basename = package_name[:-len(suffix)] if package_name.endswith(suffix) else package_name
|
384 | 364 | return f'{basename}-{api}{suffix}'
|
@@ -805,43 +785,42 @@ def load_wraps(source_dir: str, subproject_dir: str) -> T.List[PackageDefinition
|
805 | 785 | filename = os.path.join(source_dir, 'Cargo.lock')
|
806 | 786 | if os.path.exists(filename):
|
807 | 787 | try:
|
808 |
| - cargolock = T.cast('raw.CargoLock', load_toml(filename)) |
| 788 | + toml = load_toml(filename) |
809 | 789 | except TomlImplementationMissing as e:
|
810 | 790 | mlog.warning('Failed to load Cargo.lock:', str(e), fatal=False)
|
811 | 791 | return wraps
|
812 |
| - for package in cargolock['package']: |
813 |
| - name = package['name'] |
814 |
| - version = package['version'] |
815 |
| - subp_name = _dependency_name(name, _version_to_api(version)) |
816 |
| - source = package.get('source') |
817 |
| - if source is None: |
| 792 | + raw_cargolock = T.cast('raw.CargoLock', toml) |
| 793 | + cargolock = CargoLock.from_raw(raw_cargolock) |
| 794 | + for package in cargolock.package: |
| 795 | + subp_name = _dependency_name(package.name, version.api(package.version)) |
| 796 | + if package.source is None: |
818 | 797 | # This is project's package, or one of its workspace members.
|
819 | 798 | pass
|
820 |
| - elif source == 'registry+https://github.com/rust-lang/crates.io-index': |
821 |
| - checksum = package.get('checksum') |
| 799 | + elif package.source == 'registry+https://github.com/rust-lang/crates.io-index': |
| 800 | + checksum = package.checksum |
822 | 801 | if checksum is None:
|
823 |
| - checksum = cargolock['metadata'][f'checksum {name} {version} ({source})'] |
824 |
| - url = f'https://crates.io/api/v1/crates/{name}/{version}/download' |
825 |
| - directory = f'{name}-{version}' |
| 802 | + checksum = cargolock.metadata[f'checksum {package.name} {package.version} ({package.source})'] |
| 803 | + url = f'https://crates.io/api/v1/crates/{package.name}/{package.version}/download' |
| 804 | + directory = f'{package.name}-{package.version}' |
826 | 805 | wraps.append(PackageDefinition.from_values(subp_name, subproject_dir, 'file', {
|
827 | 806 | 'directory': directory,
|
828 | 807 | 'source_url': url,
|
829 | 808 | 'source_filename': f'{directory}.tar.gz',
|
830 | 809 | 'source_hash': checksum,
|
831 | 810 | 'method': 'cargo',
|
832 | 811 | }))
|
833 |
| - elif source.startswith('git+'): |
834 |
| - parts = urllib.parse.urlparse(source[4:]) |
| 812 | + elif package.source.startswith('git+'): |
| 813 | + parts = urllib.parse.urlparse(package.source[4:]) |
835 | 814 | query = urllib.parse.parse_qs(parts.query)
|
836 | 815 | branch = query['branch'][0] if 'branch' in query else ''
|
837 | 816 | revision = parts.fragment or branch
|
838 | 817 | url = urllib.parse.urlunparse(parts._replace(params='', query='', fragment=''))
|
839 | 818 | wraps.append(PackageDefinition.from_values(subp_name, subproject_dir, 'git', {
|
840 |
| - 'directory': name, |
| 819 | + 'directory': package.name, |
841 | 820 | 'url': url,
|
842 | 821 | 'revision': revision,
|
843 | 822 | 'method': 'cargo',
|
844 | 823 | }))
|
845 | 824 | else:
|
846 |
| - mlog.warning(f'Unsupported source URL in {filename}: {source}') |
| 825 | + mlog.warning(f'Unsupported source URL in {filename}: {package.source}') |
847 | 826 | return wraps
|
0 commit comments