@@ -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