summaryrefslogtreecommitdiffstats
path: root/extra/rebase-pr.js
blob: 4921d2e7c8bd391cc8a637ef98cd9ca600cf0d64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
const { execSync } = require("child_process");

/**
 * Rebase a PR onto such as 1.23.X or master
 * @returns {Promise<void>}
 */
async function main() {
    const branch = process.argv[2];

    // Use gh to get current branch's pr id
    let currentBranchPRID = execSync("gh pr view --json number --jq \".number\"").toString().trim();
    console.log("Pr ID: ", currentBranchPRID);

    // Use gh commend to get pr commits
    const prCommits = JSON.parse(execSync(`gh pr view ${currentBranchPRID} --json commits`).toString().trim()).commits;

    console.log("Found commits: ", prCommits.length);

    // Sort the commits by authoredDate
    prCommits.sort((a, b) => {
        return new Date(a.authoredDate) - new Date(b.authoredDate);
    });

    // Get the oldest commit id
    const oldestCommitID = prCommits[0].oid;
    console.log("Oldest commit id of this pr:", oldestCommitID);

    // Get the latest commit id of the target branch
    const latestCommitID = execSync(`git rev-parse origin/${branch}`).toString().trim();
    console.log("Latest commit id of " + branch + ":", latestCommitID);

    // Get the original parent commit id of the oldest commit
    const originalParentCommitID = execSync(`git log --pretty=%P -n 1 "${oldestCommitID}"`).toString().trim();
    console.log("Original parent commit id of the oldest commit:", originalParentCommitID);

    // Rebase the pr onto the target branch
    execSync(`git rebase --onto ${latestCommitID} ${originalParentCommitID}`);
}

main();