The update bot recognised an open PR as a duplicate by hashing the blobs of the files its commit changed, read at the PR head. A follow-up commit that edits one of those files changes the hash, so the next run opened a second PR with the identical bump: PR #778 next to PR #775 for web-svc-collabora, after a fix had edited the bumped services.yml. The branch name of a bot PR ends in the first seven characters of the fingerprint of the change the bot proposed. An open PR whose branch ends in the fingerprint of the fresh proposal now counts as a duplicate before its head is compared. The head comparison stays as the second criterion. The test runs pr.sh in a throwaway repository against a stubbed gh. It fails on the previous script with exit 1, because that one goes on to push. Closes #780 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Update Pipeline 🔄
Shell helpers that drive the scheduled 🔄 Update versions workflow.
Scope 📋
This directory contains the helpers invoked by cron-update.yml to bump pinned upstream versions and open a pull request once per day. The helpers are thin wrappers: the image-version and repository-ref bumpers delegate to Python CLIs under cli/contributing/ that scan roles/*/meta/services.yml and rewrite version pins in place; the PR-open helper commits, force-pushes the update branch, and creates or refreshes the PR via gh. Helpers MUST NOT be called from workflows other than 🔄 Update versions; the CI_ENABLE_AUTO_UPDATES gate is enforced once, at the workflow's job level, and bypassing it from another caller would create PRs even when auto-updates are intentionally disabled.
Each shim MUST resolve the repository root relative to its own location so it can run from any working directory, MUST forward arguments to the underlying CLI so --dry-run and similar flags keep working from the shell, and MUST exit non-zero on CLI failure so the workflow surfaces the error.
For the workflow catalog see workflows.md. For the repository variable that gates the workflow see configuration.md. For the App-token secrets that the PR-opening step requires see secrets.md.