ebranch(1)

๐Ÿ“ฆ
version 0.27.0 ยท 5 versions
, in fedora 43, fedora 44

๐Ÿ‘‘ ebranch โ€” straight outta the Sandogasa Manual ๐Ÿ’…

okay bestie, sit DOWN, we're doing cross-branch porting and it's gonna be iconic ๐Ÿฆ‹


โœจ NAME โœจ

ebranch โ€” cross-branch porting: build order, branch requests, update checks, Bodhi karma. that's the whole vibe, no cap ๐ŸŽ€


๐ŸŒธ SYNOPSIS ๐ŸŒธ

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

๐Ÿ’œ DESCRIPTION ๐Ÿ’œ

Cross-branch porting: build order, branch requests, update checks, Bodhi karma. yes it's the same sentence twice, that's the assignment, don't @ me ๐Ÿ™ˆ


๐Ÿ’… 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. it's giving detective ๐Ÿ”

  • --from <PATH> โ€” render a report you saved earlier with --toml instead of querying crates.io and the repo all over again. recycling era โ™ป๏ธ
  • -b, --branch <BRANCH> โ€” the target branch, bestie (like epel9, rawhide)
  • -r, --repo <REPO> โ€” repository class for that branch (fedrq -r)
  • -t, --transitive โ€” expand those missing deps transitively, go deep ๐ŸŒŠ
  • --exclude-dev โ€” keep dev dependencies out of the transitive expansion, we don't need that energy
  • --include-optional โ€” for an application root, also count optional dependencies that its default features don't enable. but library roots and every transitive crate count all features, because that's how Fedora builds them, periodt
  • --features <FEATURE,...> โ€” non-default features the Fedora build enables for an application root, exactly like %cargo_generate_buildrequires -f would (CSV or repeated, pick your fighter). 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 (you know, a workspace's members, like uu_*,uucore*): they get hidden as dependencies, and their own dependencies get checked as the workspace's. globs, CSV or repeated; @repository also grabs every crate published from the root's repository. this merges with the config file's [check-crate.in-tree] entry for the crate ๐Ÿงš
  • --copr <OWNER/PROJECT> โ€” a staging COPR (owner/project, @group/project) layered over the branch: dependencies the branch is missing get looked up there too, and they're 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. (and btw the build-script generator is --copr-script, don't get it twisted ๐Ÿ™ˆ)
  • --package <NAME> โ€” the Fedora package name, for when it's not rust-<crate> (classic example: the coreutils crate is uutils-coreutils). used for the spec lookup and as the report's package name
  • --exclude-unmet โ€” kick unmet-version dependencies (packaged, but too old for the requirement) out of the transitive expansion. they're included by default, because omitting them silently under-reports what needs (re)building โ€” and lying in a report is not the move ๐Ÿ’€
  • --exclude <CRATE,...> โ€” ignore these crates entirely, direct or transitive, as dependencies Fedora won't package (CSV or repeated). added to the config file's [check-crate] exclude, or, when no config sets one, added to the built-in benchmark set (criterion, codspeed-*, divan, iai, count_instructions)
  • --copr-script โ€” generate a shell script for Copr batch builds (heads up: check-crate's --copr names the staging COPR a check reads from, totally different thing).

the script accepts the Copr repo as its first argument, followed by any extra flags to pass to copr build-package. slay ๐ŸŽ€

  • --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. fresh start energy โœจ
  • -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 the BUGZILLA_API_KEY env var). it may also be specified with the BUGZILLA_API_KEY environment variable ๐Ÿ”‘
  • --dry-run โ€” show changes without applying them. window shopping only ๐Ÿ›๏ธ
  • -v, --verbose โ€” print progress to stderr
  • -h, --help โ€” print help
  • <TOML> โ€” path to a 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] [--rpmfusion-inventory]
[--rpmfusion-renames] [--rpmfusion-dry-run] [--rpmfusion-file]
[-h|--help] <INPUT>

