Metadata-Version: 2.1
Name: kyrpmtools
Version: 1.0.0
Summary: RPM dependency analysis toolkit
Author: kyrpmtools
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: NOTICE

# kyrpmtools - RPM 依赖分析工具

## 项目简介

`kyrpmtools` 是麒麟软件系统架构部开发的 RPM 依赖分析工具，基于系统 YUM/DNF 仓库元数据（`python3-dnf`）和 RPM 版本比较能力（`python3-rpm`），为操作系统版本管理和仓库维护提供强大的依赖分析能力。

### 解决痛点

- **依赖关系复杂**：操作系统包含数千个 RPM 包，依赖关系错综复杂，难以人工分析
- **仓库维护困难**：移除某个包时，无法快速判断会影响哪些其他包，容易破坏仓库自洽性
- **开发环境搭建繁琐**：构建某个软件时，需要手动查找所有依赖包，耗时易错

### 核心价值

- **自动化依赖分析**：一键查询任意包的完整依赖链和反向依赖链
- **影响评估**：精确计算移除某包后为保持仓库自洽需要连带移除的所有包
- **开发效率提升**：自动生成开发环境所需的依赖闭包列表，支持可视化依赖图

### 功能概览

- 依赖链查询（递归到无依赖为止）
- 被依赖链查询（反向依赖，递归）
- "从仓库移除某包"的影响分析：为了保持仓库自洽，需要连带移除哪些包
- 仓库全量矩阵：对仓库内每个包，输出"移除它还需要移除哪些包"

## 功能特性

- `kyrpmtools deps <pkg>`：依赖链（Requires -> providers）
- `kyrpmtools rdeps <pkg>`：被依赖链（反向依赖）
- `kyrpmtools impact <pkg>`：移除影响（安装/编译依赖：递归求解需要一起移除的闭包，并评估受影响源码包）
- `kyrpmtools repo-impact`：仓库全量移除矩阵（每个包 -> whatrequires/weak deps/build 影响 + 移除建议）
- `kyrpmtools devbox <pkg>`：生成依赖闭包列表（用于构建开发环境安装列表；支持 `--format dot/svg` 输出依赖图）

## 安装

```bash
cd kyrpmtools
pip install -e .
```

运行依赖：
- `python3-dnf`
- `python3-rpm`

默认读取系统已启用的 yum/dnf repo；也可用 `--repo baseos,appstream` 仅启用指定 repo。

## 使用方法

### 依赖查询

```bash
# 查询依赖链（递归）
kyrpmtools deps ffmpeg --repo baseos,appstream

# 对每个依赖列出所有可提供者（更大更慢）
kyrpmtools deps ffmpeg --all-providers

# 导出 JSON（树结构）
kyrpmtools deps ffmpeg --json-out dep_tree.json
```

### 被依赖链（反向依赖）

```bash
kyrpmtools rdeps glibc --repo baseos

# 仅显示“强依赖”：某个 Requires 只能由该包提供时才算依赖
kyrpmtools rdeps glibc --strict
```

### 移除影响（自洽闭包）

```bash
# 分析移除一个包后，为了保持仓库自洽还需要移除哪些包
kyrpmtools impact ffmpeg --repo appstream --show

# 输出触发原因（哪个 Requires 被满足不了）
kyrpmtools impact ffmpeg --explain --show

# 同时输出“编译影响”（哪些源码包因 BuildRequires 无法满足而无法构建）
kyrpmtools impact ffmpeg --scope both --show

# 若出现 “[警告] SRPM 仓库自身已不自洽”，可配合 --show/--explain 输出基线不可构建源码包及原因
kyrpmtools impact ffmpeg --scope build --show --explain

# SRPM 在独立仓库时，额外指定 SRPM repo id（不会影响二进制依赖分析的 repo 选择）
kyrpmtools impact ffmpeg --repo appstream --srcrepo source --scope both --show

# 导出 JSON
kyrpmtools impact ffmpeg --json-out impact.json

# repo-impact 导出 CSV（默认 8 列；首列为 srcpkg；可用 --include-recommends 增加 whatrecommends 列）
kyrpmtools repo-impact --repo appstream --srcrepo source --format csv --out repo-impact.csv
```

## 命令行参数

### kyrpmtools deps

```
usage: kyrpmtools deps [-h] [--repo REPO] [--all-arches] [--all-providers] [--max-depth MAX_DEPTH] [--json-out JSON_OUT] pkg
```

### kyrpmtools rdeps

```
usage: kyrpmtools rdeps [-h] [--repo REPO] [--all-arches] [--strict] [--max-depth MAX_DEPTH] [--json-out JSON_OUT] pkg
```

### kyrpmtools impact

```
usage: kyrpmtools impact [-h] [--repo REPO] [--all-arches] [--srcrepo SRCREPO] [--scope {install,build,both,all}] [--show] [--explain] [--json-out [JSON_OUT]] pkg
```

### kyrpmtools repo-impact

```
usage: kyrpmtools repo-impact [-h] [--repo REPO] [--all-arches] [--srcrepo SRCREPO] [--pattern PATTERN] [--max-packages MAX_PACKAGES] [--top TOP] [--format {lines,json,csv}] [--include-recommends] [--out OUT] [--blacklist BLACKLIST] [--json-out JSON_OUT]
```

repo-impact 支持输出 CSV：`--format csv --out <file>`（默认 8 列；首列 srcpkg；加 `--include-recommends` 变为 9 列）。

### kyrpmtools devbox

```
usage: kyrpmtools devbox [-h] [--repo REPO] [--all-arches] [--max-depth MAX_DEPTH] [--all-providers] [--graph-type {dependency,dependent}] [--graph-mode {tree,all}] [--no-root] [--format {list,dnf,json,dot,svg}] [--json-out JSON_OUT] [--dot-out DOT_OUT] [--svg-out SVG_OUT] pkg
```

## 仓库数据

- 默认使用系统已启用的 yum/dnf 仓库。

## 项目结构

```
kyrpmtools/
├── kyrpmtools/           # 核心库
│   ├── __init__.py
│   ├── repo.py            # 从 DNF repo 构建依赖模型
│   ├── analyze.py         # deps/rdeps/impact 算法
│   └── cli.py             # CLI 子命令
├── docs/
│   └── kyrpmtools-technical.md  # 技术方案与可行性分析
├── setup.py              # 安装脚本
├── kyrpmtools.spec        # RPM spec（单独使用）
└── README.md             # 本文档
```

## 许可证

MIT License
