From b0303827bbdebfb541e4c029275ca136a0485258 Mon Sep 17 00:00:00 2001 From: Peter Evans <18365890+peter-evans@users.noreply.github.com> Date: Thu, 8 Aug 2024 18:36:07 +0000 Subject: [PATCH] try fix base tree --- dist/index.js | 25 ++++++++++++++++--------- src/create-or-update-branch.ts | 7 +++++-- src/create-pull-request.ts | 1 + src/github-helper.ts | 24 ++++++++++++++++++++---- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/dist/index.js b/dist/index.js index cc3ebbe..d9443c8 100644 --- a/dist/index.js +++ b/dist/index.js @@ -154,6 +154,7 @@ function createOrUpdateBranch(git, commitMessage, base, branch, branchRemoteName action: 'none', base: base, hasDiffWithBase: false, + baseSha: '', headSha: '', branchCommits: [] }; @@ -278,8 +279,9 @@ function createOrUpdateBranch(git, commitMessage, base, branch, branchRemoteName } // Build the branch commits result.branchCommits = yield buildBranchCommits(git, base, branch); - // Get the pull request branch SHA - result.headSha = yield git.revParse('HEAD'); + // Get the base and head SHAs + result.baseSha = yield git.revParse(base); + result.headSha = yield git.revParse(branch); // Delete the temporary branch yield git.exec(['branch', '--delete', '--force', tempBranch]); // Checkout the working base to leave the local repository as it was found @@ -458,7 +460,7 @@ function createPullRequest(inputs) { // Stash any uncommitted tracked and untracked changes const stashed = yield git.stashPush(['--include-untracked']); yield git.checkout(inputs.branch); - yield githubHelper.pushSignedCommits(result.branchCommits, repoPath, branchRepository, inputs.branch); + yield githubHelper.pushSignedCommits(result.branchCommits, result.baseSha, repoPath, branchRepository, inputs.branch); yield git.checkout('-'); if (stashed) { yield git.stashPop(); @@ -1274,16 +1276,21 @@ class GitHubHelper { return pull; }); } - pushSignedCommits(branchCommits, repoPath, branchRepository, branch) { + pushSignedCommits(branchCommits, baseSha, repoPath, branchRepository, branch) { return __awaiter(this, void 0, void 0, function* () { - let headSha = ''; + let headSha = baseSha; + // testing + if (branchCommits.length > 0 && branchCommits[0].parents[0] !== baseSha) { + throw new Error(`The base commit ${baseSha} does not match the first commit's parent ${branchCommits[0].parents[0]}`); + } for (const commit of branchCommits) { - headSha = yield this.createCommit(commit, repoPath, branchRepository); + // TODO: The headSha of the previous commit should be passed and used as the parent. + headSha = yield this.createCommit(commit, [headSha], repoPath, branchRepository); } yield this.createOrUpdateRef(branchRepository, branch, headSha); }); } - createCommit(commit, repoPath, branchRepository) { + createCommit(commit, parents, repoPath, branchRepository) { return __awaiter(this, void 0, void 0, function* () { const repository = this.parseRepository(branchRepository); let treeSha = commit.tree; @@ -1304,11 +1311,11 @@ class GitHubHelper { }; }))); core.info(`Creating tree for local commit ${commit.sha}`); - const { data: tree } = yield this.octokit.rest.git.createTree(Object.assign(Object.assign({}, repository), { base_tree: commit.parents[0], tree: treeObjects })); + const { data: tree } = yield this.octokit.rest.git.createTree(Object.assign(Object.assign({}, repository), { base_tree: parents[0], tree: treeObjects })); treeSha = tree.sha; core.info(`Created tree ${treeSha} for local commit ${commit.sha}`); } - const { data: remoteCommit } = yield this.octokit.rest.git.createCommit(Object.assign(Object.assign({}, repository), { parents: commit.parents, tree: treeSha, message: `${commit.subject}\n\n${commit.body}` })); + const { data: remoteCommit } = yield this.octokit.rest.git.createCommit(Object.assign(Object.assign({}, repository), { parents: parents, tree: treeSha, message: `${commit.subject}\n\n${commit.body}` })); core.info(`Created commit ${remoteCommit.sha} for local commit ${commit.sha}`); return remoteCommit.sha; }); diff --git a/src/create-or-update-branch.ts b/src/create-or-update-branch.ts index 9e316dc..643ea47 100644 --- a/src/create-or-update-branch.ts +++ b/src/create-or-update-branch.ts @@ -142,6 +142,7 @@ interface CreateOrUpdateBranchResult { action: string base: string hasDiffWithBase: boolean + baseSha: string headSha: string branchCommits: Commit[] } @@ -173,6 +174,7 @@ export async function createOrUpdateBranch( action: 'none', base: base, hasDiffWithBase: false, + baseSha: '', headSha: '', branchCommits: [] } @@ -322,8 +324,9 @@ export async function createOrUpdateBranch( // Build the branch commits result.branchCommits = await buildBranchCommits(git, base, branch) - // Get the pull request branch SHA - result.headSha = await git.revParse('HEAD') + // Get the base and head SHAs + result.baseSha = await git.revParse(base) + result.headSha = await git.revParse(branch) // Delete the temporary branch await git.exec(['branch', '--delete', '--force', tempBranch]) diff --git a/src/create-pull-request.ts b/src/create-pull-request.ts index 457dcd4..4600935 100644 --- a/src/create-pull-request.ts +++ b/src/create-pull-request.ts @@ -201,6 +201,7 @@ export async function createPullRequest(inputs: Inputs): Promise { await git.checkout(inputs.branch) await githubHelper.pushSignedCommits( result.branchCommits, + result.baseSha, repoPath, branchRepository, inputs.branch diff --git a/src/github-helper.ts b/src/github-helper.ts index 5cb17ed..0090d35 100644 --- a/src/github-helper.ts +++ b/src/github-helper.ts @@ -195,19 +195,35 @@ export class GitHubHelper { async pushSignedCommits( branchCommits: Commit[], + baseSha: string, repoPath: string, branchRepository: string, branch: string ): Promise { - let headSha = '' + let headSha = baseSha + + // testing + if (branchCommits.length > 0 && branchCommits[0].parents[0] !== baseSha) { + throw new Error( + `The base commit ${baseSha} does not match the first commit's parent ${branchCommits[0].parents[0]}` + ) + } + for (const commit of branchCommits) { - headSha = await this.createCommit(commit, repoPath, branchRepository) + // TODO: The headSha of the previous commit should be passed and used as the parent. + headSha = await this.createCommit( + commit, + [headSha], + repoPath, + branchRepository + ) } await this.createOrUpdateRef(branchRepository, branch, headSha) } private async createCommit( commit: Commit, + parents: string[], repoPath: string, branchRepository: string ): Promise { @@ -238,7 +254,7 @@ export class GitHubHelper { core.info(`Creating tree for local commit ${commit.sha}`) const {data: tree} = await this.octokit.rest.git.createTree({ ...repository, - base_tree: commit.parents[0], + base_tree: parents[0], tree: treeObjects }) treeSha = tree.sha @@ -247,7 +263,7 @@ export class GitHubHelper { const {data: remoteCommit} = await this.octokit.rest.git.createCommit({ ...repository, - parents: commit.parents, + parents: parents, tree: treeSha, message: `${commit.subject}\n\n${commit.body}` })