diff --git a/.github/workflows/database-projects-pr-workflow.yml b/.github/workflows/database-projects-pr-workflow.yml index 1e3b0af111..28216757e6 100644 --- a/.github/workflows/database-projects-pr-workflow.yml +++ b/.github/workflows/database-projects-pr-workflow.yml @@ -11,6 +11,7 @@ env: REVIEW_AWAITING: 'Awaiting' REVIEW_FEEDBACK: 'Feedback' REVIEW_MERGE: 'Merge' + MILESTONE_NAME: ${{ vars.DATABASE_CURRENT_MILESTONE }} on: pull_request: @@ -85,7 +86,7 @@ jobs: } } closingIssuesReferences(first: 10) { - nodes { id, number } + nodes { id, number, repository { owner { login }, name } } } } } @@ -271,13 +272,74 @@ jobs: // UPDATE LINKED ISSUES // ============================================================ - const linkedIssues = pr.closingIssuesReferences.nodes; + // Filter to issues in this repo only (closingIssuesReferences can include cross-repo issues) + const linkedIssues = pr.closingIssuesReferences.nodes.filter(issue => { + const isLocal = issue.repository.owner.login === context.repo.owner + && issue.repository.name === context.repo.repo; + if (!isLocal) console.log(` Skipping cross-repo issue #${issue.number} (${issue.repository.owner.login}/${issue.repository.name})`); + return isLocal; + }); + + // Resolve milestone if configured and PR was merged + let milestoneNumber = null; + const milestoneName = process.env.MILESTONE_NAME; + if (pr.merged && milestoneName) { + try { + const milestones = await github.paginate(github.rest.issues.listMilestones, { + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + per_page: 100, + }); + const milestone = milestones.find(m => m.title === milestoneName); + if (milestone) { + milestoneNumber = milestone.number; + console.log(`Will set milestone "${milestoneName}" (${milestoneNumber}) on linked issues`); + } else { + console.log(`Warning: milestone "${milestoneName}" not found, skipping milestone assignment`); + } + } catch (e) { + console.log(`Warning: failed to resolve milestone "${milestoneName}": ${e.message}`); + } + } + if (linkedIssues.length > 0) { console.log(`Updating ${linkedIssues.length} linked issue(s)...`); for (const issue of linkedIssues) { const itemId = await ensureInProject(issue.id); await updateField(itemId, fieldOptions.status.id, fieldOptions.status[status]); - console.log(` Issue #${issue.number} → ${status}`); + + if (milestoneNumber) { + try { + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + milestone: milestoneNumber, + }); + console.log(` Issue #${issue.number} → ${status}, milestone "${milestoneName}"`); + } catch (e) { + console.log(` Warning: failed to set milestone on #${issue.number}: ${e.message}`); + console.log(` Issue #${issue.number} → ${status}`); + } + } else { + console.log(` Issue #${issue.number} → ${status}`); + } + } + } + + // If no linked issues, set milestone on the PR itself + if (linkedIssues.length === 0 && milestoneNumber) { + try { + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + milestone: milestoneNumber, + }); + console.log(`No linked issues — set milestone "${milestoneName}" on PR #${prNumber}`); + } catch (e) { + console.log(`Warning: failed to set milestone on PR #${prNumber}: ${e.message}`); } } diff --git a/e2e-tests/package.json b/e2e-tests/package.json index 04cc2fcb09..377ad43313 100644 --- a/e2e-tests/package.json +++ b/e2e-tests/package.json @@ -20,7 +20,7 @@ "@faker-js/faker": "7.6.0", "@nuxt/test-utils": "^3.21.0", "@playwright/test": "^1.48.0", - "axios": "1.13.5", + "axios": "1.15.0", "dotenv": "16.0.3" } } diff --git a/e2e-tests/yarn.lock b/e2e-tests/yarn.lock index bf88cc867e..f4f4b94411 100644 --- a/e2e-tests/yarn.lock +++ b/e2e-tests/yarn.lock @@ -277,14 +277,14 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@1.13.5: - version "1.13.5" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" - integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== +axios@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.15.0.tgz#0fcee91ef03d386514474904b27863b2c683bf4f" + integrity sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q== dependencies: follow-redirects "^1.15.11" form-data "^4.0.5" - proxy-from-env "^1.1.0" + proxy-from-env "^2.1.0" c12@^3.3.2, c12@^3.3.3: version "3.3.3" @@ -749,10 +749,10 @@ postcss@^8.5.6: picocolors "^1.1.1" source-map-js "^1.2.1" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== quansync@^0.2.11: version "0.2.11" diff --git a/web-frontend/package.json b/web-frontend/package.json index 8675a4d1af..f5771c8545 100644 --- a/web-frontend/package.json +++ b/web-frontend/package.json @@ -80,7 +80,7 @@ "@zip.js/zip.js": "^2.8.14", "antlr4": "4.9.3", "async-mutex": "0.4.0", - "axios": "1.13.5", + "axios": "1.15.0", "bignumber.js": "9.1.1", "chart.js": "3.9.1", "chartjs-adapter-moment": "1.0.1", diff --git a/web-frontend/yarn.lock b/web-frontend/yarn.lock index a1599b5fb7..0b60f242e5 100644 --- a/web-frontend/yarn.lock +++ b/web-frontend/yarn.lock @@ -5468,14 +5468,14 @@ axios-mock-adapter@^2.1.0: fast-deep-equal "^3.1.3" is-buffer "^2.0.5" -axios@1.13.5: - version "1.13.5" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" - integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== +axios@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.15.0.tgz#0fcee91ef03d386514474904b27863b2c683bf4f" + integrity sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q== dependencies: follow-redirects "^1.15.11" form-data "^4.0.5" - proxy-from-env "^1.1.0" + proxy-from-env "^2.1.0" b4a@^1.6.4: version "1.7.3" @@ -10678,6 +10678,11 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== + public-encrypt@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"