Skip to content

Commit 9c89f96

Browse files
authored
Fix Dependabot auto-merge writer skips (#139)
Treat expected Dependabot non-automerge cases as clean skips instead of failing the writer workflow. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2cdf7584-95e1-43bf-aadb-c21ed80ae224
1 parent f16b04e commit 9c89f96

1 file changed

Lines changed: 47 additions & 8 deletions

File tree

‎.github/workflows/dependabot-automerge-writer.yml‎

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,19 @@ jobs:
162162
}
163163
}
164164
`;
165-
await github.graphql(mutation, {
166-
pullRequestId: afterApproval.node_id,
167-
expectedHeadOid: headSha,
168-
});
169-
core.info(`Enabled squash auto-merge for PR #${pr.number} at ${headSha}.`);
165+
try {
166+
await github.graphql(mutation, {
167+
pullRequestId: afterApproval.node_id,
168+
expectedHeadOid: headSha,
169+
});
170+
core.info(`Enabled squash auto-merge for PR #${pr.number} at ${headSha}.`);
171+
} catch (err) {
172+
if (isAutoMergeDisabledError(err)) {
173+
core.warning('Auto-merge is not allowed for this repository; leaving the approved PR for manual merge.');
174+
return;
175+
}
176+
throw err;
177+
}
170178
171179
function validateWorkflowRun(workflowRun, workflowRunPr) {
172180
if (workflowRun.name !== 'Dependabot auto-merge' ||
@@ -229,9 +237,6 @@ jobs:
229237
}
230238
231239
function validateNonMajorUpdate(metadata) {
232-
if (metadata.maintainerChanges !== 'false') {
233-
throw new Error('Dependabot metadata must explicitly report no maintainer changes.');
234-
}
235240
if (typeof metadata.updateType !== 'string' || metadata.updateType.length === 0) {
236241
throw new Error('Dependabot update type is missing.');
237242
}
@@ -242,6 +247,13 @@ jobs:
242247
if (!/^version-update:semver-(minor|patch)$/.test(metadata.updateType)) {
243248
throw new Error(`Unsupported Dependabot update type: ${metadata.updateType}`);
244249
}
250+
if (metadata.maintainerChanges !== 'false' && metadata.maintainerChanges !== 'true') {
251+
throw new Error(`Unexpected Dependabot maintainer-changes value: ${metadata.maintainerChanges}`);
252+
}
253+
if (metadata.maintainerChanges === 'true') {
254+
core.info('Dependabot reports maintainer changes; skipping auto-approval and auto-merge.');
255+
return false;
256+
}
245257
if (typeof metadata.updatedDependenciesJson !== 'string') {
246258
throw new Error('Dependabot updated dependencies metadata is missing.');
247259
}
@@ -266,10 +278,37 @@ jobs:
266278
if (typeof depUpdateType !== 'string' || !/^version-update:semver-(minor|patch)$/.test(depUpdateType)) {
267279
throw new Error(`Unsupported dependency update type: ${depUpdateType}`);
268280
}
281+
const depMaintainerChanges = dep['maintainer-changes'] ?? dep.maintainerChanges;
282+
if (depMaintainerChanges === true || depMaintainerChanges === 'true') {
283+
core.info(`Dependency ${dep['dependency-name'] || dep.dependencyName || '<unknown>'} reports maintainer changes; skipping auto-approval and auto-merge.`);
284+
return false;
285+
}
269286
}
270287
return dependencies;
271288
}
272289
290+
function isAutoMergeDisabledError(err) {
291+
const messages = [];
292+
if (err && typeof err.message === 'string') {
293+
messages.push(err.message);
294+
}
295+
if (Array.isArray(err && err.errors)) {
296+
for (const error of err.errors) {
297+
if (error && typeof error.message === 'string') {
298+
messages.push(error.message);
299+
}
300+
}
301+
}
302+
if (err && err.response && Array.isArray(err.response.errors)) {
303+
for (const error of err.response.errors) {
304+
if (error && typeof error.message === 'string') {
305+
messages.push(error.message);
306+
}
307+
}
308+
}
309+
return messages.some((message) => message.includes('Auto merge is not allowed for this repository'));
310+
}
311+
273312
function formatDependencySummary(dependencies) {
274313
const names = dependencies
275314
.map((dep) => dep['dependency-name'] || dep.dependencyName)

0 commit comments

Comments
 (0)