Check if an update would break reverse dependencies. the group project nobody wants but everybody needs ๐Ÿ˜ญ

  • -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, whether inferred or given, is checked against its base distro plus -r @epel: epel8 โ†’ al8, epel9 โ†’ al9, epel10 โ†’ c10s, and it says so on stderr. minor releases (epel10.1) have no assumed base: pass -b and -r yourself โ€” which you can do to override anyway, 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 the branch for the new-provides queries: @testing for Bodhi updates, and the chroot selection for COPR input (epel9 โ†’ epel-9-*).

it's 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 it 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. lore dump mode ๐Ÿ“š
  • -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 get prompted with that suggestion as the default. requires a Bodhi update alias or URL as input. reuses the bodhi CLI's login session, and starts an interactive login first if there's 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 get prompted. the full plan is shown for confirmation before posting. no surprises here, bestie โœ…

  • --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: it 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 gets 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) โ€” that's 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 get asked whether to submit anyway (default no).

non-interactive runs and --yes never submit a failing update. the safety rails are ON ๐Ÿ’€
  • --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, so don't skimp ๐ŸŽฏ
  • --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 ๐Ÿ›‘
  • --rpmfusion-inventory [<PATH>] โ€” RPM Fusion inventory (poi-tracker sync-rpmfusion). a package with a counterpart there never auto-pushes. without a path, it uses the inventory you generated, or the one your packages shipped ๐Ÿ“ฆ
  • --rpmfusion-renames <PATH> โ€” Fedora-to-RPM-Fusion renames for counterparts the naming doesn't make guessable (configs/rpmfusion/renames.toml). found beside the inventory when not given
  • --rpmfusion-dry-run โ€” do everything except send: show the RPM Fusion bug or comment that would be written, and where ๐Ÿ‘€
  • --rpmfusion-file โ€” go file the RPM Fusion rebuild request for an update that's already been submitted. โœจ Yeah bestie, --submit files these automatically for the update it makes โ€” this flag is for the ones it can't reach: an update submitted through Bodhi's web UI, one that predates this flag, or one whose earlier run stopped somewhere between the submit and the filing. ๐Ÿ™ˆ

Give every alias for the same change in one run, so they all become one bug listing all of them โ€” exactly like a batch of side tags would. ๐Ÿ‘‘

  • -h, --help โ€” Print help (see a summary with -h). ๐Ÿ’…
  • <INPUT> โ€” the update(s) to check, each 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-*).

Several may be given, comma-separated or repeated, to carry one change across releases in a single run:

ebranch check-update f45-build-side-1,f44-build-side-2 --submit

They are checked and submitted in order, and every input is validated before any of them is submitted. RPM Fusion is told once per package afterwards, with every update linked โ€” which is why a fan-out belongs in one run: three EPEL minors are one rebuild for them, not three. ๐Ÿ’…


๐Ÿฆ‹ 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 absolutely 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 close

ebranch close [--claim] [--bugzilla-url] [--api-key] [--fas] [--sig]
[--base-branch] [--dry-run] [-y|--yes] [-v|--verbose] [-h|--help] <TOML>
<BRANCH>

Close branch requests whose package has landed ๐Ÿ›ฌโœ…

  • --claim โ€” also take the bugs being closed (assigned_to = your Bugzilla account), without asking ๐Ÿ˜ค
  • --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>] โ€” volunteer as co-maintainer of the package. ๐Ÿซถ
    • (omitted) โ€” file without volunteering
    • --fas โ€” the FAS from ebranch config
    • --fas NAME โ€” that FAS

A bare --fas takes the next word as the name, so put it last or separate the positionals with --:

ebranch file-requests --fas -- pkgs.toml epel10
  • --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 ๐Ÿ˜‡
  • -y, --yes โ€” file releng tickets without confirming each one ๐Ÿ™ˆ
  • -v, --verbose โ€” print progress to stderr ๐Ÿ“ข
  • -h, --help โ€” Print help (see a summary with -h). ๐Ÿ’…
  • <TOML> โ€” check-crate or resolve report TOML with recorded branch requests ๐Ÿ“„
  • <BRANCH> โ€” EPEL branch to request (e.g. epel9, epel10) ๐ŸŒฟ

