|
3 | 3 | import argparse |
4 | 4 | import pathlib |
5 | 5 | import pprint |
| 6 | +import tarfile |
6 | 7 | import typing |
| 8 | +import zipfile |
7 | 9 |
|
8 | | -from ._elfdeps import ELFDeps |
| 10 | +from . import _archives, _elfdeps |
| 11 | + |
| 12 | +ZIPEXT = frozenset({".zip", ".whl"}) |
| 13 | +TAREXT = frozenset({".tar", ".tar.gz", ".tgz", ".tar.bz2", "tbz2", "tar.xz", "txz"}) |
9 | 14 |
|
10 | 15 | parser = argparse.ArgumentParser("elfdeps") |
11 | 16 | parser.add_argument("filename", type=pathlib.Path) |
|
56 | 61 | ) |
57 | 62 |
|
58 | 63 |
|
59 | | -def main(argv: typing.Optional[typing.List[str]] = None) -> None: |
| 64 | +def zip_requires( |
| 65 | + filename: pathlib.Path, settings: _elfdeps.ELFAnalyzeSettings |
| 66 | +) -> typing.Iterable[_elfdeps.ELFInfo]: |
| 67 | + with zipfile.ZipFile(filename) as zf: |
| 68 | + for zipinfo in zf.infolist(): |
| 69 | + if zipinfo.filename.endswith(".so"): |
| 70 | + yield _archives.analyze_zipmember(zf, zipinfo, settings=settings) |
| 71 | + |
| 72 | + |
| 73 | +def tar_requires( |
| 74 | + filename: pathlib.Path, settings: _elfdeps.ELFAnalyzeSettings |
| 75 | +) -> typing.Iterable[_elfdeps.ELFInfo]: |
| 76 | + with tarfile.TarFile.open(filename, mode="r:*") as tf: |
| 77 | + for tarinfo in tf.getmembers(): |
| 78 | + if tarinfo.name.endswith(".so"): |
| 79 | + yield _archives.analyze_tarmember(tf, tarinfo, settings=settings) |
| 80 | + |
| 81 | + |
| 82 | +def main(argv: list[str] | None = None) -> None: |
60 | 83 | args = parser.parse_args(argv) |
61 | | - e = ELFDeps( |
62 | | - args.filename, |
| 84 | + settings = _elfdeps.ELFAnalyzeSettings( |
63 | 85 | soname_only=args.soname_only, |
64 | 86 | fake_soname=args.fake_soname, |
65 | 87 | filter_soname=args.filter_soname, |
66 | 88 | require_interp=args.require_interp, |
67 | 89 | unique=args.unique, |
68 | 90 | ) |
| 91 | + filename: pathlib.Path = args.filename |
| 92 | + if filename.suffix in ZIPEXT: |
| 93 | + infos = list(zip_requires(filename, settings=settings)) |
| 94 | + elif filename.suffix in TAREXT: |
| 95 | + infos = list(tar_requires(filename, settings=settings)) |
| 96 | + else: |
| 97 | + infos = [_elfdeps.analyze_file(filename, settings=settings)] |
69 | 98 | if args.provides: |
70 | | - for p in e.info.provides: |
| 99 | + provides = set() |
| 100 | + for info in infos: |
| 101 | + provides.update(info.provides) |
| 102 | + for p in sorted(provides): |
71 | 103 | print(p) |
72 | | - if args.requires: |
73 | | - for r in e.info.requires: |
| 104 | + elif args.requires: |
| 105 | + requires = set() |
| 106 | + for info in infos: |
| 107 | + requires.update(info.requires) |
| 108 | + for r in sorted(requires): |
74 | 109 | print(r) |
75 | | - if not args.requires and not args.provides: |
76 | | - pprint.pprint(e.info) |
| 110 | + else: |
| 111 | + for info in infos: |
| 112 | + pprint.pprint(info) |
77 | 113 |
|
78 | 114 |
|
79 | 115 | if __name__ == "__main__": |
|
0 commit comments