ebranch - Man Page

Cross-branch porting: build order, branch requests, update checks, Bodhi karma

Synopsis

ebranch [-h|--help] [-V|--version] <subcommands>

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 [--from] [-b|--branch] [-r|--repo] [-t|--transitive] [--exclude-dev] [--include-optional] [--features] [--no-default-features] [--in-tree] [--copr] [--package] [--exclude-unmet] [--exclude] [--copr-script] [--dot] [--json] [--koji] [--toml] [--refresh] [-v|--verbose] [-j|--jobs] [-h|--help] [NAME] [VERSION]

Analyze a crates.io crate's dependencies

--from <PATH>

Render a report saved earlier with --toml instead of querying crates.io and the repo again

-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

For an application root, also count optional dependencies its default features do not enable. Library roots and every transitive crate count all features, as Fedora builds them

--features <FEATURE,...>

Non-default features the Fedora build enables for an application root, as `%cargo_generate_buildrequires -f` (CSV or repeated). Default: read from the package's rawhide spec when it already exists

--no-default-features

Build without default features (`-n`)

--in-tree <GLOB,...>

Crates built in-tree from the root's own source (a workspace's members, e.g. `uu_*,uucore*`): hidden as dependencies, their own dependencies checked as the workspace's. Globs, CSV or repeated; `@repository` also takes every crate published from the root's repository. Merged with the config file's `[check-crate.in-tree]` entry for the crate

--copr <OWNER/PROJECT>

Staging COPR (`owner/project`, `@group/project`) layered over the branch: dependencies the branch lacks are looked up there too and reported as staged — built, still in flight — instead of missing. The branch picks the chroot (rawhide → fedora-rawhide). Default: the config file's `[check-crate.copr]` entry for the crate. (The build-script generator is --copr-script.)

--package <NAME>

Fedora package name when it is not `rust-<crate>` (e.g. the `coreutils` crate is `uutils-coreutils`): used for the spec lookup and as the report's package name

--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,...>

Ignore these crates entirely, direct or transitive, as dependencies Fedora will not package (CSV or repeated). Added to the config file's `[check-crate] exclude`, or, when no config sets one, to the built-in benchmark set (criterion, codspeed-*, divan, iai, count_instructions)

--copr-script

Generate a shell script for Copr batch builds (check-crate's --copr names the staging COPR a check reads from).

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 side tag (f43-build-side-* uses f43, epel9-build-side-* uses epel9). A plain EPEL branch, inferred or given, is checked against its base distro plus -r @epel: epel8 → al8, epel9 → al9, epel10 → c10s, said on stderr. Minor releases (epel10.1) have no assumed base: pass -b and -r yourself, as you can to override, e.g. -b c9s -r @epel.

-r, --repo <REPO>

Repository class for the branch (fedrq -r).

Defaults to the branch's stable base repos, which is the correct comparison baseline, and to @epel for a plain EPEL branch (see -b). Passing -r turns that mapping off: pair it with a base branch, e.g. -b c9s -r @epel.

--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-*).

Kept as the EPEL branch when -b is mapped to its base (epel9 → al9 queries epel9 here); auto-detected for EPEL side tags (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 (-b epel9 also picks the
 chroot, epel-9-*).

ebranch check-wip

ebranch check-wip [--copr] [--target] [--offline] [--no-offline] [--prune] [--rescan-reviews] [--side-tag] [--add] [--forget] [--set] [--package] [--json] [-h|--help] <LEDGER>

Track packages on their way into the distro

--copr <COPR>

COPR staging it (owner/project or URL)

--target <BRANCH,...>

Releases targeted (repeated or CSV)

--offline

Report from the ledger, contacting nothing

--no-offline

Refresh, overriding a config default

--prune [<WHAT>...]

Forget what is gone: packages (default), side-tags

Possible values:

  • packages: Packages no longer staged in any COPR the ledger follows
  • side-tags: Side tags Koji says no longer exist
--rescan-reviews

Search for review requests again

--side-tag <TAG,...>

Koji side tags built into (repeated or CSV)

--add <NAME,...>

Track packages no COPR staged (repeated or CSV)

--forget <NAME,...>

Drop packages and stop tracking them (repeated or CSV)

--set <PKG=ROUTE>

Set a route: review:BUG, pr:ID, or direct

--package <NAME,...>

Limit to these packages (repeated or CSV)

--json

Machine-readable JSON output

-h, --help

Print help (see a summary with '-h')

<LEDGER>

Ledger file tracking the effort (created if absent)

ebranch config

ebranch config [-h|--help]

Set up Bugzilla API key and other settings

-h, --help

Print help

ebranch copr-prune

ebranch copr-prune [-y|--yes] [--json] [-v|--verbose] [-h|--help] <COPR>

Prune a staging COPR of what its target releases caught up on

-y, --yes

Delete every caught-up package without asking

--json

Print the plan as JSON (never deletes)

-v, --verbose

Print progress to stderr

-h, --help

Print help

<COPR>

COPR project: owner/project, @group/project, or its URL

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-script] [--check-install] [--exclude] [--exclude-install] [--override] [--base-branch] [--no-auto-exclude-install] [--max-depth] [-v|--verbose] [-j|--jobs] [--refresh] [--graph] [-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-script

Generate a shell script for Copr batch builds (check-crate's --copr names the staging COPR a check reads from).

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

--graph <PATH>

Saved dependency graph of the source branch (a `poi-tracker deps` graph JSON): source-side lookups it can answer are served offline; only the frontier, the target and the base go to fedrq

-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-script] [--check-install] [--exclude] [--exclude-install] [--override] [--base-branch] [--no-auto-exclude-install] [--max-depth] [-v|--verbose] [-j|--jobs] [--refresh] [--graph] [-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-script

Generate a shell script for Copr batch builds (check-crate's --copr names the staging COPR a check reads from).

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

--graph <PATH>

Saved dependency graph of the source branch (a `poi-tracker deps` graph JSON): source-side lookups it can answer are served offline; only the frontier, the target and the base go to fedrq

-h, --help

Print help (see a summary with '-h')

[PACKAGES]

Source RPM names to analyze

Info

2026-09-10 sandogasa 0.24.0 Sandogasa Manual