Extract man pages from the downloaded dump files.
(args)
| 130 | |
| 131 | |
| 132 | def cmd_extract(args): |
| 133 | """Extract man pages from the downloaded dump files.""" |
| 134 | for cmd in ["zstd"]: |
| 135 | if subprocess.run(["which", cmd], capture_output=True).returncode != 0: |
| 136 | logger.error("Required command '%s' not found. Please install it.", cmd) |
| 137 | sys.exit(1) |
| 138 | |
| 139 | data_dir = args.data_dir |
| 140 | distro = args.distro.lower() |
| 141 | |
| 142 | # Check that dump files exist |
| 143 | for fname in ALL_FILES: |
| 144 | zst_path = os.path.join(data_dir, fname) |
| 145 | if not os.path.exists(zst_path): |
| 146 | logger.error("Missing dump file: %s. Run 'download' first.", zst_path) |
| 147 | sys.exit(1) |
| 148 | |
| 149 | # Decompress metadata files (small ones, skip contents) |
| 150 | metadata_files = [f for f in ALL_FILES if f != "contents.tsv.zst"] |
| 151 | for fname in metadata_files: |
| 152 | decompress_zst(os.path.join(data_dir, fname)) |
| 153 | |
| 154 | # Parse sections filter |
| 155 | sections = None |
| 156 | if args.sections: |
| 157 | sections = set(args.sections.split(",")) |
| 158 | logger.info("Filtering to sections: %s", sections) |
| 159 | |
| 160 | # Load metadata |
| 161 | logger.info("=== Loading metadata ===") |
| 162 | systems, english_locale_ids, mans, packages, pkg_versions = load_metadata(data_dir) |
| 163 | |
| 164 | # Find matching system IDs for the requested distro |
| 165 | distro_systems = {} # sys_id -> (name, release, short) |
| 166 | for sys_id, (name, release, short) in systems.items(): |
| 167 | if distro in name.lower(): |
| 168 | distro_systems[sys_id] = (name, release, short) |
| 169 | if not distro_systems: |
| 170 | available = sorted(set(name.lower() for name, _, _ in systems.values())) |
| 171 | logger.error( |
| 172 | "No systems found matching distro '%s'. Available: %s", distro, available |
| 173 | ) |
| 174 | sys.exit(1) |
| 175 | |
| 176 | # Filter by release |
| 177 | release = args.release |
| 178 | if release == "latest": |
| 179 | # Pick the latest release by sorting version strings |
| 180 | releases = set(r for _, r, _ in distro_systems.values() if r) |
| 181 | if not releases: |
| 182 | # Rolling-release distro (e.g. Arch Linux) — no versioned releases. |
| 183 | # Use "latest" as a synthetic release label so the on-disk layout |
| 184 | # keeps the distro/release/section/file.gz convention expected by |
| 185 | # source_from_path(). |
| 186 | release = "latest" |
| 187 | logger.info("Rolling-release distro, using 'latest' as release label") |
| 188 | else: |
| 189 | release = sorted(releases, key=parse_version)[-1] |
no test coverage detected