ebranch - Man Page
Cross-branch porting: build order, branch requests, update checks, Bodhi karma
Synopsis
Description
Cross-branch porting: build order, branch requests, update checks, Bodhi karma
Options
- -h, --help
Print help
- -V, --version
Print version
Commands
ebranch check-crate
ebranch check-crate [-b|--branch] [-r|--repo] [-t|--transitive] [--exclude-dev] [--include-optional] [--exclude-unmet] [--exclude] [--copr] [--dot] [--json] [--koji] [--toml] [--refresh] [-v|--verbose] [-j|--jobs] [-h|--help] <NAME> [VERSION]
Analyze a crates.io crate's dependencies
- -b, --branch <BRANCH>
Target branch (e.g. epel9, rawhide)
- -r, --repo <REPO>
Repository class for the branch (fedrq -r)
- -t, --transitive
Expand missing deps transitively
- --exclude-dev
Exclude dev dependencies from transitive expansion
- --include-optional
Include optional dependencies in transitive expansion
- --exclude-unmet
Exclude unmet-version dependencies (packaged, but too old for the requirement) from transitive expansion. They are included by default: omitting them silently under-reports what needs (re)building.
- --exclude <CRATE,...>
Exclude crates from transitive expansion
- --copr
Generate a shell script for Copr batch builds.
The script accepts the Copr repo as its first argument, followed by any extra flags to pass to copr build-package.
- --dot
Output dependency graph in Graphviz DOT format
- --json
Machine-readable JSON output
- --koji
Output build-order as a Koji chain build string
- --toml <PATH>
Write analysis to a TOML file
- --refresh
Clear fedrq + libdnf5 repo metadata caches before querying
- -v, --verbose
Print progress to stderr
- -j, --jobs <JOBS>
Parallel fedrq queries (0 = CPUs)
- -h, --help
Print help (see a summary with '-h')
- <NAME>
Crate name on crates.io
- [VERSION]
Crate version (default: latest)
ebranch check-pkg-reviews
ebranch check-pkg-reviews [--bugzilla-url] [--api-key] [--dry-run] [-v|--verbose] [-h|--help] <TOML>
Find and link Bugzilla package review requests
- --bugzilla-url <BUGZILLA_URL> [default: https://bugzilla.redhat.com]
Bugzilla base URL
- --api-key <API_KEY>
Bugzilla API key (or set BUGZILLA_API_KEY env var)
May also be specified with the BUGZILLA_API_KEY environment variable.- --dry-run
Show changes without applying them
- -v, --verbose
Print progress to stderr
- -h, --help
Print help
- <TOML>
Path to TOML analysis file from check-crate --toml
ebranch check-update
ebranch check-update [-b|--branch] [-r|--repo] [--testing-branch] [--koji-profile] [--json] [--detailed] [-v|--verbose] [--refresh] [-j|--jobs] [--give-karma] [--comment] [-y|--yes] [--submit] [--notes] [--notes-file] [--type] [--severity] [--bug] [--stable-karma] [--unstable-karma] [--disable-autokarma] [-h|--help] <INPUT>
Check if an update would break reverse dependencies
- -b, --branch <BRANCH>
Branch to check against (e.g. epel9).
Auto-detected from the input: the Bodhi release for an update alias, or the name of a Fedora side tag (f43-build-side-* uses f43). EPEL side tags are not inferred: pass a base branch plus the EPEL repo, e.g. -b al9 -r @epel (epel9) or -b c10s -r @epel (epel10).
- -r, --repo <REPO>
Repository class for the branch (fedrq -r).
Defaults to the branch's stable base repos, which is the correct comparison baseline. Override only for special cases, e.g. -r @epel for EPEL side tags (paired with a base branch like -b al9).
- --testing-branch <TESTING_BRANCH>
Override branch for the new-provides queries: @testing for Bodhi updates, and the chroot selection for COPR input (epel9 → epel-9-*).
Auto-detected for EPEL side tags (e.g. epel9-build-side-* uses epel9). Otherwise defaults to --branch.
- --koji-profile <KOJI_PROFILE>
Koji CLI profile (e.g. cbs for CentOS)
- --json
Machine-readable JSON output
- --detailed
Show full lists (every package, Provide, and reverse dep) instead of counts plus the actionable problems.
- -v, --verbose
Print progress to stderr
- --refresh
Clear fedrq + libdnf5 repo metadata caches before querying
- -j, --jobs <JOBS>
Parallel fedrq queries (0 = CPUs)
- --give-karma
Cast karma on the Bodhi update. The check result suggests the value (+1 when no issues are found, -1 when reverse deps break or the updated packages have unsatisfied deps, 0 when the analysis was incomplete); you are prompted with that suggestion as the default. Requires a Bodhi update alias or URL as input. Reuses the bodhi CLI's login session, starting an interactive login first if there is none.
Listed bugs get per-bug feedback: update-request bugs ("<pkg>-<version> is available") are auto-voted +1 when the update delivers at least the requested version and -1 otherwise; for other bugs you are prompted. The full plan is shown for confirmation before posting.
- --comment <COMMENT>
Reviewer notes added as a section near the top of the posted report (with --give-karma, or the review comment --submit posts after creating the update). Prompted for interactively when omitted; --yes skips the prompt.
- -y, --yes
Skip vote/submit confirmations; non-update bugs get 0
- --submit
Submit the side tag as a Bodhi update once the check passes: creates the update from the tag (the API behind `bodhi updates new --from-tag`) after showing the plan — packages, type, bugs, karma thresholds, notes — for confirmation, so an accidentally missing package is caught before anything is published. Requires a Koji side tag as input and update notes via --notes or --notes-file. Reuses the bodhi CLI's login session, starting an interactive login first if there is none.
After submitting, the check report is posted on the new update as a review comment with per-bug feedback (whether each listed bug is addressed by the delivered versions) — the --give-karma flow; Bodhi zeroes the submitter's own overall karma, but per-bug feedback still counts.
When the check does NOT pass cleanly you can curate the findings (keep/explain/remove) like --give-karma; if findings are kept you are asked whether to submit anyway (default no). Non-interactive runs and --yes never submit a failing update.
- --notes <NOTES>
Update notes/description (inline)
- --notes-file <PATH>
Read the update notes from a file
- --type <TYPE> [default: bugfix]
Type: bugfix, enhancement, security, newpackage
- --severity <LEVEL>
Update severity: unspecified (default), low, medium, high, or urgent. Bodhi requires a real severity for --type security.
- --bug <ID>
Bug ID(s) to associate and close (repeated or CSV)
- --stable-karma <N> [default: 3]
Karma needed to push stable (default 3)
- --unstable-karma <N> [default: -3]
Negative karma that unpushes (default -3)
- --disable-autokarma
Don't auto-push at the karma thresholds
- -h, --help
Print help (see a summary with '-h')
- <INPUT>
The update to check, one of: - a Koji side tag (f45-build-side-143123) - a Bodhi update alias or URL
(FEDORA-EPEL-2026-f9eaa11e18) - a COPR project: owner/project spec
(@rust/uutils-and-nushell) or its URL. COPR
input requires -b, and --testing-branch when
-b is a base branch like al9 (it picks the
COPR chroot, e.g. epel9 → epel-9-*).
ebranch config
Set up Bugzilla API key and other settings
- -h, --help
Print help
ebranch escalate
ebranch escalate [--bugzilla-url] [--api-key] [--fas] [--sig] [--base-branch] [--dry-run] [-v|--verbose] [-h|--help] <TOML> <BRANCH>
Escalate (needinfo) stale branch requests in a report
- --bugzilla-url <BUGZILLA_URL> [default: https://bugzilla.redhat.com]
Bugzilla base URL
- --api-key <API_KEY>
Bugzilla API key (defaults to BUGZILLA_API_KEY env var or the key from `ebranch config`)
May also be specified with the BUGZILLA_API_KEY environment variable.- --fas <FAS>
FAS of the reporter, if willing to co-maintain
- --sig <SIG>
Packaging SIG to offer as co-maintainer (requires --fas)
- --base-branch <BRANCH>
Base-distro branch behind the EPEL branch, checked before filing: a package present in the base distro is skipped (EPEL must not replace it; the request would be CANTFIX).
Inferred from the branch: epel10 uses c10s, epel9 uses al9. Pass this to override the mapping or to enable the check for branches it can't infer (e.g. epel8).
- --dry-run
Show what would happen without contacting Bugzilla
- -v, --verbose
Print progress to stderr
- -h, --help
Print help (see a summary with '-h')
- <TOML>
check-crate report TOML with recorded branch requests
- <BRANCH>
EPEL branch to request (e.g. epel9, epel10)
ebranch file-request
ebranch file-request [--bugzilla-url] [--api-key] [--fas] [--sig] [--base-branch] [--dry-run] [-v|--verbose] [--blocked] [--dependson] [--toml] [-h|--help] <PACKAGE> <BRANCH>
File a branch request for one package
- --bugzilla-url <BUGZILLA_URL> [default: https://bugzilla.redhat.com]
Bugzilla base URL
- --api-key <API_KEY>
Bugzilla API key (defaults to BUGZILLA_API_KEY env var or the key from `ebranch config`)
May also be specified with the BUGZILLA_API_KEY environment variable.- --fas <FAS>
FAS of the reporter, if willing to co-maintain
- --sig <SIG>
Packaging SIG to offer as co-maintainer (requires --fas)
- --base-branch <BRANCH>
Base-distro branch behind the EPEL branch, checked before filing: a package present in the base distro is skipped (EPEL must not replace it; the request would be CANTFIX).
Inferred from the branch: epel10 uses c10s, epel9 uses al9. Pass this to override the mapping or to enable the check for branches it can't infer (e.g. epel8).
- --dry-run
Show what would happen without contacting Bugzilla
- -v, --verbose
Print progress to stderr
- --blocked <BLOCKED>
CSV of bugs/aliases this request blocks
- --dependson <DEPENDSON>
CSV of bugs/aliases this request depends on
- --toml <TOML>
check-crate report TOML to record the new bug ID in
- -h, --help
Print help (see a summary with '-h')
- <PACKAGE>
Source package to request a branch for
- <BRANCH>
EPEL branch to request (e.g. epel9, epel10)
ebranch file-requests
ebranch file-requests [--bugzilla-url] [--api-key] [--fas] [--sig] [--base-branch] [--dry-run] [-v|--verbose] [--blocked] [-h|--help] <TOML> <BRANCH>
File branch requests for all missing packages in a report
- --bugzilla-url <BUGZILLA_URL> [default: https://bugzilla.redhat.com]
Bugzilla base URL
- --api-key <API_KEY>
Bugzilla API key (defaults to BUGZILLA_API_KEY env var or the key from `ebranch config`)
May also be specified with the BUGZILLA_API_KEY environment variable.- --fas <FAS>
FAS of the reporter, if willing to co-maintain
- --sig <SIG>
Packaging SIG to offer as co-maintainer (requires --fas)
- --base-branch <BRANCH>
Base-distro branch behind the EPEL branch, checked before filing: a package present in the base distro is skipped (EPEL must not replace it; the request would be CANTFIX).
Inferred from the branch: epel10 uses c10s, epel9 uses al9. Pass this to override the mapping or to enable the check for branches it can't infer (e.g. epel8).
- --dry-run
Show what would happen without contacting Bugzilla
- -v, --verbose
Print progress to stderr
- --blocked <BLOCKED>
CSV of bugs/aliases each filed request blocks
- -h, --help
Print help (see a summary with '-h')
- <TOML>
check-crate report TOML listing the missing packages
- <BRANCH>
EPEL branch to request (e.g. epel9, epel10)
ebranch find-cycles
ebranch find-cycles [-s|--source] [--source-repo] [-t|--target] [--target-repo] [--json] [--report] [--koji] [--copr] [--check-install] [--exclude] [--exclude-install] [--override] [--base-branch] [--no-auto-exclude-install] [--max-depth] [-v|--verbose] [-j|--jobs] [--refresh] [-h|--help] [PACKAGES]
Detect dependency cycles in the build graph
- -s, --source <SOURCE>
Branch to take packages from (e.g. rawhide)
- --source-repo <REPO>
Repository class for the source branch (fedrq -r)
- -t, --target <TARGET>
Branch to port packages to (e.g. epel10)
- --target-repo <REPO>
Repository class for the target branch (fedrq -r)
- --json
Output as JSON instead of human-readable text
- --report <FILE>
Write a TOML report (package list + dependency edges) for the branch-request subcommands to consume
- --koji
Output build-order as a Koji chain build string
- --copr
Generate a shell script for Copr batch builds.
The script accepts the Copr repo as its first argument, followed by any extra flags to pass to copr build-package.
- --check-install
Check that subpackages are installable.
Verifies that the Requires of every subpackage in the closure can be satisfied by the target repo or by other packages in the closure.
- --exclude <PKG,...>
Exclude source packages from the closure.
Comma-separated list of source packages to treat as already available on the target. Their BuildRequires will not be resolved and they will not appear in the closure. Useful for packages you plan to excise from the build requirements.
May be passed multiple times.
- --exclude-install <PKG,...>
Exclude packages from installability checks.
Comma-separated list of source packages. Deps provided by these packages are treated as satisfied and they will not be pulled into the closure. Useful for packages like glibc whose version mismatch between Rawhide and older releases is expected.
May be passed multiple times.
- --override <PKG,...>
Base-distro packages to treat as deliberate overrides (alternate, non-conflicting EPEL packages).
Normally a dependency whose provider exists in the base distro (RHEL / CentOS Stream) at a too-old version is *blocked*: EPEL packages must not replace base-distro packages, so the closure is pruned there and the report explains the options. Listing a package here confirms you intend to introduce an alternate package instead — the analysis then descends into it. Note an alternate package needs a NEW package review, not a branch request.
May be passed multiple times.
- --base-branch <BRANCH>
Base-distro branch behind the target, probed to detect deps whose provider exists in the base at a too-old version (EPEL must not replace base packages).
Inferred for EPEL targets: epel10 uses c10s, epel9 uses al9 (fedrq's c9s layers epel9 + epel9-next, and UBI is incomplete, so AlmaLinux stands in for RHEL 9). Pass this to override the mapping or to enable the guard for targets it can't infer (e.g. epel8).
- --no-auto-exclude-install
Disable auto-exclusion of default packages (e.g. glibc) from installability checks.
By default, packages whose version mismatch between branches is expected and harmless are excluded automatically.
- --max-depth <MAX_DEPTH> [default: 0]
Max recursion depth (0 = unlimited)
- -v, --verbose
Print progress to stderr
- -j, --jobs <JOBS> [default: 0]
Number of parallel fedrq queries (0 = CPUs)
- --refresh
Clear fedrq + libdnf5 repo metadata caches before querying
- -h, --help
Print help (see a summary with '-h')
- [PACKAGES]
Source RPM names to analyze
ebranch resolve
ebranch resolve [-s|--source] [--source-repo] [-t|--target] [--target-repo] [--json] [--report] [--koji] [--copr] [--check-install] [--exclude] [--exclude-install] [--override] [--base-branch] [--no-auto-exclude-install] [--max-depth] [-v|--verbose] [-j|--jobs] [--refresh] [-h|--help] [PACKAGES]
Resolve the full dependency closure for porting
- -s, --source <SOURCE>
Branch to take packages from (e.g. rawhide)
- --source-repo <REPO>
Repository class for the source branch (fedrq -r)
- -t, --target <TARGET>
Branch to port packages to (e.g. epel10)
- --target-repo <REPO>
Repository class for the target branch (fedrq -r)
- --json
Output as JSON instead of human-readable text
- --report <FILE>
Write a TOML report (package list + dependency edges) for the branch-request subcommands to consume
- --koji
Output build-order as a Koji chain build string
- --copr
Generate a shell script for Copr batch builds.
The script accepts the Copr repo as its first argument, followed by any extra flags to pass to copr build-package.
- --check-install
Check that subpackages are installable.
Verifies that the Requires of every subpackage in the closure can be satisfied by the target repo or by other packages in the closure.
- --exclude <PKG,...>
Exclude source packages from the closure.
Comma-separated list of source packages to treat as already available on the target. Their BuildRequires will not be resolved and they will not appear in the closure. Useful for packages you plan to excise from the build requirements.
May be passed multiple times.
- --exclude-install <PKG,...>
Exclude packages from installability checks.
Comma-separated list of source packages. Deps provided by these packages are treated as satisfied and they will not be pulled into the closure. Useful for packages like glibc whose version mismatch between Rawhide and older releases is expected.
May be passed multiple times.
- --override <PKG,...>
Base-distro packages to treat as deliberate overrides (alternate, non-conflicting EPEL packages).
Normally a dependency whose provider exists in the base distro (RHEL / CentOS Stream) at a too-old version is *blocked*: EPEL packages must not replace base-distro packages, so the closure is pruned there and the report explains the options. Listing a package here confirms you intend to introduce an alternate package instead — the analysis then descends into it. Note an alternate package needs a NEW package review, not a branch request.
May be passed multiple times.
- --base-branch <BRANCH>
Base-distro branch behind the target, probed to detect deps whose provider exists in the base at a too-old version (EPEL must not replace base packages).
Inferred for EPEL targets: epel10 uses c10s, epel9 uses al9 (fedrq's c9s layers epel9 + epel9-next, and UBI is incomplete, so AlmaLinux stands in for RHEL 9). Pass this to override the mapping or to enable the guard for targets it can't infer (e.g. epel8).
- --no-auto-exclude-install
Disable auto-exclusion of default packages (e.g. glibc) from installability checks.
By default, packages whose version mismatch between branches is expected and harmless are excluded automatically.
- --max-depth <MAX_DEPTH> [default: 0]
Max recursion depth (0 = unlimited)
- -v, --verbose
Print progress to stderr
- -j, --jobs <JOBS> [default: 0]
Number of parallel fedrq queries (0 = CPUs)
- --refresh
Clear fedrq + libdnf5 repo metadata caches before querying
- -h, --help
Print help (see a summary with '-h')
- [PACKAGES]
Source RPM names to analyze