fix: provide merge context to beta conflict resolver (#19055)
This commit is contained in:
parent
0a80ef4278
commit
700f57112a
@ -50,11 +50,32 @@ async function cleanup() {
|
|||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fix(pr: PR, files: string[]) {
|
async function fix(pr: PR, files: string[], prs: PR[], applied: number[], idx: number) {
|
||||||
console.log(` Trying to auto-resolve ${files.length} conflict(s) with opencode...`)
|
console.log(` Trying to auto-resolve ${files.length} conflict(s) with opencode...`)
|
||||||
|
|
||||||
|
const done =
|
||||||
|
prs
|
||||||
|
.filter((x) => applied.includes(x.number))
|
||||||
|
.map((x) => `- #${x.number}: ${x.title}`)
|
||||||
|
.join("\n") || "(none yet)"
|
||||||
|
|
||||||
|
const next =
|
||||||
|
prs
|
||||||
|
.slice(idx + 1)
|
||||||
|
.map((x) => `- #${x.number}: ${x.title}`)
|
||||||
|
.join("\n") || "(none)"
|
||||||
|
|
||||||
const prompt = [
|
const prompt = [
|
||||||
`Resolve the current git merge conflicts while merging PR #${pr.number} into the beta branch.`,
|
`Resolve the current git merge conflicts while merging PR #${pr.number} into the beta branch.`,
|
||||||
|
`PR #${pr.number}: ${pr.title}`,
|
||||||
`Only touch these files: ${files.join(", ")}.`,
|
`Only touch these files: ${files.join(", ")}.`,
|
||||||
|
`Merged PRs on HEAD:\n${done}`,
|
||||||
|
`Pending PRs after this one (context only):\n${next}`,
|
||||||
|
"IMPORTANT: The conflict resolution must be consistent with already-merged PRs.",
|
||||||
|
"Pending PRs are context only; do not introduce their changes unless they are already present on HEAD.",
|
||||||
|
"Prefer already-merged PRs over the base branch when resolving stacked conflicts.",
|
||||||
|
"If a PR already deleted a file/directory, do not re-add it, instead apply changes in the new semantic location.",
|
||||||
|
"If a PR already changed an import, keep that change.",
|
||||||
"Keep the merge in progress, do not abort the merge, and do not create a commit.",
|
"Keep the merge in progress, do not abort the merge, and do not create a commit.",
|
||||||
"When done, leave the working tree with no unmerged files.",
|
"When done, leave the working tree with no unmerged files.",
|
||||||
].join("\n")
|
].join("\n")
|
||||||
@ -99,7 +120,7 @@ async function main() {
|
|||||||
const applied: number[] = []
|
const applied: number[] = []
|
||||||
const failed: FailedPR[] = []
|
const failed: FailedPR[] = []
|
||||||
|
|
||||||
for (const pr of prs) {
|
for (const [idx, pr] of prs.entries()) {
|
||||||
console.log(`\nProcessing PR #${pr.number}: ${pr.title}`)
|
console.log(`\nProcessing PR #${pr.number}: ${pr.title}`)
|
||||||
|
|
||||||
console.log(" Fetching PR head...")
|
console.log(" Fetching PR head...")
|
||||||
@ -119,7 +140,7 @@ async function main() {
|
|||||||
const files = await conflicts()
|
const files = await conflicts()
|
||||||
if (files.length > 0) {
|
if (files.length > 0) {
|
||||||
console.log(" Failed to merge (conflicts)")
|
console.log(" Failed to merge (conflicts)")
|
||||||
if (!(await fix(pr, files))) {
|
if (!(await fix(pr, files, prs, applied, idx))) {
|
||||||
await cleanup()
|
await cleanup()
|
||||||
failed.push({ number: pr.number, title: pr.title, reason: "Merge conflicts" })
|
failed.push({ number: pr.number, title: pr.title, reason: "Merge conflicts" })
|
||||||
await commentOnPR(pr.number, "Merge conflicts with dev branch")
|
await commentOnPR(pr.number, "Merge conflicts with dev branch")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user