eng/copilot/octokitFunctions.js (176 lines of code) (raw):
import { Octokit } from "@octokit/rest";
import { githubToken, basePrId } from "./constants.js";
const branchRef = "heads/auto-generated-integration-test-from-";
const mainRef = "heads/main";
const octokit = new Octokit({
auth: githubToken,
});
export async function getLatestCommitShaOnMain(owner, repo) {
try {
const { data } = await octokit.rest.git.getRef({
owner,
repo,
ref: mainRef,
});
return data.object.sha;
} catch (error) {
console.error("Failed to get latest commit SHA:", error.message);
throw error;
}
}
export async function getLatestCommitShaOnTestFolder(owner, repo, mainSha) {
try {
const { data: commits } = await octokit.rest.repos.listCommits({
owner,
repo,
sha: mainSha,
path: 'tests'
});
if (commits.length > 0) {
return commits[0].sha;
} else {
return null;
}
} catch (error) {
console.error("Failed to get last commit SHA for /test folder:", error.message);
throw error;
}
}
export async function getLatestCommitShaOnPr(owner, repo, prId) {
try {
const { data: prInfo } = await octokit.rest.pulls.get({
owner,
repo,
pull_number: prId,
});
const latestCommitSha = prInfo.head.sha;
return latestCommitSha;
} catch (error) {
console.error(`Failed to get latest commit SHA for PR ${prNumber}:`, error.message);
throw error;
}
}
export async function getChangedFiles(owner, repo, commitSha) {
try {
const { data: commit } = await octokit.rest.repos.getCommit({
owner,
repo,
ref: commitSha,
});
const files = commit.files;
return files;
} catch (error) {
console.error(`Failed to load commit ${commitSha}: `, error.message);
throw error;
}
}
export async function createChangeBranch(owner, repo, mainSha, originSha) {
try {
const { data } = await octokit.rest.git.getRef({
owner,
repo,
ref: `refs/${branchRef}${originSha}`,
});
console.log("Branch already exists, using existing branch SHA:", data.object.sha);
return data.object.sha;
} catch (error) {
if (error.status === 404) {
try {
const { data: newData } = await octokit.rest.git.createRef({
owner,
repo,
ref: `refs/${branchRef}`,
mainSha,
});
console.log("Branch auto-generated-integration-test created successfully, new branch SHA:", newData.object.sha);
return newData.object.sha;
} catch (error) {
console.error("Failed to create branch:", error.message);
throw error;
}
} else {
console.error("Failed to check branch existence:", error.message);
throw error;
}
}
}
export async function createBlob(owner, repo, files) {
try {
return await Promise.all(files.map(async file => {
const { data } = await octokit.rest.git.createBlob({
owner,
repo,
content: file.fileContent,
encoding: "utf-8",
});
return {
sha: data.sha,
path: file.fileName,
mode: "100644",
type: "blob",
};
}));
} catch (error) {
console.error("Failed to create blobs:", error.message);
throw error;
}
}
export async function createTree(owner, repo, blobs, branchSha) {
try {
const { data } = await octokit.rest.git.createTree({
owner,
repo,
base_tree: branchSha,
tree: blobs,
});
return data.sha;
} catch (error) {
console.error("Failed to create tree:", error.message);
throw error;
}
}
export async function createCommit(owner, repo, treeSha, branchSha) {
try {
const { data } = await octokit.rest.git.createCommit({
owner,
repo,
message: "[auto-generated]sync translation fix attempt",
tree: treeSha,
parents: [branchSha],
});
return data.sha;
} catch (error) {
console.error("Failed to create commit:", error.message);
throw error;
}
}
export async function updateBranch(owner, repo, commitSha) {
try {
await octokit.rest.git.updateRef({
owner,
repo,
ref: branchRef,
sha: commitSha,
});
} catch (error) {
console.error("Failed to push the commit on branch,", error.message);
throw error;
}
}
export async function createPR(owner, repo) {
try {
const { data } = await octokit.rest.pulls.create({
owner,
repo,
title: "auto-generated-Sync test",
head: "auto-generated-integration-test",
base: "main",
body: "Please pull these awesome changes in!",
draft: false,
});
console.log("PR created: ", data.html_url);
} catch (error) {
console.error("Failed to create pull request, ", error.message);
throw error;
}
}