Skip to content

Commit

Permalink
Support for rebase merges
Browse files Browse the repository at this point in the history
  • Loading branch information
m-kuhn committed Apr 27, 2021
1 parent b5f25ce commit 4145428
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 56 deletions.
32 changes: 24 additions & 8 deletions src/backport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ const warnIfSquashIsNotTheOnlyAllowedMergeMethod = async ({
const backportOnce = async ({
base,
body,
commits,
commitToBackport,
github,
head,
Expand All @@ -92,6 +93,7 @@ const backportOnce = async ({
}: {
base: string;
body: string;
commits: string[];
commitToBackport: string;
github: InstanceType<typeof GitHub>;
head: string;
Expand All @@ -107,6 +109,7 @@ const backportOnce = async ({
let backportError = null;
await git("switch", base);
await git("switch", "--create", head);

try {
await git("show", commitToBackport + "^2");
// We have a merge commit
Expand All @@ -119,7 +122,7 @@ const backportOnce = async ({
} catch (error: unknown) {
// No merge commit
try {
await git("cherry-pick", commitToBackport);
await git("cherry-pick", ...commits);
} catch (error: unknown) {
await git("cherry-pick", "--abort");
backportError = error;
Expand Down Expand Up @@ -153,12 +156,12 @@ const backportOnce = async ({

const getFailedBackportCommentBody = ({
base,
commitToBackport,
commits,
errorMessage,
head,
}: {
base: string;
commitToBackport: string;
commits: string[];
errorMessage: string;
head: string;
}) => {
Expand All @@ -179,7 +182,7 @@ const getFailedBackportCommentBody = ({
"# Create a new branch",
`git switch --create ${head}`,
"# Cherry-pick the merged commit of this pull request and resolve the conflicts",
`git cherry-pick --mainline 1 ${commitToBackport}`,
`git cherry-pick ${commits}`,
"# Push it to GitHub",
`git push --set-upstream origin ${head}`,
"# Go back to the original working tree",
Expand Down Expand Up @@ -237,9 +240,21 @@ const backport = async ({

await warnIfSquashIsNotTheOnlyAllowedMergeMethod({ github, owner, repo });

// The merge commit SHA is actually not null.
const commitsResponse = await github.request(
"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits",
{
owner: owner,
repo: repo,
pull_number: pullRequestNumber,
},
);

// The commit range (interesting for rebase merges)
const commits = commitsResponse.data.map(({ commit }) => commit.tree.sha);

// The merge commit itself (only interesting if it's a merge)
const commitToBackport = String(mergeCommitSha);
info(`Backporting ${commitToBackport} from #${pullRequestNumber}`);
info(`Backporting #${pullRequestNumber}`);

await exec("git", [
"clone",
Expand All @@ -254,7 +269,7 @@ const backport = async ({
await exec("git", ["config", "--global", "user.name", "github-actions[bot]"]);

for (const [base, head] of Object.entries(backportBaseToHead)) {
const body = `Backport ${commitToBackport} from #${pullRequestNumber}\n **Authored by:** @${pullRequestUser}`;
const body = `Backport #${pullRequestNumber}\n **Authored by:** @${pullRequestUser}`;

let title = titleTemplate;
Object.entries({
Expand All @@ -272,6 +287,7 @@ const backport = async ({
await backportOnce({
base,
body,
commits,
commitToBackport,
github,
head,
Expand All @@ -291,7 +307,7 @@ const backport = async ({
await github.issues.createComment({
body: getFailedBackportCommentBody({
base,
commitToBackport,
commits,
errorMessage: error.message,
head,
}),
Expand Down
121 changes: 73 additions & 48 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
"@octokit/plugin-rest-endpoint-methods" "^4.0.0"

"@actions/http-client@^1.0.8":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.9.tgz#af1947d020043dbc6a3b4c5918892095c30ffb52"
integrity sha512-0O4SsJ7q+MK0ycvXPl2e6bMXV7dxAXOGjrXS1eTF9s2S401Tp6c/P3c3Joz04QefC1J6Gt942Wl2jbm3f4mLcg==
version "1.0.11"
resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.11.tgz#c58b12e9aa8b159ee39e7dd6cbd0e91d905633c0"
integrity sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==
dependencies:
tunnel "0.0.6"

Expand Down Expand Up @@ -302,59 +302,74 @@
"@nodelib/fs.scandir" "2.1.3"
fastq "^1.6.0"

"@octokit/auth-token@^2.4.0":
version "2.4.3"
resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.3.tgz#b868b5f2366533a7e62933eaa1181a8924228cc4"
integrity sha512-fdGoOQ3kQJh+hrilc0Plg50xSfaCKOeYN9t6dpJKXN9BxhhfquL0OzoQXg3spLYymL5rm29uPeI3KEXRaZQ9zg==
"@octokit/auth-token@^2.4.4":
version "2.4.5"
resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3"
integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==
dependencies:
"@octokit/types" "^5.0.0"
"@octokit/types" "^6.0.3"

"@octokit/core@^3.0.0":
version "3.2.1"
resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.1.tgz#9e04df3f4e7f825ac0559327490ce34299140af5"
integrity sha512-XfFSDDwv6tclUenS0EmB6iA7u+4aOHBT1Lz4PtQNQQg3hBbNaR/+Uv5URU+egeIuuGAiMRiDyY92G4GBOWOqDA==
dependencies:
"@octokit/auth-token" "^2.4.0"
"@octokit/graphql" "^4.3.1"
"@octokit/request" "^5.4.0"
"@octokit/types" "^5.0.0"
before-after-hook "^2.1.0"
version "3.4.0"
resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742"
integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg==
dependencies:
"@octokit/auth-token" "^2.4.4"
"@octokit/graphql" "^4.5.8"
"@octokit/request" "^5.4.12"
"@octokit/request-error" "^2.0.5"
"@octokit/types" "^6.0.3"
before-after-hook "^2.2.0"
universal-user-agent "^6.0.0"

"@octokit/endpoint@^6.0.1":
version "6.0.9"
resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.9.tgz#c6a772e024202b1bd19ab69f90e0536a2598b13e"
integrity sha512-3VPLbcCuqji4IFTclNUtGdp9v7g+nspWdiCUbK3+iPMjJCZ6LEhn1ts626bWLOn0GiDb6j+uqGvPpqLnY7pBgw==
version "6.0.11"
resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1"
integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==
dependencies:
"@octokit/types" "^5.0.0"
"@octokit/types" "^6.0.3"
is-plain-object "^5.0.0"
universal-user-agent "^6.0.0"

"@octokit/graphql@^4.3.1":
version "4.5.7"
resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.7.tgz#f4562dcd9e80ea94602068e85aefac19a88f8578"
integrity sha512-Gk0AR+DcwIK/lK/GX+OQ99UqtenQhcbrhHHfOYlrCQe17ADnX3EKAOKRsAZ9qZvpi5MuwWm/Nm+9aO2kTDSdyA==
"@octokit/graphql@^4.5.8":
version "4.6.1"
resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.1.tgz#f975486a46c94b7dbe58a0ca751935edc7e32cc9"
integrity sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==
dependencies:
"@octokit/request" "^5.3.0"
"@octokit/types" "^5.0.0"
"@octokit/types" "^6.0.3"
universal-user-agent "^6.0.0"

"@octokit/openapi-types@^6.1.1":
version "6.1.1"
resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-6.1.1.tgz#27f9386fcbcb9846b27b1bc8a41ba6f313c922a6"
integrity sha512-ICBhnEb+ahi/TTdNuYb/kTyKVBgAM0VD4k6JPzlhJyzt3Z+Tq/bynwCD+gpkJP7AEcNnzC8YO5R39trmzEo2UA==

"@octokit/plugin-paginate-rest@^2.2.3":
version "2.5.1"
resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.5.1.tgz#beffa460e88cf84a9cc81fd2d48603f8f9db8fde"
integrity sha512-tYmEThOFZbb4QbZ1LHtNpsYRb88OA2j9wCKhmmy/Va/l2uVgjb7k7GtcujiDLA7xaF0a7IhgadSNrZbM/zxyKw==
version "2.13.3"
resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a"
integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==
dependencies:
"@octokit/types" "^5.5.0"
"@octokit/types" "^6.11.0"

"@octokit/plugin-rest-endpoint-methods@^4.0.0":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.2.1.tgz#8224833a45c3394836dc6e86f1e6c49269a2c350"
integrity sha512-QyFr4Bv807Pt1DXZOC5a7L5aFdrwz71UHTYoHVajYV5hsqffWm8FUl9+O7nxRu5PDMtB/IKrhFqTmdBTK5cx+A==
version "4.15.1"
resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.15.1.tgz#91a064bee99d0ffcef74a04357e1cf15c27d1cd0"
integrity sha512-4gQg4ySoW7ktKB0Mf38fHzcSffVZd6mT5deJQtpqkuPuAqzlED5AJTeW8Uk7dPRn7KaOlWcXB0MedTFJU1j4qA==
dependencies:
"@octokit/types" "^5.5.0"
"@octokit/types" "^6.13.0"
deprecation "^2.3.1"

"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.2":
"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.5":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143"
integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==
dependencies:
"@octokit/types" "^6.0.3"
deprecation "^2.0.0"
once "^1.4.0"

"@octokit/request-error@^2.0.2":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.3.tgz#b51b200052bf483f6fa56c9e7e3aa51ead36ecd8"
integrity sha512-GgD5z8Btm301i2zfvJLk/mkhvGCdjQ7wT8xF9ov5noQY8WbKZDH9cOBqXzoeKd1mLr1xH2FwbtGso135zGBgTA==
Expand All @@ -363,27 +378,32 @@
deprecation "^2.0.0"
once "^1.4.0"

"@octokit/request@^5.3.0", "@octokit/request@^5.4.0":
version "5.4.10"
resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.10.tgz#402d2c53768bde12b99348329ba4129746aebb9c"
integrity sha512-egA49HkqEORVGDZGav1mh+VD+7uLgOxtn5oODj6guJk0HCy+YBSYapFkSLFgeYj3Fr18ZULKGURkjyhkAChylw==
"@octokit/request@^5.3.0", "@octokit/request@^5.4.12":
version "5.4.15"
resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128"
integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag==
dependencies:
"@octokit/endpoint" "^6.0.1"
"@octokit/request-error" "^2.0.0"
"@octokit/types" "^5.0.0"
deprecation "^2.0.0"
"@octokit/types" "^6.7.1"
is-plain-object "^5.0.0"
node-fetch "^2.6.1"
once "^1.4.0"
universal-user-agent "^6.0.0"

"@octokit/types@^5.0.0", "@octokit/types@^5.0.1", "@octokit/types@^5.5.0":
"@octokit/types@^5.0.1":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.5.0.tgz#e5f06e8db21246ca102aa28444cdb13ae17a139b"
integrity sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==
dependencies:
"@types/node" ">= 8"

"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.13.0", "@octokit/types@^6.7.1":
version "6.13.2"
resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.13.2.tgz#e3423dc733567ac4836e116b34d154a8e9cbbf3c"
integrity sha512-jN5LImYHvv7W6SZargq1UMJ3EiaqIz5qkpfsv4GAb4b16SGqctxtOU2TQAZxvsKHkOw2A4zxdsi5wR9en1/ezQ==
dependencies:
"@octokit/openapi-types" "^6.1.1"

"@octokit/webhooks@^7.15.1":
version "7.15.1"
resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-7.15.1.tgz#e1a3398fc91ffbe1e8a17433f6afd8aa46daf221"
Expand Down Expand Up @@ -433,7 +453,12 @@
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=

"@types/node@>= 8", "@types/node@^14.14.6":
"@types/node@>= 8":
version "14.14.41"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615"
integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==

"@types/node@^14.14.6":
version "14.14.6"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f"
integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==
Expand Down Expand Up @@ -661,10 +686,10 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=

before-after-hook@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635"
integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==
before-after-hook@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c"
integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw==

brace-expansion@^1.1.7:
version "1.1.11"
Expand Down

0 comments on commit 4145428

Please sign in to comment.