Codeberg workflow

August 6, 2026 ยท View on GitHub

Codeberg is Ferrum's primary forge.

Use tea for routine Codeberg operations when possible.

Issues

List issues:

tea issues ls --repo ominiverdi/ferrum

View one issue:

tea issues 5 --repo ominiverdi/ferrum --comments

Create an issue non-interactively:

tea issues create \
  --repo ominiverdi/ferrum \
  --login codeberg.org \
  --title "Issue title" \
  --description "Issue body"

Reply to an issue or PR non-interactively:

tea comment 5 "Reply text" --repo ominiverdi/ferrum --login codeberg.org
tea comment 7 "PR reply text" --repo ominiverdi/ferrum --login codeberg.org

For multiline comments, write the body to a temporary file and pass it as the positional comment argument:

cat > /tmp/ferrum-comment.md <<'EOF'
Comment body.
EOF
tea comment 5 "$(cat /tmp/ferrum-comment.md)" --repo ominiverdi/ferrum --login codeberg.org

Close an issue:

tea issues close 5 --repo ominiverdi/ferrum --login codeberg.org

tea comment is singular. There is no tea comments create command.

If a fuller issue comment workflow is not available in the current environment, draft the exact reply text for the user instead of pretending it was posted.

Pull requests

List pull requests:

tea pr ls --repo ominiverdi/ferrum

View a pull request:

tea pr 1 --repo ominiverdi/ferrum --comments

If tea cannot post review comments non-interactively, provide the exact review text for manual posting.

For diff inspection, fetching the PR ref locally is often useful:

git fetch origin refs/pull/1/head:pr-1
git diff main...pr-1

Releases

List releases:

tea releases ls --repo ominiverdi/ferrum

Create a release entry and upload assets in one command:

version=vX.Y.Z
plain_version=${version#v}
target=x86_64-unknown-linux-gnu
package="ferrum-${version}-${target}"

tea releases create \
  --tag "$version" \
  --target main \
  --title "Ferrum $version" \
  --note-file "/tmp/ferrum-${version}-notes.md" \
  --asset "dist/${package}.tar.gz" \
  --asset "dist/${package}.tar.gz.sha256" \
  --asset "dist/ferrum_${plain_version}_amd64.deb" \
  --asset "dist/ferrum_${plain_version}_amd64.deb.sha256" \
  --asset "dist/ferrum-${plain_version}-1.x86_64.rpm" \
  --asset "dist/ferrum-${plain_version}-1.x86_64.rpm.sha256" \
  --repo ominiverdi/ferrum \
  --login codeberg.org

If the release already exists and only missing assets need to be uploaded:

version=vX.Y.Z
plain_version=${version#v}
target=x86_64-unknown-linux-gnu
package="ferrum-${version}-${target}"

tea releases assets create "$version" \
  "dist/${package}.tar.gz" \
  "dist/${package}.tar.gz.sha256" \
  "dist/ferrum_${plain_version}_amd64.deb" \
  "dist/ferrum_${plain_version}_amd64.deb.sha256" \
  "dist/ferrum-${plain_version}-1.x86_64.rpm" \
  "dist/ferrum-${plain_version}-1.x86_64.rpm.sha256" \
  --repo ominiverdi/ferrum \
  --login codeberg.org

Verify uploaded assets:

tea releases assets ls "$version" --repo ominiverdi/ferrum

Mirrors

GitHub is a passive source and binary-release mirror. GitHub Actions are disabled; validation and publishing are performed locally.

Normal source pushes go to Codeberg first and then GitHub:

git push origin main
git push github main

For tagged releases, complete and verify the Codeberg release before pushing the GitHub mirror. Then create the backup GitHub release from the same locally built six-file asset set:

version=vX.Y.Z
git push github main "$version"

gh release create "$version" \
  --repo ominiverdi/ferrum \
  --title "Ferrum $version" \
  --notes-file "/tmp/ferrum-${version}-notes.md" \
  "dist/ferrum-${version}-x86_64-unknown-linux-gnu.tar.gz" \
  "dist/ferrum-${version}-x86_64-unknown-linux-gnu.tar.gz.sha256" \
  "dist/ferrum_${version#v}_amd64.deb" \
  "dist/ferrum_${version#v}_amd64.deb.sha256" \
  "dist/ferrum-${version#v}-1.x86_64.rpm" \
  "dist/ferrum-${version#v}-1.x86_64.rpm.sha256"

Use gh release upload if the GitHub release already exists and only assets are missing.