๐ŸŽ€ 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] [-y|--yes] [-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>] โ€” volunteer as co-maintainer of the package. ๐Ÿซถ
    • (omitted) โ€” file without volunteering
    • --fas โ€” the FAS from ebranch config
    • --fas NAME โ€” that FAS

A bare --fas takes the next word as the name, so put it last or separate the positionals with --:

ebranch file-requests --fas -- pkgs.toml epel10
  • --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 ๐Ÿ˜‡
  • -y, --yes โ€” file releng tickets without confirming each one ๐Ÿ™ˆ
  • -v, --verbose โ€” print progress to stderr ๐Ÿ“ข
  • -h, --help โ€” Print help (see a summary with -h). ๐Ÿ’…
  • <TOML> โ€” check-crate or resolve 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] [-y|--yes] [-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>] โ€” volunteer as co-maintainer of the package. ๐Ÿซถ
    • (omitted) โ€” file without volunteering
    • --fas โ€” the FAS from ebranch config
    • --fas NAME โ€” that FAS

A bare --fas takes the next word as the name, so put it last or separate the positionals with --:

ebranch file-requests --fas -- pkgs.toml epel10
  • --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 ๐Ÿ˜‡
  • -y, --yes โ€” file releng tickets without confirming each one ๐Ÿ™ˆ
  • -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 or resolve 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] [-y|--yes] [-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>] โ€” volunteer as co-maintainer of the package. ๐Ÿซถ
    • (omitted) โ€” file without volunteering
    • --fas โ€” the FAS from ebranch config
    • --fas NAME โ€” that FAS

A bare --fas takes the next word as the name, so put it last or separate the positionals with --:

ebranch file-requests --fas -- pkgs.toml epel10
  • --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 ๐Ÿ˜‡
  • -y, --yes โ€” just file the releng tickets, no confirmation per ticket, we trust you bestie ๐Ÿ’…
  • -v, --verbose โ€” spill the progress to stderr so you can watch it cook ๐Ÿ”ฅ
  • --blocked <BLOCKED> โ€” a CSV of bugs/aliases that every single filed request blocks ๐Ÿšง
  • -h, --help โ€” print help (peep the summary with -h)
  • <TOML> โ€” a check-crate or resolve report TOML that lists the missing packages. like, the receipts, basically ๐Ÿงพ
  • <BRANCH> โ€” the EPEL branch you're requesting, 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] [--max-depth] [-v|--verbose] [-j|--jobs] [--refresh]
[--graph] [-h|--help] [PACKAGES]

Detect dependency cycles in the build graph ๐Ÿ”„๐Ÿ˜ญ the circular-dependency jump-scare is real and this is how you catch it.

OPTIONS

  • -s, --source <SOURCE> โ€” branch you're pulling packages from (e.g. rawhide) ๐Ÿ“ฅ
  • --source-repo <REPO> โ€” repository class for the source branch, that's the fedrq -r thing
  • -t, --target <TARGET> โ€” branch you're porting those packages to (e.g. epel10) ๐ŸŽฏ
  • --target-repo <REPO> โ€” repository class for the target branch (fedrq -r)
  • --json โ€” output as JSON instead of the human-readable text, for when a script is the main character ๐Ÿค–
  • --report <FILE> โ€” write a TOML report (package list + dependency edges) so the branch-request subcommands can snack on it ๐Ÿ“
  • --koji โ€” output the build-order as a Koji chain build string ๐Ÿ‘‘
  • --copr-script โ€” generate a shell script for Copr batch builds ๐Ÿ

Heads up: check-crate's --copr is what names the staging COPR a check reads from.

