metadata: support virtual manifest
This commit is contained in:
parent
afbee03f26
commit
b746a2ec5c
2 changed files with 47 additions and 6 deletions
|
@ -32,9 +32,7 @@ def main():
|
|||
if len(deps) > 0:
|
||||
print("\n".join(sorted(normalize_deps(deps))))
|
||||
|
||||
for f in files:
|
||||
f = f.rstrip()
|
||||
md = Metadata.from_file(f)
|
||||
def process_metadata(md):
|
||||
if args.name:
|
||||
print(md.name)
|
||||
if args.version:
|
||||
|
@ -67,5 +65,15 @@ def main():
|
|||
if args.test_requires:
|
||||
print_deps(md.dev_dependencies)
|
||||
|
||||
for f in files:
|
||||
f = f.rstrip()
|
||||
mds = Metadata.from_file(f)
|
||||
if isinstance(mds, list):
|
||||
for md in mds:
|
||||
process_metadata(md)
|
||||
else:
|
||||
process_metadata(mds)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
|
@ -3,8 +3,10 @@ __all__ = ["Dependency", "Metadata"]
|
|||
import collections
|
||||
import copy
|
||||
import json
|
||||
import os.path
|
||||
import re
|
||||
import subprocess
|
||||
from urllib.parse import urlparse
|
||||
|
||||
|
||||
Requirement = collections.namedtuple('Requirement', ('kind',
|
||||
|
@ -334,9 +336,40 @@ class Metadata:
|
|||
|
||||
@classmethod
|
||||
def from_file(cls, path):
|
||||
metadata = subprocess.check_output(["cargo", "read-manifest",
|
||||
f"--manifest-path={path}"])
|
||||
return cls.from_json(json.loads(metadata))
|
||||
try:
|
||||
return cls.from_json(Metadata.manifest(path))
|
||||
except subprocess.CalledProcessError:
|
||||
# If fails, we still check that is a workspace
|
||||
members = Metadata.members(path)
|
||||
if members:
|
||||
return [
|
||||
cls.from_json(Metadata.manifest(m)) for m in members
|
||||
]
|
||||
# Is not a workspace? re-raise the exception
|
||||
raise
|
||||
|
||||
@staticmethod
|
||||
def manifest(path):
|
||||
return json.loads(
|
||||
subprocess.check_output(["cargo", "read-manifest",
|
||||
f"--manifest-path={path}"]))
|
||||
|
||||
@staticmethod
|
||||
def metadata(path, deps=False):
|
||||
cmd = ["cargo", "metadata", "--format-version=1",
|
||||
f"--manifest-path={path}"]
|
||||
if not deps:
|
||||
cmd.append("--no-deps")
|
||||
return json.loads(subprocess.check_output(cmd))
|
||||
|
||||
@staticmethod
|
||||
def members(path):
|
||||
members = []
|
||||
metadata = Metadata.metadata(path)
|
||||
for workspace in metadata.get('workspace_members', []):
|
||||
path = re.search(r'\((.*)\)', workspace).group(1)
|
||||
members.append(os.path.join(urlparse(path).path, 'Cargo.toml'))
|
||||
return members
|
||||
|
||||
@property
|
||||
def all_dependencies(self):
|
||||
|
|
Loading…
Reference in a new issue