snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
103
tools/backport-pull-request
Executable file
103
tools/backport-pull-request
Executable file
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
usage() {
|
||||
cat >&2 <<EOF
|
||||
usage: $0 PULL_REQUEST_ID
|
||||
|
||||
Fetch the given GitHub pull request branch and backport it to
|
||||
the current branch using 'git cherry-pick -x'.
|
||||
|
||||
Typical usage is:
|
||||
git fetch upstream
|
||||
git checkout -b 8.x upstream/8.x
|
||||
$0 FIRST_PR_ID
|
||||
$0 SECOND_PR_ID
|
||||
git push origin +HEAD:backport-changes
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
pr_id="${1-}"
|
||||
|
||||
if [ -z "$pr_id" ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
fail() {
|
||||
echo "$1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
type gh >/dev/null 2>&1 \
|
||||
|| fail "The 'gh' CLI tool is not installed; see https://cli.github.com/"
|
||||
gh auth status 2>/dev/null || fail "Not authenticated to github"
|
||||
|
||||
# Find the last commit that was merged. We will look back in `main`
|
||||
# for other commits from the same PR.
|
||||
# shellcheck disable=SC2016
|
||||
merge_commit="$(
|
||||
gh api graphql \
|
||||
-q '.data.repository.pullRequest.timelineItems.nodes[0].commit.oid' \
|
||||
-F pr_id="$1" \
|
||||
-f query='
|
||||
query($pr_id:Int!) {
|
||||
repository(name: "zulip", owner: "zulip") {
|
||||
pullRequest(number:$pr_id) {
|
||||
timelineItems(last:1, itemTypes: [MERGED_EVENT]) {
|
||||
nodes {
|
||||
... on MergedEvent {
|
||||
commit {
|
||||
oid
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
'
|
||||
)"
|
||||
|
||||
[ -n "$merge_commit" ] || fail "PR #$pr_id is not merged into 'main'. Merge it first before backporting."
|
||||
|
||||
# We cannot trust the "commits" count on the PR, since only part of it
|
||||
# may get merged, or it may have commits squashed during the merge.
|
||||
# Walk backwards on `main` from the merge commit we found, checking
|
||||
# that each of those commits is still associated with the same PR.
|
||||
commit_id="$merge_commit"
|
||||
while true; do
|
||||
# shellcheck disable=SC2016
|
||||
this_pr="$(gh api graphql -F "commit_id=$commit_id 0" \
|
||||
--jq '.data.repository.ref.target.history.edges[].node.associatedPullRequests.nodes[].number' \
|
||||
-f query='
|
||||
query($commit_id: String!) {
|
||||
repository(owner: "zulip", name:"zulip") {
|
||||
ref(qualifiedName:"main") {
|
||||
target {
|
||||
... on Commit {
|
||||
history(first:1, after: $commit_id) {
|
||||
edges {
|
||||
node {
|
||||
oid
|
||||
associatedPullRequests(first: 1) {
|
||||
nodes {
|
||||
number
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}')"
|
||||
if [ "$this_pr" != "$pr_id" ]; then
|
||||
break
|
||||
fi
|
||||
commit_id="$(git rev-parse "$commit_id"~)"
|
||||
done
|
||||
|
||||
set -x
|
||||
git cherry-pick -x "$commit_id~..$merge_commit"
|
||||
Reference in New Issue
Block a user