The script takes the Copr repo as its first argument, then any extra flags you wanna hand to copr build-package.

  • --check-install โ€” check that the subpackages are actually installable, no cap ๐Ÿง

It verifies that the Requires of every subpackage in the closure can be satisfied by the target repo or by other packages inside the closure.

  • --exclude <PKG,...> โ€” exclude source packages from the closure โœ‚๏ธ

Comma-separated list of source packages you're treating as already available on the target. Their BuildRequires won't get resolved and they won't show up in the closure. Chef's kiss for packages you plan to excise from the build requirements.

May be passed multiple times. ๐Ÿ”

  • --exclude-install <PKG,...> โ€” exclude packages from the installability checks ๐Ÿ™ˆ

Comma-separated list of source packages. Deps provided by these packages get treated as satisfied and they won't be pulled into the closure. Super useful for things like glibc where a version mismatch between Rawhide and older releases is just... expected, bestie.

May be passed multiple times. ๐Ÿ”

  • --override <PKG,...> โ€” base-distro packages to treat as deliberate overrides (the alternate, non-conflicting EPEL packages) ๐Ÿ’ซ

Normally, a dependency whose provider already exists in the base distro (RHEL / CentOS Stream) but at a too-old version is blocked: EPEL packages must not replace base-distro packages, so the closure gets pruned right there and the report explains your options. Listing a package here is you confirming you intend to introduce an alternate package instead โ€” and the analysis then descends into it. Note: an alternate package needs a NEW package review, not a branch request. ๐Ÿ“‹

  • --base-branch <BRANCH> โ€” base-distro branch sitting behind the target, probed to detect deps whose provider exists in the base at a too-old version (because EPEL must not replace base packages) ๐Ÿ›ก๏ธ

It's inferred for EPEL targets: epel10 uses c10s, epel9 uses al9 (fun fact: 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 turn the guard on for targets it can't infer (e.g. epel8).

  • --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 the fedrq + libdnf5 repo metadata caches before querying ๐Ÿงผ
  • --graph <PATH> โ€” a saved dependency graph of the source branch (a poi-tracker deps graph JSON). Source-side lookups it can answer get served offline; only the frontier, the target and the base actually go to fedrq. slay ๐Ÿฆ‹
  • -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] [--max-depth] [-v|--verbose] [-j|--jobs] [--refresh]
[--graph] [-h|--help] [PACKAGES]

Resolve the full dependency closure for porting ๐ŸŒˆ the whole web, every dep, traced out so you know exactly what has to come along for the ride.

OPTIONS

  • -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 ๐Ÿ

Reminder: 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. ๐Ÿ“‹

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

  • --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 ๐Ÿ”

okay that's the whole page bestie, you made it to the end ๐ŸŽ€๐Ÿ’– this was sandogasa version 0.27.0, dated 2026-10-21, and it's the ebranch(1) manual page. go forth and port those packages, you're literally the main character of EPEL now ๐Ÿ‘‘โœจ

๐Ÿ“ฆ where this page comes from
  • fedora 43: sandogasa 0.27.0-2.fc43 ยท (Apache-2.0 OR MIT) AND LicenseRef-Fedora-Public-Domain AND Unicode-3.0 AND Apache-2.0 AND ISC AND MIT AND (Apache-2.0 OR BSL-1.0) AND (Apache-2.0 OR ISC OR MIT) AND (Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT) AND BSD-3-Clause AND MPL-2.0 AND (Unlicense OR MIT) AND Zlib
  • fedora 44: sandogasa 0.27.0-2.fc44 ยท (Apache-2.0 OR MIT) AND LicenseRef-Fedora-Public-Domain AND Unicode-3.0 AND Apache-2.0 AND ISC AND MIT AND (Apache-2.0 OR BSL-1.0) AND (Apache-2.0 OR ISC OR MIT) AND (Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT) AND BSD-3-Clause AND MPL-2.0 AND (Unlicense OR MIT) AND Zlib
  • ๐Ÿ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms